Skip to content

Commit 84b7e71

Browse files
committed
Handle modified layer names
1 parent 9e83743 commit 84b7e71

File tree

5 files changed

+57
-31
lines changed

5 files changed

+57
-31
lines changed

SparkFunKiCadPanelizer/dialog/dialog.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,13 @@ def __init__(self, parent, config, layertable, ordering, panelizer, func):
118118
self.vscore.LayersGrid.AppendRows(len(self.layertable))
119119
# Initialize them
120120
row = 0
121-
for layer in self.layertable.keys():
121+
for layer, names in self.layertable.items():
122122
self.vscore.LayersGrid.SetCellValue(row, 0, "0") # JSON style
123123
self.vscore.LayersGrid.SetCellRenderer(row, 0, wx.grid.GridCellBoolRenderer())
124-
self.vscore.LayersGrid.SetCellValue(row, 1, layer)
124+
layerName = names['standardName']
125+
if names['actualName'] != names['standardName']:
126+
layerName += " (" + names['actualName'] + ")"
127+
self.vscore.LayersGrid.SetCellValue(row, 1, layerName)
125128
self.vscore.LayersGrid.SetReadOnly(row, 1)
126129
row += 1
127130

@@ -187,7 +190,10 @@ def CurrentSettings(self):
187190
if self.vscore_layer in item:
188191
for row in range(self.vscore.LayersGrid.GetNumberRows()):
189192
if self.vscore.LayersGrid.GetCellValue(row, 0) == "1":
190-
params.update({self.vscore_layer: self.vscore.LayersGrid.GetCellValue(row, 1)})
193+
layername = self.vscore.LayersGrid.GetCellValue(row, 1)
194+
if " (" in layername:
195+
layername = layername[:layername.find(" (")] # Trim the actual name - if present
196+
params.update({self.vscore_layer: layername})
191197
else:
192198
obj = getattr(self.general, "m_{}".format(item))
193199
if hasattr(obj, "GetValue"):

SparkFunKiCadPanelizer/panelizer/panelizer.py

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,32 @@ def startPanelizer(self, args, board=None, ordering=None, logger=None):
306306
# Set up layer table
307307
layertable = {}
308308
numlayers = pcbnew.PCB_LAYER_ID_COUNT
309+
edgeLayerNumber = None
310+
vScoreLayerNumber = None
311+
vScoreTextLayerNumber = None
309312
for i in range(numlayers):
310-
layertable[board.GetLayerName(i)] = i
313+
layertable[i] = {'standardName': board.GetStandardLayerName(i), 'actualName': board.GetLayerName(i)}
314+
if "Edge.Cuts" in board.GetStandardLayerName(i):
315+
edgeLayerNumber = i
316+
if V_SCORE_LAYER in board.GetStandardLayerName(i):
317+
vScoreLayerNumber = i
318+
if V_SCORE_TEXT_LAYER in board.GetStandardLayerName(i):
319+
vScoreTextLayerNumber = i
320+
321+
if edgeLayerNumber is None:
322+
report += "Edge.Cuts not found in layertable. Quitting.\n"
323+
sysExit = 2
324+
return sysExit, report
325+
326+
if vScoreLayerNumber is None:
327+
report += V_SCORE_LAYER + " not found in layertable. Quitting.\n"
328+
sysExit = 2
329+
return sysExit, report
330+
331+
if vScoreTextLayerNumber is None:
332+
report += V_SCORE_TEXT_LAYER + " not found in layertable. Quitting.\n"
333+
sysExit = 2
334+
return sysExit, report
311335

