Python-Skript für KiCad-Pre-Place-Footprint fast entsprechend dem Layout des Schaltplans

Lassen Sie uns ein Skript für KiCad erstellen, während wir Python studieren

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)

Websites und Referenzmaterialien, auf die ich mich diesmal bezog

KiCad Python Script Reference

Hanyas Blog

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

Skriptbeschreibung

Das Skript ist wie folgt. Der Grundfluss ist

  1. Holen Sie sich Board-Informationen
  2. Lesen Sie die Schaltplandatei
  3. Extrahieren Sie den Abschnitt "$ Comp" (Informationen zu einzelnen Schaltplansymbolen) und speichern Sie ihn in der Liste
  4. Schließen Sie Energiesymbole wie GND aus
  5. Extrahieren Sie die erste Einheit
  6. Referenz und Koordinaten extrahieren
  7. Platzierung der Teile basierend auf der Referenz (Änderung des absoluten Koordinatenwerts)

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

Koordinatenextraktion des Schaltplansymbols (Komponente)

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.

Platzierung in der Tafel

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) ~~

Wie benutzt man

Vor dem Ausführen des Skripts

  1. Erstellen einer Netzliste
  2. Erstellen und Zuweisen von Footprints
  3. Reflexion der Netzliste an Bord
  4. Platzierung des Footprints (Globale Verschiebung / Platzierung im Footprint-Modus → Erweitern Sie alle Footprints

Damit es wie in der Abbildung unten aussieht.

kicad_pre_place_1.png

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.

kicad_pre_place_2.png

wichtiger Punkt

――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.

Zukünftige Verbesserungspläne

―― ~~ 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.

Impressionen beim Erstellen des Skripts

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

Python-Skript für KiCad-Pre-Place-Footprint fast entsprechend dem Layout des Schaltplans
Der schnellste Weg für Anfänger, um Python zu beherrschen
Python-Konstanten wie None (laut Referenz)
Python-Skript zum Abrufen einer Liste von Eingabebeispielen für den AtCoder-Wettbewerb
Vorlage des Python-Skripts zum Lesen des Inhalts der Datei
[Python] Verwendung von Matplotlib, einer Bibliothek zum Zeichnen von Diagrammen
[Für Anfänger] Skript innerhalb von 10 Zeilen (4. Verbindung von Python zu sqlite3)
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Punkt entsprechend dem Bild
~ Tipps für Python-Anfänger mit Liebe von Pythonista ③ ~
Einführung in Python For, While
So ändern Sie die Protokollstufe von Azure SDK für Python
Erstellen Sie ein Shell-Skript, um die Python-Datei mehrmals auszuführen
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
Atom: Hinweis zum Einrückungsfehler beim Kopieren des Python-Skripts in die Shell
Skript zum Sichern von Ordnern auf dem Server in Google Drive
Ein Skript, das 0, 1 an die erste Python-Primzahl zurückgibt
Holen Sie sich den Skriptpfad in Python
Im Python-Befehl zeigt Python auf Python3.8
So erhalten Sie die Python-Version
[Python] Kopierskript zum Generieren eines Kopierprotokolls
AWS Layer Creation Script für Python
Siehe Python zum ersten Mal
Wofür ist der Python-Unterstrich (_)?
Erste Schritte mit Python für Nicht-Ingenieure
Befehl für das aktuelle Verzeichnis Python
[Python] Ändere das Alphabet in eine Zahl
Hinzufügen von Kv-Sprachsyntax-Highlights zu Spyder in Python IDE
[Einführung in die Udemy Python3 + -Anwendung] 47. Verarbeiten Sie das Wörterbuch mit einer for-Anweisung
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 9 Verwendung aus der C-Sprache
Python> sys.path> Liste der Zeichenfolgen, die den Pfad für die Suche nach Modulen angeben
AtCoder-Autor Ich habe ein Skript geschrieben, das Wettbewerbe für jeden Autor zusammenfasst
Lassen Sie uns die kostenlose "Einführung in Python für maschinelles Lernen" bis zum 27. April online stellen
Wechseln Sie das zu ladende Modul für jede Ausführungsumgebung in Python
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 6 Verbessern Sie den Python-Code