Pluginy v KiCadu: Difference between revisions

From Tučňák Wiki
Jump to navigation Jump to search
Ok1zia (talk | contribs)
Ok1zia (talk | contribs)
No edit summary
Line 25: Line 25:
     wx.LogMessage('move to F.silkscreen plugin error\n'+str(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.
'''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.
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
'''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
'''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 +.
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á funkce je '''str()''', která převede svůj parametr na řetězec. Řetězce pak lze kombinovat operátorem '''+'''.


=move_to_Fsilkscreen.py=
=move_to_Fsilkscreen.py=
Line 43: Line 43:
  class move_to_Fsilkscreen( pcbnew.ActionPlugin ):
  class move_to_Fsilkscreen( pcbnew.ActionPlugin ):
     def defaults( self ):
     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
         import os
         self.name = "Move Selected Drawings to F.silkscreen \nversion "+___version___
         self.name = "Move Selected Drawings to F.silkscreen \nversion "+___version___
Line 67: Line 60:
                 #wx.LogMessage(footprint.GetValue())
                 #wx.LogMessage(footprint.GetValue())
                 value.SetLayer(id)
                 value.SetLayer(id)
První řádka zpřístupňuje API programu '''pcbnew'''. Následuje již známý import wxWindows
Dále se deklaruje třída '''move_to_Fsilkscreen''' odvozená ze třídy '''ActionPlugin''' programu (přesněji namespace) '''pcbnew'''. To znamená, že naše nová třída přebírá všechnu funkčnost třídy '''ActionPlugin'''. Už v minulém skriptu jsme využili metodu '''register'''. Následuje definice metod '''defaults''' a '''Run'''.
Metoda '''defaults''' nastavuje informace o pluginu - jméno, kategorii, popis, ikonu a zda plugin přidat do toolbaru programu. Parametr '''self''' ukazuje na aktuální instanci objektu pluginu, parametry nastavujeme konkrétní instanci (byť v tomto případě bude existovat vždy jen jeden objekt, jde o základní princip objektového programování). Metody začínající '''os.path''' slouží k určení absolutní cesty k PNG souboru.
Metoda '''Run''' je spuštěna, když uživatel klikne na tlačítko pluginu v toolbaru. Je to hlavní akce celého pluginu.
'''board = pcbnew.GetBoard()''' vytvoří v metodě '''Run''' lokální proměnnou '''board''', do které načte objekt popisující celou desku. Obecně platí, že když chci informace o boardu, najdu si v API odkaz na '''BOARD''' a tím zjistím, jaké metody mohu volat.
'''id = board.GetLayerID('F.Silkscreen')''' využívá už dostupný objekt desky a do proměnné '''id''' načte číslo vrstvy '''F.silkscreen'''. V programu se vždy pracuje s tímto číslem, ne s názvem vrstvy.
'''#wx.LogMessage(str(id))''' je komentář. Po odkomentování (smazání '''#''') by se vypsalo číslo vrstvy, v mém případě je to 37. Takto si můžete ladit veškeré hodnoty za běhu pluginu.
'''for footprint in board.GetFootprints():''' je smyčka. Z desky načte všechna pouzdra. Pro každé pouzdro na desce zavolá následující blok (to, co je odsazené), jednotlivá pouzdra jsou přístupná v proměnné '''footprint'''.
'''value = footprint.Value()''' načte z pouzdra objekt popisující hodnotu. Jde o celý objekt, ne jen řetězec s hodnotou.
Následné '''if''' je podmínka, která spustí násleující blok, pokud je vybráno celé pouzdro '''nebo''' jen hodnota.
No a ve finále nastavíme vrstvu hodnoty voláním '''value.SetLayer(id)'''

Revision as of 19:03, 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:

  • __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á funkce 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 ):
        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)

První řádka zpřístupňuje API programu pcbnew. Následuje již známý import wxWindows

Dále se deklaruje třída move_to_Fsilkscreen odvozená ze třídy ActionPlugin programu (přesněji namespace) pcbnew. To znamená, že naše nová třída přebírá všechnu funkčnost třídy ActionPlugin. Už v minulém skriptu jsme využili metodu register. Následuje definice metod defaults a Run.

Metoda defaults nastavuje informace o pluginu - jméno, kategorii, popis, ikonu a zda plugin přidat do toolbaru programu. Parametr self ukazuje na aktuální instanci objektu pluginu, parametry nastavujeme konkrétní instanci (byť v tomto případě bude existovat vždy jen jeden objekt, jde o základní princip objektového programování). Metody začínající os.path slouží k určení absolutní cesty k PNG souboru.

Metoda Run je spuštěna, když uživatel klikne na tlačítko pluginu v toolbaru. Je to hlavní akce celého pluginu.

board = pcbnew.GetBoard() vytvoří v metodě Run lokální proměnnou board, do které načte objekt popisující celou desku. Obecně platí, že když chci informace o boardu, najdu si v API odkaz na BOARD a tím zjistím, jaké metody mohu volat.

id = board.GetLayerID('F.Silkscreen') využívá už dostupný objekt desky a do proměnné id načte číslo vrstvy F.silkscreen. V programu se vždy pracuje s tímto číslem, ne s názvem vrstvy.

#wx.LogMessage(str(id)) je komentář. Po odkomentování (smazání #) by se vypsalo číslo vrstvy, v mém případě je to 37. Takto si můžete ladit veškeré hodnoty za běhu pluginu.

for footprint in board.GetFootprints(): je smyčka. Z desky načte všechna pouzdra. Pro každé pouzdro na desce zavolá následující blok (to, co je odsazené), jednotlivá pouzdra jsou přístupná v proměnné footprint.

value = footprint.Value() načte z pouzdra objekt popisující hodnotu. Jde o celý objekt, ne jen řetězec s hodnotou.

Následné if je podmínka, která spustí násleující blok, pokud je vybráno celé pouzdro nebo jen hodnota.

No a ve finále nastavíme vrstvu hodnoty voláním value.SetLayer(id)