@@ -266,6 +266,8 @@ def _add_track(self, el, net):
266
266
trk ['width' ] = float (el .attrib ['drill' ]) + 2 * self .min_via_w \
267
267
if 'diameter' not in el .attrib else float (
268
268
el .attrib ['diameter' ])
269
+ if float (el .attrib ['drill' ]) >= self .min_drill_via_untented :
270
+ trk ['drillsize' ] = float (el .attrib ['drill' ])
269
271
self .pcbdata ['tracks' ]['F' ].append (trk )
270
272
self .pcbdata ['tracks' ]['B' ].append (trk )
271
273
@@ -715,6 +717,31 @@ def _add_parsed_font_data(self):
715
717
if c not in self .pcbdata ['font_data' ]:
716
718
self .pcbdata ['font_data' ][c ] = wl
717
719
720
+ def _parse_param_length (self , name , root , default ):
721
+ # parse named parameter (typically a design rule) assuming it is in
722
+ # length units (mil or mm)
723
+ p = [el .attrib ['value' ] for el in root .iter ('param' ) if
724
+ el .attrib ['name' ] == name ]
725
+ if len (p ) == 0 :
726
+ self .logger .warning ("{0} not found, defaulting to {1}"
727
+ .format (name , default ))
728
+ return default
729
+ else :
730
+ if len (p ) > 1 :
731
+ self .logger .warning (
732
+ "Multiple {0} found, using first occurrence" .format (name ))
733
+ p = p [0 ]
734
+ p_val = float ('' .join (d for d in p if d in string .digits + '.' ))
735
+ p_units = ('' .join (d for d in p if d in string .ascii_lowercase ))
736
+
737
+ if p_units == 'mm' :
738
+ return p_val
739
+ elif p_units == 'mil' :
740
+ return p_val * 0.0254
741
+ else :
742
+ self .logger .error ("Unsupported units {0} on {1}"
743
+ .format (p_units , name ))
744
+
718
745
def parse (self ):
719
746
ext = os .path .splitext (self .file_name )[1 ]
720
747
@@ -752,28 +779,16 @@ def _parse(self, brdfile):
752
779
# Build library mapping elements' pads to nets
753
780
self ._parse_pad_nets (signals )
754
781
755
- # Determine minimum via annular ring from board design rules
782
+ # Parse needed design rules
783
+
784
+ # Minimum via annular ring
756
785
# (Needed in order to calculate through-hole pad diameters correctly)
757
- mv = [el .attrib ['value' ] for el in root .iter ('param' ) if
758
- el .attrib ['name' ] == 'rlMinViaOuter' ]
759
- if len (mv ) == 0 :
760
- self .logger .warning ("rlMinViaOuter not found, defaulting to 0" )
761
- self .min_via_w = 0
762
- else :
763
- if len (mv ) > 1 :
764
- self .logger .warning (
765
- "Multiple rlMinViaOuter found, using first occurrence" )
766
- mv = mv [0 ]
767
- mv_val = float ('' .join (d for d in mv if d in string .digits + '.' ))
768
- mv_units = ('' .join (d for d in mv if d in string .ascii_lowercase ))
769
-
770
- if mv_units == 'mm' :
771
- self .min_via_w = mv_val
772
- elif mv_units == 'mil' :
773
- self .min_via_w = mv_val * 0.0254
774
- else :
775
- self .logger .error ("Unsupported units %s on rlMinViaOuter" ,
776
- mv_units )
786
+ self .min_via_w = (
787
+ self ._parse_param_length ('rlMinViaOuter' , root , default = 0 ))
788
+
789
+ # Minimum drill diameter above which vias will be un-tented
790
+ self .min_drill_via_untented = (
791
+ self ._parse_param_length ('mlViaStopLimit' , root , default = 0 ))
777
792
778
793
# Signals --> nets
779
794
if self .config .include_nets :
0 commit comments