fix a rotaion issue
This commit is contained in:
parent
b72d891998
commit
cb420e39e2
5 changed files with 28 additions and 13 deletions
|
|
@ -37,16 +37,17 @@ for ext in exts:
|
||||||
ctx = DrillComposition()
|
ctx = DrillComposition()
|
||||||
else:
|
else:
|
||||||
ctx = GerberComposition()
|
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 = gerberex.read(path + ext)
|
||||||
file.to_metric()
|
file.to_metric()
|
||||||
file.rotate(theta)
|
file.rotate(angle)
|
||||||
file.offset(x_offset, y_offset)
|
file.offset(x_offset, y_offset)
|
||||||
ctx.merge(file)
|
ctx.merge(file)
|
||||||
putstr('.')
|
putstr('.')
|
||||||
if ext == 'TXT':
|
if ext == 'TXT':
|
||||||
file = gerberex.read(mousebites)
|
file = gerberex.read(mousebites)
|
||||||
file.draw_mode = DxfFile.DM_MOUSE_BITES
|
file.draw_mode = DxfFile.DM_MOUSE_BITES
|
||||||
|
file.to_metric()
|
||||||
file.width = 0.5
|
file.width = 0.5
|
||||||
file.format = (3, 3)
|
file.format = (3, 3)
|
||||||
ctx.merge(file)
|
ctx.merge(file)
|
||||||
|
|
|
||||||
|
|
@ -11,17 +11,11 @@ from gerber.utils import inch, metric, write_gerber_value
|
||||||
from gerber.gerber_statements import ADParamStmt
|
from gerber.gerber_statements import ADParamStmt
|
||||||
from gerber.excellon_statements import ExcellonTool
|
from gerber.excellon_statements import ExcellonTool
|
||||||
from gerber.excellon_statements import CoordinateStmt
|
from gerber.excellon_statements import CoordinateStmt
|
||||||
|
from gerberex.utility import is_equal_point, is_equal_value
|
||||||
from gerberex.dxf_path import generate_closed_paths
|
from gerberex.dxf_path import generate_closed_paths
|
||||||
|
|
||||||
ACCEPTABLE_ERROR = 0.001
|
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):
|
class DxfStatement(object):
|
||||||
def __init__(self, entity):
|
def __init__(self, entity):
|
||||||
self.entity = entity
|
self.entity = entity
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
from gerber.utils import inch, metric, write_gerber_value
|
from gerber.utils import inch, metric, write_gerber_value
|
||||||
from gerber.cam import FileSettings
|
from gerber.cam import FileSettings
|
||||||
|
from gerberex.utility import is_equal_point, is_equal_value
|
||||||
|
|
||||||
class DxfPath(object):
|
class DxfPath(object):
|
||||||
def __init__(self, statement, error_range=0):
|
def __init__(self, statement, error_range=0):
|
||||||
|
|
@ -21,12 +22,10 @@ class DxfPath(object):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_closed(self):
|
def is_closed(self):
|
||||||
from gerberex.dxf import is_equal_point
|
|
||||||
return len(self.statements) > 1 and \
|
return len(self.statements) > 1 and \
|
||||||
is_equal_point(self.start, self.end, self.error_range)
|
is_equal_point(self.start, self.end, self.error_range)
|
||||||
|
|
||||||
def is_equal_to(self, target, error_range=0):
|
def is_equal_to(self, target, error_range=0):
|
||||||
from gerberex.dxf import is_equal_point
|
|
||||||
if not isinstance(target, DxfPath):
|
if not isinstance(target, DxfPath):
|
||||||
return False
|
return False
|
||||||
if len(self.statements) != len(target.statements):
|
if len(self.statements) != len(target.statements):
|
||||||
|
|
@ -59,7 +58,6 @@ class DxfPath(object):
|
||||||
self.statements = rlist
|
self.statements = rlist
|
||||||
|
|
||||||
def merge(self, element, error_range=0):
|
def merge(self, element, error_range=0):
|
||||||
from gerberex.dxf import is_equal_point
|
|
||||||
if self.is_closed or element.is_closed:
|
if self.is_closed or element.is_closed:
|
||||||
return False
|
return False
|
||||||
if not error_range:
|
if not error_range:
|
||||||
|
|
|
||||||
|
|
@ -30,11 +30,25 @@ class GerberFile(gerber.rs274x.GerberFile):
|
||||||
if angle % 360 == 0:
|
if angle % 360 == 0:
|
||||||
return
|
return
|
||||||
self._generalize_aperture()
|
self._generalize_aperture()
|
||||||
|
last_x = 0
|
||||||
|
last_y = 0
|
||||||
|
last_rx = 0
|
||||||
|
last_ry = 0
|
||||||
for statement in self.statements:
|
for statement in self.statements:
|
||||||
if isinstance(statement, AMParamStmtEx):
|
if isinstance(statement, AMParamStmtEx):
|
||||||
statement.rotate(angle, center)
|
statement.rotate(angle, center)
|
||||||
elif isinstance(statement, CoordStmt) and statement.x != None and statement.y != None:
|
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):
|
def _generalize_aperture(self):
|
||||||
RECTANGLE = 0
|
RECTANGLE = 0
|
||||||
|
|
|
||||||
|
|
@ -11,3 +11,11 @@ def rotate(x, y, angle, center):
|
||||||
angle = angle * pi / 180.0
|
angle = angle * pi / 180.0
|
||||||
return (cos(angle) * x0 - sin(angle) * y0 + center[0],
|
return (cos(angle) * x0 - sin(angle) * y0 + center[0],
|
||||||
sin(angle) * x0 + cos(angle) * y0 + center[1])
|
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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue