mirror of
https://github.com/gumyr/build123d.git
synced 2025-12-06 02:30:55 -08:00
Hid context from the user
This commit is contained in:
parent
30c0045a6d
commit
366b7a38f8
2 changed files with 51 additions and 59 deletions
76
build1d.py
76
build1d.py
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue