KiCAD Symboleigenschaften editeren/erweitern

OP #7869208
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

#7869210
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

Moderator Persönliche Seite #7869214
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.

#7869307
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.

OP #7869444
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

#7869688
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.

#7870145
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.

Moderator Persönliche Seite #7870219
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.

Moderator Persönliche Seite #7870310
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]
#7871400
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.

#7871413
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")
Moderator Persönliche Seite #7871440
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.

OP #7871567
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

Moderator Persönliche Seite #7871591
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.

OP #7871973
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 :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren