kopia lustrzana https://gitlab.com/gerbolyze/gerbonara
fix a rotaion issue
rodzic
b72d891998
commit
cb420e39e2
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Ładowanie…
Reference in New Issue