diff --git a/examples/panelize.py b/examples/panelize.py index 1c5c0da..34cc446 100755 --- a/examples/panelize.py +++ b/examples/panelize.py @@ -37,16 +37,17 @@ for ext in exts: ctx = DrillComposition() else: ctx = GerberComposition() - for path, x_offset, y_offset, theta in boards: + for path, x_offset, y_offset, angle in boards: file = gerberex.read(path + ext) file.to_metric() - file.rotate(theta) + file.rotate(angle) file.offset(x_offset, y_offset) ctx.merge(file) putstr('.') if ext == 'TXT': file = gerberex.read(mousebites) file.draw_mode = DxfFile.DM_MOUSE_BITES + file.to_metric() file.width = 0.5 file.format = (3, 3) ctx.merge(file) diff --git a/gerberex/dxf.py b/gerberex/dxf.py index 1b2ddf7..39d256b 100644 --- a/gerberex/dxf.py +++ b/gerberex/dxf.py @@ -11,17 +11,11 @@ from gerber.utils import inch, metric, write_gerber_value from gerber.gerber_statements import ADParamStmt from gerber.excellon_statements import ExcellonTool from gerber.excellon_statements import CoordinateStmt +from gerberex.utility import is_equal_point, is_equal_value from gerberex.dxf_path import generate_closed_paths ACCEPTABLE_ERROR = 0.001 -def is_equal_value(a, b, error_range=0): - return a - b <= error_range and a - b >= -error_range - -def is_equal_point(a, b, error_range=0): - return is_equal_value(a[0], b[0], error_range) and \ - is_equal_value(a[1], b[1], error_range) - class DxfStatement(object): def __init__(self, entity): self.entity = entity diff --git a/gerberex/dxf_path.py b/gerberex/dxf_path.py index 930d8d2..2825c58 100644 --- a/gerberex/dxf_path.py +++ b/gerberex/dxf_path.py @@ -5,6 +5,7 @@ from gerber.utils import inch, metric, write_gerber_value from gerber.cam import FileSettings +from gerberex.utility import is_equal_point, is_equal_value class DxfPath(object): def __init__(self, statement, error_range=0): @@ -21,12 +22,10 @@ class DxfPath(object): @property def is_closed(self): - from gerberex.dxf import is_equal_point return len(self.statements) > 1 and \ is_equal_point(self.start, self.end, self.error_range) def is_equal_to(self, target, error_range=0): - from gerberex.dxf import is_equal_point if not isinstance(target, DxfPath): return False if len(self.statements) != len(target.statements): @@ -59,7 +58,6 @@ class DxfPath(object): self.statements = rlist def merge(self, element, error_range=0): - from gerberex.dxf import is_equal_point if self.is_closed or element.is_closed: return False if not error_range: diff --git a/gerberex/rs274x.py b/gerberex/rs274x.py index 4b477d3..4eb317d 100644 --- a/gerberex/rs274x.py +++ b/gerberex/rs274x.py @@ -30,11 +30,25 @@ class GerberFile(gerber.rs274x.GerberFile): if angle % 360 == 0: return self._generalize_aperture() + last_x = 0 + last_y = 0 + last_rx = 0 + last_ry = 0 for statement in self.statements: if isinstance(statement, AMParamStmtEx): statement.rotate(angle, center) elif isinstance(statement, CoordStmt) and statement.x != None and statement.y != None: - statement.x, statement.y = rotate(statement.x, statement.y, angle, center) + if statement.i != None and statement.j != None: + cx = last_x + statement.i + cy = last_y + statement.j + cx, cy = rotate(cx, cy, angle, center) + statement.i = cx - last_rx + statement.j = cy - last_ry + last_x = statement.x + last_y = statement.y + last_rx, last_ry = rotate(statement.x, statement.y, angle, center) + statement.x = last_rx + statement.y = last_ry def _generalize_aperture(self): RECTANGLE = 0 diff --git a/gerberex/utility.py b/gerberex/utility.py index 852519a..f90df96 100644 --- a/gerberex/utility.py +++ b/gerberex/utility.py @@ -11,3 +11,11 @@ def rotate(x, y, angle, center): angle = angle * pi / 180.0 return (cos(angle) * x0 - sin(angle) * y0 + center[0], sin(angle) * x0 + cos(angle) * y0 + center[1]) + +def is_equal_value(a, b, error_range=0): + return a - b <= error_range and a - b >= -error_range + + +def is_equal_point(a, b, error_range=0): + return is_equal_value(a[0], b[0], error_range) and \ + is_equal_value(a[1], b[1], error_range)