1212
1313class PcbnewParser (EcadParser ):
1414
15- def __init__ (self , file_name , logger , board = None ):
16- super (PcbnewParser , self ).__init__ (file_name , logger )
15+ def __init__ (self , file_name , config , logger , board = None ):
16+ super (PcbnewParser , self ).__init__ (file_name , config , logger )
1717 self .board = board
1818 if self .board is None :
1919 self .board = pcbnew .LoadBoard (self .file_name ) # type: pcbnew.BOARD
@@ -273,6 +273,8 @@ def parse_pad(self, pad):
273273 pad_dict ["type" ] = "smd"
274274 if hasattr (pad , "GetOffset" ):
275275 pad_dict ["offset" ] = self .normalize (pad .GetOffset ())
276+ if self .config .include_nets :
277+ pad_dict ["net" ] = pad .GetNetname ()
276278
277279 return pad_dict
278280
@@ -354,12 +356,14 @@ def parse_tracks(self, tracks):
354356 result [l ].append (track_dict )
355357 else :
356358 if track .GetLayer () in [pcbnew .F_Cu , pcbnew .B_Cu ]:
357- result [ track . GetLayer ()]. append ( {
359+ track_dict = {
358360 "start" : self .normalize (track .GetStart ()),
359361 "end" : self .normalize (track .GetEnd ()),
360362 "width" : track .GetWidth () * 1e-6 ,
361- "net" : track .GetNetname (),
362- })
363+ }
364+ if self .config .include_nets :
365+ track_dict ["net" ] = track .GetNetname ()
366+ result [track .GetLayer ()].append (track_dict )
363367
364368 return {
365369 'F' : result .get (pcbnew .F_Cu ),
@@ -368,20 +372,30 @@ def parse_tracks(self, tracks):
368372
369373 def parse_zones (self , zones ):
370374 result = {pcbnew .F_Cu : [], pcbnew .B_Cu : []}
371- for zone in zones :
375+ for zone in zones : # type: (pcbnew.ZONE_CONTAINER)
372376 if not zone .IsFilled () or zone .GetIsKeepout ():
373377 continue
374378 if zone .GetLayer () in [pcbnew .F_Cu , pcbnew .B_Cu ]:
375- result [ zone . GetLayer ()]. append ( {
379+ zone_dict = {
376380 "polygons" : self .parse_poly_set (zone .GetFilledPolysList ()),
377- "net" : zone .GetNetname (),
378- })
381+ }
382+ if self .config .include_nets :
383+ zone_dict ["net" ] = zone .GetNetname ()
384+ result [zone .GetLayer ()].append (zone_dict )
379385
380386 return {
381387 'F' : result .get (pcbnew .F_Cu ),
382388 'B' : result .get (pcbnew .B_Cu )
383389 }
384390
391+ @staticmethod
392+ def parse_netlist (net_info ):
393+ # type: (pcbnew.NETINFO_LIST) -> list
394+ nets = net_info .NetsByName ().asdict ().keys ()
395+ nets = [str (s ) for s in nets ]
396+ nets .sort ()
397+ return nets
398+
385399 @staticmethod
386400 def module_to_component (module ):
387401 # type: (pcbnew.MODULE) -> Component
@@ -452,8 +466,11 @@ def parse(self):
452466 "bom" : {},
453467 "font_data" : self .font_parser .get_parsed_font ()
454468 }
455- pcbdata ["tracks" ] = self .parse_tracks (self .board .GetTracks ())
456- pcbdata ["zones" ] = self .parse_zones (self .board .Zones ())
469+ if self .config .include_tracks :
470+ pcbdata ["tracks" ] = self .parse_tracks (self .board .GetTracks ())
471+ pcbdata ["zones" ] = self .parse_zones (self .board .Zones ())
472+ if self .config .include_nets :
473+ pcbdata ["nets" ] = self .parse_netlist (self .board .GetNetInfo ())
457474 components = [self .module_to_component (m ) for m in pcb_modules ]
458475
459476 return pcbdata , components
@@ -485,5 +502,5 @@ def Run(self):
485502 logger .error ('Please save the board file before generating BOM.' )
486503 return
487504
488- parser = PcbnewParser (pcb_file_name , logger , board )
505+ parser = PcbnewParser (pcb_file_name , config , logger , board )
489506 ibom .run_with_dialog (parser , config , logger )
0 commit comments