Script Python pour l'empreinte de KiCad-Pre-place presque selon la disposition du schéma de circuit

Créons un script pour KiCad tout en étudiant Python

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)

Sites et documents de référence auxquels j'ai fait référence cette fois

Référence du script KiCad Python

blog de hanya

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

Description du script

Le script est le suivant. Le flux de base est

  1. Obtenez des informations sur la carte
  2. Lisez le fichier de schéma de circuit
  3. Extrayez la section "$ Comp" (informations sur les symboles schématiques individuels) et enregistrez-la dans la liste
  4. Exclure les symboles d'alimentation tels que GND
  5. Extraire la première unité
  6. Extraire la référence et les coordonnées
  7. Placement des pièces en fonction de la référence (changement de la valeur absolue des coordonnées)

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

Extraction de coordonnées du symbole de schéma de circuit (composant)

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.

Placement dans le tableau

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

Comment utiliser

Avant d'exécuter le script

  1. Créer une netlist
  2. Création et attribution d'empreintes
  3. Reflet de la netlist à bord
  4. Placement de l'empreinte (déplacement global / placement en mode empreinte → Développer toutes les empreintes

Pour le faire ressembler à la figure ci-dessous.

kicad_pre_place_1.png

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.

kicad_pre_place_2.png

point important

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

Plans d'amélioration futurs

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

Impressions de la création du script

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

Script Python pour l'empreinte de KiCad-Pre-place presque selon la disposition du schéma de circuit
Le moyen le plus rapide pour les débutants de maîtriser Python
Constantes Python comme None (selon la référence)
Script Python pour obtenir une liste d'exemples d'entrée pour le concours AtCoder
Modèle de script python pour lire le contenu du fichier
[python] Comment utiliser Matplotlib, une bibliothèque pour dessiner des graphiques
[Pour les débutants] Script dans 10 lignes (4. Connexion de python à sqlite3)
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image par eux-mêmes
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
Point selon l'image
~ Conseils pour les débutants de Python présentés avec amour par Pythonista ③ ~
Introduction à Python pour, pendant
Comment modifier le niveau de journalisation d'Azure SDK pour Python
Créez un script shell pour exécuter le fichier python plusieurs fois
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Atom: Remarque pour l'erreur d'indentation lors de la copie du script Python dans le shell
Script pour sauvegarder les dossiers sur le serveur sur Google Drive
Un script qui renvoie 0, 1 attaché au premier Python prime
Obtenez le chemin du script en Python
Dans la commande python, python pointe vers python3.8
Comment obtenir la version Python
[python] Script de copie pour générer un journal de copie
Script de création de couche AWS pour python
Voir python pour la première fois
À quoi sert le trait de soulignement Python (_)?
Premiers pas avec Python pour les non-ingénieurs
Commande pour le répertoire courant Python
[Python] Changer l'alphabet en nombre
Ajouter des points forts de la syntaxe du langage Kv à Spyder dans Python IDE
[Introduction à Udemy Python3 + Application] 47. Traitez le dictionnaire avec une instruction for
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 9 Utilisation à partir du langage C
Python> sys.path> Liste de chaînes indiquant le chemin pour rechercher des modules
Écrivain AtCoder J'ai écrit un script qui regroupe les concours pour chaque écrivain
Prenons la version gratuite "Introduction à Python pour l'apprentissage automatique" en ligne jusqu'au 27/04
Changer le module à charger pour chaque environnement d'exécution en Python
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image pour eux-mêmes 6 Améliorer le code Python