From 94f3976915d64a77135a1fdc8983085ee8d2e1f9 Mon Sep 17 00:00:00 2001 From: Hamilton Kibbe Date: Thu, 11 Jun 2015 11:20:56 -0400 Subject: [PATCH 1/3] Add keys to statements for linking to primitives. Add some API features to ExcellonFile, such as getting a tool path length and changing tool parameters. Excellonfiles write method generates statements based on the drill hits in the hits member, so drill hits in a generated file can be re-ordered by re-ordering the drill hits in ExcellonFile.hits. see #30 --- gerber/cam.py | 3 +- gerber/excellon.py | 120 ++++++++++++++++++++++++++------- gerber/excellon_statements.py | 121 +++++++++++++++++++--------------- gerber/primitives.py | 4 +- gerber/tests/test_excellon.py | 17 ++++- 5 files changed, 185 insertions(+), 80 deletions(-) diff --git a/gerber/cam.py b/gerber/cam.py index 31b6d2f..23d8214 100644 --- a/gerber/cam.py +++ b/gerber/cam.py @@ -220,7 +220,8 @@ class CamFile(object): self.zeros = 'leading' self.format = (2, 5) self.statements = statements if statements is not None else [] - self.primitives = primitives + if primitives is not None: + self.primitives = primitives self.filename = filename self.layer_name = layer_name diff --git a/gerber/excellon.py b/gerber/excellon.py index f994b67..1f0c570 100755 --- a/gerber/excellon.py +++ b/gerber/excellon.py @@ -24,6 +24,7 @@ This module provides Excellon file classes and parsing utilities """ import math +import operator from .excellon_statements import * from .cam import CamFile, FileSettings @@ -49,6 +50,22 @@ def read(filename): return ExcellonParser(settings).parse(filename) +class DrillHit(object): + def __init__(self, tool, position): + self.tool = tool + self.position = position + + def to_inch(self): + if self.tool.units == 'metric': + self.tool.to_inch() + self.position = tuple(map(inch, self.position)) + + def to_metric(self): + if self.tool.units == 'inch': + self.tool.to_metric() + self.position = tuple(map(metric, self.position)) + + class ExcellonFile(CamFile): """ A class representing a single excellon file @@ -81,17 +98,19 @@ class ExcellonFile(CamFile): filename=filename) self.tools = tools self.hits = hits - self.primitives = [Drill(position, tool.diameter, units=settings.units) - for tool, position in self.hits] + + @property + def primitives(self): + return [Drill(hit.position, hit.tool.diameter,units=self.settings.units) for hit in self.hits] + @property def bounds(self): xmin = ymin = 100000000000 xmax = ymax = -100000000000 - for tool, position in self.hits: - radius = tool.diameter / 2. - x = position[0] - y = position[1] + for hit in self.hits: + radius = hit.tool.diameter / 2. + x, y = hit.position xmin = min(x - radius, xmin) xmax = max(x + radius, xmax) ymin = min(y - radius, ymin) @@ -101,20 +120,23 @@ class ExcellonFile(CamFile): def report(self, filename=None): """ Print or save drill report """ - toolfmt = ' T%%02d %%%d.%df %%d\n' % self.settings.format - rprt = 'Excellon Drill Report\n\n' + if self.settings.units == 'inch': + toolfmt = ' T{:0>2d} {:%d.%df} {: >3d} {:f}in.\n' % self.settings.format + else: + toolfmt = ' T{:0>2d} {:%d.%df} {: >3d} {:f}mm\n' % self.settings.format + rprt = '=====================\nExcellon Drill Report\n=====================\n' if self.filename is not None: rprt += 'NC Drill File: %s\n\n' % self.filename - rprt += 'Drill File Info:\n\n' + rprt += 'Drill File Info:\n----------------\n' rprt += (' Data Mode %s\n' % 'Absolute' if self.settings.notation == 'absolute' else 'Incremental') rprt += (' Units %s\n' % 'Inches' if self.settings.units == 'inch' else 'Millimeters') - rprt += '\nTool List:\n\n' - rprt += ' Code Size Hits\n' - rprt += ' --------------------------\n' + rprt += '\nTool List:\n----------\n\n' + rprt += ' Code Size Hits Path Length\n' + rprt += ' --------------------------------------\n' for tool in self.tools.itervalues(): - rprt += toolfmt % (tool.number, tool.diameter, tool.hit_count) + rprt += toolfmt.format(tool.number, tool.diameter, tool.hit_count, self.tool_path_length(tool.number)) if filename is not None: with open(filename, 'w') as f: f.write(rprt) @@ -122,9 +144,22 @@ class ExcellonFile(CamFile): def write(self, filename): with open(filename, 'w') as f: + # Copy the header verbatim for statement in self.statements: - f.write(statement.to_excellon(self.settings) + '\n') - + print(statement) + if not isinstance(statement, ToolSelectionStmt): + f.write(statement.to_excellon(self.settings) + '\n') + else: + break + + # Write out coordinates for drill hits by tool + for tool in self.tools.itervalues(): + f.write(ToolSelectionStmt(tool.number).to_excellon(self.settings) + '\n') + for hit in self.hits: + if hit.tool.number == tool.number: + f.write(CoordinateStmt(*hit.position).to_excellon(self.settings) + '\n') + f.write(EndOfProgramStmt().to_excellon() + '\n') + def to_inch(self): """ Convert units to inches @@ -137,8 +172,8 @@ class ExcellonFile(CamFile): tool.to_inch() for primitive in self.primitives: primitive.to_inch() - self.hits = [(tool, tuple(map(inch, pos))) - for tool, pos in self.hits] + for hit in self.hits: + hit.position = tuple(map(inch, hit,position)) def to_metric(self): @@ -152,17 +187,52 @@ class ExcellonFile(CamFile): tool.to_metric() for primitive in self.primitives: primitive.to_metric() - self.hits = [(tool, tuple(map(metric, pos))) - for tool, pos in self.hits] + for hit in self.hits: + hit.position = tuple(map(metric, hit.position)) def offset(self, x_offset=0, y_offset=0): for statement in self.statements: statement.offset(x_offset, y_offset) for primitive in self.primitives: primitive.offset(x_offset, y_offset) - self.hits = [(tool, (pos[0] + x_offset, pos[1] + y_offset)) - for tool, pos in self.hits] + for hit in self. hits: + hit.position = tuple(map(operator.add, hit.position, (x_offset, y_offset))) + def tool_path_length(self, tool_number): + """ Return the path length for a given tool + """ + length = 0.0 + pos = (0, 0) + for hit in self.hits: + tool = hit.tool + if tool.number == tool_number: + length = length + math.hypot(*tuple(map(operator.sub, pos, hit.position))) + pos = hit.position + return length + + + def update_tool(self, tool_number, **kwargs): + """ Change parameters of a tool + """ + if kwargs.get('feed_rate') is not None: + self.tools[tool_number].feed_rate = kwargs.get('feed_rate') + if kwargs.get('retract_rate') is not None: + self.tools[tool_number].retract_rate = kwargs.get('retract_rate') + if kwargs.get('rpm') is not None: + self.tools[tool_number].rpm = kwargs.get('rpm') + if kwargs.get('diameter') is not None: + self.tools[tool_number].diameter = kwargs.get('diameter') + if kwargs.get('max_hit_count') is not None: + self.tools[tool_number].max_hit_count = kwargs.get('max_hit_count') + if kwargs.get('depth_offset') is not None: + self.tools[tool_number].depth_offset = kwargs.get('depth_offset') + # Update drill hits + newtool = self.tools[tool_number] + for hit in self.hits: + if hit.tool.number == newtool.number: + hit.tool = newtool + + class ExcellonParser(object): """ Excellon File Parser @@ -248,6 +318,8 @@ class ExcellonParser(object): self.statements.append(RewindStopStmt()) if self.state == 'HEADER': self.state = 'DRILL' + elif self.state == 'INIT': + self.state = 'HEADER' elif line[:3] == 'M95': self.statements.append(HeaderEndStmt()) @@ -312,7 +384,7 @@ class ExcellonParser(object): for i in range(stmt.count): self.pos[0] += stmt.xdelta if stmt.xdelta is not None else 0 self.pos[1] += stmt.ydelta if stmt.ydelta is not None else 0 - self.hits.append((self.active_tool, tuple(self.pos))) + self.hits.append(DrillHit(self.active_tool, tuple(self.pos))) self.active_tool._hit() elif line[0] in ['X', 'Y']: @@ -331,7 +403,7 @@ class ExcellonParser(object): if y is not None: self.pos[1] += y if self.state == 'DRILL': - self.hits.append((self.active_tool, tuple(self.pos))) + self.hits.append(DrillHit(self.active_tool, tuple(self.pos))) self.active_tool._hit() else: self.statements.append(UnknownStmt.from_excellon(line)) @@ -402,7 +474,7 @@ def detect_excellon_format(filename): size = tuple([t[1] - t[0] for t in p.bounds]) hole_area = 0.0 for hit in p.hits: - tool = hit[0] + tool = hit.tool hole_area += math.pow(math.pi * tool.diameter / 2., 2) results[key] = (size, p.hole_count, hole_area) except: diff --git a/gerber/excellon_statements.py b/gerber/excellon_statements.py index 31a3c72..fa05e53 100644 --- a/gerber/excellon_statements.py +++ b/gerber/excellon_statements.py @@ -22,7 +22,7 @@ Excellon Statements """ import re - +import uuid from .utils import (parse_gerber_value, write_gerber_value, decimal_string, inch, metric) @@ -40,13 +40,15 @@ class ExcellonStatement(object): """ Excellon Statement abstract base class """ - units = 'inch' - @classmethod def from_excellon(cls, line): raise NotImplementedError('from_excellon must be implemented in a ' 'subclass') - + + def __init__(self, unit='inch', id=None): + self.units = unit + self.id = uuid.uuid4().int if id is None else id + def to_excellon(self, settings=None): raise NotImplementedError('to_excellon must be implemented in a ' 'subclass') @@ -107,7 +109,7 @@ class ExcellonTool(ExcellonStatement): """ @classmethod - def from_excellon(cls, line, settings): + def from_excellon(cls, line, settings, id=None): """ Create a Tool from an excellon file tool definition line. Parameters @@ -126,6 +128,7 @@ class ExcellonTool(ExcellonStatement): commands = re.split('([BCFHSTZ])', line)[1:] commands = [(command, value) for command, value in pairwise(commands)] args = {} + args['id'] = id nformat = settings.format zero_suppression = settings.zero_suppression for cmd, val in commands: @@ -165,6 +168,8 @@ class ExcellonTool(ExcellonStatement): return cls(settings, **tool_dict) def __init__(self, settings, **kwargs): + if kwargs.get('id') is not None: + super(ExcellonTool, self).__init__(id=kwargs.get('id')) self.settings = settings self.number = kwargs.get('number') self.feed_rate = kwargs.get('feed_rate') @@ -221,7 +226,7 @@ class ExcellonTool(ExcellonStatement): class ToolSelectionStmt(ExcellonStatement): @classmethod - def from_excellon(cls, line): + def from_excellon(cls, line, **kwargs): """ Create a ToolSelectionStmt from an excellon file line. Parameters @@ -244,9 +249,10 @@ class ToolSelectionStmt(ExcellonStatement): tool = int(line[:2]) compensation_index = int(line[2:]) - return cls(tool, compensation_index) + return cls(tool, compensation_index, **kwargs) - def __init__(self, tool, compensation_index=None): + def __init__(self, tool, compensation_index=None, **kwargs): + super(ToolSelectionStmt, self).__init__(**kwargs) tool = int(tool) compensation_index = (int(compensation_index) if compensation_index is not None else None) @@ -263,7 +269,7 @@ class ToolSelectionStmt(ExcellonStatement): class CoordinateStmt(ExcellonStatement): @classmethod - def from_excellon(cls, line, settings): + def from_excellon(cls, line, settings, **kwargs): x_coord = None y_coord = None if line[0] == 'X': @@ -276,11 +282,12 @@ class CoordinateStmt(ExcellonStatement): else: y_coord = parse_gerber_value(line.strip(' Y'), settings.format, settings.zero_suppression) - c = cls(x_coord, y_coord) + c = cls(x_coord, y_coord, **kwargs) c.units = settings.units return c - def __init__(self, x=None, y=None): + def __init__(self, x=None, y=None, **kwargs): + super(CoordinateStmt, self).__init__(**kwargs) self.x = x self.y = y @@ -329,7 +336,7 @@ class CoordinateStmt(ExcellonStatement): class RepeatHoleStmt(ExcellonStatement): @classmethod - def from_excellon(cls, line, settings): + def from_excellon(cls, line, settings, **kwargs): match = re.compile(r'R(?P[0-9]*)X?(?P[+\-]?\d*\.?\d*)?Y?' '(?P[+\-]?\d*\.?\d*)?').match(line) stmt = match.groupdict() @@ -340,11 +347,12 @@ class RepeatHoleStmt(ExcellonStatement): ydelta = (parse_gerber_value(stmt['ydelta'], settings.format, settings.zero_suppression) if stmt['ydelta'] is not '' else None) - c = cls(count, xdelta, ydelta) + c = cls(count, xdelta, ydelta, **kwargs) c.units = settings.units return c - def __init__(self, count, xdelta=0.0, ydelta=0.0): + def __init__(self, count, xdelta=0.0, ydelta=0.0, **kwargs): + super(RepeatHoleStmt, self).__init__(**kwargs) self.count = count self.xdelta = xdelta self.ydelta = ydelta @@ -385,10 +393,11 @@ class RepeatHoleStmt(ExcellonStatement): class CommentStmt(ExcellonStatement): @classmethod - def from_excellon(cls, line): + def from_excellon(cls, line, **kwargs): return cls(line.lstrip(';')) - def __init__(self, comment): + def __init__(self, comment, **kwargs): + super(CommentStmt, self).__init__(**kwargs) self.comment = comment def to_excellon(self, settings=None): @@ -397,8 +406,8 @@ class CommentStmt(ExcellonStatement): class HeaderBeginStmt(ExcellonStatement): - def __init__(self): - pass + def __init__(self, **kwargs): + super(HeaderBeginStmt, self).__init__(**kwargs) def to_excellon(self, settings=None): return 'M48' @@ -406,8 +415,8 @@ class HeaderBeginStmt(ExcellonStatement): class HeaderEndStmt(ExcellonStatement): - def __init__(self): - pass + def __init__(self, **kwargs): + super(HeaderEndStmt, self).__init__(**kwargs) def to_excellon(self, settings=None): return 'M95' @@ -415,8 +424,8 @@ class HeaderEndStmt(ExcellonStatement): class RewindStopStmt(ExcellonStatement): - def __init__(self): - pass + def __init__(self, **kwargs): + super(RewindStopStmt, self).__init__(**kwargs) def to_excellon(self, settings=None): return '%' @@ -425,7 +434,7 @@ class RewindStopStmt(ExcellonStatement): class EndOfProgramStmt(ExcellonStatement): @classmethod - def from_excellon(cls, line, settings): + def from_excellon(cls, line, settings, **kwargs): match = re.compile(r'M30X?(?P\d*\.?\d*)?Y?' '(?P\d*\.?\d*)?').match(line) stmt = match.groupdict() @@ -435,11 +444,12 @@ class EndOfProgramStmt(ExcellonStatement): y = (parse_gerber_value(stmt['y'], settings.format, settings.zero_suppression) if stmt['y'] is not '' else None) - c = cls(x, y) + c = cls(x, y, **kwargs) c.units = settings.units return c - def __init__(self, x=None, y=None): + def __init__(self, x=None, y=None, **kwargs): + super(EndOfProgramStmt, self).__init__(**kwargs) self.x = x self.y = y @@ -476,12 +486,13 @@ class EndOfProgramStmt(ExcellonStatement): class UnitStmt(ExcellonStatement): @classmethod - def from_excellon(cls, line): + def from_excellon(cls, line, **kwargs): units = 'inch' if 'INCH' in line else 'metric' zeros = 'leading' if 'LZ' in line else 'trailing' - return cls(units, zeros) + return cls(units, zeros, **kwargs) - def __init__(self, units='inch', zeros='leading'): + def __init__(self, units='inch', zeros='leading', **kwargs): + super(UnitStmt, self).__init__(**kwargs) self.units = units.lower() self.zeros = zeros @@ -500,10 +511,11 @@ class UnitStmt(ExcellonStatement): class IncrementalModeStmt(ExcellonStatement): @classmethod - def from_excellon(cls, line): - return cls('off') if 'OFF' in line else cls('on') + def from_excellon(cls, line, **kwargs): + return cls('off', **kwargs) if 'OFF' in line else cls('on', **kwargs) - def __init__(self, mode='off'): + def __init__(self, mode='off', **kwargs): + super(IncrementalModeStmt, self).__init__(**kwargs) if mode.lower() not in ['on', 'off']: raise ValueError('Mode may be "on" or "off"') self.mode = mode @@ -515,11 +527,12 @@ class IncrementalModeStmt(ExcellonStatement): class VersionStmt(ExcellonStatement): @classmethod - def from_excellon(cls, line): + def from_excellon(cls, line, **kwargs): version = int(line.split(',')[1]) - return cls(version) + return cls(version, **kwargs) - def __init__(self, version=1): + def __init__(self, version=1, **kwargs): + super(VersionStmt, self).__init__(**kwargs) version = int(version) if version not in [1, 2]: raise ValueError('Valid versions are 1 or 2') @@ -532,11 +545,12 @@ class VersionStmt(ExcellonStatement): class FormatStmt(ExcellonStatement): @classmethod - def from_excellon(cls, line): + def from_excellon(cls, line, **kwargs): fmt = int(line.split(',')[1]) - return cls(fmt) + return cls(fmt, **kwargs) - def __init__(self, format=1): + def __init__(self, format=1, **kwargs): + super(FormatStmt, self).__init__(**kwargs) format = int(format) if format not in [1, 2]: raise ValueError('Valid formats are 1 or 2') @@ -549,11 +563,12 @@ class FormatStmt(ExcellonStatement): class LinkToolStmt(ExcellonStatement): @classmethod - def from_excellon(cls, line): + def from_excellon(cls, line, **kwargs): linked = [int(tool) for tool in line.split('/')] - return cls(linked) + return cls(linked, **kwargs) - def __init__(self, linked_tools): + def __init__(self, linked_tools, **kwargs): + super(LinkToolStmt, self).__init__(**kwargs) self.linked_tools = [int(x) for x in linked_tools] def to_excellon(self, settings=None): @@ -563,12 +578,13 @@ class LinkToolStmt(ExcellonStatement): class MeasuringModeStmt(ExcellonStatement): @classmethod - def from_excellon(cls, line): + def from_excellon(cls, line, **kwargs): if not ('M71' in line or 'M72' in line): raise ValueError('Not a measuring mode statement') - return cls('inch') if 'M72' in line else cls('metric') + return cls('inch', **kwargs) if 'M72' in line else cls('metric', **kwargs) - def __init__(self, units='inch'): + def __init__(self, units='inch', **kwargs): + super(MeasuringModeStmt, self).__init__(**kwargs) units = units.lower() if units not in ['inch', 'metric']: raise ValueError('units must be "inch" or "metric"') @@ -585,8 +601,8 @@ class MeasuringModeStmt(ExcellonStatement): class RouteModeStmt(ExcellonStatement): - def __init__(self): - pass + def __init__(self, **kwargs): + super(RouteModeStmt, self).__init__(**kwargs) def to_excellon(self, settings=None): return 'G00' @@ -594,8 +610,8 @@ class RouteModeStmt(ExcellonStatement): class DrillModeStmt(ExcellonStatement): - def __init__(self): - pass + def __init__(self, **kwargs): + super(DrillModeStmt, self).__init__(**kwargs) def to_excellon(self, settings=None): return 'G05' @@ -603,8 +619,8 @@ class DrillModeStmt(ExcellonStatement): class AbsoluteModeStmt(ExcellonStatement): - def __init__(self): - pass + def __init__(self, **kwargs): + super(AbsoluteModeStmt, self).__init__(**kwargs) def to_excellon(self, settings=None): return 'G90' @@ -613,10 +629,11 @@ class AbsoluteModeStmt(ExcellonStatement): class UnknownStmt(ExcellonStatement): @classmethod - def from_excellon(cls, line): - return cls(line) + def from_excellon(cls, line, **kwargs): + return cls(line, **kwargs) - def __init__(self, stmt): + def __init__(self, stmt, **kwargs): + super(UnknownStmt, self).__init__(**kwargs) self.stmt = stmt def to_excellon(self, settings=None): diff --git a/gerber/primitives.py b/gerber/primitives.py index bdd49f7..00ecb12 100644 --- a/gerber/primitives.py +++ b/gerber/primitives.py @@ -36,11 +36,13 @@ class Primitive(object): Rotation of a primitive about its origin in degrees. Positive rotation is counter-clockwise as viewed from the board top. """ - def __init__(self, level_polarity='dark', rotation=0, units=None): + def __init__(self, level_polarity='dark', rotation=0, units=None, id=None, statement_id=None): self.level_polarity = level_polarity self.rotation = rotation self.units = units self._to_convert = list() + self.id = id + self.statement_id = statement_id def bounding_box(self): """ Calculate bounding box diff --git a/gerber/tests/test_excellon.py b/gerber/tests/test_excellon.py index d47ad6a..006277d 100644 --- a/gerber/tests/test_excellon.py +++ b/gerber/tests/test_excellon.py @@ -24,6 +24,17 @@ def test_read(): ncdrill = read(NCDRILL_FILE) assert(isinstance(ncdrill, ExcellonFile)) +def test_write(): + ncdrill = read(NCDRILL_FILE) + ncdrill.write('test.ncd') + with open(NCDRILL_FILE) as src: + srclines = src.readlines() + + with open('test.ncd') as res: + for idx, line in enumerate(res): + assert_equal(line.strip(), srclines[idx].strip()) + os.remove('test.ncd') + def test_read_settings(): ncdrill = read(NCDRILL_FILE) assert_equal(ncdrill.settings['format'], (2, 4)) @@ -47,9 +58,11 @@ def test_conversion(): ncdrill.to_metric() assert_equal(ncdrill.settings.units, 'metric') + inch_primitives = ncdrill_inch.primitives + for tool in iter(ncdrill_inch.tools.values()): tool.to_metric() - for primitive in ncdrill_inch.primitives: + for primitive in inch_primitives: primitive.to_metric() for statement in ncdrill_inch.statements: statement.to_metric() @@ -57,7 +70,7 @@ def test_conversion(): for m_tool, i_tool in zip(iter(ncdrill.tools.values()), iter(ncdrill_inch.tools.values())): assert_equal(i_tool, m_tool) - for m, i in zip(ncdrill.primitives,ncdrill_inch.primitives): + for m, i in zip(ncdrill.primitives,inch_primitives): assert_equal(m, i) From ec2ca92da6e3dac1d56bfba28d4c2cadc35a9811 Mon Sep 17 00:00:00 2001 From: Hamilton Kibbe Date: Thu, 11 Jun 2015 14:00:40 -0400 Subject: [PATCH 2/3] Python 3 fix remove dict itervalues() calls --- gerber/excellon.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gerber/excellon.py b/gerber/excellon.py index 1f0c570..65d014f 100755 --- a/gerber/excellon.py +++ b/gerber/excellon.py @@ -135,7 +135,7 @@ class ExcellonFile(CamFile): rprt += '\nTool List:\n----------\n\n' rprt += ' Code Size Hits Path Length\n' rprt += ' --------------------------------------\n' - for tool in self.tools.itervalues(): + for tool in iter(self.tools.values()): rprt += toolfmt.format(tool.number, tool.diameter, tool.hit_count, self.tool_path_length(tool.number)) if filename is not None: with open(filename, 'w') as f: @@ -153,7 +153,7 @@ class ExcellonFile(CamFile): break # Write out coordinates for drill hits by tool - for tool in self.tools.itervalues(): + for tool in iter(self.tools.values()): f.write(ToolSelectionStmt(tool.number).to_excellon(self.settings) + '\n') for hit in self.hits: if hit.tool.number == tool.number: @@ -168,7 +168,7 @@ class ExcellonFile(CamFile): self.units = 'inch' for statement in self.statements: statement.to_inch() - for tool in self.tools.itervalues(): + for tool in iter(self.tools.values()): tool.to_inch() for primitive in self.primitives: primitive.to_inch() From 15254a5bb7ad866e09374c5a99e9be4468e4d3c7 Mon Sep 17 00:00:00 2001 From: Hamilton Kibbe Date: Mon, 6 Jul 2015 12:13:59 -0400 Subject: [PATCH 3/3] Add tool path optimization example Add example demonstrating use of tsp-solver with pcb-tools to optimize tool paths in an excellon file. This is based on @koppi's script in #30 --- examples/excellon_optimize.py | 90 +++++++ examples/excellon_optimize_after.PNG | Bin 0 -> 33753 bytes examples/excellon_optimize_before.PNG | Bin 0 -> 90206 bytes examples/gerbers/shld.drd | 354 ++++++++++++++++++++++++++ gerber/excellon.py | 35 ++- 5 files changed, 469 insertions(+), 10 deletions(-) create mode 100644 examples/excellon_optimize.py create mode 100644 examples/excellon_optimize_after.PNG create mode 100644 examples/excellon_optimize_before.PNG create mode 100644 examples/gerbers/shld.drd diff --git a/examples/excellon_optimize.py b/examples/excellon_optimize.py new file mode 100644 index 0000000..5f0adbc --- /dev/null +++ b/examples/excellon_optimize.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Example using pcb-tools with tsp-solver (github.com/dmishin/tsp-solver) to +# optimize tool paths in an Excellon file. +# +# +# Copyright 2015 Hamilton Kibbe +# Based on a script by https://github.com/koppi +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +import sys +import math +import gerber +from operator import sub +from gerber.excellon import DrillHit + +try: + from tsp_solver.greedy import solve_tsp +except ImportError: + print('\n=================================================================\n' + 'This example requires tsp-solver be installed in order to run.\n\n' + 'tsp-solver can be downloaded from:\n' + ' http://github.com/dmishin/tsp-solver.\n' + '=================================================================') + sys.exit(0) + + +if __name__ == '__main__': + + # Get file name to open + if len(sys.argv) < 2: + fname = 'gerbers/shld.drd' + else: + fname = sys.argv[1] + + # Read the excellon file + f = gerber.read(fname) + + positions = {} + tools = {} + hit_counts = f.hit_count() + oldpath = sum(f.path_length().values()) + + #Get hit positions + for hit in f.hits: + tool_num = hit.tool.number + if tool_num not in positions.keys(): + positions[tool_num] = [] + positions[tool_num].append(hit.position) + + hits = [] + + # Optimize tool path for each tool + for tool, count in iter(hit_counts.items()): + + # Calculate distance matrix + distance_matrix = [[math.hypot(*tuple(map(sub, + positions[tool][i], + positions[tool][j]))) + for j in iter(range(count))] + for i in iter(range(count))] + + # Calculate new path + path = solve_tsp(distance_matrix, 50) + + # Create new hits list + hits += [DrillHit(f.tools[tool], positions[tool][p]) for p in path] + + # Update the file + f.hits = hits + f.filename = f.filename + '.optimized' + f.write() + + # Print drill report + print(f.report()) + print('Original path length: %1.4f' % oldpath) + print('Optimized path length: %1.4f' % sum(f.path_length().values())) + diff --git a/examples/excellon_optimize_after.PNG b/examples/excellon_optimize_after.PNG new file mode 100644 index 0000000000000000000000000000000000000000..0f16387e92d847bf2090651c5c468b8fea24670c GIT binary patch literal 33753 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 Q3=9kmp00i_>zopr0It4700000 literal 0 HcmV?d00001 diff --git a/examples/excellon_optimize_before.PNG b/examples/excellon_optimize_before.PNG new file mode 100644 index 0000000000000000000000000000000000000000..26a36ab44717e0eef47ee2c7756e417591f52923 GIT binary patch literal 90206 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 BR2l#P literal 0 HcmV?d00001 diff --git a/examples/gerbers/shld.drd b/examples/gerbers/shld.drd new file mode 100644 index 0000000..a919b5b --- /dev/null +++ b/examples/gerbers/shld.drd @@ -0,0 +1,354 @@ +% +M48 +M72 +T01C0.03200 +T02C0.03543 +T03C0.04000 +% +T01 +X11212Y16343 +X80212Y16343 +X21212Y16343 +X99212Y22143 +X99212Y12143 +X40212Y16343 +T02 +X10812Y191043 +X70812Y111043 +X130812Y111043 +X80812Y141043 +X110812Y71043 +X160812Y51043 +X20812Y171043 +X30812Y91043 +X50812Y111043 +X50812Y121043 +X20812Y161043 +X90812Y111043 +X70812Y61043 +X40812Y171043 +X50812Y81043 +X160812Y61043 +X40812Y191043 +X30812Y31043 +X90812Y131043 +X10812Y31043 +X150812Y111043 +X170812Y51043 +X110812Y151043 +X10812Y51043 +X150812Y51043 +X140812Y121043 +X170812Y61043 +X30812Y61043 +X70812Y91043 +X70812Y101043 +X160812Y161043 +X40812Y81043 +X220812Y151043 +X180812Y71043 +X30812Y151043 +X50812Y161043 +X150812Y131043 +X40812Y61043 +X130812Y91043 +X90812Y61043 +X80812Y101043 +X30812Y191043 +X130812Y151043 +X60812Y31043 +X50812Y91043 +X40812Y111043 +X220812Y141043 +X30812Y81043 +X140812Y81043 +X60812Y61043 +X210812Y131043 +X160812Y71043 +X90812Y41043 +X120812Y151043 +X10812Y161043 +X80812Y151043 +X50812Y71043 +X160812Y151043 +X110812Y111043 +X30812Y121043 +X10812Y41043 +X20812Y41043 +X40812Y51043 +X10812Y151043 +X200812Y101043 +X70812Y41043 +X120812Y51043 +X40812Y41043 +X80812Y91043 +X170812Y161043 +X100812Y71043 +X40812Y31043 +X30812Y141043 +X180812Y131043 +X10812Y61043 +X120812Y141043 +X200812Y151043 +X90812Y121043 +X50812Y31043 +X170812Y121043 +X170812Y111043 +X60812Y121043 +X40812Y101043 +X120812Y121043 +X100812Y161043 +X10812Y81043 +X130812Y131043 +X60812Y81043 +X200812Y111043 +X140812Y51043 +X150812Y71043 +X160812Y111043 +X120812Y111043 +X130812Y101043 +X20812Y51043 +X20812Y201043 +X90812Y71043 +X190812Y61043 +X170812Y81043 +X70812Y71043 +X50812Y101043 +X150812Y81043 +X60812Y131043 +X190812Y121043 +X170812Y131043 +X130812Y121043 +X20812Y91043 +X70812Y151043 +X70812Y141043 +X180812Y111043 +X10812Y181043 +X40812Y131043 +X80812Y121043 +X120812Y61043 +X160812Y101043 +X90812Y31043 +X10812Y91043 +X80812Y71043 +X100812Y121043 +X100812Y51043 +X160812Y121043 +X40812Y71043 +X50812Y51043 +X180812Y81043 +X90812Y51043 +X60812Y71043 +X40812Y161043 +X190812Y141043 +X20812Y31043 +X100812Y151043 +X200812Y141043 +X180812Y151043 +X60812Y51043 +X120812Y131043 +X150812Y141043 +X180812Y51043 +X150812Y101043 +X170812Y101043 +X150812Y151043 +X30812Y111043 +X90812Y151043 +X80812Y131043 +X170812Y151043 +X80812Y51043 +X10812Y201043 +X60812Y151043 +X140812Y111043 +X100812Y91043 +X90812Y161043 +X130812Y81043 +X190812Y111043 +X140812Y101043 +X20812Y71043 +X150812Y121043 +X90812Y141043 +X60812Y111043 +X110812Y121043 +X30812Y71043 +X30812Y51043 +X210812Y141043 +X50812Y61043 +X140812Y131043 +X30812Y201043 +X190812Y101043 +X70812Y81043 +X20812Y121043 +X20812Y191043 +X80812Y161043 +X80812Y81043 +X20812Y151043 +X40812Y121043 +X80812Y31043 +X80812Y111043 +X190812Y151043 +X30812Y181043 +X60812Y91043 +X110812Y61043 +X180812Y61043 +X10812Y141043 +X50812Y131043 +X130812Y51043 +X50812Y151043 +X110812Y51043 +X70812Y131043 +X60812Y41043 +X200812Y161043 +X80812Y61043 +X140812Y161043 +X190812Y81043 +X20812Y141043 +X70812Y161043 +X140812Y151043 +X20812Y61043 +X20812Y81043 +X100812Y131043 +X200812Y131043 +X140812Y141043 +X40812Y151043 +X40812Y91043 +X60812Y101043 +X160812Y81043 +X130812Y71043 +X30812Y41043 +X10812Y71043 +X180812Y141043 +X170812Y141043 +X180812Y91043 +X180812Y101043 +X150812Y61043 +X120812Y161043 +X90812Y101043 +X200812Y121043 +X190812Y91043 +X160812Y141043 +X130812Y161043 +X20812Y101043 +X90812Y81043 +X190812Y161043 +X30812Y171043 +X40812Y181043 +X70812Y51043 +X110812Y101043 +X60812Y141043 +X120812Y101043 +X30812Y161043 +X100812Y141043 +X220812Y131043 +X50812Y141043 +X30812Y101043 +X60812Y161043 +X150812Y161043 +X20812Y131043 +X150812Y91043 +X100812Y61043 +X10812Y131043 +X30812Y131043 +X100812Y41043 +X140812Y61043 +X210812Y151043 +X70812Y121043 +X100812Y101043 +X180812Y121043 +X40812Y201043 +X190812Y71043 +X10812Y171043 +X110812Y141043 +X130812Y61043 +X110812Y81043 +X80812Y41043 +X50812Y41043 +X110812Y131043 +X190812Y131043 +X130812Y141043 +X140812Y91043 +X20812Y111043 +X140812Y71043 +X170812Y91043 +X120812Y91043 +X190812Y51043 +X120812Y81043 +X160812Y91043 +X100812Y81043 +X120812Y71043 +X10812Y121043 +X170812Y71043 +X110812Y91043 +X100812Y111043 +X110812Y161043 +X70812Y31043 +X90812Y91043 +X40812Y141043 +X20812Y181043 +X210812Y161043 +X180812Y161043 +X160812Y131043 +T03 +X86712Y189043 +X213012Y23043 +X126732Y201114 +X96712Y189043 +X86732Y201114 +X56732Y201114 +X142812Y23443 +X106712Y189043 +X112754Y11450 +X182720Y200950 +X106732Y201114 +X207259Y55639 +X207259Y81239 +X203131Y11150 +X76732Y201114 +X192720Y200950 +X66712Y189043 +X96732Y201114 +X193131Y11150 +X66732Y201114 +X203012Y23043 +X122754Y11450 +X76712Y189043 +X173131Y11150 +X192712Y188843 +X116712Y189043 +X116732Y201114 +X213131Y11150 +X162720Y200950 +X225059Y55639 +X183131Y11150 +X126712Y189043 +X183012Y23043 +X212712Y188843 +X163131Y11150 +X213563Y110846 +X122812Y23443 +X132812Y23443 +X182712Y188843 +X212720Y200950 +X202720Y200950 +X193012Y23043 +X213563Y120846 +X172720Y200950 +X225059Y81239 +X223563Y120846 +X56712Y189043 +X172712Y188843 +X213563Y100846 +X142720Y200950 +X163012Y23043 +X142754Y11450 +X223563Y110846 +X132754Y11450 +X142712Y188843 +X162712Y188843 +X152712Y188843 +X223563Y100846 +X202712Y188843 +X112812Y23443 +X173012Y23043 +X152720Y200950 +M30 diff --git a/gerber/excellon.py b/gerber/excellon.py index 65d014f..d89b349 100755 --- a/gerber/excellon.py +++ b/gerber/excellon.py @@ -136,17 +136,18 @@ class ExcellonFile(CamFile): rprt += ' Code Size Hits Path Length\n' rprt += ' --------------------------------------\n' for tool in iter(self.tools.values()): - rprt += toolfmt.format(tool.number, tool.diameter, tool.hit_count, self.tool_path_length(tool.number)) + rprt += toolfmt.format(tool.number, tool.diameter, tool.hit_count, self.path_length(tool.number)) if filename is not None: with open(filename, 'w') as f: f.write(rprt) return rprt - def write(self, filename): + def write(self, filename=None): + filename = filename if filename is not None else self.filename with open(filename, 'w') as f: + # Copy the header verbatim for statement in self.statements: - print(statement) if not isinstance(statement, ToolSelectionStmt): f.write(statement.to_excellon(self.settings) + '\n') else: @@ -198,18 +199,32 @@ class ExcellonFile(CamFile): for hit in self. hits: hit.position = tuple(map(operator.add, hit.position, (x_offset, y_offset))) - def tool_path_length(self, tool_number): + def path_length(self, tool_number=None): """ Return the path length for a given tool """ - length = 0.0 - pos = (0, 0) + lengths = {} + positions = {} for hit in self.hits: tool = hit.tool - if tool.number == tool_number: - length = length + math.hypot(*tuple(map(operator.sub, pos, hit.position))) - pos = hit.position - return length + num = tool.number + positions[num] = (0, 0) if positions.get(num) is None else positions[num] + lengths[num] = 0.0 if lengths.get(num) is None else lengths[num] + lengths[num] = lengths[num] + math.hypot(*tuple(map(operator.sub, positions[num], hit.position))) + positions[num] = hit.position + + if tool_number is None: + return lengths + else: + return lengths.get(tool_number) + def hit_count(self, tool_number=None): + counts = {} + for tool in iter(self.tools.values()): + counts[tool.number] = tool.hit_count + if tool_number is None: + return counts + else: + return counts.get(tool_number) def update_tool(self, tool_number, **kwargs): """ Change parameters of a tool