312336
# Get dimensions of board
313337
# Note: the bounding box width and height _include_ the Edge.Cuts line width.
@@ -324,7 +348,7 @@ def startPanelizer(self, args, board=None, ordering=None, logger=None):
324348
cutWidth = 0
325349
drawings = board.GetDrawings()
326350
for drawing in drawings:
327-
if drawing.IsOnLayer(layertable["Edge.Cuts"]):
351+
if drawing.IsOnLayer(edgeLayerNumber):
328352
if drawing.GetWidth() > cutWidth:
329353
cutWidth = drawing.GetWidth()
330354
#report += "Subtracting Edge.Cuts line width of {}mm.\n".format(cutWidth / SCALE)
@@ -404,7 +428,7 @@ def startPanelizer(self, args, board=None, ordering=None, logger=None):
404428
sparkxLogoSeen = False
405429
solderMask = None
406430
silkscreen = None
407-
numLayers = None
431+
numLayers = "Layers: {}".format(board.GetCopperLayerCount())
408432
controlledImpedance = None
409433
finish = None
410434
thickness = None
@@ -427,11 +451,6 @@ def startPanelizer(self, args, board=None, ordering=None, logger=None):
427451
drill = sourceTrack.GetDrill()
428452
if drill < minViaDrill:
429453
minViaDrill = drill
430-
layer = sourceTrack.GetLayerName()
431-
if numLayers is None and ("In1.Cu" in layer or "In2.Cu" in layer):
432-
numLayers = "Layers: 4"
433-
if "In3.Cu" in layer or "In4.Cu" in layer:
434-
numLayers = "Layers: 6"
435454
for x in range(0, NUM_X): # iterate through x direction
436455
for y in range(0, NUM_Y): # iterate through y direction
437456
if (x != 0) or (y != 0): # do not duplicate source object to location
@@ -619,7 +638,7 @@ def startPanelizer(self, args, board=None, ordering=None, logger=None):
619638
# Erase all existing edgeCuts objects (individual board outlines)
620639
#drawings = board.GetDrawings()
621640
#for drawing in drawings:
622-
# if drawing.IsOnLayer(layertable["Edge.Cuts"]):
641+
# if drawing.IsOnLayer(edgeLayerNumber):
623642
# drawing.DeleteStructure()
624643

625644
# Rail Edge.Cuts
@@ -742,7 +761,7 @@ def startPanelizer(self, args, board=None, ordering=None, logger=None):
742761
board.Add(edge)
743762
edge.SetStart(pcbnew.VECTOR2I(int(cut[0]), int(cut[1])))
744763
edge.SetEnd(pcbnew.VECTOR2I(int(cut[2]), int(cut[3])))
745-
edge.SetLayer(layertable["Edge.Cuts"])
764+
edge.SetLayer(edgeLayerNumber)
746765

747766
# Re-calculate board dimensions with new edge cuts
748767
panelWidth = board.GetBoardEdgesBoundingBox().GetWidth()
@@ -806,7 +825,7 @@ def startPanelizer(self, args, board=None, ordering=None, logger=None):
806825
v_score_line = pcbnew.PCB_SHAPE(board)
807826
v_score_line.SetStart(pcbnew.VECTOR2I(int(x_loc), int(vscore_top)))
808827
v_score_line.SetEnd(pcbnew.VECTOR2I(int(x_loc), int(vscore_bottom)))
809-
v_score_line.SetLayer(layertable[V_SCORE_LAYER])
828+
v_score_line.SetLayer(vScoreLayerNumber)
810829
v_score_line.SetWidth(int(V_SCORE_WIDTH * SCALE))
811830
board.Add(v_score_line)
812831
v_score_text = pcbnew.PCB_TEXT(board)
@@ -818,7 +837,7 @@ def startPanelizer(self, args, board=None, ordering=None, logger=None):
818837
v_score_text.SetTextSize(
819838
pcbnew.VECTOR2I(SCALE * V_SCORE_TEXT_SIZE, SCALE * V_SCORE_TEXT_SIZE)
820839
)
821-
v_score_text.SetLayer(layertable[V_SCORE_TEXT_LAYER])
840+
v_score_text.SetLayer(vScoreTextLayerNumber)
822841
v_score_text.SetTextAngle(pcbnew.EDA_ANGLE(900, pcbnew.TENTHS_OF_A_DEGREE_T))
823842
board.Add(v_score_text)
824843

@@ -856,7 +875,7 @@ def startPanelizer(self, args, board=None, ordering=None, logger=None):
856875
v_score_line = pcbnew.PCB_SHAPE(board)
857876
v_score_line.SetStart(pcbnew.VECTOR2I(int(vscore_left), int(y_loc)))
858877
v_score_line.SetEnd(pcbnew.VECTOR2I(int(vscore_right), int(y_loc)))
859-
v_score_line.SetLayer(layertable[V_SCORE_LAYER])
878+
v_score_line.SetLayer(vScoreLayerNumber)
860879
v_score_line.SetWidth(int(V_SCORE_WIDTH * SCALE))
861880
board.Add(v_score_line)
862881
v_score_text = pcbnew.PCB_TEXT(board)
@@ -868,7 +887,7 @@ def startPanelizer(self, args, board=None, ordering=None, logger=None):
868887
v_score_text.SetTextSize(
869888
pcbnew.VECTOR2I(SCALE * V_SCORE_TEXT_SIZE, SCALE * V_SCORE_TEXT_SIZE)
870889
)
871-
v_score_text.SetLayer(layertable[V_SCORE_TEXT_LAYER])
890+
v_score_text.SetLayer(vScoreTextLayerNumber)
872891
v_score_text.SetTextAngle(pcbnew.EDA_ANGLE(0, pcbnew.TENTHS_OF_A_DEGREE_T))
873892
board.Add(v_score_text)
874893

