Pluginy v KiCadu: Difference between revisions
No edit summary |
|||
Line 15: | Line 15: | ||
* move2layer.png je ikona pro tlačítko v toolbaru pro vyvolání skriptu | * 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. | 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. | ||
Line 35: | Line 35: | ||
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á 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 pcbnew | ||
import wx | import wx |
Revision as of 18: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:
- __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)