Skip to content

Commit a05f4ac

Browse files
Funkenjaegerqu1ck
authored andcommitted
Initial provisions for un-tented vias (fusion/eagle)
new 'drillsize' parameter added to tracks, only included for un-tented vias as determined by relevant design rule Render un-tented vias like through-hole pads Simplify rendering code
1 parent 77eb20b commit a05f4ac

File tree

3 files changed

+68
-37
lines changed

3 files changed

+68
-37
lines changed

DATAFORMAT.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ pcbdata = {
6060
// Common fields
6161
"width": w,
6262
// Optional net name
63-
"net": netname
63+
"net": netname,
64+
// Optional drill diameter (un-tented vias only)
65+
"drillsize": x
6466
},
6567
...
6668
],

InteractiveHtmlBom/ecad/fusion_eagle.py

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,8 @@ def _add_track(self, el, net):
266266
trk['width'] = float(el.attrib['drill']) + 2 * self.min_via_w \
267267
if 'diameter' not in el.attrib else float(
268268
el.attrib['diameter'])
269+
if float(el.attrib['drill']) >= self.min_drill_via_untented:
270+
trk['drillsize'] = float(el.attrib['drill'])
269271
self.pcbdata['tracks']['F'].append(trk)
270272
self.pcbdata['tracks']['B'].append(trk)
271273

@@ -715,6 +717,31 @@ def _add_parsed_font_data(self):
715717
if c not in self.pcbdata['font_data']:
716718
self.pcbdata['font_data'][c] = wl
717719

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+
718745
def parse(self):
719746
ext = os.path.splitext(self.file_name)[1]
720747

@@ -752,28 +779,16 @@ def _parse(self, brdfile):
752779
# Build library mapping elements' pads to nets
753780
self._parse_pad_nets(signals)
754781

755-
# Determine minimum via annular ring from board design rules
782+
# Parse needed design rules
783+
784+
# Minimum via annular ring
756785
# (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))
777792

778793
# Signals --> nets
779794
if self.config.include_nets:

InteractiveHtmlBom/web/render.js

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -419,20 +419,34 @@ function drawTracks(canvas, layer, defaultColor, highlight) {
419419
ctx.lineCap = "round";
420420
for (var track of pcbdata.tracks[layer]) {
421421
if (highlight && highlightedNet != track.net) continue;
422-
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
423-
ctx.lineWidth = track.width;
424-
ctx.beginPath();
425-
if ('radius' in track) {
426-
ctx.arc(
427-
...track.center,
428-
track.radius,
429-
deg2rad(track.startangle),
430-
deg2rad(track.endangle));
431-
} else {
422+
if ('drillsize' in track && track.start[0] == track.end[0] && track.start[1] == track.end[1]) {
423+
var style = getComputedStyle(topmostdiv);
424+
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
425+
ctx.lineWidth = track.width;
426+
ctx.beginPath();
432427
ctx.moveTo(...track.start);
433428
ctx.lineTo(...track.end);
429+
ctx.stroke();
430+
ctx.strokeStyle = style.getPropertyValue('--pad-hole-color');
431+
ctx.lineWidth = track.drillsize;
432+
ctx.lineTo(...track.end);
433+
ctx.stroke();
434+
} else {
435+
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
436+
ctx.lineWidth = track.width;
437+
ctx.beginPath();
438+
if ('radius' in track) {
439+
ctx.arc(
440+
...track.center,
441+
track.radius,
442+
deg2rad(track.startangle),
443+
deg2rad(track.endangle));
444+
} else {
445+
ctx.moveTo(...track.start);
446+
ctx.lineTo(...track.end);
447+
}
448+
ctx.stroke();
434449
}
435-
ctx.stroke();
436450
}
437451
}
438452

@@ -470,14 +484,14 @@ function clearCanvas(canvas, color = null) {
470484

471485
function drawNets(canvas, layer, highlight) {
472486
var style = getComputedStyle(topmostdiv);
473-
if (settings.renderTracks) {
474-
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
475-
drawTracks(canvas, layer, trackColor, highlight);
476-
}
477487
if (settings.renderZones) {
478488
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
479489
drawZones(canvas, layer, zoneColor, highlight);
480490
}
491+
if (settings.renderTracks) {
492+
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
493+
drawTracks(canvas, layer, trackColor, highlight);
494+
}
481495
if (highlight && settings.renderPads) {
482496
var padColor = style.getPropertyValue('--pad-color-highlight');
483497
var padHoleColor = style.getPropertyValue('--pad-hole-color');

0 commit comments

Comments
 (0)