Mirror operates on all edges if none provided

This commit is contained in:
Roger Maitland 2022-07-03 19:35:51 -04:00
parent 6446cb8dbc
commit 996062ecc7
3 changed files with 83 additions and 7 deletions

View file

@ -15,8 +15,10 @@ Thanks. Playing around a bit more, it seems like translate() makes the underlyi
"""
from errno import E2BIG
from math import pi, sin, cos, radians, sqrt
from typing import Union, Iterable, Sequence, Callable
import builtins
from enum import Enum, auto
import cadquery as cq
from cadquery.hull import find_hull
@ -135,6 +137,10 @@ class SortBy(Enum):
DISTANCE = auto()
class FilterBy(Enum):
LAST_OPERATION = auto()
class Mode(Enum):
"""Combination Mode"""
@ -142,6 +148,7 @@ class Mode(Enum):
SUBTRACTION = auto()
INTERSECTION = auto()
CONSTRUCTION = auto()
PRIVATE = auto()
class Transition(Enum):
@ -217,3 +224,57 @@ def _null(self):
Solid.null = _null
Compound.null = _null
class EdgeList(list):
def __init__(self, *edges: Edge):
self.edges = list(edges)
super().__init__(edges)
def sort_edges(self, sort_by: SortBy = SortBy.NONE, reverse: bool = False):
if sort_by == SortBy.NONE:
edges = self
elif sort_by == SortBy.X:
edges = sorted(
self,
key=lambda obj: obj.Center().x,
reverse=reverse,
)
elif sort_by == SortBy.Y:
edges = sorted(
self,
key=lambda obj: obj.Center().y,
reverse=reverse,
)
elif sort_by == SortBy.Z:
edges = sorted(
self,
key=lambda obj: obj.Center().z,
reverse=reverse,
)
elif sort_by == SortBy.LENGTH:
edges = sorted(
self,
key=lambda obj: obj.Length(),
reverse=reverse,
)
elif sort_by == SortBy.RADIUS:
edges = sorted(
self,
key=lambda obj: obj.radius(),
reverse=reverse,
)
elif sort_by == SortBy.DISTANCE:
edges = sorted(
self,
key=lambda obj: obj.Center().Length,
reverse=reverse,
)
else:
raise ValueError(f"Unable to sort edges by {sort_by}")
return edges
# builtins.list = EdgeList

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]:
@ -67,6 +68,10 @@ class Build1D:
raise ValueError("Build1D.add only accepts edges")
context_stack[-1].edge_list.append(edge)
@staticmethod
def get_context() -> "Build1D":
return context_stack[-1]
class Line(Edge):
def __init__(self, *pts: VectorLike, mode: Mode = Mode.ADDITION):
@ -263,11 +268,20 @@ class SagittaArc(Edge):
class MirrorX:
def __init__(self, *edges: Edge, mode: Mode = Mode.ADDITION):
mirrored_edges = Plane.named("XY").mirrorInPlane(edges, axis="X")
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:
def __init__(self, *edges: Edge, mode: Mode = Mode.ADDITION):
mirrored_edges = Plane.named("XY").mirrorInPlane(edges, axis="Y")
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

@ -5,7 +5,6 @@ from build1d_super import *
with Build1D() as ml:
l1 = Polyline((0.0000, 0.0771), (0.0187, 0.0771), (0.0094, 0.2569))
print(f"{type(l1)=}")
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))
@ -18,7 +17,9 @@ with Build1D() as ml:
Spline(l5 @ 1, l6 @ 0, tangents=(l5 % 1, l6 % 0), tangent_scalars=(2, 2))
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()
if "show_object" in locals():
show_object(ml.edge_list, "maple leaf")