Seit der 4.0-Version von KiCad unterstützt Pcbnew Python-Skripte. Es ist möglich, Informationen von der Karte abzurufen, Attribute sofort zu ändern und die Arbeit zu automatisieren. Deshalb habe ich dieses Skript erstellt und Python studiert. Hat. Selbst wenn das Teilelayout beim Zeichnen des Schaltplans berücksichtigt wird, ist es kein Wunder, dass solche Informationen gelöscht werden, wenn das Netz in den Karten-CAD importiert wird.
Einige kommerzielle CAD-Dateien können nicht nur das Teilelayout, sondern auch die Verdrahtungsreihenfolge und den Punkt der Ein-Punkt-Erdung widerspiegeln. Es ist jedoch viel einfacher, nur das grobe Layout wiederzugeben.
Skriptausführungsvideo (Youtube)
Arbeitsgruppe Robotertechnologie des Tokyo Institute of Technology
Dies ist ein Dokument des Dateiformats von Eeschema, das zuvor von Freiwilligen von kicad.jp übersetzt wurde. Die Struktur der Schaltplandatei ist jedoch in Version 4.0.1 dieselbe wie in Version BZR4022. ist.
Für verschiedene KiCad-Formate befand sich in der vorherigen Version ein Dokument im Installationsverzeichnis, das jedoch in Version 4.0 oder höher nicht gefunden wurde, und PDF wird auf dem Launchpad veröffentlicht. http://bazaar.launchpad.net/~stambaughw/kicad/doc-read-only/download/head:/1115%4016bec504-3128-0410-b3e8-8e38c2123bca:trunk%252Fkicad-doc%252Fdoc%252Fhelp%252Ffile_formats%252Ffile_formats.pdf/file_formats.pdf
Das Skript ist wie folgt. Der Grundfluss ist
ist.
ki_pre_place.py
# coding: utf-8
# KiCad footprint pre place tool (2016-01-30)
#
# This script places footprints based on the XY coordinate
# of Eeschema's schematic components.
# import sys
import codecs
import pcbnew
def input_num():
while True:
try:
v = float(sys.stdin.readline())
return v
except ValueError:
print 'Value Error!'
comp_flg = False # For Detect $Comp section
qty = -1 # Comp counter
zuwaku = [] # Sch sheet size
sch_comp = [] # All Comp info (expect PWR-Symbol)
sch_comp_xy = [] # Comp Location List
pcb_comp_xy = [] # pcb location
scl_size = float(0.4) # Scaling for pcb
offset_x = float(2000) # PCB Place offset X(mils)
offset_y = float(2000) # Y(mils)
pcb = pcbnew.GetBoard() # Get pcb all info
pcb_name = pcb.GetFileName() # current pcb file name
sch_name = pcb_name.replace('.kicad_pcb','.sch') # Generate Sch file name
org_aux = pcb.GetAuxOrigin() # fab. origin(gerber etc.) and conv string (non used)
org_grid = pcb.GetGridOrigin() # grid origin and conv string (non used)
#Start Sch operation
f = codecs.open(sch_name,'r','utf-8') # Sch file reading (utf-8)
sch = f.readlines()
f.close()
for line in sch: # reading each sch lines...
line = line.lstrip().rstrip() # Del \t and \n
if line.startswith('$Descr') : # Detect $Descr section...
zuwaku = line.replace('$Descr ','').split(' ')
zuwaku[1] = float(zuwaku[1]) # X size
zuwaku[2] = float(zuwaku[2]) # Y size
if line.startswith('$Comp') : # Detect $Comp section...
comp_flg = True # flg on
qty += 1 # Component count
sch_comp.append([]) # ex) sch_comp[0] = [] , sch_comp[1] = [] ....
elif line.startswith('$EndComp') : # $EndComp -> flg off
comp_flg = False
if comp_flg : # from $Comp to $EndComp
if not line.startswith('$Comp') : # except 1st line($Comp)
sch_comp[qty].append(line) # add comp all info
# ex) sch_comp[0][0] <- 'L 74AC04 U2'
# [0][1] <- 'U 1 1 512E0139'
# [0][2] <- 'P 4050 6950'
# ....
# Get Ref.No and XY
for c_line in sch_comp:
if '#' not in c_line[0] : # except PWR SYMBOL (GND,Vcc,PWR_FLG etc.)
ref = c_line[0].split(' ')
unit_num = c_line[1].split(' ')
xy = c_line[2].split(' ')
angle = c_line[-1] # orientation matrix (angle and mirror)
if unit_num[1] == '1': # detect 1st unit ( for OPAMP , logic IC etc.)
xy_raw = [ref[2],float(xy[1]),float(xy[2]),angle] # make Ref,x,y list
sch_comp_xy.append(xy_raw)
# ex) sch_comp_xy[0][0] <- R1
# [0][1] <- X(mils)
# [0][2] <- Y(mils)
# [0][3] <- orientation matrix
#
# [1][0] <- C1
# .....
# End Sch operation
# print sch_comp <- all comp list
# print sch_comp_xy <- comp xy list
# print zuwaku <- Sch paper size
# Start PCB operation
place_flg = 'n'
judge = 'n'
while place_flg == 'n' :
if judge != 'n' :
pass
else :
print 'scale = ' + str(scl_size)
print 'offset x,y(mil) = ' + '(' +str(offset_x) + ',' + str(offset_y) + ')'
for posi in sch_comp_xy:
pcb_x = int(posi[1] * scl_size) # convert xy Sch --> PCB (scaling)
pcb_y = int(posi[2] * scl_size)
module = pcb.FindModuleByReference(posi[0]) # Get Footprint info
module.SetPosition(pcbnew.wxPointMils(pcb_x , pcb_y)) # Move abs x,y(mils)
module.Move(pcbnew.wxPointMils(offset_x , offset_y)) # Move inc(offset from origin, mils)
print '''
Place Finished , Press[F3] Key(Redraw).
'''
print 'Is this floor plan all right(y/n,a:abort)?' # Layout check...
judge = sys.stdin.readline()
if judge == 'y': # Layout OK
print 'Place Completed.'
place_flg = 'y'
elif judge == 'n': # Change place scale and origin
print 'place scale = '
scl_size = input_num()
print 'offset x(mil) = '
offset_x = input_num()
print 'offset y(mil) = '
offset_y = input_num()
elif judge == 'a': # abort
print 'Aborted.'
place_flg = 'a'
else :
pass
Glück, wenn Sie die Zwischen-Netzliste verwenden können, die Eeschema ausspuckt! Ich dachte, aber natürlich gibt es leider keine Koordinateninformationen des Symbols. Daher erstelle ich aus dem Namen der aktuell geöffneten Platinendatei einen Schaltplan-Dateinamen, lese die Schaltplan-Datei von Anfang an und extrahiere die erforderlichen Teile. Meine Umgebung ist Win7 64bit, aber die Eeschema-Datei war UTF-8, daher habe ich den Zeichencode vorerst angegeben.
Teilenamen, die mit \ # beginnen, werden ausgeschlossen, da es sich um GND-Symbole und PWR_FLG handelt. Wenn mehrere Einheiten in einem Paket vorhanden sind, wie beispielsweise ein Operationsverstärker und ein Logik-IC, wird nur die erste Einheit extrahiert.
Obwohl es nicht verwendet wird, werden der Platzierungswinkel und die Spiegelinformationen jedes Symbols in der "Winkel" (Orientierungsmatrix) gespeichert. Ich denke, dass der Winkel oft später gedreht wird, und da es ziemlich mühsam war, die Matrix zu beurteilen, wird sie als Array gespeichert. Es speichert auch die Blattgröße des Schaltplans.
Verwenden Sie nach dem Extrahieren der Referenz und der Koordinaten die erfassten Karteninformationen, um die for-Anweisung in der Koordinatenwerteliste zu drehen und in absoluten Koordinaten auf der Karte zu platzieren (zu verschieben). Da die tatsächliche Größenanordnung in A4 zu breit ist, wird sie nach dem Skalieren der Koordinatenwerte angeordnet.
Ich habe darüber nachgedacht, die Kartengröße von PCBNew abzurufen und automatisch zu skalieren, aber derzeit scheint es, dass die ungefähre Kartengröße mit dem Skript nicht ermittelt werden kann. Daher verwende ich die Methode zur Eingabe des Skalierungswerts. Das Raster von Eeschema ist standardmäßig 50 mil, daher scheint ein Skalierungswert von 0,25 bis 0,5 genau richtig zu sein.
Außerdem werden der Rasterursprung und der Montageursprung extrahiert, sodass der Platzierungsursprung durch Ändern des Skripts ausgewählt werden kann. ~~ (Auskommentiert in den Zeilen 22 und 23) ~~
Vor dem Ausführen des Skripts
Damit es wie in der Abbildung unten aussieht.
Platzieren Sie das Skript an einer geeigneten Stelle in der Menüleiste von Pcbnew im Python-Skriptfenster
execfile ('absoluter Pfad \ ki_pre_place.py')
Ausführen als, geben Sie den Platzierungsursprung und die Skalierung ein und zeigen Sie sie erneut mit der Taste F3 an. Die Platzierung erfolgt wie unten gezeigt.
――Es kann nur meine Umgebung sein, aber ** Wenn Sie Schritt 4 oben überspringen, wird es nicht platziert. ** Es scheint, dass der Footprint auf dem Board sein muss, bevor das Skript ausgeführt wird.
―― ~~ Der Platzierungsursprung und die Skalierung werden als Anfangswerte angegeben. Wenn jedoch nach der Platzierung des Footprints eine Möglichkeit zur erneuten Anzeige mit einem Skript besteht, wird ein Dialogfeld wie das Ändern des Skalierungs- und Platzierungsursprungs nach dem Anzeigen des Ergebnisses und der erneuten Ausführung angezeigt Ich möchte es in Eingabe ändern. ~~
―― Was die Korrespondenz mit hierarchischen Dateien betrifft, so hat der Abschnitt $ Sch den Namen und die Koordinaten der hierarchischen Datei, so scheint es ganz so, aber ist die obige Realisierung eine Priorität? .. .. ――Bitte weisen Sie auf Probleme hin.
21.03.2016 Nachtrag Es unterstützt Skalierung, Ursprungsspezifikation und Wiederholungsversuche, ist aber dennoch praktisch.
Ich habe auch versucht, Python zu lernen, aber ich war beeindruckt, die gewünschten Funktionen realisieren zu können. Wir möchten uns bei den Entwicklern und denjenigen bedanken, die die Skriptinformationen bereitgestellt haben.
Obwohl es sich um ein solides Skript handelt, möchte ich den Teil, der Schaltplaninformationen extrahiert, wiederverwenden können. Da alle Informationen im Abschnitt "$ Comp" einmal in der Liste gespeichert sind, ist es möglicherweise einfacher, sie aus der Liste zu ziehen, als eine Bom aus der Zwischennetzliste zu erstellen. Ich denke, es ist, bis Eeschema Skripte unterstützt. ..
Abgesehen davon scheint OSSs 3D-CAD "FreeCAD" auch eine Python-Skriptfunktion zu haben. Es scheint nützlich zu sein, um Bibliotheken und Board-Konturen miteinander zu verknüpfen, auf Interferenzen zu prüfen usw.
Recommended Posts