mirror of
https://github.com/gumyr/build123d.git
synced 2025-12-06 02:30:55 -08:00
introduced tuplify in topology.py and allow single single align arg
This commit is contained in:
parent
89ec8e6b1d
commit
499562559d
9 changed files with 125 additions and 76 deletions
|
|
@ -1,16 +1,16 @@
|
|||
from build123d import *
|
||||
|
||||
logo_text = Text("123d", font_size=10, align=(Align.MIN, Align.MIN))
|
||||
logo_text = Text("123d", font_size=10, align=Align.MIN)
|
||||
font_height = logo_text.vertices().sort_by(Axis.Y)[-1].Y
|
||||
|
||||
build_text = Text("build", font_size=5, align=(Align.CENTER, Align.CENTER))
|
||||
build_text = Text("build", font_size=5, align=Align.CENTER)
|
||||
build_bb = build_text.bounding_box()
|
||||
build_width = build_bb.max.X - build_bb.min.X
|
||||
|
||||
cust_text = Text(
|
||||
"customizable",
|
||||
font_size=2.9,
|
||||
align=(Align.CENTER, Align.CENTER),
|
||||
align=Align.CENTER,
|
||||
font_style=FontStyle.BOLD,
|
||||
)
|
||||
cust_bb = cust_text.bounding_box()
|
||||
|
|
@ -19,9 +19,9 @@ cust_width = cust_bb.max.X - cust_bb.min.X
|
|||
l1 = Line((font_height * 0.3, 0), (font_height * 0.3, font_height))
|
||||
one = l1 + TangentArc(l1 @ 1, (0, font_height * 0.7), tangent=(l1 % 1) * -1)
|
||||
|
||||
two = Pos(font_height * 0.35, 0) * Text("2", font_size=10, align=(Align.MIN, Align.MIN))
|
||||
two = Pos(font_height * 0.35, 0) * Text("2", font_size=10, align=Align.MIN)
|
||||
|
||||
three_d = Text("3d", font_size=10, align=(Align.MIN, Align.MIN))
|
||||
three_d = Text("3d", font_size=10, align=Align.MIN)
|
||||
three_d = Pos(font_height * 1.1, 0) * extrude(three_d, amount=font_height * 0.3)
|
||||
logo_width = three_d.vertices().sort_by(Axis.X)[-1].X
|
||||
|
||||
|
|
|
|||
|
|
@ -1,18 +1,18 @@
|
|||
from build123d import *
|
||||
|
||||
logo_text = Text("123d", font_size=10, align=(Align.MIN, Align.MIN))
|
||||
logo_text = Text("123d", font_size=10, align=Align.MIN)
|
||||
font_height = logo_text.vertices().sort_by(Axis.Y).last.Y
|
||||
|
||||
build_text = Text("build", font_size=5, align=(Align.CENTER, Align.CENTER))
|
||||
build_text = Text("build", font_size=5, align=Align.CENTER)
|
||||
build_bb = build_text.bounding_box()
|
||||
build_width = build_bb.max.X - build_bb.min.X
|
||||
|
||||
l1 = Line((font_height * 0.3, 0), (font_height * 0.3, font_height))
|
||||
one = l1 + TangentArc(l1 @ 1, (0, font_height * 0.7), tangent=(l1 % 1) * -1)
|
||||
|
||||
two = Pos(font_height * 0.35, 0) * Text("2", font_size=10, align=(Align.MIN, Align.MIN))
|
||||
two = Pos(font_height * 0.35, 0) * Text("2", font_size=10, align=Align.MIN)
|
||||
|
||||
three_d = Text("3d", font_size=10, align=(Align.MIN, Align.MIN))
|
||||
three_d = Text("3d", font_size=10, align=Align.MIN)
|
||||
three_d = Pos(font_height * 1.1, 0) * extrude(three_d, amount=font_height * 0.3)
|
||||
logo_width = three_d.vertices().sort_by(Axis.X).last.X
|
||||
|
||||
|
|
|
|||
|
|
@ -30,9 +30,7 @@ the_wind = Face.make_surface_from_array_of_points(
|
|||
]
|
||||
)
|
||||
|
||||
field_planar = Plane.XY.offset(10) * Rectangle(
|
||||
width / 4, height, align=(Align.MIN, Align.MIN)
|
||||
)
|
||||
field_planar = Plane.XY.offset(10) * Rectangle(width / 4, height, align=Align.MIN)
|
||||
west_field_planar = field_planar.faces()[0]
|
||||
east_field_planar = mirror(west_field_planar, about=Plane.YZ.offset(width / 2))
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ clock_face -= [
|
|||
str(hour + 1),
|
||||
font_size=clock_radius * 0.175,
|
||||
font_style=FontStyle.BOLD,
|
||||
align=(Align.CENTER, Align.CENTER, Align.CENTER),
|
||||
align=Align.CENTER,
|
||||
)
|
||||
for hour, loc in enumerate(
|
||||
PolarLocations(clock_radius * 0.75, 12, 60, -360, rotate=False)
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ class PlayingCard(Compound):
|
|||
):
|
||||
w = PlayingCard.width
|
||||
h = PlayingCard.height
|
||||
playing_card = Rectangle(w, h, align=(Align.MIN, Align.MIN))
|
||||
playing_card = Rectangle(w, h, align=Align.MIN)
|
||||
if "show" in locals():
|
||||
show(playing_card)
|
||||
playing_card = fillet(
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ from build123d.topology import (
|
|||
Solid,
|
||||
Vertex,
|
||||
Wire,
|
||||
tuplify,
|
||||
)
|
||||
|
||||
# Create a build123d logger to distinguish these logs from application logs.
|
||||
|
|
@ -463,7 +464,7 @@ class HexLocations(LocationList):
|
|||
apothem: radius of the inscribed circle
|
||||
xCount: number of points ( > 0 )
|
||||
yCount: number of points ( > 0 )
|
||||
align (tuple[Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER).
|
||||
|
||||
Raises:
|
||||
|
|
@ -475,7 +476,7 @@ class HexLocations(LocationList):
|
|||
apothem: float,
|
||||
x_count: int,
|
||||
y_count: int,
|
||||
align: tuple[Align, Align] = (Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align]] = (Align.CENTER, Align.CENTER),
|
||||
):
|
||||
diagonal = 4 * apothem / sqrt(3)
|
||||
x_spacing = 3 * diagonal / 4
|
||||
|
|
@ -487,7 +488,7 @@ class HexLocations(LocationList):
|
|||
self.diagonal = diagonal
|
||||
self.x_count = x_count
|
||||
self.y_count = y_count
|
||||
self.align = align
|
||||
self.align = tuplify(align, 2)
|
||||
|
||||
# Generate the raw coordinates relative to bottom left point
|
||||
points = ShapeList[Vector]()
|
||||
|
|
@ -650,7 +651,7 @@ class GridLocations(LocationList):
|
|||
y_spacing (float): vertical spacing
|
||||
x_count (int): number of horizontal points
|
||||
y_count (int): number of vertical points
|
||||
align (tuple[Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER).
|
||||
|
||||
Raises:
|
||||
|
|
@ -663,7 +664,7 @@ class GridLocations(LocationList):
|
|||
y_spacing: float,
|
||||
x_count: int,
|
||||
y_count: int,
|
||||
align: tuple[Align, Align] = (Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align]] = (Align.CENTER, Align.CENTER),
|
||||
):
|
||||
if x_count < 1 or y_count < 1:
|
||||
raise ValueError(
|
||||
|
|
@ -673,7 +674,7 @@ class GridLocations(LocationList):
|
|||
self.y_spacing = y_spacing
|
||||
self.x_count = x_count
|
||||
self.y_count = y_count
|
||||
self.align = align
|
||||
self.align = tuplify(align, 2)
|
||||
|
||||
size = [x_spacing * (x_count - 1), y_spacing * (y_count - 1)]
|
||||
align_offset = []
|
||||
|
|
|
|||
|
|
@ -29,11 +29,12 @@ from __future__ import annotations
|
|||
|
||||
from math import radians, tan
|
||||
|
||||
from typing import Union
|
||||
from build123d.build_common import LocationList, validate_inputs
|
||||
from build123d.build_enums import Align, Mode
|
||||
from build123d.build_part import BuildPart
|
||||
from build123d.geometry import Location, Plane, Rotation, RotationLike, Vector
|
||||
from build123d.topology import Compound, Part, Solid
|
||||
from build123d.topology import Compound, Part, Solid, tuplify
|
||||
|
||||
|
||||
class BasePartObject(Part):
|
||||
|
|
@ -44,7 +45,7 @@ class BasePartObject(Part):
|
|||
Args:
|
||||
solid (Solid): object to create
|
||||
rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
|
||||
align (tuple[Align, Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to None.
|
||||
mode (Mode, optional): combination mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -55,10 +56,11 @@ class BasePartObject(Part):
|
|||
self,
|
||||
solid: Solid,
|
||||
rotation: RotationLike = (0, 0, 0),
|
||||
align: tuple[Align, Align, Align] = None,
|
||||
align: Union[Align, tuple[Align, Align, Align]] = None,
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
if align:
|
||||
if align is not None:
|
||||
align = tuplify(align, 3)
|
||||
bbox = solid.bounding_box()
|
||||
align_offset = []
|
||||
for i in range(3):
|
||||
|
|
@ -102,7 +104,7 @@ class Box(BasePartObject):
|
|||
width (float): box size
|
||||
height (float): box size
|
||||
rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
|
||||
align (tuple[Align, Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combine mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -115,7 +117,11 @@ class Box(BasePartObject):
|
|||
width: float,
|
||||
height: float,
|
||||
rotation: RotationLike = (0, 0, 0),
|
||||
align: tuple[Align, Align, Align] = (Align.CENTER, Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align, Align]] = (
|
||||
Align.CENTER,
|
||||
Align.CENTER,
|
||||
Align.CENTER,
|
||||
),
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
context: BuildPart = BuildPart._get_context(self)
|
||||
|
|
@ -127,7 +133,9 @@ class Box(BasePartObject):
|
|||
|
||||
solid = Solid.make_box(length, width, height)
|
||||
|
||||
super().__init__(solid=solid, rotation=rotation, align=align, mode=mode)
|
||||
super().__init__(
|
||||
solid=solid, rotation=rotation, align=tuplify(align, 3), mode=mode
|
||||
)
|
||||
|
||||
|
||||
class Cone(BasePartObject):
|
||||
|
|
@ -141,7 +149,7 @@ class Cone(BasePartObject):
|
|||
height (float): cone size
|
||||
arc_size (float, optional): angular size of cone. Defaults to 360.
|
||||
rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
|
||||
align (tuple[Align, Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combine mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -155,7 +163,11 @@ class Cone(BasePartObject):
|
|||
height: float,
|
||||
arc_size: float = 360,
|
||||
rotation: RotationLike = (0, 0, 0),
|
||||
align: tuple[Align, Align, Align] = (Align.CENTER, Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align, Align]] = (
|
||||
Align.CENTER,
|
||||
Align.CENTER,
|
||||
Align.CENTER,
|
||||
),
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
context: BuildPart = BuildPart._get_context(self)
|
||||
|
|
@ -174,7 +186,9 @@ class Cone(BasePartObject):
|
|||
angle=arc_size,
|
||||
)
|
||||
|
||||
super().__init__(solid=solid, rotation=rotation, align=align, mode=mode)
|
||||
super().__init__(
|
||||
solid=solid, rotation=rotation, align=tuplify(align, 3), mode=mode
|
||||
)
|
||||
|
||||
|
||||
class CounterBoreHole(BasePartObject):
|
||||
|
|
@ -278,7 +292,7 @@ class Cylinder(BasePartObject):
|
|||
height (float): cylinder size
|
||||
arc_size (float, optional): angular size of cone. Defaults to 360.
|
||||
rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
|
||||
align (tuple[Align, Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combine mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -291,7 +305,11 @@ class Cylinder(BasePartObject):
|
|||
height: float,
|
||||
arc_size: float = 360,
|
||||
rotation: RotationLike = (0, 0, 0),
|
||||
align: tuple[Align, Align, Align] = (Align.CENTER, Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align, Align]] = (
|
||||
Align.CENTER,
|
||||
Align.CENTER,
|
||||
Align.CENTER,
|
||||
),
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
context: BuildPart = BuildPart._get_context(self)
|
||||
|
|
@ -307,7 +325,9 @@ class Cylinder(BasePartObject):
|
|||
height,
|
||||
angle=arc_size,
|
||||
)
|
||||
super().__init__(solid=solid, rotation=rotation, align=align, mode=mode)
|
||||
super().__init__(
|
||||
solid=solid, rotation=rotation, align=tuplify(align, 3), mode=mode
|
||||
)
|
||||
|
||||
|
||||
class Hole(BasePartObject):
|
||||
|
|
@ -363,7 +383,7 @@ class Sphere(BasePartObject):
|
|||
arc_size2 (float, optional): angular size of sphere. Defaults to 90.
|
||||
arc_size3 (float, optional): angular size of sphere. Defaults to 360.
|
||||
rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
|
||||
align (tuple[Align, Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combine mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -377,7 +397,11 @@ class Sphere(BasePartObject):
|
|||
arc_size2: float = 90,
|
||||
arc_size3: float = 360,
|
||||
rotation: RotationLike = (0, 0, 0),
|
||||
align: tuple[Align, Align, Align] = (Align.CENTER, Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align, Align]] = (
|
||||
Align.CENTER,
|
||||
Align.CENTER,
|
||||
Align.CENTER,
|
||||
),
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
context: BuildPart = BuildPart._get_context(self)
|
||||
|
|
@ -395,7 +419,9 @@ class Sphere(BasePartObject):
|
|||
angle2=arc_size2,
|
||||
angle3=arc_size3,
|
||||
)
|
||||
super().__init__(solid=solid, rotation=rotation, align=align, mode=mode)
|
||||
super().__init__(
|
||||
solid=solid, rotation=rotation, align=tuplify(align, 3), mode=mode
|
||||
)
|
||||
|
||||
|
||||
class Torus(BasePartObject):
|
||||
|
|
@ -410,7 +436,7 @@ class Torus(BasePartObject):
|
|||
major_arc_size (float, optional): angular size of torus. Defaults to 0.
|
||||
minor_arc_size (float, optional): angular size or torus. Defaults to 360.
|
||||
rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
|
||||
align (tuple[Align, Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combine mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -425,7 +451,11 @@ class Torus(BasePartObject):
|
|||
minor_end_angle: float = 360,
|
||||
major_angle: float = 360,
|
||||
rotation: RotationLike = (0, 0, 0),
|
||||
align: tuple[Align, Align, Align] = (Align.CENTER, Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align, Align]] = (
|
||||
Align.CENTER,
|
||||
Align.CENTER,
|
||||
Align.CENTER,
|
||||
),
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
context: BuildPart = BuildPart._get_context(self)
|
||||
|
|
@ -445,7 +475,9 @@ class Torus(BasePartObject):
|
|||
end_angle=minor_end_angle,
|
||||
major_angle=major_angle,
|
||||
)
|
||||
super().__init__(solid=solid, rotation=rotation, align=align, mode=mode)
|
||||
super().__init__(
|
||||
solid=solid, rotation=rotation, align=tuplify(align, 3), mode=mode
|
||||
)
|
||||
|
||||
|
||||
class Wedge(BasePartObject):
|
||||
|
|
@ -462,7 +494,7 @@ class Wedge(BasePartObject):
|
|||
xmax (float): maximum X location
|
||||
zmax (float): maximum Z location
|
||||
rotation (RotationLike, optional): angles to rotate about axes. Defaults to (0, 0, 0).
|
||||
align (tuple[Align, Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combine mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -479,7 +511,11 @@ class Wedge(BasePartObject):
|
|||
xmax: float,
|
||||
zmax: float,
|
||||
rotation: RotationLike = (0, 0, 0),
|
||||
align: tuple[Align, Align, Align] = (Align.CENTER, Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align, Align]] = (
|
||||
Align.CENTER,
|
||||
Align.CENTER,
|
||||
Align.CENTER,
|
||||
),
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
context: BuildPart = BuildPart._get_context(self)
|
||||
|
|
@ -495,4 +531,6 @@ class Wedge(BasePartObject):
|
|||
self.align = align
|
||||
|
||||
solid = Solid.make_wedge(xsize, ysize, zsize, xmin, zmin, xmax, zmax)
|
||||
super().__init__(solid=solid, rotation=rotation, align=align, mode=mode)
|
||||
super().__init__(
|
||||
solid=solid, rotation=rotation, align=tuplify(align, 3), mode=mode
|
||||
)
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ from build123d.build_common import LocationList, validate_inputs
|
|||
from build123d.build_enums import Align, FontStyle, Mode
|
||||
from build123d.build_sketch import BuildSketch
|
||||
from build123d.geometry import Axis, Location, Vector, VectorLike
|
||||
from build123d.topology import Compound, Edge, Face, ShapeList, Sketch, Wire
|
||||
from build123d.topology import Compound, Edge, Face, ShapeList, Sketch, Wire, tuplify
|
||||
|
||||
|
||||
class BaseSketchObject(Sketch):
|
||||
|
|
@ -45,7 +45,7 @@ class BaseSketchObject(Sketch):
|
|||
Args:
|
||||
face (Face): face to create
|
||||
rotation (float, optional): angles to rotate objects. Defaults to 0.
|
||||
align (tuple[Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to None.
|
||||
mode (Mode, optional): combination mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -56,10 +56,11 @@ class BaseSketchObject(Sketch):
|
|||
self,
|
||||
obj: Union[Compound, Face],
|
||||
rotation: float = 0,
|
||||
align: tuple[Align, Align] = None,
|
||||
align: Union[Align, tuple[Align, Align]] = None,
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
if align:
|
||||
if align is not None:
|
||||
align = tuplify(align, 2)
|
||||
bbox = obj.bounding_box()
|
||||
align_offset = []
|
||||
for i in range(2):
|
||||
|
|
@ -100,7 +101,7 @@ class Circle(BaseSketchObject):
|
|||
|
||||
Args:
|
||||
radius (float): circle size
|
||||
align (tuple[Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combination mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -110,17 +111,17 @@ class Circle(BaseSketchObject):
|
|||
def __init__(
|
||||
self,
|
||||
radius: float,
|
||||
align: tuple[Align, Align] = (Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align]] = (Align.CENTER, Align.CENTER),
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
context = BuildSketch._get_context(self)
|
||||
validate_inputs(context, self)
|
||||
|
||||
self.radius = radius
|
||||
self.align = align
|
||||
self.align = tuplify(align, 2)
|
||||
|
||||
face = Face.make_from_wires(Wire.make_circle(radius))
|
||||
super().__init__(face, 0, align, mode)
|
||||
super().__init__(face, 0, self.align, mode)
|
||||
|
||||
|
||||
class Ellipse(BaseSketchObject):
|
||||
|
|
@ -132,7 +133,7 @@ class Ellipse(BaseSketchObject):
|
|||
x_radius (float): horizontal radius
|
||||
y_radius (float): vertical radius
|
||||
rotation (float, optional): angles to rotate objects. Defaults to 0.
|
||||
align (tuple[Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combination mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -144,7 +145,7 @@ class Ellipse(BaseSketchObject):
|
|||
x_radius: float,
|
||||
y_radius: float,
|
||||
rotation: float = 0,
|
||||
align: tuple[Align, Align] = (Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align]] = (Align.CENTER, Align.CENTER),
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
context = BuildSketch._get_context(self)
|
||||
|
|
@ -152,10 +153,10 @@ class Ellipse(BaseSketchObject):
|
|||
|
||||
self.x_radius = x_radius
|
||||
self.y_radius = y_radius
|
||||
self.align = align
|
||||
self.align = tuplify(align, 2)
|
||||
|
||||
face = Face.make_from_wires(Wire.make_ellipse(x_radius, y_radius))
|
||||
super().__init__(face, rotation, align, mode)
|
||||
super().__init__(face, rotation, self.align, mode)
|
||||
|
||||
|
||||
class Polygon(BaseSketchObject):
|
||||
|
|
@ -166,7 +167,7 @@ class Polygon(BaseSketchObject):
|
|||
Args:
|
||||
pts (VectorLike): sequence of points defining the vertices of polygon
|
||||
rotation (float, optional): angles to rotate objects. Defaults to 0.
|
||||
align (tuple[Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combination mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -177,18 +178,18 @@ class Polygon(BaseSketchObject):
|
|||
self,
|
||||
*pts: VectorLike,
|
||||
rotation: float = 0,
|
||||
align: tuple[Align, Align] = (Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align]] = (Align.CENTER, Align.CENTER),
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
context = BuildSketch._get_context(self)
|
||||
validate_inputs(context, self)
|
||||
|
||||
self.pts = pts
|
||||
self.align = align
|
||||
self.align = tuplify(align, 2)
|
||||
|
||||
poly_pts = [Vector(p) for p in pts]
|
||||
face = Face.make_from_wires(Wire.make_polygon(poly_pts))
|
||||
super().__init__(face, rotation, align, mode)
|
||||
super().__init__(face, rotation, self.align, mode)
|
||||
|
||||
|
||||
class Rectangle(BaseSketchObject):
|
||||
|
|
@ -200,7 +201,7 @@ class Rectangle(BaseSketchObject):
|
|||
width (float): horizontal size
|
||||
height (float): vertical size
|
||||
rotation (float, optional): angles to rotate objects. Defaults to 0.
|
||||
align (tuple[Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combination mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -212,7 +213,7 @@ class Rectangle(BaseSketchObject):
|
|||
width: float,
|
||||
height: float,
|
||||
rotation: float = 0,
|
||||
align: tuple[Align, Align] = (Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align]] = (Align.CENTER, Align.CENTER),
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
context = BuildSketch._get_context(self)
|
||||
|
|
@ -220,10 +221,10 @@ class Rectangle(BaseSketchObject):
|
|||
|
||||
self.width = width
|
||||
self.rectangle_height = height
|
||||
self.align = align
|
||||
self.align = tuplify(align, 2)
|
||||
|
||||
face = Face.make_rect(height, width)
|
||||
super().__init__(face, rotation, align, mode)
|
||||
super().__init__(face, rotation, self.align, mode)
|
||||
|
||||
|
||||
class RectangleRounded(BaseSketchObject):
|
||||
|
|
@ -236,7 +237,7 @@ class RectangleRounded(BaseSketchObject):
|
|||
height (float): vertical size
|
||||
radius (float): fillet radius
|
||||
rotation (float, optional): angles to rotate objects. Defaults to 0.
|
||||
align (tuple[Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combination mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -249,7 +250,7 @@ class RectangleRounded(BaseSketchObject):
|
|||
height: float,
|
||||
radius: float,
|
||||
rotation: float = 0,
|
||||
align: tuple[Align, Align] = (Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align]] = (Align.CENTER, Align.CENTER),
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
context = BuildSketch._get_context(self)
|
||||
|
|
@ -260,7 +261,7 @@ class RectangleRounded(BaseSketchObject):
|
|||
self.width = width
|
||||
self.rectangle_height = height
|
||||
self.radius = radius
|
||||
self.align = align
|
||||
self.align = tuplify(align, 2)
|
||||
|
||||
face = Face.make_rect(height, width)
|
||||
face = face.fillet_2d(radius, face.vertices())
|
||||
|
|
@ -276,7 +277,7 @@ class RegularPolygon(BaseSketchObject):
|
|||
radius (float): distance from origin to vertices
|
||||
side_count (int): number of polygon sides
|
||||
rotation (float, optional): angles to rotate objects. Defaults to 0.
|
||||
align (tuple[Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combination mode. Defaults to Mode.ADD.
|
||||
"""
|
||||
|
|
@ -317,7 +318,8 @@ class RegularPolygon(BaseSketchObject):
|
|||
mins = [pts_sorted[0][0].X, pts_sorted[1][0].Y]
|
||||
maxs = [pts_sorted[0][-1].X, pts_sorted[1][-1].Y]
|
||||
|
||||
if align:
|
||||
if align is not None:
|
||||
align = tuplify(align, 2)
|
||||
align_offset = []
|
||||
for i in range(2):
|
||||
if align[i] == Align.MIN:
|
||||
|
|
@ -502,7 +504,7 @@ class Text(BaseSketchObject):
|
|||
font (str, optional): font name. Defaults to "Arial".
|
||||
font_path (str, optional): system path to font library. Defaults to None.
|
||||
font_style (Font_Style, optional): style. Defaults to Font_Style.REGULAR.
|
||||
align (tuple[Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER).
|
||||
path (Union[Edge, Wire], optional): path for text to follow. Defaults to None.
|
||||
position_on_path (float, optional): the relative location on path to position the
|
||||
|
|
@ -520,7 +522,7 @@ class Text(BaseSketchObject):
|
|||
font: str = "Arial",
|
||||
font_path: str = None,
|
||||
font_style: FontStyle = FontStyle.REGULAR,
|
||||
align: tuple[Align, Align] = (Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align]] = (Align.CENTER, Align.CENTER),
|
||||
path: Union[Edge, Wire] = None,
|
||||
position_on_path: float = 0.0,
|
||||
rotation: float = 0,
|
||||
|
|
@ -546,7 +548,7 @@ class Text(BaseSketchObject):
|
|||
font=font,
|
||||
font_path=font_path,
|
||||
font_style=font_style,
|
||||
align=align,
|
||||
align=tuplify(align, 2),
|
||||
position_on_path=position_on_path,
|
||||
text_path=path,
|
||||
)
|
||||
|
|
@ -565,7 +567,7 @@ class Trapezoid(BaseSketchObject):
|
|||
right_side_angle (float, optional): bottom right interior angle. If not provided,
|
||||
the trapezoid will be symmetric. Defaults to None.
|
||||
rotation (float, optional): angles to rotate objects. Defaults to 0.
|
||||
align (tuple[Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER).
|
||||
mode (Mode, optional): combination mode. Defaults to Mode.ADD.
|
||||
|
||||
|
|
@ -582,7 +584,7 @@ class Trapezoid(BaseSketchObject):
|
|||
left_side_angle: float,
|
||||
right_side_angle: float = None,
|
||||
rotation: float = 0,
|
||||
align: tuple[Align, Align] = (Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align]] = (Align.CENTER, Align.CENTER),
|
||||
mode: Mode = Mode.ADD,
|
||||
):
|
||||
context = BuildSketch._get_context(self)
|
||||
|
|
@ -594,7 +596,7 @@ class Trapezoid(BaseSketchObject):
|
|||
self.trapezoid_height = height
|
||||
self.left_side_angle = left_side_angle
|
||||
self.right_side_angle = right_side_angle
|
||||
self.align = align
|
||||
self.align = tuplify(align, 2)
|
||||
|
||||
# Calculate the reduction of the top on both sides
|
||||
reduction_left = (
|
||||
|
|
@ -612,4 +614,4 @@ class Trapezoid(BaseSketchObject):
|
|||
pts.append(Vector(-width / 2 + reduction_left, height / 2))
|
||||
pts.append(pts[0])
|
||||
face = Face.make_from_wires(Wire.make_polygon(pts))
|
||||
super().__init__(face, rotation, align, mode)
|
||||
super().__init__(face, rotation, self.align, mode)
|
||||
|
|
|
|||
|
|
@ -379,6 +379,15 @@ Geoms = Literal[
|
|||
]
|
||||
|
||||
|
||||
def tuplify(obj, dim):
|
||||
if obj is None:
|
||||
return None
|
||||
elif isinstance(obj, (tuple, list)):
|
||||
return obj
|
||||
else:
|
||||
return tuple([obj] * dim)
|
||||
|
||||
|
||||
class Mixin1D:
|
||||
"""Methods to add to the Edge and Wire classes"""
|
||||
|
||||
|
|
@ -3105,7 +3114,7 @@ class Compound(Shape, Mixin3D):
|
|||
font: str = "Arial",
|
||||
font_path: Optional[str] = None,
|
||||
font_style: FontStyle = FontStyle.REGULAR,
|
||||
align: tuple[Align, Align] = (Align.CENTER, Align.CENTER),
|
||||
align: Union[Align, tuple[Align, Align]] = (Align.CENTER, Align.CENTER),
|
||||
position_on_path: float = 0.0,
|
||||
text_path: Union[Edge, Wire] = None,
|
||||
) -> "Compound":
|
||||
|
|
@ -3122,7 +3131,7 @@ class Compound(Shape, Mixin3D):
|
|||
font: font name
|
||||
font_path: path to font file
|
||||
font_style: text style. Defaults to FontStyle.REGULAR.
|
||||
align (tuple[Align, Align], optional): align min, center, or max of object.
|
||||
align (Union[Align, tuple[Align, Align]], optional): align min, center, or max of object.
|
||||
Defaults to (Align.CENTER, Align.CENTER).
|
||||
position_on_path: the relative location on path to position the text,
|
||||
between 0.0 and 1.0. Defaults to 0.0.
|
||||
|
|
@ -3192,6 +3201,7 @@ class Compound(Shape, Mixin3D):
|
|||
text_flat = Compound(builder.Perform(font_i, NCollection_Utf8String(txt)))
|
||||
|
||||
# Align the text from the bounding box
|
||||
align = tuplify(align, 2)
|
||||
bbox = text_flat.bounding_box()
|
||||
align_offset = []
|
||||
for i in range(2):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue