Skip to content

Commit 48bdcec

Browse files
committed
[Layers] Decoupled from pcbnew
- Started to add support for KiCad 11, just the `pcbnew` part - The code using the BOARD class isn't migrated yet
1 parent 5d0f25d commit 48bdcec

5 files changed

Lines changed: 194 additions & 130 deletions

File tree

kibot/__main__.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,9 +379,95 @@ def get_kicad_version():
379379
GS.ki11 = GS.kicad_version_major >= 11 or (GS.kicad_version_major == 10 and GS.kicad_version_minor == 99)
380380

381381

382+
def get_layers_info_pn():
383+
pcbnew = GS.pn
384+
GS.DEFAULT_LAYER_NAMES = {
385+
'F.Cu': pcbnew.F_Cu,
386+
'B.Cu': pcbnew.B_Cu,
387+
'F.Adhes': pcbnew.F_Adhes,
388+
'B.Adhes': pcbnew.B_Adhes,
389+
'F.Paste': pcbnew.F_Paste,
390+
'B.Paste': pcbnew.B_Paste,
391+
'F.SilkS': pcbnew.F_SilkS,
392+
'B.SilkS': pcbnew.B_SilkS,
393+
'F.Mask': pcbnew.F_Mask,
394+
'B.Mask': pcbnew.B_Mask,
395+
'Dwgs.User': pcbnew.Dwgs_User,
396+
'Cmts.User': pcbnew.Cmts_User,
397+
'Eco1.User': pcbnew.Eco1_User,
398+
'Eco2.User': pcbnew.Eco2_User,
399+
'Edge.Cuts': pcbnew.Edge_Cuts,
400+
'Margin': pcbnew.Margin,
401+
'F.CrtYd': pcbnew.F_CrtYd,
402+
'B.CrtYd': pcbnew.B_CrtYd,
403+
'F.Fab': pcbnew.F_Fab,
404+
'B.Fab': pcbnew.B_Fab,
405+
}
406+
# Add all the Inner layers
407+
for i in range(1, 31):
408+
name = 'In'+str(i)+'.Cu'
409+
GS.DEFAULT_INNER_LAYER_NAMES.add(name)
410+
GS.DEFAULT_LAYER_NAMES[name] = (i+1)*2 if GS.ki9 else pcbnew.In1_Cu+i-1
411+
GS.DEFAULT_LAYER_DESC[name] = 'Inner layer '+str(i)
412+
if GS.ki6:
413+
# Add all the User.N layers
414+
step = 2 if GS.ki9 else 1
415+
for i in range(1, 10):
416+
name = 'User.'+str(i)
417+
GS.DEFAULT_LAYER_NAMES[name] = pcbnew.User_1+(i-1)*step
418+
GS.DEFAULT_LAYER_DESC[name] = 'User layer '+str(i)
419+
GS.F_Cu = pcbnew.F_Cu
420+
GS.B_Cu = pcbnew.B_Cu
421+
GS.F_Adhes = pcbnew.F_Adhes
422+
GS.B_Adhes = pcbnew.B_Adhes
423+
GS.F_Paste = pcbnew.F_Paste
424+
GS.B_Paste = pcbnew.B_Paste
425+
GS.F_SilkS = pcbnew.F_SilkS
426+
GS.B_SilkS = pcbnew.B_SilkS
427+
GS.F_Mask = pcbnew.F_Mask
428+
GS.B_Mask = pcbnew.B_Mask
429+
GS.Edge_Cuts = pcbnew.Edge_Cuts
430+
431+
432+
def get_layers_info_kp():
433+
kipy = GS.kp
434+
for i in range(128):
435+
name = kipy.util.board_layer.canonical_name(i)
436+
if name == 'Unknown':
437+
continue
438+
GS.DEFAULT_LAYER_NAMES[name] = i
439+
if name.startswith('In') and name.endswith('.Cu'):
440+
GS.DEFAULT_INNER_LAYER_NAMES.add(name)
441+
GS.DEFAULT_LAYER_DESC[name] = 'Inner layer '+name[2:-3]
442+
elif name.startswith('User.'):
443+
GS.DEFAULT_LAYER_DESC[name] = 'User layer '+name[5:]
444+
GS.F_Cu = GS.DEFAULT_LAYER_NAMES['F.Cu']
445+
GS.B_Cu = GS.DEFAULT_LAYER_NAMES['B.Cu']
446+
GS.F_Adhes = GS.DEFAULT_LAYER_NAMES['F.Adhes']
447+
GS.B_Adhes = GS.DEFAULT_LAYER_NAMES['B.Adhes']
448+
GS.F_Paste = GS.DEFAULT_LAYER_NAMES['F.Paste']
449+
GS.B_Paste = GS.DEFAULT_LAYER_NAMES['B.Paste']
450+
GS.F_SilkS = GS.DEFAULT_LAYER_NAMES['F.SilkS']
451+
GS.B_SilkS = GS.DEFAULT_LAYER_NAMES['B.SilkS']
452+
GS.F_Mask = GS.DEFAULT_LAYER_NAMES['F.Mask']
453+
GS.B_Mask = GS.DEFAULT_LAYER_NAMES['B.Mask']
454+
GS.Edge_Cuts = GS.DEFAULT_LAYER_NAMES['Edge.Cuts']
455+
456+
457+
def get_layers_info():
458+
if GS.pn is not None:
459+
get_layers_info_pn()
460+
else:
461+
get_layers_info_kp()
462+
GS.ID_2_DEFAULT_NAME = {v: k for k, v in GS.DEFAULT_LAYER_NAMES.items()}
463+
for k, v in GS.KICAD6_RENAME.items():
464+
GS.DEFAULT_LAYER_NAMES[v] = GS.DEFAULT_LAYER_NAMES[k]
465+
466+
382467
def detect_kicad():
383468
import_kicad_api()
384469
get_kicad_version()
470+
get_layers_info()
385471

386472
# Setup details dependent on the API version
387473
if GS.ki10 and GS.pn is not None:

kibot/gs.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,81 @@ class GS(object):
146146
VIATYPE_BLIND_BURIED = 2
147147
VIATYPE_MICROVIA = 1
148148
#
149+
# KiCad layers from pcbnew or kicad-python
150+
# Collected in __main__.py mainly used by layers.py
151+
#
152+
# Default names
153+
DEFAULT_LAYER_NAMES = {}
154+
# Default descriptions
155+
DEFAULT_LAYER_DESC = {
156+
'F.Cu': 'Front copper',
157+
'B.Cu': 'Bottom copper',
158+
'F.Adhes': 'Front adhesive (glue)',
159+
'B.Adhes': 'Bottom adhesive (glue)',
160+
'F.Adhesive': 'Front adhesive (glue)',
161+
'B.Adhesive': 'Bottom adhesive (glue)',
162+
'F.Paste': 'Front solder paste',
163+
'B.Paste': 'Bottom solder paste',
164+
'F.SilkS': 'Front silkscreen (artwork)',
165+
'B.SilkS': 'Bottom silkscreen (artwork)',
166+
'F.Silkscreen': 'Front silkscreen (artwork)',
167+
'B.Silkscreen': 'Bottom silkscreen (artwork)',
168+
'F.Mask': 'Front soldermask (negative)',
169+
'B.Mask': 'Bottom soldermask (negative)',
170+
'Dwgs.User': 'User drawings',
171+
'User.Drawings': 'User drawings',
172+
'Cmts.User': 'User comments',
173+
'User.Comments': 'User comments',
174+
'Eco1.User': 'For user usage 1',
175+
'Eco2.User': 'For user usage 2',
176+
'User.Eco1': 'For user usage 1',
177+
'User.Eco2': 'For user usage 2',
178+
'Edge.Cuts': 'Board shape',
179+
'Margin': 'Margin relative to edge cut',
180+
'F.CrtYd': 'Front courtyard area',
181+
'B.CrtYd': 'Bottom courtyard area',
182+
'F.Courtyard': 'Front courtyard area',
183+
'B.Courtyard': 'Bottom courtyard area',
184+
'F.Fab': 'Front documentation',
185+
'B.Fab': 'Bottom documentation',
186+
'User.1': 'User layer 1',
187+
'User.2': 'User layer 2',
188+
'User.3': 'User layer 3',
189+
'User.4': 'User layer 4',
190+
'User.5': 'User layer 5',
191+
'User.6': 'User layer 6',
192+
'User.7': 'User layer 7',
193+
'User.8': 'User layer 8',
194+
'User.9': 'User layer 9',
195+
}
196+
DEFAULT_INNER_LAYER_NAMES = set()
197+
# ID to default (canonical) name table
198+
ID_2_DEFAULT_NAME = None
199+
# KiCad 6 renamed some layers, this the translation
200+
KICAD6_RENAME = {
201+
'F.Adhes': 'F.Adhesive',
202+
'B.Adhes': 'B.Adhesive',
203+
'F.SilkS': 'F.Silkscreen',
204+
'B.SilkS': 'B.Silkscreen',
205+
'Dwgs.User': 'User.Drawings',
206+
'Cmts.User': 'User.Comments',
207+
'Eco1.User': 'User.Eco1',
208+
'Eco2.User': 'User.Eco2',
209+
'F.CrtYd': 'F.Courtyard',
210+
'B.CrtYd': 'B.Courtyard',
211+
}
212+
F_Cu = None
213+
B_Cu = None
214+
F_Adhes = None
215+
B_Adhes = None
216+
F_Paste = None
217+
B_Paste = None
218+
F_SilkS = None
219+
B_SilkS = None
220+
F_Mask = None
221+
B_Mask = None
222+
Edge_Cuts = None
223+
#
149224
# Global defaults
150225
#
151226
# Options from command line

0 commit comments

Comments
 (0)