Pluginy v KiCadu
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)
Práce s pluginem
Jak pracovat s pluginem vyplývá z textu výše. Označíte jedno nebo více pouzder případně hodnot. V toolbaru stiskněte tlačítko pluginu. To je vše.
Ladění pluginu
Po uložení souboru je potřeba znovu načíst pluginy. V menu Tools / External plugins najdete volbu Refresh Plugins
Dojde-li k výjimce, zobrazí se okno s popisem chyby. Pokud vám není jasné, o co jde, zkuste zadat její text do google, zpravidla se ke každé chybě dá najít informace, která vás posune správným směrem. Využívejte také ladění pomocí wx.LogMessage a str.
Potřebujete-li něco víc, můžete se inspirovat u kicad-action-tools, ostatně můj plugin je jím také inspirovaný.