Depuis la version 4.0 de KiCad, Pcbnew prend en charge les scripts Python, et il est possible d'acquérir des informations de la carte, de modifier les attributs à la fois et d'automatiser le travail, j'ai donc créé ce script et étudié Python. Fait. Même si la disposition des pièces est prise en compte lors du dessin du schéma de circuit, il n'est pas étonnant que ces informations soient effacées lorsque le filet est importé dans la carte CAO.
Certains CAO commerciaux peuvent refléter non seulement la disposition des pièces, mais aussi l'ordre du câblage et le point de mise à la terre en un point, mais il sera beaucoup plus facile de refléter simplement la disposition approximative.
Vidéo d'exécution du script (Youtube)
Référence du script KiCad Python
Groupe d'étude sur la technologie des robots de l'Institut de technologie de Tokyo
Ceci est un document du format de fichier d'Eeschema traduit par des volontaires de kicad.jp auparavant, mais la structure du fichier de schéma de circuit est la même en version 4.0.1 que dans la version BZR4022. est.
Pour différents formats de KiCad, il y avait un document dans le répertoire d'installation de la version précédente, mais il ne se trouve pas dans la v4.0 ou une version ultérieure, et le pdf est publié sur le tableau de bord. 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
Le script est le suivant. Le flux de base est
est.
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
Heureusement si vous pouvez utiliser la netlist intermédiaire qu'Eeschema crache! J'ai pensé, mais bien sûr, malheureusement, il n'y a pas d'informations de coordonnées du symbole. Par conséquent, je crée un nom de fichier de schéma de circuit à partir du nom du fichier de carte actuellement ouvert, je lis le fichier de schéma de circuit depuis le début et j'en extrait les pièces nécessaires. Mon environnement est Win7 64 bits, mais le fichier Eeschema était UTF-8, j'ai donc spécifié le code de caractère pour le moment.
Les noms de pièces commençant par \ # sont exclus car ce sont des symboles GND et PWR_FLG. De plus, lorsqu'il y a plusieurs unités dans un même boîtier, comme un amplificateur opérationnel et un circuit intégré logique, seule la première unité est extraite.
Bien qu'il ne soit pas utilisé, l'angle de placement et les informations de miroir de chaque symbole sont stockés dans «l'angle» (matrice d'orientation). Je pense que l'angle est souvent tourné plus tard, et comme il était assez gênant de juger la matrice, il est stocké sous forme de tableau. Il stocke également la taille de feuille du schéma de circuit.
Après avoir extrait la référence et les coordonnées, utilisez les informations de carte acquises pour faire pivoter l'instruction for dans la liste des valeurs de coordonnées et placez-la (déplacez-la) sur la carte en coordonnées absolues. Étant donné que la disposition de taille réelle dans A4 est trop large, elle est organisée après la mise à l'échelle des valeurs de coordonnées.
J'ai pensé à obtenir la taille de la carte à partir de PCBNew et à la mettre à l'échelle automatiquement, mais à l'heure actuelle, il semble que la taille approximative de la carte ne puisse pas être obtenue avec le script, j'utilise donc la méthode de saisie de la valeur d'échelle. La grille d'Eeschema est de 50 mil par défaut, donc une valeur d'échelle de 0,25 à 0,5 semble être juste.
De plus, l'origine de la grille et l'origine du montage sont extraites afin que l'origine du placement puisse être sélectionnée en modifiant le script. ~~ (Commenté sur les lignes 22 et 23) ~~
Avant d'exécuter le script
Pour le faire ressembler à la figure ci-dessous.
Placez le script dans un endroit approprié, depuis la barre de menu de Pcbnew, depuis la fenêtre de script Python
execfile ('chemin absolu \ ki_pre_place.py')
Exécutez en tant que, entrez l'origine et l'échelle du placement et réaffichez avec la touche F3, le placement sera comme indiqué ci-dessous.
――Il peut s'agir uniquement de mon environnement, mais ** Si vous sautez l'étape 4 ci-dessus, il ne sera pas placé. ** Il semble que l'empreinte doit être sur la carte avant d'exécuter le script.
――En ce qui concerne la correspondance avec le fichier hiérarchique, la section $ Sch a le nom et les coordonnées du fichier hiérarchique, donc cela semble tout à fait le cas, mais la réalisation ci-dessus est-elle priorisée? .. .. ―― Veuillez signaler tout problème.
2016-03-21 Addendum Il prend en charge la mise à l'échelle, la spécification d'origine et les nouvelles tentatives, mais cela reste pratique.
J'ai aussi essayé d'étudier Python, mais j'ai été impressionné de pouvoir réaliser les fonctions que je voulais. Nous remercions les développeurs et ceux qui ont fourni les informations sur le script.
Bien que ce soit un script solide, j'aimerais pouvoir réutiliser la partie qui extrait les informations du schéma de circuit. Puisque toutes les informations de la section "$ Comp" sont stockées une fois dans la liste, il peut être plus facile de les extraire de la liste que de créer une nomenclature à partir de la liste des réseaux intermédiaires. Je pense que c'est jusqu'à ce qu'Eeschema prenne en charge les scripts. ..
En passant, il semble que la CAO 3D "FreeCAD" d'OSS dispose également d'une fonction de script Python. Cela semble utile pour relier les bibliothèques et les contours de cartes entre eux, vérifier les interférences, etc.
Recommended Posts