summaryrefslogtreecommitdiff
path: root/gerbonara/gerber/graphic_objects.py
diff options
context:
space:
mode:
authorjaseg <git@jaseg.de>2021-12-29 19:58:20 +0100
committerjaseg <git@jaseg.de>2021-12-29 19:58:20 +0100
commit3fb26e6940b5ae752308d8a33f2608d266795153 (patch)
treea563b0cf512e5661b2a450ebf73eafe655ac18b2 /gerbonara/gerber/graphic_objects.py
parent30dabef9ee83021067957854187b9bbf245c14cf (diff)
downloadgerbonara-3fb26e6940b5ae752308d8a33f2608d266795153.tar.gz
gerbonara-3fb26e6940b5ae752308d8a33f2608d266795153.tar.bz2
gerbonara-3fb26e6940b5ae752308d8a33f2608d266795153.zip
Basic round-trip works
Diffstat (limited to 'gerbonara/gerber/graphic_objects.py')
-rw-r--r--gerbonara/gerber/graphic_objects.py53
1 files changed, 52 insertions, 1 deletions
diff --git a/gerbonara/gerber/graphic_objects.py b/gerbonara/gerber/graphic_objects.py
index 55d1b9c..47ed718 100644
--- a/gerbonara/gerber/graphic_objects.py
+++ b/gerbonara/gerber/graphic_objects.py
@@ -1,6 +1,10 @@
-import graphic_primitives as gp
+from dataclasses import dataclass, KW_ONLY
+from . import graphic_primitives as gp
+from .gerber_statements import *
+
+@dataclass
class GerberObject:
_ : KW_ONLY
polarity_dark : bool = True
@@ -73,6 +77,7 @@ class Region(GerberObject):
yield RegionEndStmt()
+@dataclass
class Line(GerberObject):
# Line with *round* end caps.
x1 : float
@@ -109,6 +114,52 @@ class Line(GerberObject):
yield InterpolateStmt(*self.p2)
+@dataclass
+class Drill(GerberObject):
+ x : float
+ y : float
+ diameter : float
+
+ def with_offset(self, dx, dy):
+ return replace(self, x=self.x+dx, y=self.y+dy)
+
+ def rotate(self, angle, cx=None, cy=None):
+ self.x, self.y = gp.rotate_point(self.x, self.y, angle, cx, cy)
+
+ def to_primitives(self):
+ yield gp.Circle(self.x, self.y, self.diameter/2)
+
+
+@dataclass
+class Slot(GerberObject):
+ x1 : float
+ y1 : float
+ x2 : float
+ y2 : float
+ width : float
+
+ def with_offset(self, dx, dy):
+ return replace(self, x1=self.x1+dx, y1=self.y1+dy, x2=self.x2+dx, y2=self.y2+dy)
+
+ def rotate(self, rotation, cx=None, cy=None):
+ if cx is None:
+ cx = (self.x1 + self.x2) / 2
+ cy = (self.y1 + self.y2) / 2
+ self.x1, self.y1 = gp.rotate_point(self.x1, self.y1, rotation, cx, cy)
+ self.x2, self.y2 = gp.rotate_point(self.x2, self.y2, rotation, cx, cy)
+
+ @property
+ def p1(self):
+ return self.x1, self.y1
+
+ @property
+ def p2(self):
+ return self.x2, self.y2
+
+ def to_primitives(self):
+ yield gp.Line(*self.p1, *self.p2, self.width, polarity_dark=self.polarity_dark)
+
+
class Arc(GerberObject):
x : float
y : float