support incremental coordinate for excellon

This commit is contained in:
Hiroshi Murayama 2019-08-25 20:16:53 +09:00
parent 36956f93fe
commit 13ab9db6e7
4 changed files with 16 additions and 62 deletions

View file

@ -124,8 +124,6 @@ class GerberComposition(Composition):
class DrillComposition(Composition):
def __init__(self, settings=None, comments=None):
super(DrillComposition, self).__init__(settings, comments)
self.header1_statements = []
self.header2_statements = []
self.tools = []
self.hits = []
self.dxf_statements = []
@ -140,12 +138,6 @@ class DrillComposition(Composition):
def dump(self, path):
def statements():
for s in self.header1_statements:
yield s.to_excellon(self.settings)
for t in self.tools:
yield t.to_excellon(self.settings)
for s in self.header2_statements:
yield s.to_excellon(self.settings)
for t in self.tools:
yield ToolSelectionStmt(t.number).to_excellon(self.settings)
for h in self.hits:
@ -157,6 +149,7 @@ class DrillComposition(Composition):
yield EndOfProgramStmt().to_excellon()
with open(path, 'w') as f:
gerberex.excellon.write_excellon_header(f, self.settings, self.tools)
for statement in statements():
f.write(statement + '\n')
@ -171,20 +164,6 @@ class DrillComposition(Composition):
else:
file.to_inch()
if not self.header1_statements:
in_header1 = True
for statement in file.statements:
if not isinstance(statement, ToolSelectionStmt):
if isinstance(statement, ExcellonTool):
in_header1 = False
else:
if in_header1:
self.header1_statements.append(statement)
else:
self.header2_statements.append(statement)
else:
break
for tool in iter(file.tools.values()):
num = tool.number
tool_map[num] = self._register_tool(tool)
@ -202,10 +181,6 @@ class DrillComposition(Composition):
else:
file.to_inch()
if not self.header1_statements:
self.header1_statements = [file.header]
self.header2_statements = [file.header2]
tool = self._register_tool(ExcellonTool(self.settings, number=1, diameter=file.width))
self.dxf_statements.append((tool.number, file.statements))

View file

@ -13,6 +13,7 @@ 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
from gerberex.excellon import write_excellon_header
ACCEPTABLE_ERROR = 0.001
@ -465,31 +466,8 @@ class DxfHeaderStatement(object):
)
def to_excellon(self, settings):
return 'M48\n'\
'FMAT,2\n'\
'ICI,{0}\n'\
'{1},{2},{3}.{4}\n'\
'{5}'.format(
'ON' if settings.notation == 'incremental' else 'OFF',
'INCH' if settings.units == 'inch' else 'METRIC',
'TZ' if settings.zero_suppression == 'leading' else 'LZ',
'0' * settings.format[0], '0' * settings.format[1],
'M72' if settings.units == 'inch' else 'M71'
)
def to_inch(self):
pass
def to_metric(self):
pass
class DxfHeader2Statement(object):
def to_gerber(self, settings):
pass
def to_excellon(self, settings):
return '%'
def to_inch(self):
pass
@ -555,7 +533,6 @@ class DxfFile(CamFile):
self._draw_mode = draw_mode
self.header = DxfHeaderStatement()
self.header2 = DxfHeader2Statement()
self.aperture = ADParamStmt.circle(dcode=10, diameter=0.0)
self.statements = DxfStatements(
statements, self.units, dcode=self.aperture.d, draw_mode=self.draw_mode)
@ -607,10 +584,8 @@ class DxfFile(CamFile):
f.write(self.statements.to_gerber(self.settings) + '\n')
f.write('M02*\n')
else:
tool = ExcellonTool(self.settings, number=1, diameter=self.width)
f.write(self.header.to_excellon(self.settings) + '\n')
f.write(tool.to_excellon(self.settings) + '\n')
f.write(self.header2.to_excellon(self.settings) + '\n')
tools = [ExcellonTool(self.settings, number=1, diameter=self.width)]
write_excellon_header(f, self.settings, tools)
f.write('T01\n')
f.write(self.statements.to_excellon(self.settings) + '\n')
f.write('M30\n')

View file

@ -26,6 +26,13 @@ def loads(data, filename=None, settings=None, tools=None, format=None):
file = ExcellonParser(settings, tools).parse_raw(data, filename)
return ExcellonFileEx.from_file(file)
def write_excellon_header(file, settings, tools):
file.write('M48\nFMAT,2\nICI,OFF\n%s\n' %
UnitStmtEx(settings.units, settings.zeros, settings.format).to_excellon(settings))
for tool in tools:
file.write(tool.to_excellon(settings) + '\n')
file.write('%%\nG90\n%s\n' % ('M72' if settings.units == 'inch' else 'M71'))
class ExcellonFileEx(ExcellonFile):
@classmethod
def from_file(cls, file):
@ -180,6 +187,7 @@ class ExcellonFileEx(ExcellonFile):
self.tools[tool].to_inch()
for hit in self.hits:
hit.to_inch()
self.units = 'inch'
def to_metric(self):
if self.units == 'inch':
@ -189,17 +197,12 @@ class ExcellonFileEx(ExcellonFile):
self.tools[tool].to_metric()
for hit in self.hits:
hit.to_metric()
self.units = 'metric'
def write(self, filename=None):
filename = filename if filename is not None else self.filename
with open(filename, 'w') as f:
for statement in self.statements:
if not isinstance(statement, ToolSelectionStmt):
f.write(statement.to_excellon(self.settings) + '\n')
else:
break
write_excellon_header(f, self.settings, [self.tools[t] for t in self.tools])
for tool in iter(self.tools.values()):
f.write(ToolSelectionStmt(
tool.number).to_excellon(self.settings) + '\n')

View file

@ -2,9 +2,10 @@ M48
FMAT,2
ICI,OFF
METRIC,TZ,000.000
M71
T01C0.500
%
G90
M71
T01
X1000Y9000
X1000Y8000