Forum: Platinen KiCAD Symboleigenschaften editeren/erweitern


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thomas T. (runout)


Lesenswert?

Hallo Gemeinde,

eigentlich ein Softwarethema aber KiCAD-bezogen.

Ich möchte von Symbolen die Eigenschaften von extern
editieren oder erweitern.
Unter Symboleigenschaften gibt es Felder wie "Datenblatt", 
"Beschreibung" etc.
Ich möchte bibliotheksübergreifend Felder ergänzen. z.B. 
"Herstellerbezeichnung".

Es gibt eine "API for Add-on Developers", weiterhin
gibt es die "KiCad API Python Bindings" welche auf die API zugreifen.

Wohlgemerkt, des Editieren kann sollte, besser sollte, ohne eine 
laufende Runtime erfolgen.

Gibt es da eine Empfehlung für den besten Weg?
Oder gar ein fertiges Tool, gern auch Datenbank-basiert?

Grüße
Runout

von Patrick C. (pcrom)


Lesenswert?

Kauf dir ein buch oder folge einen Kurs Kicad damit du weiszt wie es 
benutzt werden soll. Wenn du das gut im griff hast, kann man eventuell 
mit API benutzung anfangen.

Ich bin noch nicht so lange her angefangen mit KiCad und bin sehr froh 
mit (e)book Kicad Like A Pro.

Patrick aus die Niederlande

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Schau dir doch einfach mal an, wie so ein Bibliothekssymbol aussieht. 
Hier mal ein x-beliebiges rausgegriffen:
1
(kicad_symbol_lib
2
        (version 20241209)
3
        (generator "kicad_symbol_editor")
4
        (generator_version "9.0")
5
        (symbol "8284"
6
                (exclude_from_sim no)
7
                (in_bom yes)
8
                (on_board yes)
9
10
                (property "Datasheet" "http://www.cpu-galaxy.at/cpu/ram%20rom%20eprom/other_intel_chips/other_intel-Dateien/D8284A_Datasheet.pdf"
11
                        (at 0 0 0)
12
                        (effects
13
                                (font
14
                                        (size 1.27 1.27)
15
                                )
16
                                (hide yes)
17
                        )
18
                )
19
                (property "Description" "Clock Generator and Driver for i8086/88 Microcontrollers, PDIP-18"
20
                        (at 0 0 0)
21
                        (effects
22
                                (font
23
                                        (size 1.27 1.27)
24
                                )
25
                                (hide yes)
26
                        )
27
Ich denke, es ist ziemlich offensichtlich, wie man da mit der 
Textbearbeitungs-Scriptsprache seines geringsten Misstrauens weitere 
property-Einträge hinzufügen kann. Vermutlich werden deine neuen 
Einträge ja alle "(at 0 0 0)" und "(hide yes)" haben sollen. Wenn sie 
auch im Schaltplan erscheinen sollen, wird es natürlich etwas 
schwieriger, eine konfliktfreie Platzierung zu finden.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

die Idee von Jörg weitergedacht. Nimm ein Symbol, kopiere es unter neuen 
Namen und ändere es mittels Symboleditor wie du es benötigt. Dann kannst 
du genau schauen was sich wie verändert hat. Wenn du die Unterschiede 
kennst, kannste bspw. mit Python ein Script schreiben, welches dir alle 
weiteren Dateien ändert/erweitert.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

man kann es noch anders machen, je nach Langlebigkeit der Änderung. Im 
Schaltplan alle Symbole markieren, Werkzeuge > Symbolfelder editieren. 
Hier kann man dann Felder hinzufügen und löschen usw..

von Thomas T. (runout)


Lesenswert?

Hallo Veit,

das greift doch bloß im Projekt und nicht in den Bibliotheken.

Das Stichwort wäre hier "SEXPR"

Die Quelle ist hier:
https://docs.kicad.org/doxygen/classSEXPR_1_1SEXPR.html

Wenn man die Kirche im Dorf lassen will, dann mit Python:
https://pypi.org/project/sexpdata/

Ich möchte damit meine eignen Libs anpassen. (1000+ Symbole)
Die KiCAD-Libs lass ich i.d.R. unangetastet.

Grüße
Runout

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Thomas T. schrieb:
> Wenn man die Kirche im Dorf lassen will, dann mit Python:
> https://pypi.org/project/sexpdata/

Das klingt doch schon mal nicht schlecht.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

es ist schon erstaunlich wie man so über die Antworten hinweggehen kann. 
Da frage ich mich, wenn du alles weißt wie man es macht, warum fragst du 
dann überhaupt? Irgendwie habe ich dafür kein Verständnis.
Parser Möglichkeiten gibt es viele, der Parser alleine hilft nicht.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Parser Möglichkeiten gibt es viele, der Parser alleine hilft nicht.

Das Python-Teil macht ja beides.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich meinte, es ist damit noch lange kein fertiges Script um das 
eigentliche Ziel zu erreichen. Da gehören schon noch paar mehr 
Überlegungen dazu.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> ich meinte, es ist damit noch lange kein fertiges Script um das
> eigentliche Ziel zu erreichen. Da gehören schon noch paar mehr
> Überlegungen dazu.

Klar, aber mit einem bereits vorhandenen Deserializer + Serializer 
sollte die Aufgabe gar nicht so anspruchsvoll sein.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

die sexpdata Lib benötigt man nicht. Man will ja nach ganz bestimmten 
Abschnitten ein paar eigene Zeilen einfügen. Dafür reicht die 
Standardsuchmethode für Zeileninhalte. Wenn man eine Symboldatei in 
KiCad bearbeitet hat und sich dann die Unterschiede anschaut, dann wird 
das nach allen Abschnitten mit
1
(property "Description" ...
 sein. Vorausgesetzt man hat nicht schon hier und da paar Einträge 
manuell gemacht. Dann hätte man ganz schnell irgendwelchen Müll in 
seinen Symbolen. Das heißt die Herausforderung liegt in der Erkennung 
von noch nicht vorhandenen Einträgen und von vorhandenen Einträgen. Weil 
man wird das Script ja irgendwann wiederholt auf seine Symboldateien 
loslassen wollen. Hierfür muss man sich eine Logik ausdenken.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Hierfür muss man sich eine Logik ausdenken.

Genau das sollte die Lib aber problemlos abdecken.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

mir ist das zu viel "sollte. Laut meiner Logik würde mir die sexpdata 
nicht helfen. Die würde mir ohne weitere Logik mit jedem Aufruf die 
eigenen Zeilen erneut einfügen. Genau das was ich nicht möchte. Ich bin 
gespannt was rauskommt wenn etwas rauskommt.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Laut meiner Logik würde mir die sexpdata nicht helfen. Die würde mir
> ohne weitere Logik mit jedem Aufruf die eigenen Zeilen erneut einfügen.

Ja, natürlich musst du schon noch nachschauen, ob das schon da ist, und 
es nur anfügen, wenn noch nicht.
1
#!/usr/bin/env python
2
3
import sexpdata
4
from sexpdata import Symbol
5
6
f = open("Local.kicad_sym")
7
lib = sexpdata.load(f)
8
f.close()
9
10
if lib[0] != Symbol('kicad_symbol_lib'):
11
    raise "Not a KiCad symbol library"
12
13
# lib[1]: Symbol('version'), 20201005
14
# lib[2]: Symbol('generator'), Symbol('kicad_symbol_editor')
15
16
contents = lib[3:]
17
18
for ele in contents:
19
    lastid = -1
20
    found = False
21
    for x in ele:
22
        if type(x) == list:
23
            if x[0] == Symbol('property'):
24
                # id is 3rd element
25
                id = x[3][1]
26
                if id > lastid:
27
                    lastid = id
28
                if x[1] == 'dl8dtl':
29
                    found = True
30
                    break
31
32
    if not found:
33
        print(f"Appending private entry to {ele[1]}")
34
        myproperty = [Symbol('property'),
35
                      'dl8dtl',
36
                      'this is my value',
37
                      [Symbol('id'), lastid + 1],
38
                      [Symbol('at'), 0, 0, 0],
39
                      [Symbol('effects'),
40
                       [Symbol('font'),
41
                        [Symbol('size'),
42
                         1.27, 1.27]],
43
                       Symbol('hide')]]
44
        ele.append(myproperty)
45
    else:
46
        print(f"Private entry already in {ele[1]}")
47
48
f = open("mylib.kicad_sym", "w")
49
sexpdata.dump(lib, f)
50
f.close()

Funktioniert.  Erster Aufruf:
1
$ python x.py
2
Appending private entry to Local:MAX1551_5
3
Appending private entry to Local:MCP1825

Danach mylib.kicad_sym auf Local.kicad_sym kopiert und nochmal laufen 
lassen:
1
$ python x.py
2
Private entry already in Local:MAX1551_5
3
Private entry already in Local:MCP1825

Der Deserializer / Serializer garantiert halt zumindest, dass du dich 
mit der Struktur nicht verhedderst. Das Ergebnis quetscht er übrigens 
knallhart in eine einzelne Textzeile (kann man also nicht zeilenweise 
selbst parsen), und KiCad hat kein Problem damit, das dann einzulesen.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

muss ich in Ruhe durchgehen. Danke.
Ich hätte es versucht mit, grobes Schema ...
1
    fileRead = open(Dateiname, "r")   
2
    dataLine = fileRead.readlines()
3
    for zeile in dataLine:
4
        if ausdruck in zeile:
5
    
6
    ...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wie geschrieben, wenn dir jemand die S-Expressions all in einer Zeile um 
die Ohren haut (was legal ist), dann hast du mit dem zeilenweisen 
Einlesen schnell ein Problem.

Verbesserungspotenzial (war nur ein quick hack gestern Abend):
1
            if x[0] == Symbol('property'):
2
                # id is 3rd element
3
                if x[3][0] != Symbol('id'):
4
                    raise f"Expected 'id', got {x[3][0]}"
5
                id = x[3][1]

von Veit D. (devil-elec)


Lesenswert?

Hallo Jörg,

dein gezeigter kompletter Code funktioniert erstmal. "Erstmal", weil man 
die Datei leider ohne Zeilenumbruch nie wieder manuell anschauen 
geschweige denn bearbeiten kann.

Die letzte Änderung erzeugt übrigens einen Error den ich nicht beheben 
kann. Ich weiß nur das eine Ausnahmeregel verlangt wird. Aber von was 
genau?
1
Traceback (most recent call last):
2
  File "c:\Users\Worker\Documents\Python\KiCad_SymbolAddIn.py", line 22, in <module>
3
    raise f"Expected 'id', got {x[3][0]}"
4
TypeError: exceptions must derive from BaseException

Generell habe ich noch nicht verstanden wie Python bzw. sexpdata die 
Abschnitte in den runden Klammern erkennt, um nach dem letzten Abschnitt 
und vorm neuen Symbol die eigenen Zeilen einzufügen.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

übrigens kommt eine Klammer abhanden. Wenn man sich die Mühe macht die 
ersten Zeilen umzubrechen, dann fehlt bei mir die letzte runde 
geschlossene Klammer nach 9.0.  Bei dir nicht?
1
(kicad_symbol_lib
2
  (version 20241209)
3
  (generator "kicad_symbol_editor")
4
  (generator_version "9.0")

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:

> dein gezeigter kompletter Code funktioniert erstmal. "Erstmal", weil man
> die Datei leider ohne Zeilenumbruch nie wieder manuell anschauen
> geschweige denn bearbeiten kann.

Hmm, ja, man könnte jetzt für die S-Exp-Lib einen feature request 
machen, dass er auch mehrzeilige Ausgabe unterstützt.

> Die letzte Änderung erzeugt übrigens einen Error den ich nicht beheben
> kann. Ich weiß nur das eine Ausnahmeregel verlangt wird. Aber von was
> genau?
>
>
1
> Traceback (most recent call last):
2
>   File "c:\Users\Worker\Documents\Python\KiCad_SymbolAddIn.py", line 22, 
3
> in <module>
4
>     raise f"Expected 'id', got {x[3][0]}"
5
> TypeError: exceptions must derive from BaseException
6
>

Huch. Gut, wichtig ist ja erstmal, dass komplett neben der Spur liegende 
Dateien nicht versucht werden zu bearbeiten.
1
raise Exception("f"Expected 'id', got {x[3][0]}")

sollte funktionieren.

Dass da eine Klammer zu wenig wäre, hat zumindest weder die Lib noch 
Kicad gestört.

Wäre allerdings wohl einen bug report wert.

: Bearbeitet durch Moderator
von Thomas T. (runout)


Lesenswert?

Hallo an alle Beteiligten.

Für meine Belange macht das Skript von Jörg schon was ich brauche.
Es scheint unterschiedliche "Header" zu geben.
z.B. "[Symbol('generator_version'), '8.0']" ist aktuell
noch in den Information am Anfang.
Die eigentlichen Symbole gehen dann ab Index 4 los.

Veit D. schrieb:
> dein gezeigter kompletter Code funktioniert erstmal. "Erstmal", weil man
> die Datei leider ohne Zeilenumbruch nie wieder manuell anschauen
> geschweige denn bearbeiten kann.

Wenn man die "mylib.kicad_sym" ohne Zeilenumbrüche
dann mit dem KiCAD-Symboleditor öffnet und den "Symbolprüfer" anwirft,
hat der nix zu meckern.
Dann: irgendein Feld editieren (Leerzeichen rein/raus) und abspeichern
und schon sieht die Symboldatei wieder lesbar aus.

Danke nochmal für den Ansatz von Jörg.
(ich wollte mit regulären Ausdrücken loslegen aber es geht 
offensichtlich auch einfacher :-))

Grüße
Runout

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Thomas T. schrieb:
> Danke nochmal für den Ansatz von Jörg.

Bitte sehr, hatte mich ja selbst interessiert. Gerade die Möglichkeit, 
auf diese Weise automatisch die eigene Bauteildatenbank zu verlinken, 
könnte mich durchaus interessieren.

> Die eigentlichen Symbole gehen dann ab Index 4 los.

Daher ja die Zeile 16 bei mir im Script, die genau ab da bearbeitet.

Man könnte natürlich auch noch eine Ergänzung bei "generator" 
hinzufügen. ;-) Aber stellt sich die Frage, ob das überhaupt irgendwo 
abfragbar ist.

: Bearbeitet durch Moderator
von Veit D. (devil-elec)


Lesenswert?

Hallo,

für eine weitere Nachbearbeitung aller Dateien bin ich nicht so zu 
haben. Da bin ich zu sehr Perfektionist. Das sollte dann schon alles 
richtig funktionieren. Wir warten einmal ab ob Joshua D. Boyd reagiert.
Dennoch Danke für die Informationen. Klaro.  ;-)

: Bearbeitet durch User
von Thomas T. (runout)


Lesenswert?

Veit D. schrieb:
> Da bin ich zu sehr Perfektionist.

Hallo Veit,

gern darfst du noch mit einer kleinen GUI oder einem KiCAD-Plugin 
nachlegen.
Mein Wunschkandidat: wxWidgets/wxPython

Bibliotheksübergreifend Properties hinzufügen bzw. entfernen,
automatischer Abgleich von Preis, Lagerbestand von den großen Distris 
etc.

Naja, die Rente ist nicht mehr soweit weg, dann bliebe Zeit für solche 
Spielereien, theoretisch...

Runout :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.