Hid context from the user

This commit is contained in:
Roger Maitland 2022-07-03 10:55:56 -04:00
parent 30c0045a6d
commit 366b7a38f8
2 changed files with 51 additions and 59 deletions

View file

@ -28,20 +28,25 @@ class Build1D:
def working_line(self) -> Wire:
return Wire.assembleEdges(self.edge_list)
def __init__(
self, parent: Union[Build2D, Build3D] = None, mode: Mode = Mode.ADDITION
):
def __init__(self, mode: Mode = Mode.ADDITION):
self.edge_list = []
self.tags: dict[str, Edge] = {}
self.parent = parent
self.mode = mode
def __enter__(self):
if "context_stack" in globals():
context_stack.append(self)
else:
globals()["context_stack"] = [self]
return self
def __exit__(self, exception_type, exception_value, traceback):
if self.parent is not None:
self.parent.add(*self.edge_list, mode=self.mode)
# if self.parent is not None:
# self.parent.add(*self.edge_list, mode=self.mode)
if "context_stack" in globals():
context_stack.pop()
if context_stack:
context_stack[-1].add(*self.edge_list, mode=self.mode)
def edges(self) -> list[Edge]:
return self.edge_list
@ -57,17 +62,19 @@ class Build1DObject(ABC):
@property
@abstractmethod
def object(self):
"""Each derived class must provide the object created"""
"""Each derived class must provide the created object"""
return NotImplementedError
@staticmethod
def add(context: Build1D, *edges: Edge, mode: Mode = Mode.ADDITION):
if context is not None and mode != Mode.CONSTRUCTION:
for edge in edges:
if not isinstance(edge, Edge):
raise ValueError("Build1D.add only accepts edges")
context.edge_list.append(edge)
print(f"{context.edge_list=}")
def add(*edges: Edge, mode: Mode = Mode.ADDITION):
if "context_stack" in globals():
if context_stack: # Stack isn't empty
for edge in edges:
edge.forConstruction = mode == Mode.CONSTRUCTION
if not isinstance(edge, Edge):
raise ValueError("Build1D.add only accepts edges")
context_stack[-1].edge_list.append(edge)
print(f"{context_stack[-1].edge_list=}")
class Polyline(Build1DObject):
@ -78,7 +85,7 @@ class Polyline(Build1DObject):
else:
return Wire.assembleEdges(self.new_edges)
def __init__(self, context: Build1D, *pts: VectorLike, mode: Mode = Mode.ADDITION):
def __init__(self, *pts: VectorLike, mode: Mode = Mode.ADDITION):
if len(pts) < 2:
raise ValueError("polyline requires two or more pts")
@ -88,7 +95,7 @@ class Polyline(Build1DObject):
Edge.makeLine(lines_pts[i], lines_pts[i + 1])
for i in range(len(lines_pts) - 1)
]
Build1DObject.add(context, *self.new_edges, mode=mode)
Build1DObject.add(*self.new_edges, mode=mode)
class Spline(Build1DObject):
@ -98,7 +105,6 @@ class Spline(Build1DObject):
def __init__(
self,
context: Build1D,
*pts: VectorLike,
tangents: Iterable[VectorLike] = None,
tangent_scalars: Iterable[float] = None,
@ -129,7 +135,7 @@ class Spline(Build1DObject):
scale=tangent_scalars is None,
)
Build1DObject.add(context, self.spline, mode=mode)
Build1DObject.add(self.spline, mode=mode)
class CenterArc(Build1DObject):
@ -139,7 +145,6 @@ class CenterArc(Build1DObject):
def __init__(
self,
context: Build1D,
center: VectorLike,
radius: float,
start_angle: float,
@ -170,7 +175,7 @@ class CenterArc(Build1DObject):
)
self.arc = Edge.makeThreePointArc(p1, p2, p3)
Build1DObject.add(context, self.arc, mode=mode)
Build1DObject.add(self.arc, mode=mode)
class ThreePointArc(Build1DObject):
@ -178,12 +183,12 @@ class ThreePointArc(Build1DObject):
def object(self) -> Edge:
return self.arc
def __init__(self, context: Build1D, *pts: VectorLike, mode: Mode = Mode.ADDITION):
def __init__(self, *pts: VectorLike, mode: Mode = Mode.ADDITION):
if len(pts) != 3:
raise ValueError("ThreePointArc requires three points")
points = [Vector(p) for p in pts]
self.arc = Edge.makeThreePointArc(*points)
Build1DObject.add(context, self.arc, mode=mode)
Build1DObject.add(self.arc, mode=mode)
class TangentArc(Build1DObject):
@ -193,7 +198,6 @@ class TangentArc(Build1DObject):
def __init__(
self,
context: Build1D,
*pts: VectorLike,
tangent: VectorLike,
tangent_from_first: bool = True,
@ -209,7 +213,7 @@ class TangentArc(Build1DObject):
arc_pts[point_indices[0]], arc_tangent, arc_pts[point_indices[1]]
)
Build1DObject.add(context, self.arc, mode=mode)
Build1DObject.add(self.arc, mode=mode)
class RadiusArc(Build1DObject):
@ -219,7 +223,6 @@ class RadiusArc(Build1DObject):
def __init__(
self,
context: Build1D,
start_point: VectorLike,
end_point: VectorLike,
radius: float,
@ -238,14 +241,9 @@ class RadiusArc(Build1DObject):
# Return a sagitta arc
if radius > 0:
self.arc = SagittaArc(
context, start, end, sagitta, mode=Mode.CONSTRUCTION
).object
self.arc = SagittaArc(start, end, sagitta, mode=mode).object
else:
self.arc = SagittaArc(
context, start, end, -sagitta, mode=Mode.CONSTRUCTION
).object
Build1DObject.add(context, self.arc, mode=mode)
self.arc = SagittaArc(start, end, -sagitta, mode=mode).object
class SagittaArc(Build1DObject):
@ -255,7 +253,6 @@ class SagittaArc(Build1DObject):
def __init__(
self,
context: Build1D,
start_point: VectorLike,
end_point: VectorLike,
sagitta: float,
@ -280,10 +277,7 @@ class SagittaArc(Build1DObject):
sag_point = mid_point + sagitta_vector
self.arc = ThreePointArc(
context, start, sag_point, end, mode=Mode.CONSTRUCTION
).object
Build1DObject.add(context, self.arc, mode=mode)
self.arc = ThreePointArc(start, sag_point, end, mode=mode).object
class MirrorX(Build1DObject):
@ -295,9 +289,9 @@ class MirrorX(Build1DObject):
else self.mirrored_edges
)
def __init__(self, context: Build1D, *edges: Edge, mode: Mode = Mode.ADDITION):
def __init__(self, *edges: Edge, mode: Mode = Mode.ADDITION):
self.mirrored_edges = Plane.named("XY").mirrorInPlane(edges, axis="X")
Build1DObject.add(context, *self.mirrored_edges, mode=mode)
Build1DObject.add(*self.mirrored_edges, mode=mode)
class MirrorY(Build1DObject):
@ -309,6 +303,6 @@ class MirrorY(Build1DObject):
else self.mirrored_edges
)
def __init__(self, context: Build1D, *edges: Edge, mode: Mode = Mode.ADDITION):
def __init__(self, *edges: Edge, mode: Mode = Mode.ADDITION):
self.mirrored_edges = Plane.named("XY").mirrorInPlane(edges, axis="Y")
Build1DObject.add(context, *self.mirrored_edges, mode=mode)
Build1DObject.add(*self.mirrored_edges, mode=mode)

