From 5476da8aa3f4ee424f56f4f2491e7af1c4b7b758 Mon Sep 17 00:00:00 2001 From: Hamilton Kibbe Date: Thu, 21 Jan 2016 03:57:44 -0500 Subject: Fix a bunch of rendering bugs. - 'clear' polarity primitives no longer erase background - Added aperture macro support for polygons - Added aperture macro rendring support - Renderer now creates a new surface for each layer and merges them instead of working directly on a single surface - Updated examples accordingly --- gerber/pcb.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'gerber/pcb.py') diff --git a/gerber/pcb.py b/gerber/pcb.py index 0518dd4..92a1f28 100644 --- a/gerber/pcb.py +++ b/gerber/pcb.py @@ -63,13 +63,15 @@ class PCB(object): @property def top_layers(self): - board_layers = [l for l in reversed(self.layers) if l.layer_class in ('topsilk', 'topmask', 'top')] + board_layers = [l for l in reversed(self.layers) if l.layer_class in + ('topsilk', 'topmask', 'top')] drill_layers = [l for l in self.drill_layers if 'top' in l.layers] return board_layers + drill_layers @property def bottom_layers(self): - board_layers = [l for l in self.layers if l.layer_class in ('bottomsilk', 'bottommask', 'bottom')] + board_layers = [l for l in self.layers if l.layer_class in + ('bottomsilk', 'bottommask', 'bottom')] drill_layers = [l for l in self.drill_layers if 'bottom' in l.layers] return board_layers + drill_layers @@ -77,11 +79,17 @@ class PCB(object): def drill_layers(self): return [l for l in self.layers if l.layer_class == 'drill'] + @property + def copper_layers(self): + return [layer for layer in self.layers if layer.layer_class in + ('top', 'bottom', 'internal')] + @property def layer_count(self): """ Number of *COPPER* layers """ - return len([l for l in self.layers if l.layer_class in ('top', 'bottom', 'internal')]) + return len([l for l in self.layers if l.layer_class in + ('top', 'bottom', 'internal')]) @property def board_bounds(self): @@ -91,4 +99,3 @@ class PCB(object): for layer in self.layers: if layer.layer_class == 'top': return layer.bounds - -- cgit From 5df38c014fd09792995b2b12b1982c535c962c9a Mon Sep 17 00:00:00 2001 From: Hamilton Kibbe Date: Thu, 28 Jan 2016 12:19:03 -0500 Subject: Cleanup, rendering fixes. fixed rendering of tented vias fixed rendering of semi-transparent layers fixed file type detection issues added some examples --- gerber/pcb.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'gerber/pcb.py') diff --git a/gerber/pcb.py b/gerber/pcb.py index 92a1f28..a213fb3 100644 --- a/gerber/pcb.py +++ b/gerber/pcb.py @@ -18,7 +18,7 @@ import os from .exceptions import ParseError -from .layers import PCBLayer, LayerSet, sort_layers +from .layers import PCBLayer, sort_layers from .common import read as gerber_read from .utils import listdir @@ -29,22 +29,26 @@ class PCB(object): def from_directory(cls, directory, board_name=None, verbose=False): layers = [] names = set() + # Validate directory = os.path.abspath(directory) if not os.path.isdir(directory): raise TypeError('{} is not a directory.'.format(directory)) + # Load gerber files for filename in listdir(directory, True, True): try: camfile = gerber_read(os.path.join(directory, filename)) - layer = PCBLayer.from_gerber(camfile) + layer = PCBLayer.from_cam(camfile) layers.append(layer) names.add(os.path.splitext(filename)[0]) if verbose: - print('Added {} layer <{}>'.format(layer.layer_class, filename)) + print('[PCB]: Added {} layer <{}>'.format(layer.layer_class, + filename)) except ParseError: if verbose: - print('Skipping file {}'.format(filename)) + print('[PCB]: Skipping file {}'.format(filename)) + # Try to guess board name if board_name is None: if len(names) == 1: @@ -66,14 +70,16 @@ class PCB(object): board_layers = [l for l in reversed(self.layers) if l.layer_class in ('topsilk', 'topmask', 'top')] drill_layers = [l for l in self.drill_layers if 'top' in l.layers] - return board_layers + drill_layers + # Drill layer goes under soldermask for proper rendering of tented vias + return [board_layers[0]] + drill_layers + board_layers[1:] @property def bottom_layers(self): board_layers = [l for l in self.layers if l.layer_class in ('bottomsilk', 'bottommask', 'bottom')] drill_layers = [l for l in self.drill_layers if 'bottom' in l.layers] - return board_layers + drill_layers + # Drill layer goes under soldermask for proper rendering of tented vias + return [board_layers[0]] + drill_layers + board_layers[1:] @property def drill_layers(self): @@ -81,8 +87,9 @@ class PCB(object): @property def copper_layers(self): - return [layer for layer in self.layers if layer.layer_class in - ('top', 'bottom', 'internal')] + return list(reversed([layer for layer in self.layers if + layer.layer_class in + ('top', 'bottom', 'internal')])) @property def layer_count(self): -- cgit