Going with the class solution

This commit is contained in:
Roger Maitland 2022-07-04 19:04:39 -04:00
parent 996062ecc7
commit fad3d38691
2 changed files with 100 additions and 102 deletions

View file

@ -1,9 +1,7 @@
from math import pi, sin, cos, radians, sqrt
from typing import Union, Iterable, Sequence, Callable
from enum import Enum, auto
from abc import ABC, abstractmethod
import cadquery as cq
from cadquery.hull import find_hull
from cadquery import (
Edge,
Face,
@ -47,8 +45,11 @@ class Build1D:
context_stack.pop()
if context_stack:
context_stack[-1].add(*self.edge_list, mode=self.mode)
if not context_stack:
del globals()["context_stack"]
def edges(self) -> list[Edge]:
def edges(self) -> EdgeList:
# return EdgeList(*self.edge_list)
return self.edge_list
def vertices(self) -> list[Vertex]:
@ -57,52 +58,50 @@ class Build1D:
vertex_list.extend(e.Vertices())
return list(set(vertex_list))
class Build1DObject(ABC):
@property
@abstractmethod
def object(self):
"""Each derived class must provide the created object"""
return NotImplementedError
@staticmethod
def add(*edges: Edge, mode: Mode = Mode.ADDITION):
if "context_stack" in globals():
def add_to_context(*edges: Edge, mode: Mode = Mode.ADDITION):
if "context_stack" in globals() and mode != Mode.PRIVATE:
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")
# if not isinstance(edge, Edge):
# if not issubclass(type(edge),Edge):
# raise ValueError("Build1D.add only accepts edges")
context_stack[-1].edge_list.append(edge)
print(f"{context_stack[-1].edge_list=}")
@staticmethod
def get_context() -> "Build1D":
return context_stack[-1]
class Polyline(Build1DObject):
@property
def object(self) -> Union[Edge, Wire]:
if len(self.new_edges) == 1:
return self.new_edges[0]
else:
return Wire.assembleEdges(self.new_edges)
class Line(Edge):
def __init__(self, *pts: VectorLike, mode: Mode = Mode.ADDITION):
if len(pts) < 2:
raise ValueError("polyline requires two or more pts")
if len(pts) != 2:
raise ValueError("Line requires two pts")
lines_pts = [Vector(p) for p in pts]
self.new_edges = [
new_edge = Edge.makeLine(lines_pts[0], lines_pts[1])
Build1D.add_to_context(new_edge, mode=mode)
super().__init__(new_edge.wrapped)
class Polyline(Wire):
def __init__(self, *pts: VectorLike, mode: Mode = Mode.ADDITION):
if len(pts) < 3:
raise ValueError("polyline requires three or more pts")
lines_pts = [Vector(p) for p in pts]
new_edges = [
Edge.makeLine(lines_pts[i], lines_pts[i + 1])
for i in range(len(lines_pts) - 1)
]
Build1DObject.add(*self.new_edges, mode=mode)
Build1D.add_to_context(*new_edges, mode=mode)
super().__init__(Wire.assembleEdges(new_edges).wrapped)
class Spline(Build1DObject):
@property
def object(self) -> Edge:
return self.spline
class Spline(Edge):
def __init__(
self,
*pts: VectorLike,
@ -123,7 +122,7 @@ class Spline(Build1DObject):
else:
scalars = tangent_scalars
self.spline = Edge.makeSpline(
spline = Edge.makeSpline(
[p if isinstance(p, Vector) else Vector(*p) for p in spline_pts],
tangents=[
t * s if isinstance(t, Vector) else Vector(*t) * s
@ -134,15 +133,11 @@ class Spline(Build1DObject):
periodic=periodic,
scale=tangent_scalars is None,
)
Build1DObject.add(self.spline, mode=mode)
Build1D.add_to_context(spline, mode=mode)
super().__init__(spline.wrapped)
class CenterArc(Build1DObject):
@property
def object(self) -> Edge:
return self.arc
class CenterArc(Edge):
def __init__(
self,
center: VectorLike,
@ -153,7 +148,7 @@ class CenterArc(Build1DObject):
):
if abs(arc_size) >= 360:
self.arc = Edge.makeCircle(
arc = Edge.makeCircle(
radius,
center,
angle1=start_angle,
@ -173,29 +168,23 @@ class CenterArc(Build1DObject):
cos(radians(start_angle + arc_size)),
sin(radians(start_angle + arc_size)),
)
self.arc = Edge.makeThreePointArc(p1, p2, p3)
arc = Edge.makeThreePointArc(p1, p2, p3)
Build1DObject.add(self.arc, mode=mode)
Build1D.add_to_context(arc, mode=mode)
super().__init__(arc.wrapped)
class ThreePointArc(Build1DObject):
@property
def object(self) -> Edge:
return self.arc
class ThreePointArc(Edge):
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(self.arc, mode=mode)
arc = Edge.makeThreePointArc(*points)
Build1D.add_to_context(arc, mode=mode)
super().__init__(arc.wrapped)
class TangentArc(Build1DObject):
@property
def object(self) -> Edge:
return self.arc
class TangentArc(Edge):
def __init__(
self,
*pts: VectorLike,
@ -209,18 +198,15 @@ class TangentArc(Build1DObject):
arc_tangent = Vector(tangent)
point_indices = (0, -1) if tangent_from_first else (-1, 0)
self.arc = Edge.makeTangentArc(
arc = Edge.makeTangentArc(
arc_pts[point_indices[0]], arc_tangent, arc_pts[point_indices[1]]
)
Build1DObject.add(self.arc, mode=mode)
Build1D.add_to_context(arc, mode=mode)
super().__init__(arc.wrapped)
class RadiusArc(Build1DObject):
@property
def object(self) -> Edge:
return self.arc
class RadiusArc(Edge):
def __init__(
self,
start_point: VectorLike,
@ -241,16 +227,15 @@ class RadiusArc(Build1DObject):
# Return a sagitta arc
if radius > 0:
self.arc = SagittaArc(start, end, sagitta, mode=mode).object
arc = SagittaArc(start, end, sagitta, mode=Mode.PRIVATE)
else:
self.arc = SagittaArc(start, end, -sagitta, mode=mode).object
arc = SagittaArc(start, end, -sagitta, mode=Mode.PRIVATE)
Build1D.add_to_context(arc, mode=mode)
super().__init__(arc.wrapped)
class SagittaArc(Build1DObject):
@property
def object(self) -> Edge:
return self.arc
class SagittaArc(Edge):
def __init__(
self,
start_point: VectorLike,
@ -277,32 +262,27 @@ class SagittaArc(Build1DObject):
sag_point = mid_point + sagitta_vector
self.arc = ThreePointArc(start, sag_point, end, mode=mode).object
arc = ThreePointArc(start, sag_point, end, mode=Mode.PRIVATE)
Build1D.add_to_context(arc, mode=mode)
super().__init__(arc.wrapped)
class MirrorX(Build1DObject):
@property
def object(self) -> Union[Edge, list[Edge]]:
return (
self.mirrored_edges[0]
if len(self.mirrored_edges) == 1
else self.mirrored_edges
)
class MirrorX:
def __init__(self, *edges: Edge, mode: Mode = Mode.ADDITION):
self.mirrored_edges = Plane.named("XY").mirrorInPlane(edges, axis="X")
Build1DObject.add(*self.mirrored_edges, mode=mode)
edge_list = edges if edges else Build1D.get_context().edge_list
mirrored_edges = Plane.named("XY").mirrorInPlane(edge_list, axis="X")
Build1D.add_to_context(*mirrored_edges, mode=mode)
class MirrorY(Build1DObject):
@property
def object(self) -> Union[Edge, list[Edge]]:
return (
self.mirrored_edges[0]
if len(self.mirrored_edges) == 1
else self.mirrored_edges
)
class MirrorY:
def __init__(self, *edges: Edge, mode: Mode = Mode.ADDITION):
self.mirrored_edges = Plane.named("XY").mirrorInPlane(edges, axis="Y")
Build1DObject.add(*self.mirrored_edges, mode=mode)
edge_list = edges if edges else Build1D.get_context().edge_list
mirrored_edges = Plane.named("XY").mirrorInPlane(edge_list, axis="Y")
Build1D.add_to_context(*mirrored_edges, mode=mode)
class MirrorZ:
def __init__(self, *edges: Edge, mode: Mode = Mode.ADDITION):
edge_list = edges if edges else Build1D.get_context().edge_list
mirrored_edges = Plane.named("XY").mirrorInPlane(edge_list, axis="Z")
Build1D.add_to_context(*mirrored_edges, mode=mode)

View file

@ -1,23 +1,41 @@
from cadquery import Vector
from build123d_common import *
from build1d import *
from build1d_super import *
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
l1 = Polyline((0.0000, 0.0771), (0.0187, 0.0771), (0.0094, 0.2569))
l2 = Polyline((0.0325, 0.2773), (0.2115, 0.2458), (0.1873, 0.3125))
RadiusArc(l1 @ 1, l2 @ 0, 0.0271)
l3 = Polyline((0.1915, 0.3277), (0.3875, 0.4865), (0.3433, 0.5071)).object
l3 = Polyline((0.1915, 0.3277), (0.3875, 0.4865), (0.3433, 0.5071))
TangentArc(l2 @ 1, l3 @ 0, tangent=l2 % 1)
l4 = Polyline((0.3362, 0.5235), (0.375, 0.6427), (0.2621, 0.6188)).object
l4 = Polyline((0.3362, 0.5235), (0.375, 0.6427), (0.2621, 0.6188))
SagittaArc(l3 @ 1, l4 @ 0, 0.003)
l5 = Polyline((0.2469, 0.6267), (0.225, 0.6781), (0.1369, 0.5835)).object
l5 = Polyline((0.2469, 0.6267), (0.225, 0.6781), (0.1369, 0.5835))
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
l6 = Polyline((0.1138, 0.5954), (0.1562, 0.8146), (0.0881, 0.7752))
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
l7 = Line((0.0692, 0.7808), (0.0000, 0.9167))
TangentArc(l6 @ 1, l7 @ 0, tangent=l6 % 1)
MirrorY(*ml.edges())
# MirrorY(*ml.edges().sort(key=by_z))
# MirrorY(*ml.edges())
MirrorY()
with Build1D() as mirror_example:
MirrorY(Polyline((0.0000, 0.0771), (0.0187, 0.0771), (0.0094, 0.2569)))
with Build1D() as mirror_example2:
edge1 = Polyline((0.0000, 0.0771), (0.0187, 0.0771), (0.0094, 0.2569))
MirrorY(edge1)
with Build1D() as private_example:
MirrorY(
Polyline(
(0.0000, 0.0771), (0.0187, 0.0771), (0.0094, 0.2569), mode=Mode.PRIVATE
)
)
if "show_object" in locals():
show_object(ml.edge_list, "maple leaf")
show_object(mirror_example.edge_list, "mirror_example")
show_object(mirror_example2.edge_list, "mirror_example2")
show_object(private_example.edge_list, "private_example")