@@ -919,7 +938,7 @@ def startPanelizer(self, args, board=None, ordering=None, logger=None):
919938
route_text = pcbnew.PCB_TEXT(board)
920939
route_text.SetText("ROUTE OUT")
921940
route_text.SetTextSize(pcbnew.VECTOR2I(SCALE * V_SCORE_TEXT_SIZE, SCALE * V_SCORE_TEXT_SIZE))
922-
route_text.SetLayer(layertable[V_SCORE_TEXT_LAYER])
941+
route_text.SetLayer(vScoreLayerNumber)
923942
route_text.SetHorizJustify(pcbnew.GR_TEXT_H_ALIGN_CENTER)
924943
route_text.SetPosition(pcbnew.VECTOR2I(pos[0], pos[1]))
925944
route_text.SetTextAngle(pcbnew.EDA_ANGLE(pos[2], pcbnew.TENTHS_OF_A_DEGREE_T))
@@ -930,7 +949,7 @@ def startPanelizer(self, args, board=None, ordering=None, logger=None):
930949
route_text = pcbnew.PCB_TEXT(board)
931950
route_text.SetText("DO NOT REMOVE")
932951
route_text.SetTextSize(pcbnew.VECTOR2I(SCALE * V_SCORE_TEXT_SIZE, SCALE * V_SCORE_TEXT_SIZE))
933-
route_text.SetLayer(layertable[V_SCORE_TEXT_LAYER])
952+
route_text.SetLayer(vScoreTextLayerNumber)
934953
route_text.SetHorizJustify(pcbnew.GR_TEXT_H_ALIGN_CENTER)
935954
route_text.SetPosition(pcbnew.VECTOR2I(arrayCenter.x, arrayCenter.y))
936955
board.Add(route_text)

SparkFunKiCadPanelizer/plugin.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,20 +74,19 @@ def Run(self):
7474
layertable = {}
7575
numlayers = pcbnew.PCB_LAYER_ID_COUNT
7676
for i in range(numlayers):
77-
layertable[board.GetLayerName(i)] = i
77+
layertable[i] = {'standardName': board.GetStandardLayerName(i), 'actualName': board.GetLayerName(i)}
7878

7979
# Check the number of copper layers. Delete unwanted layers from the table.
8080
wantedCopper = []
81-
if board.GetCopperLayerCount() >= 2:
82-
wantedCopper.extend(['F.Cu','B.Cu'])
83-
if board.GetCopperLayerCount() >= 4:
84-
wantedCopper.extend(['In1.Cu','In2.Cu'])
85-
if board.GetCopperLayerCount() >= 6:
86-
wantedCopper.extend(['In3.Cu','In4.Cu'])
81+
wantedCopper.append("F.Cu")
82+
wantedCopper.append("B.Cu")
83+
if (board.GetCopperLayerCount() > 2):
84+
for i in range(1, board.GetCopperLayerCount() - 1):
85+
wantedCopper.append("In{}.Cu".format(i))
8786
deleteLayers = []
88-
for layer in layertable.keys():
89-
if layer[-3:] == ".Cu":
90-
if layer not in wantedCopper:
87+
for layer, names in layertable.items():
88+
if names['standardName'][-3:] == ".Cu":
89+
if names['standardName'] not in wantedCopper:
9190
deleteLayers.append(layer)
9291
for layer in deleteLayers:
9392
layertable.pop(layer, None)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "1.1.0"
1+
__version__ = "1.1.1"

SparkFunKiCadPanelizer/test_dialog.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ def OnInit(self):
1111

1212
config_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'panel_config.json')
1313
ordering_instructions = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'ordering_instructions.txt')
14-
layertable = {'F.Cu': 1, 'User.Comments': 2, 'User.1':3}
14+
layertable = {0: {'standardName': 'F.Cu', 'actualName': 'F-Cu-Renamed'},
15+
1: {'standardName': 'User.Comments', 'actualName': 'User-Comments-Renamed'},
16+
2: {'standardName': 'User.1', 'actualName': 'User-1-Renamed'}}
1517

1618
self.frame = frame = Dialog(None, config_file, layertable, ordering_instructions, Panelizer(), self.run)
1719
if frame.ShowModal() == wx.ID_OK:

0 commit comments

Comments
 (0)