View file

@ -1,25 +1,23 @@
from cadquery import Vector
from build123d_common import *
import build1d as b
from build1d import *
with b.Build1D() as ml:
l1 = b.Polyline(ml, (0.0000, 0.0771), (0.0187, 0.0771), (0.0094, 0.2569)).object
l2 = b.Polyline(ml, (0.0325, 0.2773), (0.2115, 0.2458), (0.1873, 0.3125)).object
b.RadiusArc(ml, l1 @ 1, l2 @ 0, 0.0271)
l3 = b.Polyline(ml, (0.1915, 0.3277), (0.3875, 0.4865), (0.3433, 0.5071)).object
b.TangentArc(ml, l2 @ 1, l3 @ 0, tangent=l2 % 1)
l4 = b.Polyline(ml, (0.3362, 0.5235), (0.375, 0.6427), (0.2621, 0.6188)).object
b.SagittaArc(ml, l3 @ 1, l4 @ 0, 0.003)
l5 = b.Polyline(ml, (0.2469, 0.6267), (0.225, 0.6781), (0.1369, 0.5835)).object
b.ThreePointArc(
ml, l4 @ 1, (l4 @ 1 + l5 @ 0) * 0.5 + Vector(-0.002, -0.002), l5 @ 0
)
l6 = b.Polyline(ml, (0.1138, 0.5954), (0.1562, 0.8146), (0.0881, 0.7752)).object
b.Spline(ml, l5 @ 1, l6 @ 0, tangents=(l5 % 1, l6 % 0), tangent_scalars=(2, 2))
l7 = b.Polyline(ml, (0.0692, 0.7808), (0.0000, 0.9167)).object
b.TangentArc(ml, l6 @ 1, l7 @ 0, tangent=l6 % 1)
b.MirrorY(ml, *ml.edges())
with Build1D() as ml:
l1 = Polyline((0.0000, 0.0771), (0.0187, 0.0771), (0.0094, 0.2569)).object
l2 = Polyline((0.0325, 0.2773), (0.2115, 0.2458), (0.1873, 0.3125)).object
RadiusArc(l1 @ 1, l2 @ 0, 0.0271)
l3 = Polyline((0.1915, 0.3277), (0.3875, 0.4865), (0.3433, 0.5071)).object
TangentArc(l2 @ 1, l3 @ 0, tangent=l2 % 1)
l4 = Polyline((0.3362, 0.5235), (0.375, 0.6427), (0.2621, 0.6188)).object
SagittaArc(l3 @ 1, l4 @ 0, 0.003)
l5 = Polyline((0.2469, 0.6267), (0.225, 0.6781), (0.1369, 0.5835)).object
ThreePointArc(l4 @ 1, (l4 @ 1 + l5 @ 0) * 0.5 + Vector(-0.002, -0.002), l5 @ 0)
l6 = Polyline((0.1138, 0.5954), (0.1562, 0.8146), (0.0881, 0.7752)).object
Spline(l5 @ 1, l6 @ 0, tangents=(l5 % 1, l6 % 0), tangent_scalars=(2, 2))
l7 = Polyline((0.0692, 0.7808), (0.0000, 0.9167)).object
TangentArc(l6 @ 1, l7 @ 0, tangent=l6 % 1)
MirrorY(*ml.edges())
if "show_object" in locals():
show_object(ml.edge_list, "maple leaf")