Add mode statement parsing

This commit is contained in:
Hamilton Kibbe 2014-10-09 09:51:29 -04:00
parent bcb6cbc50d
commit 84bfd34e91
3 changed files with 33 additions and 11 deletions

View file

@ -164,6 +164,9 @@ class GerberParser(object):
EOF_STMT = re.compile(r"(?P<eof>M02)\*")
REGION_MODE_STMT = re.compile(r'(?P<mode>G3[67])\*')
QUAD_MODE_STMT = re.compile(r'(?P<mode>G7[45])\*')
def __init__(self):
self.settings = FileSettings()
self.statements = []
@ -206,12 +209,21 @@ class GerberParser(object):
while did_something and len(line) > 0:
did_something = False
# region mode
#if 'G36' in line or 'G37' in line:
# yield RegionModeStmt.from_gerber(line)
# did_something = True
# line = ''
# continue
# Region Mode
(mode, r) = self._match_one(self.REGION_MODE_STMT, line)
if mode:
yield RegionModeStmt.from_gerber(line)
line = r
did_something = True
continue
# Quadrant Mode
(mode, r) = self._match_one(self.QUAD_MODE_STMT, line)
if mode:
yield QuadrantModeStmt.from_gerber(line)
line = r
did_something = True
continue
# coord
(coord, r) = self._match_one(self.COORD_STMT, line)

View file

@ -600,7 +600,7 @@ class QuadrantModeStmt(Statement):
else cls('multi-quadrant'))
def __init__(self, mode):
super(QuadrantModeStmt, self).__init__('Quadrant Mode')
super(QuadrantModeStmt, self).__init__('QuadrantMode')
mode = mode.lower()
if mode not in ['single-quadrant', 'multi-quadrant']:
raise ValueError('Quadrant mode must be "single-quadrant" \
@ -611,7 +611,7 @@ class QuadrantModeStmt(Statement):
return 'G74*' if self.mode == 'single-quadrant' else 'G75*'
class RegionModeStmt(Statement):
@classmethod
def from_gerber(cls, line):
line = line.strip()
@ -620,7 +620,7 @@ class RegionModeStmt(Statement):
return (cls('on') if line[:3] == 'G36' else cls('off'))
def __init__(self, mode):
super(RegionModeStmt, self).__init__('Region Mode')
super(RegionModeStmt, self).__init__('RegionMode')
mode = mode.lower()
if mode not in ['on', 'off']:
raise ValueError('Valid modes are "on" or "off"')

View file

@ -16,8 +16,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from ..gerber_statements import (
CommentStmt, UnknownStmt, EofStmt, ParamStmt, CoordStmt, ApertureStmt
from ..gerber_statements import (CommentStmt, UnknownStmt, EofStmt, ParamStmt,
CoordStmt, ApertureStmt, RegionModeStmt,
QuadrantModeStmt,
)
@ -111,9 +112,18 @@ class GerberContext(object):
elif isinstance(stmt, ApertureStmt):
self._evaluate_aperture(stmt)
elif isinstance(stmt, (RegionModeStmt, QuadrantModeStmt)):
self._evaluate_mode(stmt)
else:
raise Exception("Invalid statement to evaluate")
def _evaluate_mode(self, stmt):
if stmt.type == 'RegionMode':
self.region_mode = stmt.mode
elif stmt.type == 'QuadrantMode':
self.quadrant_mode = stmt.mode
def _evaluate_param(self, stmt):
if stmt.param == "FS":
self.set_coord_format(stmt.zero_suppression, stmt.format,