Fix issue with chaning region mode via flash. Add options for controlling output from rendered gerber

This commit is contained in:
Garret Fick 2016-07-10 15:07:17 +08:00
parent 0107d159b5
commit 9b0d3b1122
3 changed files with 53 additions and 5 deletions

View file

@ -886,7 +886,10 @@ class CoordStmt(Statement):
@classmethod
def move(cls, func, point):
return cls(func, point[0], point[1], None, None, CoordStmt.OP_MOVE, None)
if point:
return cls(func, point[0], point[1], None, None, CoordStmt.OP_MOVE, None)
# No point specified, so just write the function. This is normally for ending a region (D02*)
return cls(func, None, None, None, None, CoordStmt.OP_MOVE, None)
@classmethod
def line(cls, func, point):
@ -902,7 +905,10 @@ class CoordStmt(Statement):
@classmethod
def flash(cls, point):
return cls(None, point[0], point[1], None, None, CoordStmt.OP_FLASH, None)
if point:
return cls(None, point[0], point[1], None, None, CoordStmt.OP_FLASH, None)
else:
return cls(None, None, None, None, None, CoordStmt.OP_FLASH, None)
def __init__(self, function, x, y, i, j, op, settings):
""" Initialize CoordStmt class

View file

@ -136,6 +136,9 @@ class GerberContext(object):
return
color = (self.color if primitive.level_polarity == 'dark'
else self.background_color)
self._pre_render_primitive(primitive)
if isinstance(primitive, Line):
self._render_line(primitive, color)
elif isinstance(primitive, Arc):
@ -160,8 +163,22 @@ class GerberContext(object):
self._render_region(primitive, color)
elif isinstance(primitive, TestRecord):
self._render_test_record(primitive, color)
else:
return
self._post_render_primitive(primitive)
def _pre_render_primitive(self, primitive):
"""
Called before rendering a primitive. Use the callback to perform some action before rendering
a primitive, for example adding a comment.
"""
return
def _post_render_primitive(self, primitive):
"""
Called after rendering a primitive. Use the callback to perform some action after rendering
a primitive
"""
return
def _render_line(self, primitive, color):
pass

View file

@ -90,6 +90,17 @@ class Rs274xContext(GerberContext):
self._quadrant_mode = None
self._dcode = None
# Primarily for testing and comarison to files, should we write
# flashes as a single statement or a move plus flash? Set to true
# to do in a single statement. Normally this can be false
self.condensed_flash = True
# When closing a region, force a D02 staement to close a region.
# This is normally not necessary because regions are closed with a G37
# staement, but this will add an extra statement for doubly close
# the region
self.explicit_region_move_end = False
self._next_dcode = 10
self._rects = {}
self._circles = {}
@ -153,6 +164,11 @@ class Rs274xContext(GerberContext):
if aper.d != self._dcode:
self.body.append(ApertureStmt(aper.d))
self._dcode = aper.d
def _pre_render_primitive(self, primitive):
if hasattr(primitive, 'comment'):
self.body.append(CommentStmt(primitive.comment))
def _render_line(self, line, color):
@ -233,6 +249,8 @@ class Rs274xContext(GerberContext):
else:
self._render_arc(p, color)
if self.explicit_region_move_end:
self.body.append(CoordStmt.move(None, None))
self.body.append(RegionModeStmt.off())
@ -243,11 +261,18 @@ class Rs274xContext(GerberContext):
def _render_flash(self, primitive, aperture):
self._render_level_polarity(primitive)
if aperture.d != self._dcode:
self.body.append(ApertureStmt(aperture.d))
self._dcode = aperture.d
self.body.append(CoordStmt.flash( self._simplify_point(primitive.position)))
if self.condensed_flash:
self.body.append(CoordStmt.flash(self._simplify_point(primitive.position)))
else:
self.body.append(CoordStmt.move(None, self._simplify_point(primitive.position)))
self.body.append(CoordStmt.flash(None))
self._pos = primitive.position
def _get_circle(self, diameter, dcode = None):