summaryrefslogtreecommitdiff
path: root/gerber/render.py
diff options
context:
space:
mode:
Diffstat (limited to 'gerber/render.py')
-rw-r--r--gerber/render.py140
1 files changed, 140 insertions, 0 deletions
diff --git a/gerber/render.py b/gerber/render.py
new file mode 100644
index 0000000..dd30ae0
--- /dev/null
+++ b/gerber/render.py
@@ -0,0 +1,140 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright 2013-2014 Paulo Henrique Silva <ph.silva@gmail.com>
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+IMAGE_POLARITY_POSITIVE = 1
+IMAGE_POLARITY_NEGATIVE = 2
+
+LEVEL_POLARITY_DARK = 1
+LEVEL_POLARITY_CLEAR = 2
+
+NOTATION_ABSOLUTE = 1
+NOTATION_INCREMENTAL = 2
+
+UNIT_INCH = 1
+UNIT_MM = 2
+
+INTERPOLATION_LINEAR = 1
+INTERPOLATION_ARC = 2
+
+
+class GerberCoordFormat(object):
+ def __init__(self, zeroes, x, y):
+ self.omit_leading_zeroes = True if zeroes == "L" else False
+ self.omit_trailing_zeroes = True if zeroes == "T" else False
+ self.x_int_digits, self.x_dec_digits = [int(d) for d in x]
+ self.y_int_digits, self.y_dec_digits = [int(d) for d in y]
+
+ def resolve(self, x, y):
+ new_x = x
+ new_y = y
+
+ if new_x is not None:
+ negative = "-" in new_x
+ new_x = new_x.replace("-", "")
+
+ missing_zeroes = (self.x_int_digits + self.x_dec_digits) - len(new_x)
+
+ if missing_zeroes and self.omit_leading_zeroes:
+ new_x = (missing_zeroes * "0") + new_x
+ elif missing_zeroes and self.omit_trailing_zeroes:
+ new_x += missing_zeroes * "0"
+
+ new_x = float("{0}{1}.{2}".format("-" if negative else "",
+ new_x[:self.x_int_digits],
+ new_x[self.x_int_digits:]))
+
+ if new_y is not None:
+ negative = "-" in new_y
+ new_y = new_y.replace("-", "")
+
+ missing_zeroes = (self.y_int_digits + self.y_dec_digits) - len(new_y)
+
+ if missing_zeroes and self.omit_leading_zeroes:
+ new_y = (missing_zeroes * "0") + new_y
+ elif missing_zeroes and self.omit_trailing_zeroes:
+ new_y += missing_zeroes * "0"
+
+ new_y = float("{0}{1}.{2}".format("-" if negative else "",
+ new_y[:self.y_int_digits],
+ new_y[self.y_int_digits:]))
+
+ return new_x, new_y
+
+
+class GerberContext(object):
+ coord_format = None
+ coord_notation = NOTATION_ABSOLUTE
+ coord_unit = None
+
+ x = 0
+ y = 0
+
+ aperture = 0
+ interpolation = INTERPOLATION_LINEAR
+
+ image_polarity = IMAGE_POLARITY_POSITIVE
+ level_polarity = LEVEL_POLARITY_DARK
+
+ def __init__(self):
+ pass
+
+ def set_coord_format(self, zeroes, x, y):
+ self.coord_format = GerberCoordFormat(zeroes, x, y)
+
+ def set_coord_notation(self, notation):
+ self.coord_notation = NOTATION_ABSOLUTE if notation == "A" else NOTATION_INCREMENTAL
+
+ def set_coord_unit(self, unit):
+ self.coord_unit = UNIT_INCH if unit == "IN" else UNIT_MM
+
+ def set_image_polarity(self, polarity):
+ self.image_polarity = IMAGE_POLARITY_POSITIVE if polarity == "POS" else IMAGE_POLARITY_NEGATIVE
+
+ def set_level_polarity(self, polarity):
+ self.level_polarity = LEVEL_POLARITY_DARK if polarity == "D" else LEVEL_POLARITY_CLEAR
+
+ def set_interpolation(self, interpolation):
+ self.interpolation = INTERPOLATION_LINEAR if interpolation in ("G01", "G1") else INTERPOLATION_ARC
+
+ def set_aperture(self, d):
+ self.aperture = d
+
+ def resolve(self, x, y):
+ x, y = self.coord_format.resolve(x, y)
+ return x or self.x, y or self.y
+
+ def define_aperture(self, d, shape, modifiers):
+ pass
+
+ def move(self, x, y, resolve=True):
+ if resolve:
+ self.x, self.y = self.resolve(x, y)
+ else:
+ self.x, self.y = x, y
+
+ def stroke(self, x, y):
+ pass
+
+ def line(self, x, y):
+ pass
+
+ def arc(self, x, y):
+ pass
+
+ def flash(self, x, y):
+ pass