mirror of
https://github.com/gumyr/build123d.git
synced 2025-12-06 02:30:55 -08:00
Mirror operates on all edges if none provided
This commit is contained in:
parent
6446cb8dbc
commit
996062ecc7
3 changed files with 83 additions and 7 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue