introduced tuplify in topology.py and allow single single align arg

This commit is contained in:
Bernhard 2023-03-26 13:14:44 +02:00
parent 89ec8e6b1d
commit 499562559d
9 changed files with 125 additions and 76 deletions

View file

@ -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

View file

@ -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

View file

@ -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))

View file

@ -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)

View file

@ -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(

View file

@ -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 = []

View file

@ -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
)

View file

@ -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)

View file

@ -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):