fix a rotaion issue

refactor
opiopan 2019-04-03 00:30:00 +09:00
rodzic b72d891998
commit cb420e39e2
5 zmienionych plików z 28 dodań i 13 usunięć

Wyświetl plik

@ -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)

Wyświetl plik

@ -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

Wyświetl plik

@ -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:

Wyświetl plik

@ -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

Wyświetl plik

@ -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)