Add mode statement parsing
This commit is contained in:
parent
bcb6cbc50d
commit
84bfd34e91
3 changed files with 33 additions and 11 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"')
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue