Difference between revisions of "Pluginy v KiCadu"

From Tučňák Wiki
Jump to: navigation, search
Line 10: Line 10:
  
 
[[Image:KicadPluginMoveToFsilkscreen.png]]
 
[[Image:KicadPluginMoveToFsilkscreen.png]]
 +
 +
* __init__.py je popis a základní soubor pluginu
 +
* move_to_Fsilkscreen.py je vlastní kód funkce
 +
* move2layer.png je ikona pro tlačítko v toolbaru pro vyvolání skriptu
 +
 +
[__init__.py]
 +
Základní vlastností Pythonu je, že nepoužívá žádné závorky ani klíčová slova pro odsazení bloků programu. Bloky jsou dány odsazením.
 +
 +
import wx
 +
try:
 +
    from .move_to_Fsilkscreen import move_to_Fsilkscreen
 +
    move_to_Fsilkscreen().register()
 +
except Exception as e:
 +
    wx.LogMessage('move to F.silkscreen plugin error\n'+str(e))
 +
 +
Import wx znamená, že se importuje knihovna wxWindows, která se stará o zobrazení grafiky.
 +
 +
Sekce try ... except slouží pro odchycení výjímek (chyb při běhu programu). Při výjimce v bloku try se zavolá sekce except, v parametru e je objekt s detaily výjimky.
 +
 +
from ... znamená, že ze souboru move_to_Fsilkscreen.py se importuje stejnojmenná třída move_to_Fsilkscreen
 +
 +
move_to_Fsilkscreen() vytvoří objekt move_to_Fsilkscreen a nad jeho instancí zavolá metodu register(), která zaregistruje plugin v KiCadu
 +
 +
Dojde-li během inicializace k výjimce, vyvolá se okno s chybovou hláškou. Pokud se wx.LogMessage zavolá vícekrát, nový text se přidá na konec původního textu, okno je stále jedno. Důležitá metoda je str(), která převede svůj parametr na řetězec. Řetězce pak lze kombinovat operátorem +.
 +
 +
[move_to_Fsilkscreen.py]
 +
import pcbnew
 +
import wx
 +
 +
___version___="0.1"
 +
 +
class move_to_Fsilkscreen( pcbnew.ActionPlugin ):
 +
    def defaults( self ):
 +
        """
 +
        Method defaults must be redefined
 +
        self.name should be the menu label to use
 +
        self.category should be the category (not yet used)
 +
        self.description should be a comprehensive description
 +
          of the plugin
 +
        """
 +
        import os
 +
        self.name = "Move Selected Drawings to F.silkscreen \nversion "+___version___
 +
        self.category = "Modify PCB"
 +
        self.description = "Move Selected Drawings to F.silkscreen on an existing PCB"
 +
        self.icon_file_name = os.path.join(os.path.dirname(__file__), "./move2layer.png")
 +
        self.show_toolbar_button = True
 +
 +
    def Run( self ):
 +
       
 +
        board = pcbnew.GetBoard()
 +
        id = board.GetLayerID('F.Silkscreen')
 +
        #wx.LogMessage(str(id))
 +
        for footprint in board.GetFootprints():
 +
            value = footprint.Value()
 +
            if footprint.IsSelected() or value.IsSelected():
 +
                #wx.LogMessage(footprint.GetValue())
 +
                value.SetLayer(id)

Revision as of 19:37, 26 July 2022

Program KiCad na návrh plošných spojů má kromě nesporných výhod i neýhody. Mezi jedny z nich patří nemožnost (AFAIK) hromadných rychlých změn. Typicky jsem potřeboval na PCB přesunout hodnoty součástek do potisku desky. Pokud je člověk "klikač", tak to třeba dokáže dělat po jedné. Já jsem na to líný, tak jsem si na to napsal skript. Protože se oficiální dokumentace omezuje pouze na lakonické TODO, pokusím se sepsat zde svoje poznatky jednak pro sebe do budoucna, druhak i pro ostatní, kteří sice nějak umějí programovat, ale na pluginy v KiCadu si z různých důvodů netroufli, nebo je ani nenapadlo, že by si s jejich pomocí mohli ušetřit nudnou rutinu.

Podotýkám, že sice jsem programátor, ale v Pythonu neprogramuji. Zrovna tak neznám programování KiCadu. Pravděpodobně by některé věci šly řešit lépe. Text je zamýšlený jako ukázání nejzákladějších principů, pro konkrétní funkčnost bude potřeba dohledat konkrétní třídy.

API PCBNEW

Třídy dostupné pro Pythonní skript jsou popsánány na [1]. Jsou pojmenované celkem logicky, takže se v nich dá orientovat. Bohužel jména identifikátorů jsou veškeré informace. Na nějaký podrobnější popis jsem nikde nenarazil.

Pluginy

Umístění pluginů na různých OS je popsáno zde: [2]. V tomto adresáři jsou podadresáře s konkrétními pluginy:

KicadPluginMoveToFsilkscreen.png

  • __init__.py je popis a základní soubor pluginu
  • move_to_Fsilkscreen.py je vlastní kód funkce
  • move2layer.png je ikona pro tlačítko v toolbaru pro vyvolání skriptu

[__init__.py] Základní vlastností Pythonu je, že nepoužívá žádné závorky ani klíčová slova pro odsazení bloků programu. Bloky jsou dány odsazením.

import wx
try:
    from .move_to_Fsilkscreen import move_to_Fsilkscreen
    move_to_Fsilkscreen().register()
except Exception as e:
    wx.LogMessage('move to F.silkscreen plugin error\n'+str(e)) 

Import wx znamená, že se importuje knihovna wxWindows, která se stará o zobrazení grafiky.

Sekce try ... except slouží pro odchycení výjímek (chyb při běhu programu). Při výjimce v bloku try se zavolá sekce except, v parametru e je objekt s detaily výjimky.

from ... znamená, že ze souboru move_to_Fsilkscreen.py se importuje stejnojmenná třída move_to_Fsilkscreen

move_to_Fsilkscreen() vytvoří objekt move_to_Fsilkscreen a nad jeho instancí zavolá metodu register(), která zaregistruje plugin v KiCadu

Dojde-li během inicializace k výjimce, vyvolá se okno s chybovou hláškou. Pokud se wx.LogMessage zavolá vícekrát, nový text se přidá na konec původního textu, okno je stále jedno. Důležitá metoda je str(), která převede svůj parametr na řetězec. Řetězce pak lze kombinovat operátorem +.

[move_to_Fsilkscreen.py] import pcbnew import wx

___version___="0.1"

class move_to_Fsilkscreen( pcbnew.ActionPlugin ):
    def defaults( self ):
        """
        Method defaults must be redefined
        self.name should be the menu label to use
        self.category should be the category (not yet used)
        self.description should be a comprehensive description
          of the plugin
        """
        import os
        self.name = "Move Selected Drawings to F.silkscreen \nversion "+___version___
        self.category = "Modify PCB"
        self.description = "Move Selected Drawings to F.silkscreen on an existing PCB"
        self.icon_file_name = os.path.join(os.path.dirname(__file__), "./move2layer.png")
        self.show_toolbar_button = True 

    def Run( self ):
        
        board = pcbnew.GetBoard()
        id = board.GetLayerID('F.Silkscreen')
        #wx.LogMessage(str(id))
        for footprint in board.GetFootprints():
            value = footprint.Value()
            if footprint.IsSelected() or value.IsSelected():
                #wx.LogMessage(footprint.GetValue())
                value.SetLayer(id)