TL;DR:
Ich möchte das Skript bearbeiten und arbeite dafür mit PyCharm. In KiCAD
klappt das Original, in PyCharm nicht, da kann es die Netzliste nicht
öffnen, das resultiert immer in einer Fehlermeldung. Dabei bräuchte ich
Hilfe.
Hintergrund:
Meine Symbole enthalten neben den vier Standardfeldern noch weitere
Felder. Ich möchte eine BOM erstellen, in der die Bauteile nicht nur
nach dem Wert und dem Footprint gruppiert werden, sondern auch nach
einigen benutzerdefinierten Feldern. Das kann keines der mitgelieferten
Skripte bewerkstelligen, also muss ich selbst Hand anlegen. Und da
hapert es nun.
Das Problem:
Ich beherrsche andere Programmiersprachen, aber bei Python steige ich
einfach nicht durch. Ich komme mit dem einfachen Texteditor nicht
weiter, also habe ich PyCharm installiert, weil das auch im Studium
verwendet wurde. Eigentlich war geplant das originale Skript damit
auszuführen und mir anzugucken, was es macht und welche Variablen gerade
da sind. Leider funktioniert das originale Skip, in PyCharm jedoch
nicht. Es wird in beiden Fällen Python 3,8 verwendet.
In den Einstellungen sind die Parameter übergeben:
Ich habe die Pfade absolut angegeben, relativ (also mit "./test.net"),
nur den Dateinamen ("test.net"), mit einfachen Anführungsstrichen, ohne
Anführungsstriche, Slash durch Backslash ersetzt ... alles, was mir so
eingefallen ist. Normalerweise sollte es ausreichen den Dateinamen in
doppelten Anführungsstrichen anzugeben, wenn sich die Datei im gleichen
Ordner wie das Skript befindet. So habe ich es zumindest gelesen und
ausprobiert, aber ohne Erfolg. So schwer kann das doch nicht sein.
Hab auch versucht den Fehler entsprechend der Fehlermeldungen
zurückzuverfolgen, aber da verstehe ich irgendwann nur Bahnhof.
Terence S. schrieb:> xml.sax._exceptions.SAXParseException:> /home/user/KiCAD/Projekte/test/test.net:1:0: syntax error>> Hab auch versucht den Fehler entsprechend der Fehlermeldungen> zurückzuverfolgen, aber da verstehe ich irgendwann nur Bahnhof.
Offensichtlich versucht das Skript, eine XML-Datei zu lesen, aber die
Datei, die es zu lesen versucht, ist keine XML-Datei oder eine mit einem
Syntaxfehler in Zeile 1.
Vielleicht magst Du das Skript und die beiden Dateien hier einmal als
Anhänge posten?
Sowas in der Art hatte ich auch.
Der Kicad Netlist Reader war nicht aufzufinden. Fehler über Fehler.
Leg das mit admin Rechten ins kicad Verzeichnis in dem auch die BOM
Scripte liegen.
Hab lange rumgewürgt und es dann irgendwann so gelassen.
Ist schlecht umgesetzt.
Wozu gibt es das scripting verz. im dokumenten Kicad 6 Verzeichnisbaum?
Danke, ich denke das hat mir schon weitergeholfen! Lösung unten.
Das sind die Standard-Dateien, die mit KiCAD mitgeliefert werden. Habe
sie dennoch mal angehängt.
In KiCAD wird mir diese Befehlszeile angezeigt:
bom_csv_sorted_by_ref.py importiert die beiden Skripte
kicad_netlist_reader.py und kicad_utils.py und scheitert an der
folgenden Zeile:
1
net = kicad_netlist_reader.netlist(sys.argv[1])
Falls da auch noch jemand dran arbeitet, auf KiCAD.org wird das Ganze
ein wenig beschrieben:
https://docs.kicad.org/6.0/en/eeschema/eeschema.html#creating-customized-netlists-and-bom-files
Dort steht:
* %B ⇒ base filename and path of selected output file, minus path and
extension.
* %I ⇒ complete filename and path of the temporary input file (the
intermediate net file).
* %O ⇒ complete filename and path of the user chosen output file.
Da wird sogar drauf verwiesen, dass der Pfad zu der net-Datei übergeben
wird. Nun habe ich mal nachgesehen und die exportierte net-Datei ist
tatsächlich keine XML-Datei. Keine Ahnung, was für ein Format das ist,
aber wenn ich das Skript über KiCAD ausführe, dann erzeugt es aus der
net-Datei zusätzlich eine XML-Datei, die dann ebenfalls im Projektordner
liegt. Die entspricht dann auch dem beschriebenen Format in der
Dokumentation. Verwende ich die statt der net-Datei, dann klappt es. Das
reicht mir, ich möchte nur das Skript testweise ausführen und kann das
mit der einen XML-Datei füttern.
Danke! Ich hoffe nun komme ich wieder allein klar.
Inzwischen konnte ich alles umsetzen, was ich umsetzen wollte. Für die
Nachwelt möchte ich noch hinzufügen, wie ich es angegangen habe. Es sei
noch einmal betont, ich habe keine Ahnung von Python, mein Weg ist ggf.
extrem umständlich.
Als Basis dient das Skript "bom_csv_grouped_by_value.py". Das liest mit
der Methode netlist() von kicad_netlist_reader.py die Netzliste ein und
speichert das Ergebnis in der Variable "net". Die Methode comp() enthält
die Liste aller Bauteile.
Das Skript bom_csv_grouped_by_value.py fügt standardmäßig alle
benutzerdfinierten Felder als Spalte nach den Standardfeldern hinzu. Das
habe ich komplett herausgelöscht, da ich ein festes Muster an
benutzerdefinierten Feldern habe, zum Beispiel das Feld "Hersteller".
Auf diese möchte ich gezielt zugreifen.
Damit füge ich der Klasse comp eine Methode hinzu, die den Wert des
Felds "Hersteller" zurückgibt.
Die Methode myEqu() habe ich um eine Abfrage des Herstellers erweitert.
Damit wird das Bauteil in eine eigene Gruppe einsortiert, wenn der Wert,
Bibliotheksname (getPartName), der Footprint, oder der Hersteller von
den bisher eingelesenen Bauteilen abweicht.
In der Ausgabe der gruppierten Liste nutze ich dann ebenfalls
self.getFieldHersteller(), um den Herstellernamen auszugeben.
1
item = 0
2
for group in grouped:
3
del row[:]
4
refs = ""
5
6
for component in group:
7
if len(refs) > 0:
8
refs += ", "
9
refs += component.getRef()
10
c = component
11
12
item += 1
13
row.append( item )
14
row.append( len(group) )
15
row.append( refs )
16
row.append( c.getValue() )
17
row.append( c.getFieldHersteller() )
18
row.append( c.getFootprint() )
19
20
writerow( out, row )
Das Ganze ist für weitere Felder eingebaut, die der Übersicht wegen in
den Codeschnipseln nicht enthalten sind. Ich denke, das kann sich jeder
selbst herleiten.
Und zuletzt habe ich gesehen, dass auch die Daten der Schaltplanseiten
ausgelesen werden. Die wollte ich dann sogleich im Header der CSV-Datei
verwursten.
Dafür zunächst wieder eine weitere Methode für eine bestehende Klasse:
Es wird für jede Schaltplanseite ein Element im Array angelegt. Mit
"title_block" nehme ich immer die Hauptseite.
Mit einer eigenen Klasse lese ich wiederum die Daten aus und speichere
sie, da es mit nicht gelang alle Felder direkt auszulesen.