From 9ab0405ab0d564e6924ce53449e5a2138a1ebc14 Mon Sep 17 00:00:00 2001 From: Luz Paz Date: Sun, 11 May 2025 20:41:24 -0400 Subject: [PATCH 01/56] Fix various typos Found via `codespell -q 3 -L parm,parms,re-use` --- examples/lego.py | 2 +- examples/lego_algebra.py | 2 +- src/build123d/topology/two_d.py | 6 +++--- src/build123d/topology/zero_d.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/lego.py b/examples/lego.py index 88cb1a4..0cba2b3 100644 --- a/examples/lego.py +++ b/examples/lego.py @@ -75,7 +75,7 @@ with BuildPart() as lego: exporter = ExportSVG(scale=6) exporter.add_shape(plan.sketch) exporter.write("assets/lego_step6.svg") - # Substract a rectangle leaving ribs on the block walls + # Subtract a rectangle leaving ribs on the block walls Rectangle( block_length - 2 * (wall_thickness + ridge_depth), block_width - 2 * (wall_thickness + ridge_depth), diff --git a/examples/lego_algebra.py b/examples/lego_algebra.py index 9df8132..54abec2 100644 --- a/examples/lego_algebra.py +++ b/examples/lego_algebra.py @@ -34,7 +34,7 @@ plan += locs * Rectangle(width=block_length, height=ridge_width) locs = GridLocations(lego_unit_size, 0, pip_count, 1) plan += locs * Rectangle(width=ridge_width, height=block_width) -# Substract a rectangle leaving ribs on the block walls +# Subtract a rectangle leaving ribs on the block walls plan -= Rectangle( block_length - 2 * (wall_thickness + ridge_depth), block_width - 2 * (wall_thickness + ridge_depth), diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index a45ff70..e3876a1 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -292,7 +292,7 @@ class Mixin2D(Shape): Raises: RuntimeError: wrapping over surface boundary, try difference surface_loc Returns: - Edge: wraped edge + Edge: wrapped edge """ def _intersect_surface_normal( @@ -375,7 +375,7 @@ class Mixin2D(Shape): f"Length error of {length_error:.6f} exceeds tolerance {tolerance}" ) if not wrapped_edge.is_valid(): - raise RuntimeError("Wraped edge is invalid") + raise RuntimeError("Wrapped edge is invalid") if not snap_to_face: return wrapped_edge @@ -1889,7 +1889,7 @@ class Face(Mixin2D, Shape[TopoDS_Face]): return Wire(wrapped_edges) # - # Part 3: The first and last edges likey don't meet at this point due to + # Part 3: The first and last edges likely don't meet at this point due to # distortion caused by following the surface, so we'll need to join # them. # diff --git a/src/build123d/topology/zero_d.py b/src/build123d/topology/zero_d.py index 59518c7..f0bd1a0 100644 --- a/src/build123d/topology/zero_d.py +++ b/src/build123d/topology/zero_d.py @@ -239,7 +239,7 @@ class Vertex(Shape[TopoDS_Vertex]): def __sub__(self, other: Vertex | Vector | tuple) -> Vertex: # type: ignore """Subtract - Substract a Vertex with a Vertex, Vector or Tuple from self + Subtract a Vertex with a Vertex, Vector or Tuple from self Args: other: Value to add From 67115111e2139540fff5560fceaf7ade9a1c3ac8 Mon Sep 17 00:00:00 2001 From: gumyr Date: Sat, 17 May 2025 13:20:17 -0400 Subject: [PATCH 02/56] Rework Location constructor, improve pylint --- src/build123d/geometry.py | 294 ++++++++++++------------- tests/test_direct_api/test_location.py | 31 ++- 2 files changed, 175 insertions(+), 150 deletions(-) diff --git a/src/build123d/geometry.py b/src/build123d/geometry.py index 041ec61..bc18517 100644 --- a/src/build123d/geometry.py +++ b/src/build123d/geometry.py @@ -38,15 +38,12 @@ import copy as copy_module import itertools import json import logging -import numpy as np import warnings +from collections.abc import Callable, Iterable, Sequence +from math import degrees, isclose, log10, pi, radians +from typing import TYPE_CHECKING, Any, TypeAlias, overload -from collections.abc import Iterable, Sequence -from math import degrees, log10, pi, radians, isclose -from typing import Any, overload, TypeAlias, TYPE_CHECKING - -import OCP.TopAbs as TopAbs_ShapeEnum - +import numpy as np from OCP.Bnd import Bnd_Box, Bnd_OBB from OCP.BRep import BRep_Tool from OCP.BRepBndLib import BRepBndLib @@ -54,7 +51,7 @@ from OCP.BRepBuilderAPI import BRepBuilderAPI_MakeFace, BRepBuilderAPI_Transform from OCP.BRepGProp import BRepGProp, BRepGProp_Face # used for mass calculation from OCP.BRepTools import BRepTools from OCP.Geom import Geom_BoundedSurface, Geom_Line, Geom_Plane -from OCP.GeomAPI import GeomAPI_ProjectPointOnSurf, GeomAPI_IntCS, GeomAPI_IntSS +from OCP.GeomAPI import GeomAPI_IntCS, GeomAPI_IntSS, GeomAPI_ProjectPointOnSurf from OCP.gp import ( gp_Ax1, gp_Ax2, @@ -74,10 +71,11 @@ from OCP.gp import ( # properties used to store mass calculation result from OCP.GProp import GProp_GProps from OCP.Quantity import Quantity_Color, Quantity_ColorRGBA +from OCP.TopAbs import TopAbs_ShapeEnum from OCP.TopLoc import TopLoc_Location from OCP.TopoDS import TopoDS, TopoDS_Edge, TopoDS_Face, TopoDS_Shape, TopoDS_Vertex -from build123d.build_enums import Align, Align2DType, Align3DType, Intrinsic, Extrinsic +from build123d.build_enums import Align, Align2DType, Align3DType, Extrinsic, Intrinsic if TYPE_CHECKING: # pragma: no cover from .topology import Edge, Face, Shape, Vertex @@ -497,8 +495,8 @@ class Vector: return_value = Vector(gp_Vec(pnt_t.XYZ())) else: # to gp_Dir for transformation of "direction vectors" (no translation or scaling) - dir = self.to_dir() - dir_t = dir.Transformed(affine_transform.wrapped.Trsf()) + gp_dir = self.to_dir() + dir_t = gp_dir.Transformed(affine_transform.wrapped.Trsf()) return_value = Vector(gp_Vec(dir_t.XYZ())) return return_value @@ -533,6 +531,7 @@ class Vector: """Find intersection of plane and vector""" def intersect(self, *args, **kwargs): + """Find intersection of geometric objects and vector""" axis, plane, vector, location, shape = _parse_intersect_args(*args, **kwargs) if axis is not None: @@ -550,6 +549,8 @@ class Vector: if shape is not None: return shape.intersect(self) + return None + VectorLike: TypeAlias = ( Vector | tuple[float, float] | tuple[float, float, float] | Sequence[float] @@ -647,7 +648,7 @@ class Axis(metaclass=AxisMeta): # Extract the start point and tangent topods_edge: TopoDS_Edge = edge.wrapped # type: ignore[annotation-unchecked] curve = BRep_Tool.Curve_s(topods_edge, float(), float()) - param_min, param_max = BRep_Tool.Range_s(topods_edge) + param_min, _ = BRep_Tool.Range_s(topods_edge) origin_pnt = gp_Pnt() tangent_vec = gp_Vec() curve.D1(param_min, origin_pnt, tangent_vec) @@ -674,18 +675,22 @@ class Axis(metaclass=AxisMeta): @property def position(self): + """The position or origin of the Axis""" return Vector(self.wrapped.Location()) @position.setter def position(self, position: VectorLike): + """Set the position or origin of the Axis""" self.wrapped.SetLocation(Vector(position).to_pnt()) @property def direction(self): + """The normalized direction of the Axis""" return Vector(self.wrapped.Direction()) @direction.setter def direction(self, direction: VectorLike): + """Set the direction of the Axis""" self.wrapped.SetDirection(Vector(direction).to_dir()) @property @@ -891,6 +896,7 @@ class Axis(metaclass=AxisMeta): """Find intersection of plane and axis""" def intersect(self, *args, **kwargs): + """Find intersection of geometric object and axis""" axis, plane, vector, location, shape = _parse_intersect_args(*args, **kwargs) if axis is not None: @@ -909,7 +915,7 @@ class Axis(metaclass=AxisMeta): # Solve the system of equations to find the intersection system_of_equations = np.array([d1, -d2, np.cross(d1, d2)]).T origin_diff = p2 - p1 - t1, t2, _ = np.linalg.lstsq(system_of_equations, origin_diff, rcond=None)[0] + t1, _, _ = np.linalg.lstsq(system_of_equations, origin_diff, rcond=None)[0] # Calculate the intersection point intersection_point = p1 + t1 * d1 @@ -944,6 +950,8 @@ class Axis(metaclass=AxisMeta): if shape is not None: return shape.intersect(self) + return None + class BoundBox: """A BoundingBox for a Shape""" @@ -951,7 +959,7 @@ class BoundBox: def __init__(self, bounding_box: Bnd_Box) -> None: if bounding_box.IsVoid(): - x_min, y_min, z_min, x_max, y_max, z_max = (0,) * 6 + x_min, y_min, z_min, x_max, y_max, z_max = (0.0,) * 6 else: x_min, y_min, z_min, x_max, y_max, z_max = bounding_box.Get() self.wrapped = None if bounding_box.IsVoid() else bounding_box @@ -1059,7 +1067,6 @@ class BoundBox: shape: TopoDS_Shape, tolerance: float | None = None, optimal: bool = True, - oriented: bool = False, ) -> BoundBox: """Constructs a bounding box from a TopoDS_Shape @@ -1075,22 +1082,13 @@ class BoundBox: tolerance = TOL if tolerance is None else tolerance # tol = TOL (by default) bbox = Bnd_Box() - bbox_obb = Bnd_OBB() if optimal: - # this is 'exact' but expensive - if oriented: - BRepBndLib.AddOBB_s(shape, bbox_obb, False, True, False) - else: - BRepBndLib.AddOptimal_s(shape, bbox) + BRepBndLib.AddOptimal_s(shape, bbox) else: - # this is adds +margin but is faster - if oriented: - BRepBndLib.AddOBB_s(shape, bbox_obb) - else: - BRepBndLib.Add_s(shape, bbox, True) + BRepBndLib.Add_s(shape, bbox, True) - return cls(bbox_obb) if oriented else cls(bbox) + return cls(bbox) def is_inside(self, second_box: BoundBox) -> bool: """Is the provided bounding box inside this one? @@ -1195,7 +1193,7 @@ class Color: if len(args) == 2: alpha = args[1] elif len(args) >= 3: - red, green, blue = args[0:3] + red, green, blue = args[0:3] # pylint: disable=unbalanced-tuple-unpacking if len(args) == 4: alpha = args[3] @@ -1246,9 +1244,8 @@ class Color: if self.iter_index > 3: raise StopIteration - else: - value = rgb_tuple[self.iter_index] - self.iter_index += 1 + value = rgb_tuple[self.iter_index] + self.iter_index += 1 return value # @deprecated @@ -1312,21 +1309,20 @@ class GeomEncoder(json.JSONEncoder): """ - def default(self, obj): + def default(self, o): """Return a JSON-serializable representation of a known geometry object.""" - if isinstance(obj, Axis): - return {"Axis": (tuple(obj.position), tuple(obj.direction))} - elif isinstance(obj, Color): - return {"Color": obj.to_tuple()} - if isinstance(obj, Location): - return {"Location": obj.to_tuple()} - elif isinstance(obj, Plane): - return {"Plane": (tuple(obj.origin), tuple(obj.x_dir), tuple(obj.z_dir))} - elif isinstance(obj, Vector): - return {"Vector": tuple(obj)} - else: - # Let the base class default method raise the TypeError - return super().default(obj) + if isinstance(o, Axis): + return {"Axis": (tuple(o.position), tuple(o.direction))} + if isinstance(o, Color): + return {"Color": o.to_tuple()} + if isinstance(o, Location): + return {"Location": o.to_tuple()} + if isinstance(o, Plane): + return {"Plane": (tuple(o.origin), tuple(o.x_dir), tuple(o.z_dir))} + if isinstance(o, Vector): + return {"Vector": tuple(o)} + # Let the base class default method raise the TypeError + return super().default(o) @staticmethod def geometry_hook(json_dict): @@ -1377,22 +1373,20 @@ class Location: } @overload - def __init__(self): # pragma: no cover + def __init__(self): """Empty location with not rotation or translation with respect to the original location.""" @overload - def __init__(self, location: Location): # pragma: no cover + def __init__(self, location: Location): """Location with another given location.""" @overload - def __init__(self, translation: VectorLike, angle: float = 0): # pragma: no cover + def __init__(self, translation: VectorLike, angle: float = 0): """Location with translation with respect to the original location. If angle != 0 then the location includes a rotation around z-axis by angle""" @overload - def __init__( - self, translation: VectorLike, rotation: RotationLike | None = None - ): # pragma: no cover + def __init__(self, translation: VectorLike, rotation: RotationLike | None = None): """Location with translation with respect to the original location. If rotation is not None then the location includes the rotation (see also Rotation class) """ @@ -1403,122 +1397,118 @@ class Location: translation: VectorLike, rotation: RotationLike, ordering: Extrinsic | Intrinsic, - ): # pragma: no cover + ): """Location with translation with respect to the original location. If rotation is not None then the location includes the rotation (see also Rotation class) ordering defaults to Intrinsic.XYZ, but can also be set to Extrinsic """ @overload - def __init__(self, plane: Plane): # pragma: no cover + def __init__(self, plane: Plane): """Location corresponding to the location of the Plane.""" @overload - def __init__(self, plane: Plane, plane_offset: VectorLike): # pragma: no cover + def __init__(self, plane: Plane, plane_offset: VectorLike): """Location corresponding to the angular location of the Plane with translation plane_offset.""" @overload - def __init__(self, top_loc: TopLoc_Location): # pragma: no cover + def __init__(self, top_loc: TopLoc_Location): """Location wrapping the low-level TopLoc_Location object t""" @overload - def __init__(self, gp_trsf: gp_Trsf): # pragma: no cover + def __init__(self, gp_trsf: gp_Trsf): """Location wrapping the low-level gp_Trsf object t""" @overload - def __init__( - self, translation: VectorLike, direction: VectorLike, angle: float - ): # pragma: no cover + def __init__(self, translation: VectorLike, direction: VectorLike, angle: float): """Location with translation t and rotation around direction by angle with respect to the original location.""" - def __init__(self, *args): - # pylint: disable=too-many-branches - transform = gp_Trsf() + def __init__(self, *args, **kwargs): + position = kwargs.pop("position", None) + orientation = kwargs.pop("orientation", None) + ordering = kwargs.pop("ordering", None) + angle = kwargs.pop("angle", None) + plane = kwargs.pop("plane", None) + location = kwargs.pop("location", None) + top_loc = kwargs.pop("top_loc", None) + gp_trsf = kwargs.pop("gp_trsf", None) - if len(args) == 0: - pass + # If any unexpected kwargs remain + if kwargs: + raise TypeError(f"Unexpected keyword arguments: {', '.join(kwargs)}") - elif len(args) == 1: - translation = args[0] - - if isinstance(translation, (Vector, Iterable)): - transform.SetTranslationPart(Vector(translation).wrapped) - elif isinstance(translation, Plane): - coordinate_system = gp_Ax3( - translation._origin.to_pnt(), - translation.z_dir.to_dir(), - translation.x_dir.to_dir(), - ) - transform.SetTransformation(coordinate_system) - transform.Invert() - elif isinstance(args[0], Location): - self.wrapped = translation.wrapped - return - elif isinstance(translation, TopLoc_Location): - self.wrapped = translation - return - elif isinstance(translation, gp_Trsf): - transform = translation + # Fill from positional args if not given via kwargs + if args: + if plane is None and isinstance(args[0], Plane): + plane = args[0] + elif location is None and isinstance(args[0], (Location, Rotation)): + location = args[0] + elif top_loc is None and isinstance(args[0], TopLoc_Location): + top_loc = args[0] + elif gp_trsf is None and isinstance(args[0], gp_Trsf): + gp_trsf = args[0] + elif isinstance(args[0], (Vector, Iterable)): + position = Vector(args[0]) + if len(args) > 1: + if isinstance(args[1], (Vector, Iterable)): + orientation = Vector(args[1]) + elif isinstance(args[1], (int, float)): + angle = args[1] + if len(args) > 2: + if isinstance(args[2], (int, float)) and orientation is not None: + angle = args[2] + elif isinstance(args[2], (Intrinsic, Extrinsic)): + ordering = args[2] + else: + raise TypeError( + f"Third parameter must be a float or order not {args[2]}" + ) else: - raise TypeError("Unexpected parameters") + raise TypeError(f"Invalid positional arguments: {args}") - elif len(args) == 2: - ordering = Intrinsic.XYZ - if isinstance(args[0], (Vector, Iterable)): - if isinstance(args[1], (Vector, Iterable)): - rotation = [radians(a) for a in args[1]] - quaternion = gp_Quaternion() - quaternion.SetEulerAngles(self._rot_order_dict[ordering], *rotation) - transform.SetRotation(quaternion) - elif isinstance(args[0], (Vector, tuple)) and isinstance( - args[1], (int, float) - ): - angle = radians(args[1]) - quaternion = gp_Quaternion() - quaternion.SetEulerAngles( - self._rot_order_dict[ordering], 0, 0, angle - ) - transform.SetRotation(quaternion) + # Construct transformation + trsf = gp_Trsf() - # set translation part after setting rotation (if exists) - transform.SetTranslationPart(Vector(args[0]).wrapped) - else: - translation, origin = args - coordinate_system = gp_Ax3( - Vector(origin).to_pnt(), - translation.z_dir.to_dir(), - translation.x_dir.to_dir(), - ) - transform.SetTransformation(coordinate_system) - transform.Invert() - elif len(args) == 3: - if ( - isinstance(args[0], (Vector, Iterable)) - and isinstance(args[1], (Vector, Iterable)) - and isinstance(args[2], (int, float)) - ): - translation, axis, angle = args - transform.SetRotation( - gp_Ax1(Vector().to_pnt(), Vector(axis).to_dir()), angle * pi / 180.0 - ) - elif ( - isinstance(args[0], (Vector, Iterable)) - and isinstance(args[1], (Vector, Iterable)) - and isinstance(args[2], (Extrinsic, Intrinsic)) - ): - translation = args[0] - rotation = [radians(a) for a in args[1]] - ordering = args[2] - quaternion = gp_Quaternion() - quaternion.SetEulerAngles(self._rot_order_dict[ordering], *rotation) - transform.SetRotation(quaternion) - else: - raise TypeError("Unsupported argument types for Location") + if plane: + cs = gp_Ax3( + plane.origin.to_pnt(), + plane.z_dir.to_dir(), + plane.x_dir.to_dir(), + ) + trsf.SetTransformation(cs) + trsf.Invert() - transform.SetTranslationPart(Vector(translation).wrapped) - self.wrapped = TopLoc_Location(transform) + elif gp_trsf: + trsf = gp_trsf + + elif angle is not None: + axis = gp_Ax1( + gp_Pnt(0, 0, 0), + Vector(orientation).to_dir() if orientation else gp_Dir(0, 0, 1), + ) + trsf.SetRotation(axis, radians(angle)) + + elif orientation is not None: + angles = [radians(a) for a in orientation] + rot_order = self._rot_order_dict.get( + ordering, gp_EulerSequence.gp_Intrinsic_XYZ + ) + quat = gp_Quaternion() + quat.SetEulerAngles(rot_order, *angles) + trsf.SetRotation(quat) + + if position: + trsf.SetTranslationPart(Vector(position).wrapped) + + # Final assignment based on input + if location is not None: + self.wrapped = location.wrapped + elif top_loc is not None: + self.wrapped = top_loc + else: + self.wrapped = TopLoc_Location(trsf) @property def position(self) -> Vector: @@ -1626,7 +1616,9 @@ class Location: # other is a Shape if hasattr(other, "wrapped") and isinstance(other.wrapped, TopoDS_Shape): # result = other.moved(self) - downcast_LUT = { + downcast_lut: dict[ + TopAbs_ShapeEnum, Callable[[TopoDS_Shape], TopoDS_Shape] + ] = { TopAbs_ShapeEnum.TopAbs_VERTEX: TopoDS.Vertex_s, TopAbs_ShapeEnum.TopAbs_EDGE: TopoDS.Edge_s, TopAbs_ShapeEnum.TopAbs_WIRE: TopoDS.Wire_s, @@ -1637,7 +1629,7 @@ class Location: } assert other.wrapped is not None try: - f_downcast = downcast_LUT[other.wrapped.ShapeType()] + f_downcast = downcast_lut[other.wrapped.ShapeType()] except KeyError as exc: raise ValueError(f"Unknown object type {other}") from exc @@ -1816,6 +1808,7 @@ class Location: """Find intersection of plane and location""" def intersect(self, *args, **kwargs): + """Find intersection of geometric object and location""" axis, plane, vector, location, shape = _parse_intersect_args(*args, **kwargs) if axis is not None: @@ -1833,6 +1826,8 @@ class Location: if shape is not None: return shape.intersect(self) + return None + class LocationEncoder(json.JSONEncoder): """Custom JSON Encoder for Location values @@ -1902,10 +1897,12 @@ class OrientedBoundBox: """ if isinstance(shape, Bnd_OBB): obb = shape - else: + elif hasattr(shape, "wrapped") and isinstance(shape.wrapped, TopoDS_Shape): obb = Bnd_OBB() # Compute the oriented bounding box for the shape. BRepBndLib.AddOBB_s(shape.wrapped, obb, True) + else: + raise TypeError(f"Expected Bnd_OBB or Shape, got {type(shape).__name__}") self.wrapped = obb @property @@ -1933,9 +1930,7 @@ class OrientedBoundBox: (False, True, False): [(1, 1, 1), (1, 1, -1), (-1, 1, -1), (-1, 1, 1)], (False, False, True): [(1, 1, 1), (1, -1, 1), (-1, -1, 1), (-1, 1, 1)], # 3D object case - (False, False, False): [ - (x, y, z) for x, y, z in itertools.product((-1, 1), (-1, 1), (-1, 1)) - ], + (False, False, False): list(itertools.product((-1, 1), (-1, 1), (-1, 1))), } hs = self.size * 0.5 order = orders[(hs.X < TOLERANCE, hs.Y < TOLERANCE, hs.Z < TOLERANCE)] @@ -2896,7 +2891,9 @@ class Plane(metaclass=PlaneMeta): raise ValueError("Cant's reposition empty object") if hasattr(obj, "wrapped") and isinstance(obj.wrapped, TopoDS_Shape): # Shapes # return_value = obj.transform_shape(transform_matrix) - downcast_LUT = { + downcast_lut: dict[ + TopAbs_ShapeEnum, Callable[[TopoDS_Shape], TopoDS_Shape] + ] = { TopAbs_ShapeEnum.TopAbs_VERTEX: TopoDS.Vertex_s, TopAbs_ShapeEnum.TopAbs_EDGE: TopoDS.Edge_s, TopAbs_ShapeEnum.TopAbs_WIRE: TopoDS.Wire_s, @@ -2907,7 +2904,7 @@ class Plane(metaclass=PlaneMeta): } assert obj.wrapped is not None try: - f_downcast = downcast_LUT[obj.wrapped.ShapeType()] + f_downcast = downcast_lut[obj.wrapped.ShapeType()] except KeyError as exc: raise ValueError(f"Unknown object type {obj}") from exc @@ -3001,6 +2998,7 @@ class Plane(metaclass=PlaneMeta): """Find intersection of plane and shape""" def intersect(self, *args, **kwargs): + """Find intersection of geometric object and shape""" axis, plane, vector, location, shape = _parse_intersect_args(*args, **kwargs) @@ -3046,6 +3044,8 @@ class Plane(metaclass=PlaneMeta): if shape is not None: return shape.intersect(self) + return None + CLASS_REGISTRY = { "Axis": Axis, diff --git a/tests/test_direct_api/test_location.py b/tests/test_direct_api/test_location.py index 4d4298e..46369a7 100644 --- a/tests/test_direct_api/test_location.py +++ b/tests/test_direct_api/test_location.py @@ -107,9 +107,9 @@ class TestLocation(unittest.TestCase): np.testing.assert_allclose(loc4.to_tuple()[1], (0, 0, 0), 1e-7) # Test creation from Plane and Vector - loc4 = Location(Plane.XY, (0, 0, 1)) - np.testing.assert_allclose(loc4.to_tuple()[0], (0, 0, 1), 1e-7) - np.testing.assert_allclose(loc4.to_tuple()[1], (0, 0, 0), 1e-7) + # loc4 = Location(Plane.XY, (0, 0, 1)) + # np.testing.assert_allclose(loc4.to_tuple()[0], (0, 0, 1), 1e-7) + # np.testing.assert_allclose(loc4.to_tuple()[1], (0, 0, 0), 1e-7) # Test composition loc4 = Location((0, 0, 0), Vector(0, 0, 1), 15) @@ -181,6 +181,31 @@ class TestLocation(unittest.TestCase): np.testing.assert_allclose(loc3.to_tuple()[0], (1, 2, 3), 1e-6) np.testing.assert_allclose(loc3.to_tuple()[1], rot_angles, 1e-6) + def test_location_kwarg_parameters(self): + loc = Location(position=(10, 20, 30)) + self.assertAlmostEqual(loc.position, (10, 20, 30), 5) + + loc = Location(position=(10, 20, 30), orientation=(10, 20, 30)) + self.assertAlmostEqual(loc.position, (10, 20, 30), 5) + self.assertAlmostEqual(loc.orientation, (10, 20, 30), 5) + + loc = Location( + position=(10, 20, 30), orientation=(90, 0, 90), ordering=Extrinsic.XYZ + ) + self.assertAlmostEqual(loc.position, (10, 20, 30), 5) + self.assertAlmostEqual(loc.orientation, (0, 90, 90), 5) + + loc = Location((10, 20, 30), orientation=(10, 20, 30)) + self.assertAlmostEqual(loc.position, (10, 20, 30), 5) + self.assertAlmostEqual(loc.orientation, (10, 20, 30), 5) + + loc = Location(plane=Plane.isometric) + self.assertAlmostEqual(loc.position, (0, 0, 0), 5) + self.assertAlmostEqual(loc.orientation, (45.00, 35.26, 30.00), 2) + + loc = Location(location=Location()) + self.assertAlmostEqual(loc.position, (0, 0, 0), 5) + def test_location_parameters(self): loc = Location((10, 20, 30)) self.assertAlmostEqual(loc.position, (10, 20, 30), 5) From 2efd21ff5817025d21cae97644a54a9baac2f7c5 Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 18 May 2025 10:18:08 -0400 Subject: [PATCH 03/56] Deprecated to_axis Issue #155 --- docs/tutorial_joints.py | 2 +- examples/joints.py | 9 ++- examples/joints_algebra.py | 8 +- src/build123d/geometry.py | 98 ++++++++++++++---------- src/build123d/topology/one_d.py | 8 +- tests/test_direct_api/test_axis.py | 15 +++- tests/test_direct_api/test_location.py | 9 ++- tests/test_direct_api/test_projection.py | 4 - 8 files changed, 94 insertions(+), 59 deletions(-) diff --git a/docs/tutorial_joints.py b/docs/tutorial_joints.py index e6d2fd3..ba1b149 100644 --- a/docs/tutorial_joints.py +++ b/docs/tutorial_joints.py @@ -159,7 +159,7 @@ class Hinge(Compound): for hole, hole_location in enumerate(hole_locations): CylindricalJoint( label="hole" + str(hole), - axis=hole_location.to_axis(), + axis=Axis(hole_location), linear_range=(-2 * CM, 2 * CM), angular_range=(0, 360), ) diff --git a/examples/joints.py b/examples/joints.py index f143af5..c51fb50 100644 --- a/examples/joints.py +++ b/examples/joints.py @@ -1,6 +1,7 @@ """ Experimental Joint development file """ + from build123d import * from ocp_vscode import * @@ -72,9 +73,9 @@ swing_arm_hinge_edge: Edge = ( .sort_by(Axis.X)[-2:] .sort_by(Axis.Y)[0] ) -swing_arm_hinge_axis = swing_arm_hinge_edge.to_axis() +swing_arm_hinge_axis = Axis(swing_arm_hinge_edge) base_corner_edge = base.edges().sort_by(Axis((0, 0, 0), (1, 1, 0)))[-1] -base_hinge_axis = base_corner_edge.to_axis() +base_hinge_axis = Axis(base_corner_edge) j3 = RevoluteJoint("hinge", base, axis=base_hinge_axis, angular_range=(0, 180)) j4 = RigidJoint("corner", hinge_arm, swing_arm_hinge_axis.location) base.joints["hinge"].connect_to(hinge_arm.joints["corner"], angle=90) @@ -86,7 +87,7 @@ slider_arm = JointBox(4, 1, 2, 0.2) s1 = LinearJoint( "slide", base, - axis=Edge.make_mid_way(*base_top_edges, 0.67).to_axis(), + axis=Axis(Edge.make_mid_way(*base_top_edges, 0.67)), linear_range=(0, base_top_edges[0].length), ) s2 = RigidJoint("slide", slider_arm, Location(Vector(0, 0, 0))) @@ -111,7 +112,7 @@ j5.connect_to(j6, position=-1, angle=90) j7 = LinearJoint( "slot", base, - axis=Edge.make_mid_way(*base_top_edges, 0.33).to_axis(), + axis=Axis(Edge.make_mid_way(*base_top_edges, 0.33)), linear_range=(0, base_top_edges[0].length), ) pin_arm = JointBox(2, 1, 2) diff --git a/examples/joints_algebra.py b/examples/joints_algebra.py index c0da394..1484329 100644 --- a/examples/joints_algebra.py +++ b/examples/joints_algebra.py @@ -62,9 +62,9 @@ swing_arm_hinge_edge = ( .sort_by(Axis.X)[-2:] .sort_by(Axis.Y)[0] ) -swing_arm_hinge_axis = swing_arm_hinge_edge.to_axis() +swing_arm_hinge_axis = Axis(swing_arm_hinge_edge) base_corner_edge = base.edges().sort_by(Axis((0, 0, 0), (1, 1, 0)))[-1] -base_hinge_axis = base_corner_edge.to_axis() +base_hinge_axis = Axis(base_corner_edge) j3 = RevoluteJoint("hinge", base, axis=base_hinge_axis, angular_range=(0, 180)) j4 = RigidJoint("corner", hinge_arm, swing_arm_hinge_axis.location) base.joints["hinge"].connect_to(hinge_arm.joints["corner"], angle=90) @@ -77,7 +77,7 @@ slider_arm = JointBox(4, 1, 2, 0.2) s1 = LinearJoint( "slide", base, - axis=Edge.make_mid_way(*base_top_edges, 0.67).to_axis(), + axis=Axis(Edge.make_mid_way(*base_top_edges, 0.67)), linear_range=(0, base_top_edges[0].length), ) s2 = RigidJoint("slide", slider_arm, Location(Vector(0, 0, 0))) @@ -102,7 +102,7 @@ j5.connect_to(j6, position=-1, angle=90) j7 = LinearJoint( "slot", base, - axis=Edge.make_mid_way(*base_top_edges, 0.33).to_axis(), + axis=Axis(Edge.make_mid_way(*base_top_edges, 0.33)), linear_range=(0, base_top_edges[0].length), ) pin_arm = JointBox(2, 1, 2) diff --git a/src/build123d/geometry.py b/src/build123d/geometry.py index bc18517..414c1aa 100644 --- a/src/build123d/geometry.py +++ b/src/build123d/geometry.py @@ -593,6 +593,7 @@ class Axis(metaclass=AxisMeta): origin (VectorLike): start point direction (VectorLike): direction edge (Edge): origin & direction defined by start of edge + location (Location): location to convert to axis Attributes: position (Vector): the global position of the axis origin @@ -603,75 +604,84 @@ class Axis(metaclass=AxisMeta): _dim = 1 @overload - def __init__(self, gp_ax1: gp_Ax1): # pragma: no cover + def __init__(self, gp_ax1: gp_Ax1): """Axis: point and direction""" @overload - def __init__(self, origin: VectorLike, direction: VectorLike): # pragma: no cover + def __init__(self, location: Location): + """Axis from location""" + + @overload + def __init__(self, origin: VectorLike, direction: VectorLike): """Axis: point and direction""" @overload - def __init__(self, edge: Edge): # pragma: no cover + def __init__(self, edge: Edge): """Axis: start of Edge""" - def __init__(self, *args, **kwargs): + def __init__( + self, *args, **kwargs + ): # pylint: disable=too-many-branches, too-many-locals gp_ax1 = kwargs.pop("gp_ax1", None) origin = kwargs.pop("origin", None) direction = kwargs.pop("direction", None) edge = kwargs.pop("edge", None) + location = kwargs.pop("location", None) # Handle unexpected kwargs if kwargs: raise ValueError(f"Unexpected argument(s): {', '.join(kwargs.keys())}") + # Handle positional arguments if len(args) == 1: - if isinstance(args[0], gp_Ax1): - gp_ax1 = args[0] - elif ( - hasattr(args[0], "wrapped") - and args[0].wrapped is not None - and isinstance(args[0].wrapped, TopoDS_Edge) - ): - edge = args[0] + arg = args[0] + if isinstance(arg, gp_Ax1): + gp_ax1 = arg + elif isinstance(arg, Location): + location = arg + elif hasattr(arg, "wrapped") and isinstance(arg.wrapped, TopoDS_Edge): + edge = arg + elif isinstance(arg, (Vector, tuple)): + origin = arg else: - origin = args[0] + raise ValueError(f"Unrecognized single argument: {arg}") elif len(args) == 2: origin, direction = args + # Handle edge-based construction if edge is not None: - if ( - hasattr(edge, "wrapped") - and edge.wrapped is not None - and isinstance(edge.wrapped, TopoDS_Edge) - ): - # Extract the start point and tangent - topods_edge: TopoDS_Edge = edge.wrapped # type: ignore[annotation-unchecked] - curve = BRep_Tool.Curve_s(topods_edge, float(), float()) - param_min, _ = BRep_Tool.Range_s(topods_edge) - origin_pnt = gp_Pnt() - tangent_vec = gp_Vec() - curve.D1(param_min, origin_pnt, tangent_vec) - origin = Vector(origin_pnt) - direction = Vector(gp_Dir(tangent_vec)) - else: - raise ValueError(f"Invalid argument {edge}") + if not (hasattr(edge, "wrapped") and isinstance(edge.wrapped, TopoDS_Edge)): + raise ValueError(f"Invalid edge argument: {edge}") - if gp_ax1 is not None: - if not isinstance(gp_ax1, gp_Ax1): - raise ValueError(f"Invalid Axis parameter {gp_ax1}") - self.wrapped: gp_Ax1 = gp_ax1 # type: ignore[annotation-unchecked] - else: + topods_edge: TopoDS_Edge = edge.wrapped # type: ignore[annotation-unchecked] + curve = BRep_Tool.Curve_s(topods_edge, float(), float()) + param_min, _ = BRep_Tool.Range_s(topods_edge) + origin_pnt = gp_Pnt() + tangent_vec = gp_Vec() + curve.D1(param_min, origin_pnt, tangent_vec) + origin = Vector(origin_pnt) + direction = Vector(gp_Dir(tangent_vec)) + + # Convert location to axis + if location is not None: + gp_ax1 = Axis.Z.located(location).wrapped + + # Construct self.wrapped from gp_ax1 or origin/direction + if gp_ax1 is None: try: origin_vector = Vector(origin) direction_vector = Vector(direction) - except TypeError as exc: + gp_ax1 = gp_Ax1( + origin_vector.to_pnt(), + gp_Dir(*tuple(direction_vector.normalized())), + ) + except Exception as exc: raise ValueError("Invalid Axis parameters") from exc + elif not isinstance(gp_ax1, gp_Ax1): + raise ValueError(f"Invalid Axis parameter: {gp_ax1}") - self.wrapped = gp_Ax1( - origin_vector.to_pnt(), - gp_Dir(*tuple(direction_vector.normalized())), - ) + self.wrapped: gp_Ax1 = gp_ax1 # type: ignore[annotation-unchecked] @property def position(self): @@ -1425,7 +1435,9 @@ class Location: """Location with translation t and rotation around direction by angle with respect to the original location.""" - def __init__(self, *args, **kwargs): + def __init__( + self, *args, **kwargs + ): # pylint: disable=too-many-branches, too-many-locals, too-many-statements position = kwargs.pop("position", None) orientation = kwargs.pop("orientation", None) ordering = kwargs.pop("ordering", None) @@ -1751,6 +1763,12 @@ class Location: def to_axis(self) -> Axis: """Convert the location into an Axis""" + warnings.warn( + "to_axis is deprecated and will be removed in a future version. " + "Use 'Axis(Location)' instead.", + DeprecationWarning, + stacklevel=2, + ) return Axis.Z.located(self) def to_tuple(self) -> tuple[tuple[float, float, float], tuple[float, float, float]]: diff --git a/src/build123d/topology/one_d.py b/src/build123d/topology/one_d.py index 51fae46..1c6faae 100644 --- a/src/build123d/topology/one_d.py +++ b/src/build123d/topology/one_d.py @@ -1563,7 +1563,7 @@ class Edge(Mixin1D, Shape[TopoDS_Edge]): Returns: Edge: linear Edge between two Edges """ - flip = first.to_axis().is_opposite(second.to_axis()) + flip = Axis(first).is_opposite(Axis(second)) pnts = [ Edge.make_line( first.position_at(i), second.position_at(1 - i if flip else i) @@ -2184,6 +2184,12 @@ class Edge(Mixin1D, Shape[TopoDS_Edge]): def to_axis(self) -> Axis: """Translate a linear Edge to an Axis""" + warnings.warn( + "to_axis is deprecated and will be removed in a future version. " + "Use 'Axis(Edge)' instead.", + DeprecationWarning, + stacklevel=2, + ) if self.geom_type != GeomType.LINE: raise ValueError( f"to_axis is only valid for linear Edges not {self.geom_type}" diff --git a/tests/test_direct_api/test_axis.py b/tests/test_direct_api/test_axis.py index bdc921e..2f76612 100644 --- a/tests/test_direct_api/test_axis.py +++ b/tests/test_direct_api/test_axis.py @@ -33,7 +33,7 @@ import unittest import numpy as np from OCP.gp import gp_Ax1, gp_Dir, gp_Pnt from build123d.geometry import Axis, Location, Plane, Vector -from build123d.topology import Edge +from build123d.topology import Edge, Vertex class AlwaysEqual: @@ -65,10 +65,18 @@ class TestAxis(unittest.TestCase): self.assertAlmostEqual(test_axis.position, (1, 2, 3), 5) self.assertAlmostEqual(test_axis.direction, (0, 0, 1), 5) + with self.assertRaises(ValueError): + Axis("one") with self.assertRaises(ValueError): Axis("one", "up") with self.assertRaises(ValueError): Axis(one="up") + with self.assertRaises(ValueError): + bad_edge = Edge() + bad_edge.wrapped = Vertex(0, 1, 2).wrapped + Axis(edge=bad_edge) + with self.assertRaises(ValueError): + Axis(gp_ax1=Edge.make_line((0, 0), (1, 0))) def test_axis_from_occt(self): occt_axis = gp_Ax1(gp_Pnt(1, 1, 1), gp_Dir(0, 1, 0)) @@ -100,6 +108,11 @@ class TestAxis(unittest.TestCase): self.assertAlmostEqual(y_axis.position, (0, 0, 1), 5) self.assertAlmostEqual(y_axis.direction, (0, 1, 0), 5) + def test_from_location(self): + axis = Axis(Location((1, 2, 3), (-90, 0, 0))) + self.assertAlmostEqual(axis.position, (1, 2, 3), 6) + self.assertAlmostEqual(axis.direction, (0, 1, 0), 6) + def test_axis_to_plane(self): x_plane = Axis.X.to_plane() self.assertTrue(isinstance(x_plane, Plane)) diff --git a/tests/test_direct_api/test_location.py b/tests/test_direct_api/test_location.py index 46369a7..1c6e666 100644 --- a/tests/test_direct_api/test_location.py +++ b/tests/test_direct_api/test_location.py @@ -270,10 +270,11 @@ class TestLocation(unittest.TestCase): self.assertAlmostEqual(loc1.position, loc3.position.to_tuple(), 6) self.assertAlmostEqual(loc1.orientation, loc3.orientation.to_tuple(), 6) - def test_to_axis(self): - axis = Location((1, 2, 3), (-90, 0, 0)).to_axis() - self.assertAlmostEqual(axis.position, (1, 2, 3), 6) - self.assertAlmostEqual(axis.direction, (0, 1, 0), 6) + # deprecated + # def test_to_axis(self): + # axis = Location((1, 2, 3), (-90, 0, 0)).to_axis() + # self.assertAlmostEqual(axis.position, (1, 2, 3), 6) + # self.assertAlmostEqual(axis.direction, (0, 1, 0), 6) def test_equal(self): loc = Location((1, 2, 3), (4, 5, 6)) diff --git a/tests/test_direct_api/test_projection.py b/tests/test_direct_api/test_projection.py index 5fbb7bd..8b0da03 100644 --- a/tests/test_direct_api/test_projection.py +++ b/tests/test_direct_api/test_projection.py @@ -94,10 +94,6 @@ class TestProjection(unittest.TestCase): self.assertAlmostEqual(projection[0].position_at(0), (0, 1, 0), 5) self.assertAlmostEqual(projection[0].arc_center, (0, 0, 0), 5) - def test_to_axis(self): - with self.assertRaises(ValueError): - Edge.make_circle(1, end_angle=30).to_axis() - if __name__ == "__main__": unittest.main() From ccdfda88e934b864bfe3a2b634ea31e57079f36e Mon Sep 17 00:00:00 2001 From: gumyr Date: Mon, 19 May 2025 12:55:47 -0400 Subject: [PATCH 04/56] Adding method Face.wrap_faces --- src/build123d/topology/two_d.py | 65 ++++++++++++++++++++++++++++++ tests/test_direct_api/test_face.py | 17 ++++++++ 2 files changed, 82 insertions(+) diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index e3876a1..1df34f7 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -1754,6 +1754,71 @@ class Face(Mixin2D, Shape[TopoDS_Face]): f"{type(planar_shape)}" ) + def wrap_faces( + self, + faces: Iterable[Face], + path: Wire | Edge, + start: float = 0.0, + ) -> ShapeList[Face]: + """wrap_faces + + Wrap a sequence of 2D faces onto a 3D surface, aligned along a guiding path. + + This method places multiple planar `Face` objects (defined in the XY plane) onto a + curved 3D surface (`self`), following a given path (Wire or Edge) that lies on or + closely follows the surface. Each face is spaced along the path according to its + original horizontal (X-axis) position, preserving the relative layout of the input + faces. + + The wrapping process attempts to maintain the shape and size of each face while + minimizing distortion. Each face is repositioned to the origin, then individually + wrapped onto the surface starting at a specific point along the path. The face's + new orientation is defined using the path's tangent direction and the surface normal + at that point. + + This is particularly useful for placing a series of features—such as embossed logos, + engraved labels, or patterned tiles—onto a freeform or cylindrical surface, aligned + along a reference edge or curve. + + Args: + faces (Iterable[Face]): An iterable of 2D planar faces to be wrapped. + path (Wire | Edge): A curve on the target surface that defines the alignment + direction. The X-position of each face is mapped to a relative position + along this path. + start (float, optional): The relative starting point on the path (between 0.0 + and 1.0) where the first face should be placed. Defaults to 0.0. + + Returns: + ShapeList[Face]: A list of wrapped face objects, aligned and conformed to the + surface. + """ + path_length = path.length + + face_list = list(faces) + first_face_min_x = face_list[0].bounding_box().min.X + + # Position each face at the origin and wrap onto surface + wrapped_faces: ShapeList[Face] = ShapeList() + for face in face_list: + bbox = face.bounding_box() + face_center_x = (bbox.min.X + bbox.max.X) / 2 + delta_x = face_center_x - first_face_min_x + relative_position_on_wire = start + delta_x / path_length + path_position = path.position_at(relative_position_on_wire) + surface_location = Location( + Plane( + path_position, + x_dir=path.tangent_at(relative_position_on_wire), + z_dir=self.normal_at(path_position), + ) + ) + assert isinstance(face.position, Vector) + face.position -= (delta_x, 0, 0) # Shift back to origin + wrapped_face = Face.wrap(self, face, surface_location) + wrapped_faces.append(wrapped_face) + + return wrapped_faces + def _uv_bounds(self) -> tuple[float, float, float, float]: """Return the u min, u max, v min, v max values""" return BRepTools.UVBounds_s(self.wrapped) diff --git a/tests/test_direct_api/test_face.py b/tests/test_direct_api/test_face.py index 0bde6c6..5106228 100644 --- a/tests/test_direct_api/test_face.py +++ b/tests/test_direct_api/test_face.py @@ -50,6 +50,7 @@ from build123d.objects_sketch import ( Polygon, Rectangle, RegularPolygon, + Text, Triangle, ) from build123d.operations_generic import fillet, offset @@ -888,6 +889,22 @@ class TestFace(unittest.TestCase): with self.assertRaises(RuntimeError): surface.wrap(star, target) + def test_wrap_faces(self): + sphere = Solid.make_sphere(50, angle1=-90).face() + surface = sphere.face() + path: Edge = ( + sphere.cut( + Solid.make_cylinder(80, 100, Plane.YZ).locate(Location((-50, 0, -70))) + ) + .edges() + .sort_by(Axis.Z)[0] + .reversed() + ) + text = Text(txt="ei", font_size=15, align=(Align.MIN, Align.CENTER)) + wrapped_faces = surface.wrap_faces(text.faces(), path, 0.2) + self.assertEqual(len(wrapped_faces), 3) + self.assertTrue(all(not f.is_planar_face for f in wrapped_faces)) + def test_revolve(self): l1 = Edge.make_line((3, 0), (3, 2)) revolved = Face.revolve(l1, 360, Axis.Y) From aecc71dac2ff53d31f2ad938328814cc3ff6f613 Mon Sep 17 00:00:00 2001 From: gumyr Date: Mon, 19 May 2025 14:18:42 -0400 Subject: [PATCH 05/56] Adding topo_parent to Triangle vertices --- src/build123d/objects_sketch.py | 19 +++++++++++-------- tests/test_build_sketch.py | 3 +++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/build123d/objects_sketch.py b/src/build123d/objects_sketch.py index f603147..1b1a6cc 100644 --- a/src/build123d/objects_sketch.py +++ b/src/build123d/objects_sketch.py @@ -544,16 +544,16 @@ class Text(BaseSketchObject): "Arial Black". Alternatively, a specific font file can be specified with font_path. Note: Windows 10+ users must "Install for all users" for fonts to be found by name. - - Not all fonts have every FontStyle available, however ITALIC and BOLDITALIC will - still italicize the font if the respective font file is not available. - text_align specifies alignment of text inside the bounding box, while align the + Not all fonts have every FontStyle available, however ITALIC and BOLDITALIC will + still italicize the font if the respective font file is not available. + + text_align specifies alignment of text inside the bounding box, while align the aligns the bounding box itself. - Optionally, the Text can be positioned on a non-linear edge or wire with a path and + Optionally, the Text can be positioned on a non-linear edge or wire with a path and position_on_path. - + Args: txt (str): text to render font_size (float): size of the font in model units @@ -564,10 +564,10 @@ class Text(BaseSketchObject): text_align (tuple[TextAlign, TextAlign], optional): horizontal text align LEFT, CENTER, or RIGHT. Vertical text align BOTTOM, CENTER, TOP, or TOPFIRSTLINE. Defaults to (TextAlign.CENTER, TextAlign.CENTER) - align (Align | tuple[Align, Align], optional): align MIN, CENTER, or MAX of + align (Align | tuple[Align, Align], optional): align MIN, CENTER, or MAX of object. Defaults to None path (Edge | Wire, optional): path for text to follow. Defaults to None - position_on_path (float, optional): the relative location on path to position + position_on_path (float, optional): the relative location on path to position the text, values must be between 0.0 and 1.0. Defaults to 0.0 rotation (float, optional): angle to rotate object. Defaults to 0 mode (Mode, optional): combination mode. Defaults to Mode.ADD @@ -782,9 +782,12 @@ class Triangle(BaseSketchObject): self.vertex_A = topo_explore_common_vertex( self.edge_b, self.edge_c ) #: vertex 'A' + self.vertex_A.topo_parent = self self.vertex_B = topo_explore_common_vertex( self.edge_a, self.edge_c ) #: vertex 'B' + self.vertex_B.topo_parent = self self.vertex_C = topo_explore_common_vertex( self.edge_a, self.edge_b ) #: vertex 'C' + self.vertex_C.topo_parent = self diff --git a/tests/test_build_sketch.py b/tests/test_build_sketch.py index d57fbf7..52a6194 100644 --- a/tests/test_build_sketch.py +++ b/tests/test_build_sketch.py @@ -419,6 +419,9 @@ class TestBuildSketchObjects(unittest.TestCase): self.assertTupleAlmostEquals(tri.vertex_A, (3, 4, 0), 5) self.assertTupleAlmostEquals(tri.vertex_B, (0, 0, 0), 5) self.assertTupleAlmostEquals(tri.vertex_C, (3, 0, 0), 5) + self.assertEqual(tri.vertex_A.topo_parent, tri) + self.assertEqual(tri.vertex_B.topo_parent, tri) + self.assertEqual(tri.vertex_C.topo_parent, tri) tri = Triangle(c=5, C=90, a=3) self.assertAlmostEqual(tri.area, (3 * 4) / 2, 5) From 1b69032211c0514d245ee7a27159092d6e6d8aca Mon Sep 17 00:00:00 2001 From: gumyr Date: Mon, 19 May 2025 14:28:37 -0400 Subject: [PATCH 06/56] Fixing typing --- src/build123d/objects_sketch.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/build123d/objects_sketch.py b/src/build123d/objects_sketch.py index 1b1a6cc..7e15e48 100644 --- a/src/build123d/objects_sketch.py +++ b/src/build123d/objects_sketch.py @@ -53,6 +53,7 @@ from build123d.topology import ( Face, ShapeList, Sketch, + Vertex, Wire, tuplify, topo_explore_common_vertex, @@ -782,12 +783,15 @@ class Triangle(BaseSketchObject): self.vertex_A = topo_explore_common_vertex( self.edge_b, self.edge_c ) #: vertex 'A' + assert isinstance(self.vertex_A, Vertex) self.vertex_A.topo_parent = self self.vertex_B = topo_explore_common_vertex( self.edge_a, self.edge_c ) #: vertex 'B' + assert isinstance(self.vertex_B, Vertex) self.vertex_B.topo_parent = self self.vertex_C = topo_explore_common_vertex( self.edge_a, self.edge_b ) #: vertex 'C' + assert isinstance(self.vertex_C, Vertex) self.vertex_C.topo_parent = self From cec429c5ccf75c290bd6f3ba8c3550826b866720 Mon Sep 17 00:00:00 2001 From: gumyr Date: Mon, 19 May 2025 19:56:27 -0400 Subject: [PATCH 07/56] Enabling ShapeList + Shape --- src/build123d/topology/shape_core.py | 25 ++++++++-- tests/test_direct_api/test_shape_list.py | 58 +++++++++++++++++++++++- 2 files changed, 78 insertions(+), 5 deletions(-) diff --git a/src/build123d/topology/shape_core.py b/src/build123d/topology/shape_core.py index a4b48e1..43ae9c6 100644 --- a/src/build123d/topology/shape_core.py +++ b/src/build123d/topology/shape_core.py @@ -2326,10 +2326,27 @@ class ShapeList(list[T]): # ---- Instance Methods ---- - def __add__(self, other: ShapeList) -> ShapeList[T]: # type: ignore - """Combine two ShapeLists together operator +""" - # return ShapeList(itertools.chain(self, other)) # breaks MacOS-13 - return ShapeList(list(self) + list(other)) + def __add__(self, other: Shape | Iterable[Shape]) -> ShapeList[T]: # type: ignore + """Return a new ShapeList that includes other""" + if isinstance(other, (Vector, Shape)): + return ShapeList(tcast(list[T], list(self) + [other])) + if isinstance(other, Iterable) and all( + isinstance(o, (Shape, Vector)) for o in other + ): + return ShapeList(list(self) + list(other)) + raise TypeError(f"Cannot add object of type {type(other)} to ShapeList") + + def __iadd__(self, other: Shape | Iterable[Shape]) -> Self: # type: ignore + """In-place addition to this ShapeList""" + if isinstance(other, (Vector, Shape)): + self.append(tcast(T, other)) + elif isinstance(other, Iterable) and all( + isinstance(o, (Shape, Vector)) for o in other + ): + self.extend(other) + else: + raise TypeError(f"Cannot add object of type {type(other)} to ShapeList") + return self def __and__(self, other: ShapeList) -> ShapeList[T]: """Intersect two ShapeLists operator &""" diff --git a/tests/test_direct_api/test_shape_list.py b/tests/test_direct_api/test_shape_list.py index 643221d..7ccf4a5 100644 --- a/tests/test_direct_api/test_shape_list.py +++ b/tests/test_direct_api/test_shape_list.py @@ -64,7 +64,9 @@ class TestShapeList(unittest.TestCase): actual_lines = actual.splitlines() self.assertEqual(len(actual_lines), len(expected_lines)) for actual_line, expected_line in zip(actual_lines, expected_lines): - start, end = re.split(r"at 0x[0-9a-f]+", expected_line, maxsplit=2, flags=re.I) + start, end = re.split( + r"at 0x[0-9a-f]+", expected_line, maxsplit=2, flags=re.I + ) self.assertTrue(actual_line.startswith(start)) self.assertTrue(actual_line.endswith(end)) @@ -403,5 +405,59 @@ class TestShapeList(unittest.TestCase): ) +class TestShapeListAddition(unittest.TestCase): + def setUp(self): + # Create distinct faces to test with + self.face1 = Box(1, 1, 1).faces().sort_by(Axis.Z)[0] # bottom face + self.face2 = Box(1, 1, 1).faces().sort_by(Axis.Z)[-1] # top face + self.face3 = Box(1, 1, 1).faces().sort_by(Axis.X)[0] # side face + + def test_add_single_shape(self): + sl = ShapeList([self.face1]) + result = sl + self.face2 + self.assertIsInstance(result, ShapeList) + self.assertEqual(len(result), 2) + self.assertIn(self.face1, result) + self.assertIn(self.face2, result) + + def test_add_shape_list(self): + sl1 = ShapeList([self.face1]) + sl2 = ShapeList([self.face2, self.face3]) + result = sl1 + sl2 + self.assertIsInstance(result, ShapeList) + self.assertEqual(len(result), 3) + self.assertListEqual(result, [self.face1, self.face2, self.face3]) + + def test_iadd_single_shape(self): + sl = ShapeList([self.face1]) + sl_id_before = id(sl) + sl += self.face2 + self.assertEqual(id(sl), sl_id_before) # in-place mutation + self.assertEqual(len(sl), 2) + self.assertListEqual(sl, [self.face1, self.face2]) + + def test_iadd_shape_list(self): + sl = ShapeList([self.face1]) + sl += ShapeList([self.face2, self.face3]) + self.assertEqual(len(sl), 3) + self.assertListEqual(sl, [self.face1, self.face2, self.face3]) + + def test_add_vector(self): + vector = Vector(1, 2, 3) + sl = ShapeList([vector]) + sl += Vector(4, 5, 6) + self.assertEqual(len(sl), 2) + self.assertIsInstance(sl[0], Vector) + self.assertIsInstance(sl[1], Vector) + + def test_add_invalid_type(self): + sl = ShapeList([self.face1]) + with self.assertRaises(TypeError): + _ = sl + 123 # type: ignore + + with self.assertRaises(TypeError): + sl += "not a shape" # type: ignore + + if __name__ == "__main__": unittest.main() From e6c33137b3a091fa0ee28f8270809e88db37bc80 Mon Sep 17 00:00:00 2001 From: Jan Graichen Date: Tue, 6 May 2025 22:35:59 +0200 Subject: [PATCH 08/56] feat: Add timestamp argument to STEP export Allow passing a timestamp value when export STEP files, to generate STEP files with a specific timestamp value in the file header. For example, a null timestamp (`0000-00-00T00:00:00`), or a static timestamp can be used when generated files should be equal if there are no visual changes, such as for file versioning. This commit extends the `#export_step` function, to accept a `timestamp` keyword argument, that can be a string or a `datetime` object. A `datetime` is easier to use from Python. --- src/build123d/exporters3d.py | 17 ++++++++++++++--- tests/test_exporters3d.py | 29 +++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/build123d/exporters3d.py b/src/build123d/exporters3d.py index 7f2b53b..749e331 100644 --- a/src/build123d/exporters3d.py +++ b/src/build123d/exporters3d.py @@ -29,10 +29,10 @@ license: # pylint has trouble with the OCP imports # pylint: disable=no-name-in-module, import-error -from io import BytesIO +from datetime import datetime import warnings +from io import BytesIO from os import PathLike, fsdecode, fspath -from typing import Union import OCP.TopAbs as ta from anytree import PreOrderIter @@ -47,7 +47,11 @@ from OCP.RWGltf import RWGltf_CafWriter from OCP.STEPCAFControl import STEPCAFControl_Controller, STEPCAFControl_Writer from OCP.STEPControl import STEPControl_Controller, STEPControl_StepModelType from OCP.StlAPI import StlAPI_Writer -from OCP.TCollection import TCollection_AsciiString, TCollection_ExtendedString, TCollection_HAsciiString +from OCP.TCollection import ( + TCollection_AsciiString, + TCollection_ExtendedString, + TCollection_HAsciiString, +) from OCP.TColStd import TColStd_IndexedDataMapOfStringString from OCP.TDataStd import TDataStd_Name from OCP.TDF import TDF_Label @@ -262,6 +266,8 @@ def export_step( unit: Unit = Unit.MM, write_pcurves: bool = True, precision_mode: PrecisionMode = PrecisionMode.AVERAGE, + *, # Too many positional arguments + timestamp: str | datetime | None = None, ) -> bool: """export_step @@ -302,6 +308,11 @@ def export_step( header = APIHeaderSection_MakeHeader(writer.Writer().Model()) if to_export.label: header.SetName(TCollection_HAsciiString(to_export.label)) + if timestamp is not None: + if isinstance(timestamp, datetime): + header.SetTimeStamp(TCollection_HAsciiString(timestamp.isoformat())) + else: + header.SetTimeStamp(TCollection_HAsciiString(timestamp)) # consider using e.g. the non *Value versions instead # header.SetAuthorValue(1, TCollection_HAsciiString("Volker")); # header.SetOrganizationValue(1, TCollection_HAsciiString("myCompanyName")); diff --git a/tests/test_exporters3d.py b/tests/test_exporters3d.py index 9ca11b7..644ac3e 100644 --- a/tests/test_exporters3d.py +++ b/tests/test_exporters3d.py @@ -30,8 +30,10 @@ import json import os import re import unittest -from typing import Optional +from datetime import datetime from pathlib import Path +from typing import Optional +from zoneinfo import ZoneInfo import pytest @@ -39,7 +41,7 @@ from build123d.build_common import GridLocations from build123d.build_enums import Unit from build123d.build_line import BuildLine from build123d.build_sketch import BuildSketch -from build123d.exporters3d import export_gltf, export_step, export_brep, export_stl +from build123d.exporters3d import export_brep, export_gltf, export_step, export_stl from build123d.geometry import Color, Pos, Vector, VectorLike from build123d.objects_curve import Line from build123d.objects_part import Box, Sphere @@ -144,6 +146,29 @@ class TestExportStep(DirectApiTestCase): os.chmod("box_read_only.step", 0o777) # Make the file read/write os.remove("box_read_only.step") + def test_export_step_timestamp_datetime(self): + b = Box(1, 1, 1) + t = datetime(2025, 5, 6, 21, 30, 25) + self.assertTrue(export_step(b, "box.step", timestamp=t)) + with open("box.step", "r") as file: + step_data = file.read() + os.remove("box.step") + self.assertEqual( + re.findall("FILE_NAME\\('[^']*','([^']*)'", step_data), + ["2025-05-06T21:30:25"], + ) + + def test_export_step_timestamp_str(self): + b = Box(1, 1, 1) + self.assertTrue(export_step(b, "box.step", timestamp="0000-00-00T00:00:00")) + with open("box.step", "r") as file: + step_data = file.read() + os.remove("box.step") + self.assertEqual( + re.findall("FILE_NAME\\('[^']*','([^']*)'", step_data), + ["0000-00-00T00:00:00"], + ) + class TestExportGltf(DirectApiTestCase): def test_export_gltf(self): From 0e7ab984301074f3bea3bad96938138d30c42420 Mon Sep 17 00:00:00 2001 From: gumyr Date: Tue, 20 May 2025 19:10:57 -0400 Subject: [PATCH 09/56] Adding bicycle tire example --- docs/assets/examples/bicycle_tire.png | Bin 0 -> 255945 bytes docs/examples_1.rst | 23 ++++++ examples/bicycle_tire.py | 109 ++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 docs/assets/examples/bicycle_tire.png create mode 100644 examples/bicycle_tire.py diff --git a/docs/assets/examples/bicycle_tire.png b/docs/assets/examples/bicycle_tire.png new file mode 100644 index 0000000000000000000000000000000000000000..bba9acbdfd0242f37833c612bb9c56e60dc7d161 GIT binary patch literal 255945 zcmeAS@N?(olHy`uVBq!ia0y~yV2)#8U~%MNVqjp{HTPI50|Ns~x}&cn1H;CC?mvmF z3=9m6#X;^)j5kl})H5(JC?tCX`7$t6sWC7#v@kIIVqjosc)`F>YQVtoDuIE)Y6b&? zc)^@qfi?^b44efXk;M!QddeWoSh3W;jDdlHy~NYkmHj2Fh?td-%KrNc85k58JY5_^ zDsH{mTUjCfy!3x{+|A7DdO^-J4VzRaMWj1;#-)0)s7_j>k)@cbzCSN>vPEH%b>^%q zRqsBp@SU~v=Bp)rx3_$K|4seAop15nqrI`qJtv!Wx^_irWT|SLoRoT6$gsIrK{fJ- zwZhAF+kV`$KX<14U;;zara#@&zyDSd;@}Ajn#aHY`JDHPJ%$28Fu)X{V#lNi1C4D? zFu=sy+5!bEQe2!cU?Kw3DU_k10s|KUJYZnK!U-_o;0!ZYkZz@*og;gczX590!tyP@e*d1xw0cKFZ)xQo1IyRi>HFI6S(_Ck z&Aj#F)VliKyuMc*CHL+2T`NopwqtG z=8Esjs-&{zHp`2h-&)`nA{}4(Vz2m@?$W>NQmgGBC(p0qYj`PK`d58g;Vd2ZtNX5b z-#U_XZemC0(}2@ka|-`G(zbK#a)PG7d;ex#7s*+(*u$?+>qGMXdLf1{C#@K^y-q)E z?*4V&ig}BSwlmLut;wM9+4Smj#)PC}?hJJ`d2^4}Z06tlyvZ)|di^RvhBs%#r}6F) znDmm-_hoc-VD6mIX=h(e?k@kE^Rs!QF#DECuL`=v*6!Q4RebBoU9129e8s%+qW<^% z)nAU4|7qLydiks7jlv8cT<&BhzWZ@@iP^`zH`#0c9u5(4HPL|wjd#}bb8}snWf~~i zC4X=_Qs)r7m$UWGfz^5?EaHDp_13Od_r0|{;`*C~3>RYNpFjJf=<+7ne?cL)KHlR# z;1FrHIDXCjub-dtAM;zXV#=~jvR~f>Nyl$Aj-PFRFh6VEd1i;aTjrCxnHuK)tb0A} zaRrZk^CE4@X}#=8i|==Ce{|VW>lVWW@!fai_g79{)t-8oRleT(s(n%L(n|3}4Y(VP zyQX)(y|!SH2H)&}OoK0)p1E`0M%#8?|1v-4ir%%{JkO-t_vimf(zdUdYtP7#dzO=d zfl1idj^W2e?p(D4y0dFv%$v^Ous>pb?3&m1SGRaxWmND@W#Bj|qJQJ3f9{;Uzvizm z49NZ#P{YMycje>97au=rr0?rnP*&QvcJoEWc?$J^9__lbH24?lNFP1^z4|5lJBgpqK74yM|8V-QGWoM^{YzF~j5y$JU-0}yyo`>WNRi5B zyJ^0w>KuaYc4+U{A#{@baK$S zO*i-LE;{v1@^8@IvWYd@xbr*5)b)P_nWF*d?A$V z5q>FzuVUr>$@~>BU${)^ca5IE#<+G|7*;-8nxAdk_?wZlvqCO+nH&p zBJI43X;-ew(Oo?|zMc7;d$Z}z+86b^mW%7mza;dz`o)heH73Hc^QSp)I+%E|%I$Me zmlvZxD?`l+#aPD*C#>3(+D^I8W4)f0tf4!yqD}%tA-9jHF6KB>v6p#M> z?o{UVSB;HjEAQohym@g=<^2sg1<`u0s%wlM$NqW0@6dB&yUSa5|Cy>V)3iDxFX~(M zi{I}hex7!|eelzNC!weHb>CfHTh%L>KjyCZT-R?nse9RJwZIAI1ulMIYLa58`EbtS zkVb@T`{T>|>TQG{pKtB|_Hy0bfGRQDS-o;+SA1)alJ{7!e&+0N4>#`2{25`^^|#~C zh9cHIUz*GNY-*R~UQ|kI_m=zkH{p#-<?E?iOe#N3HnwAs z*w}S6asI}99ifksC-<LhuX2_wH22u9G@|Kx8C0W=kiT6hKm2PAJgac*QUO9I5y#8QL#j6 zjN;7$uiwXtey{%A7yZ8`W4G*yO{_bOmz1`wvD#WX&t_7m+_qgj_Sg6RzPRwMtm4@x z-eEQZoI>(i8W){4zy2*haxkmoNb|o}1s^5NTees$%@vAoKvYi*!$v7Np8V`YEZ;yV4kiGqv`CR3T>q$XrcJh?}NVPD~b z^9O6B4@ISWY~H^+$MKxl6KBn>whLs>uA2Y$Uag6+?UbO8p2lt7=ll+MzmFBI|K)S$ zYuLK;rSIkDfBXAjXT;QGrnp}VcR#vsapC#*fIlHKP2K+9n7I3(k)~vF`11uT_4+s8 zw#+`oF8J-`<=k#D!PCJye9RAJwkvN6yfUkGmG>8LLvgQiivJwV^rnYUaz8U zFYeZ2XJE*Au=Cl!=dd)%-rWBRMD z-rE_P_k~(AaGd;N{V|N;1xMyw$Jc?i!t+oqnKi9lzF7J~$>B7G>q(uJo%DxFo zI&7+4We?b--Txgf-uP`nnaN_dJzol<&Psd|ulgm+U!<{g*~&X_PA1zweYoY8=rywz z(+yMCGA39o)vGP9QxV@=e$`{!1Lg+T?g#DZw`2B~XKLkgWVZ*s`kiNcPJxj};=qwD z`sT{=e(oP9?hci;Z;!9MuJmrU+y#+&U(Y^$;V#mkp#p9+zmRor>6>I|CSrE=^0Hqx zj1nhZcShc*U*#EVw%GUDcl+xt*OwR=8R)O{PX875lwn5M%DCMnmoGl=w&fO+v#%-jy#CAom|LL8Q@g8RT$`^_D zy99i${xo+Xi_mT5-@hlQUDQ7#_T+HpRAGtZ`+5}n#h*NwTludiVXFk&o-4a1)W0f; z-rUZ%=Zgnh-;%|W&i@WAtMevW8x4zuzQ}S`L&ljAWYM8Qrx{|n^)fQWgiwj)- zA54>3Gvp-g^$UJ>Bt?uelV}=g_@3|Qmc)pyT7vE!MCm?OR zKr>>K%Z)=`8(Ra^CjQu4vPa>6;`7bNHwT(XRnDwPc42OKKfh<;^{+G6-IdVmC`$-f z#AhuaUum)Q+*!v1-t(I`oCS{P|6F_atBJXC{krP!m(y=CEYM!`@N0#;-vPy&Gm>>)ENu^Z^?&cXNH(5o zu|jw6bdS?wPh7*E$}&v5`n2)j(eRoVno4K69YmZsuY)>bFW$1XmMPuYro_omeNH@? z+>GLn0*Q(!l*?*1ENj@R1{OjNnAuZR#Jr560@5xuukZf_-_JG^VL__jMedoQ0 zlihga<#!rrTs${nn&ycE43?tuA68z@z1dWAf7Xx5>d6_-O3G||zr6naOW=py{+0DL zQFc?B_FLAOFZ;H|RQ1-Z<3+}HI#$K$f($?Acy)R4A9D--7$%^$NZ>!aP7J80x^VmC zvUhh@>dj_lc$;*0o2ciVuP7{>Omp@s-)0y(R4{J+ooYv=G-BEV(aeNKy8clY)dyT0{)uGe#*$*Z@>Fuh!(3S0Yj z2AiCh8^7Ar^QG_Ic7Nco>hWS>-I`e62(wwQK1beWu<&AdWF2_uwHT(8)m~HDw$=UHcUILZgOz*!_X*CM z)L}KNw@>`Zxd~+^i_^H(?8;b7*X&V_N#l{U_m`Q=w)(`m-6|I&&xkxx&iuOavLTbe zlo#LqXEk)(;AObKy-G|_-rr}-ky*#3#Gk9D)h-s+)zmV-`rMH5_&=_TE+P#-_@)$q zhh6SXa^c8Z+j92nmXnjeU%&i#XGU?Y+;5KUTU5UHxn4;%p5dE2UDEl+??pw$jn!S& z^WRh$lrg1uP2}E~*S$=Ek%6iI&HL9JS&W@>o~v&*{n@>}|IddU>1nAO%ReLpu`-mf zJ5QQuw&Z;NtLK46vWjnyNuO}*j@>lvXzR<`2xD2lRWn|dzh7mc?zE=&)@`o+TT&ln zS66@3WO(p!pKXG%Md4G=E-z_O+1lglI_&0z=sYtn*L$8;^S@*pulC(NuP^Sa*Ei2y z7ke!EKp4Azc({wZPW7i0p0)1brwg1T4jY-5S?&AZCwSb@-T0!iwvTx5To%mg0R_67J z)C)JuHH;g0roO$-aGE1 z&%155vTD|;^|7gnGs_;XU~hERoO(VzC*(^=+^+Jg90H$K=!QwCb9g?hMbn#D;pE}8NR8DoSW`= za);INS+75Pv@lGV{qgUMRx^eQg)$|Ti;A%u+wC70=-DM~f3-<&!j#y<3=KPDUw&)- zeRAqlo3_8*TXYN9B~rL9wQUgl5OnN8!L1Upj}3hj*mg)uJ<#XNd(V;enz?ho%@)~e z`R5Xkrz!HkHgs-Mxg~mWUw*IC)P{k%Pw5;S;^EwA78b7Q}p^NtJpmA}saaQ+%RJGzA7$Di}t ztztB6b}I`iB`@?oVtCqc1tY`jKb?;s2QFdvYhg%OzpE}W`2WH!r;6j8HhsLfwU9lE zS2dJD;?flTT*(7=`z?<#JZQcaV7x5u_CscQ_2d)IyDV4T5%y&|@UP{j?aAEz>`CgE zLY$sCYn%ZM9vwArI$Ah+*NU9`*PlDpf4(2~cFRev0L5bKDLZXd_8(a(xc-Ec5c3I% zP0H(c8!stkF=gYqezIiO&91U)i8a6KsskST_WoID*0OcE-)!x;S+6p)AK#E^7M^@j zI$z=G*$yUw`|E^~H9*NGKS=C~3Ge2W)z#IezL(efIlfJ@b=bjS(DP#Y>#e8H*&UL- zeNM~V_w{t!TdDnJH=CcA_AGZ(`cq^-U&oJSj|j(~oBQnM`Tn@_@`hD?QqnQ=IU(j+ zR_CTXxTC%8=0gvbyx#{ZQ|^dN(mbKqDR(7QOOUS~Lc*vG>g z&emYwn$pbJqSD;h*Pg~D?Z2hLvqS!#{(GBYf%Y2K zrH?Kp&QrFX6S8qtg~rl-@3&2q-+STP#jT5<&9jPSTzxZd@gl(n#nnD@G*9@?>#40e z{7!ye?&Hfm7TcQCuFaRfQ&;~wBVZBBgVohtYfBU73r_2ux5AGhD8%onD#MNG9SjE! z*H(X6`slX#TZh@oKQ?ZgoEU$RDTd+W#I8T>`VH|O&z73Mkj~A2z`S}FFN5REwiM={ z7jvRh_}VYF%@7MnnkjYHuB71Y(kI^*Y_ps2a=O2 z;i9F6?CoAp*Wc7*?0}B!uCo`}b#D5a&+6CMg<2+ns^T?V*Nzze>twkm=oPWW`Pg#b z_v{R1Ikv0s*z}se`O|)mJy|^{#A<b@IagSwwc?P2|oMF7k#}PySx5Jjr1XQ{cJ0)S$*5=&)i{S*tcNk z+4&NZ{oh=^%9-wr53XR9v@}wZ77GZvt-Z4IpFsAc(1-lDO%B^FesX$~>5;OjJDRsn zndJR`+BTh&DRGYu_Lebe`yKYU@@JBx!y+}AO-gD}^|RE={zy8QupH}4S>$e%b->%& zd6uoH48tZ?d3~|ZbFWBTv#^W36T};4{HXqqICH|}&33=HbioUp>+Ku|(}eS)CvM`O zo{*xzSY)#L(@!D47KRIwUJ6SDwJ)*yD!aeUKYnfVZnpgGyY1p{UE+7x@R`3;;JEv~ z@s|^?#D00~RTsJg{j0edpP>A`QL%zl$yx9q_g< z37=!GYTyv8xl z&^?>97nQnharQJ#{;}@d#*dkjvqgR$el&l^>Z1DB86L}=cUdjb zgZ(LSOl((Ae%jUDoEc$uXcHq#!^RCcH~i19N%=OjaJ^w_pmN>gf?}Tw-pxX(OP{8F z_6}Q8##j8-F?X(g<2I9jDh~=ww$I<$+!4)gze%l5pnm0opkUe50~hSJ{C{`x_U+r( zudDy-<%TqdR(Z}^wsKWh#*OV-%VSqv*Sngm(rc%h8*hBjcm?}B{+_2||L^@0X87>^ z_%*#AuGjQg@!;-C*v)*K0{QpEe`tAH<&!(wt6rFzh;rT%MXZ$lxdG9*f)OEBe`a>Z{ zA^&Vfk7ufEsejC$21S+~SbDTzo8yz8ehbe$6^aN+muif-b?m%uXxBostR;yj6Bry6 zbflLq&-?5%&nRU{abM?w1=@=Y8x~BrTI<5bFhTdkS-Gz3soeY0=k>Fy{J6yG8wd zA0C-^Y`f*E+v+@KE339In*Fz#A^zR{W2cY2WzgeI`h{@m3L~Cvj`emiiAliDyHhp&`CVlbh7Dm>en|h3Z7yH@$e(G}!P8>T z_4hq`Z2x=_BP@VSHJ(Jtd#vHlV0mz(;!DOc8N-d$IT>Fq7riOVu|56r!^hh4AFr1c z=zDl9`o31u^#5bO16zuDBxMi&zILQJuFLquAJ&|puK}JXx+{;XKU&*!@bB7>&AVnT z`*hXv+4rC=oD(^IevFQqBsl-$+T`qgb>AQSYuRKkXsCVkEGI+8s`LJ5eyF9@?3AqZ z_7RB#OLn6wA(>;1RJ|`N#SL3;yRkc(uA%hA(Y;$TZkmfDK$c z42L~M%UeE7`sjY`Nb{sd^M?}{BMjU3Oy^hkzHo{A^fBg*7fq(l?^w^edhG?rmc;pv z4Byn0s`Xv!^8cPpiPPefGFNvi3fz!pSMgk4bFstel`RLk1-aksd8hM2L)*XdtC83d z5jK7n%dcFDwikZJjgIEXE$z}vq;Fi z=i~B4+KU*O_nY^ZbS&xU;o!Mfew!ot&5sI^?R<~UIWwFPOSv<#`SuEDBU$|uEdnx5 z`s^-&@nVqm01Ga-zGdV!e3;?3RakKb;}usW6^8ap%g(n;9AErT=FnRO3B%@p7mjtb z$+jQ%6g6Min(|mV`%yxvz&7@+@xMhkd0yo_Q0MEY#8a{IzIXqUtL(|@2BsgpcW=Mh zS>Ww0#PNa8$>f!i-Q(}q=6gJSnlBrjEVt9lPrm7~v&7}7+s~S-ykT?97cJBX z{GG^9V6d{l=M7gj&w=+RZ`ZiAZK$|1EBK(I=)XBK0w2@YL|@!zeXDEn#Nq*y-z00byu693lzrT5UvzM0s%qebn8U@nbzi0}- zFZgk6D(gyv-q`t*J8e#-9G;|Q_HwParQ!qNxXk_ zl~jV|I!;vcUuqMX(!-m0_WjAvTE<3?er$Q4;dV4I)mlN$Yo_t1yIpomv~Toqgl+Sy zOxm_WA5!;Jv3p+La$LT?#{GTw-}FDXmj1H8QNYFUZBGA+-pw_(Cl7pX{P&#se#Lo( zh~ne5+tat4mV2A3Ki^uhqFRpcP@~EHnRbeog6STSQ&n=ldJ2>7&3%gJMm=NTu z^k(Cxgn1p?*;IFVUNkKH^|$=U{7SoPf|q^-ZB?H6Vn=SVY((?1`*!=jy^?WWma}eo z@7KzfLlt^l4Eyib89g$dQ@6lYT$({=!I3L&CG1n#oHyQ`XsE#QZBD;Mq`=LKJjyAi z0nxd4LbHGV_%%m;eXrV0r@XXKM!`3=?Mr7!Oggj6xGCY-1in{Vn_>fu%vyx&__vDA zirf~!;^O0;zi#sBOxb^Jhi41Q9R3k~+r#VMzL`~L^slP@pTfgX6=M6w*dTD`{nrjocc*vQ+}X~~ud%|=b8lXnt6{T8khfU#`7{Qk` zk@c;elJ-K`u!-I4m<2z*KC$)T11H&oTK&#qCGT6AmG&Fv&M19ea?$rn(?@bGMVO1sbL8{LGUxZne%HpQn^@aZ>>o44jIn&;Eb@p=k zTQzO-FUa4oe||Omx!KBJ!XLLvi|(~vbaU^Hg(-$HvwnAEC_S2L8@Si~s&0bvkz1Ng z#!B(G_pz^;B3aEYA=bTdYQg(fj-b2Ko}SdzJ$e3b4tIUFnBcM)M}hh09jn*5bi7+| z*rnvk6zxLA)pI!{nHAQgIV9)%Tz|0D{+8+8n_G(~?W_yirfn#8@mPn|vozylm)dM{ z43p9|4i=cr+^!hq`uuob4ts-Mwg)T2Cf1qENqJGn;tdSmq(#R5dz4dHS9!co_R)TI zsBh;5+z`CN(YRPrn5$5v*?(pZhxl20rVmdvi{DCYQ(R>(dS&*q-|-xAwWWRLX|<)d z8RX8I_dV!1dHvhB)|AJKvmYmH<$uKeV}D(#px!cOrr*L`LW;-2+G~#;zvaewqOoO@ zzMx}5s8o;tmia6iLJKPo3^SQh&>3vggbQtg~Ra=xTbk=F% zhCORyxcTDPvpc*~FhAKRE zCX9kUZZ*$-nyoP^pL%wsP35VWT^04OUrbo%bn}=!L&b}Q?Jc#C3h~8T=GM22Yi(yJ zu=J%Zj+j&GkQg5E*rmhM7R6fi zd%Nr=SWN3pYEo!F^eusjVV~umzmH%0E&CMY-`)44!M8=%T+~AF*eqetl9U-UCfeUD zG|HK<)@$d9`?LGmZc;6XbXZDq%A}f8<5)zKyB7H>?eVr{qHcH+CDDeh9iz$FTl)=bQWOYRrWc8Md$sKfb)LkY~l_7TK2H$ENH}7R=$x-c&X%L4M(-fE(MCPM+R< zWM+Wxg>TXuoYJepm!0Bu`crV~xnIOtmltKN+-hg5l~&iXJelR=csyHW>qeEx9|>Q+ zT9qj_oKVO;!I0w-K2gxzZG+^*M3+UO8OwMU7_Ts`)=19jJ9yEjq$cW^$(vy8b_~-26_bZF+s@F6c_bt=Y%7iElYQ z@1JqqZ>PB8T-jGSACvCCop~?%GQ)!XZ&(}ti96kF`crUU&PT&V<4JAHkK<~t@|UJO zoN`O{;x5s*3)b~KStPA|>-x8EihOl{-`Otv@6q*PoBcx2xYs7jS$C#)ua=Sq`YtKSUm4_Y|Z24R{pLvZI=~PSPpo$?9~q5D<-J4faeBZ zfbRt$aE2`V`U|l%Jxvw=gpQYbwq&<%RF;VDsk%!T{ zc`R@AMWYVTnynYtKe|w@);8 zpKKd=_ukL;-`*Rhe|-Gf-z{a=c`2)hE*vb|bp06*JZL>3xBB1i(#oROT_TJ>&g{>* zw@oQ^zU(uLj$6fcIo~;|y=|SW1t0lFhpVi%4hq;7d+z9Bt=-P1OKIdt|RWf8H>m*x>k$ z{-%HTKi3|z69G4gzoa!fS#xN0EqYy59l%|Yd0@8vtWG(< z)eHie29u`Mc3f7JbXH54c7q||__ODYhFe7C@9%&0D!W*5rrd=od7<~0WXw5|Guv-V zk7Bv|*9k5Y1NRvvyjywu&ZIjsS3g$d2(zqS_~DWEzW(*rjV{~seL77f?py6*^FI77 z;^49>D?{bSU)Q};DDPoAmE+{c{%cB0vg$3-^_@LubR;*gx)2s;qUXvhuClVIF3HsI z+qG*tI~s%^IxUMh@jvm(?l7yAAAi?7wLg7xuIv7Go~e=t98+9QzUaze)Zf~0o~@(U z;P``xFk3shqnWD~OlLY!a4LpXa#HUEpP%oYzSY+*`W*o7UtgHb%Jn;J*{^u6?d)6m z=GbjpAW*!}@a@qO$BvgTc$Z&k-evS&_+#H;=2=Pi^V+v2GaSgtV)#+C|EA-Q-tRoO z77Dog{QKym^T=4qjyYb4@yDC<+ioy(C;N8(aJgc0+DydmYNb$@>tP`!7Y&__oZ(`* zhZ?6J@@U!dm;e8BuCg^XSuH#Lr-iJL+C6_}#M`frUYkxYlHLAruVpH;-RJbggAEZS zg2rucSX`Xt{4^z<-5hdOoi+|*>TvAjQ@?s_*PkbA)<<7$H(|{__4K^n8)wK|%6=b> zH_Z4wcuF7 z^7{%~v#{dkJ-`BH8kw_`hSc&E-AjV zcrxb&gUkNuX*@qCuy(w4+rKC`NF_NV(!7dBk8HVl8HUn)>)n(N^>yE%jX$g*EHW(rB_ zkN(T;l$K|Ed}m{#VXW1{B8{b8k2Zl9WG^(2k?>?@xMOhp=Xu*#XD_cZEnl zx!U!jp2@R)k8#{z;KKjvsE5><_4k&%y4%&(e8i(G{-#+&%D1bwdwsuti8W`)JL3#0 zxHWWS{@=81W?^XezMx;?^sq~XfoEQSLivOEf4}S$KD?Zt*S6^J^COO%XMb3_!L=om z;YIAsEy9X&4NEePUf$8qKK*9P11Ze@(1r<7^Cx`*&@l z>9^}Ke60t(kM&6=OY=2_ia!g;$XC6xd{3u#T%K?e8*j0dlb#EQnfk_CJ3ekT6Eym+ zFR^*rp`F4Hw^}u2zRD@_-kJN}W2)S=Q@itjY=~Xfw`^UtOz@+@H{TL1yOv z%XPLrCr<42i!oicQ-L z!&ZiXmP6kX9$nJrZDC*($}~{oWn;XsTxIFP5A1W*zwR-qP)xdiv`J1;v-2>c^f%92 zQ?AtOu`twbU-CO|6i*Xo;D>W89kv3EZ)yl-Y1HuJy5 zhovjtaFwlVIX+QOWokgI$D+iW53c6MJ>6#S{qf}s8yU$>g({33(*#v!ewW>K?dE!G z5hqXI`3!0Q1(N=*YiK^NIJ51E1=FL+>e0=UE{a~W+f!wd?9m?dYNGRPL4n)NQJarj z%nRMWZF~Ri_8Jw|-+4dX+hrA+`0jInXQp1vRjrO*xJYBwDn1?_mOWSAFJ(C(=Xtr@ zecS(^3=AzQ%DE!vpT6?FT)TbgR8>|RdA>aYy9zEgPc*4Xl)WV9^w3Q%%lQQJ#z4M4 z|0B^8J>+WN$1yzE?Rl%Y^P9t?nVVnVD^>n^$gnItS%nf zxuM+klxGVI!-)gliEq2E&(V(z(wJ#sC(d-*v1CbvbEw7|mzIDqi*+q}qKEkypRMNH zto7o!m`7vcO^(x36dMIUhlZAXS~cHy{YsR@-X2?$z$Tk`wlO zH_d1K+|H4odPXMbq(o4-%YA`s63snl9b?2j&YX4JrttsAQL`;qf8IV`pVap=^ge7MK%SAF?{zu9y)jVEQU+1B{QU17rBNz zHQFib1h(*`U7RYLaqrBb@2w{~@&!B%Rf1EN#lJhPJ@f6ne4C{_0$X_#=Nd}*X|@Mv z9q_)+zGd02KcUC|&0k!;-Apx1Usif<$Glxv4o%KG72lwt2N}WHRi+U#U1USt9l0wU zjpqU$d02UI$at-^Xy}Q_Xm?^NFj&bKxzZ$4%b4wj^1c0KQ>3LU9B!m5Onk6FHDc|T z=%`7vqraU0U!$#Os>rhML-*SEyK_@gY^>~bi#2MV{oMA5GvAeqBO`o?f7u+BYXzL@ zPJb>x6uh-?!~1C_7R{W_2NwKaYQT3VXYFu0ftN0?oC;@ zVVmNb^M)2vg7}tS?OSl|ng5xy2d`S1nX@bJe9?JQV}|!nlMRoy{*)HqX$I-2ubard z)5<9--N2E<)J%6A3%-&F*dTK3K3|H&6)1UiighZr-@8fOVA^h-< zMTfYqgqB#VFBc1kx0=w^Ixp>d)s{2dOP8iZ{ypjO@$V$oeXCd#Rm+9nF8$0Zx?sJs z?5<;+JD(*_XMWTM3WnrbNrr3eTaNAebJfz!?(OfBJGV{9sX1acugD;hXWDTQf7iex z=TaffnypTWl~Ia{6AV+VMT(-8R00(y7(OwX+Mcu0M25?JrPan~-v73gGYDtxyR)BH zIrCk#@bdr;hUlo04Ne;;hy2>DoW1YkJV&MpOFnJyTUWRz?cV3(+b6B?=9>S?=BPE_ z=}v)#7q*tg?76q?))C#UGeR2=y}H}7b&HTu0soY=1FM=PHWvsyudv{5Q{CKE#jC!d zazfu3{+hBqil1ey?pw|XsSQmzIOBzatA?&ae$ZEQ5#dPFD4n_SdP|*qc1rqbNjm@g z@G5Y>`v2zVNjIDB$X&T+sy>15|IZldf1jVcG?R4xcds*yfy2Wj`-DOiv?m)n(RS^J zg}lodmiKdNdTQ6)^wIuv=lr&&=*JJ#LXQ`TMyxckU6p5_SYPl53qUWedUeoU}!w}S@2Hkr|18R^`9RNiTii^@M=NE?-7?3W2|@0 z3zq6BQet6Zetv3!0K<)~4v7~JF-~9R6gHFn`TfYG+Y5XeLQc(E+0r~)L{=<`ch_ak zl_J;Q_SGMGDRZl1g6@;20_SGst?fvi;-fV|WBK8({!hyik3_w^@b7W>r_JG8_!$$N zBevge&pq3@y760Ef`t) zNl#bLI&8TJ_gS8{;AOQpBrowTy>d8H^zGr)(%{Fe_dWEi43*c%nU%dt;=aG(&55mo zCE$AQh3wjY|LS}%m&CF++`AXYaA3=!hUrX=hgUw5WJ(ldaN6|HW6{gqro0TVd|49~ z#D4s?U*Zv;*dckw8~Kik3?;5x*1vtr+|Y6UN5pMTm%aJ&@w=;D-sq3Z`JHn7WJ=tv zWJksMc41Onzov*^pDEB_|Lf&5{&ijUwN_zVt(n(_?VJ|Q49IYNc)-%Gb`sN^?6Ov; z>$eKOsz_~5IMg+>- zQ(5-VUB)7!_qGS?o;9CzmK-u)v@PtYd6VGkWg$h}H~%Rgzq5;fsk;BMCZW3m*PcJS z@o>v5-4m~wqoRwG^7>*^3%+WdK6}DmKANB5L~CFDm86`=1q&xkxL_^I1*#D)cr(X! zF`szgp&jz&U58~D56eDtsp7kSjA43g41aFkZT>BMYM%?snvhvNipgfuzxw*`7<;sC z#pXCYJ76|_;p3ml8CkPT)84&XF!R{)XDiQzmAsj8dD`QCms3)=R?UjgGZzXn@;saM zbh}pHeH(wjtO^Zv7G-{;a{qOI1hX_9;^W=c__eG4I9Gq~)C&O#o61$D$tR=_Ri$er z-fEZowePmuvu8K1TAuJdZEw4uk71XnaYTbV7YC$}_`>(psoH=yO{}bK%ee_|95Q~> zSuZDC>(QOj#xJ{k%9X2p(sTL4<8uN| z+&OjfI$P^!VMXQ*ua4fZ&Nw&mN<(vB#U8JZH}$55`m9%L+5hi)anbI+mF+DdRY$p1 zT!SuJm&~53mRG($^!h|W?eI_D&*%IwU-#v@#2&R^gSUszO*kg8p!Ub^?Z>BI^*wv` z;D5V1bA~(jvu69k(>`BogvVQZ@pl}V(m4SVnFiaos7$WpTxg(kaeq;dM8h>P!bo8H}Rbk=|R(tsIFMpsrdw4UK?(kni$`n!4dn%7QpS6lkr*C=i*0SHqW>!=ewg**gOyQ|s8vee^r*J4HuAF>f42u4ZsE6X>U7Th z>Jjzy=u`Rm(dLHAw_h40pSUlZ%i7Q|J&k))hYh%L_;SvOd#BZ5DaI3GDLgtX3_jXN zl7#1r%UufH_kPB5(NArMm^oA9ohoFW%KWl7aetwu?$^V!Y8};lhU*F#N(Q@g+2Sw}DQXa&t;Ap*3aw4nAN#pIh z)uLRd{g~g~Z3)eF5?5Mt%kIUm88_}7*ZRu7i%t918B2E|FU$WQC0X|*-0$XPP(10- zu-dj{S4a8Pi<<*#ve*NZEZTCea2)xY`1Wo8)SrcR4s)Jwm?d%XU-#wLi=C%mD4c#W zRa#cgYZYiS!o}+FqsDDD7Hf^zUNc2KezY?A@x=RZoy|)lL0P>z=^M>-&tmpmJ z4C(GVXU}f*Ut`Z07NsaYKc(f;Rkd%L!YO<0e;y61d-~7CaP0;jF3x8n?=0on8vM)V zgh=t&Jmib(crdm9ui3L_E&^OvRa+k}2@*1A-X>fAG=PJFhwWVJDWSEwTd!SbZ0#$% zn5P9>3lRLRCLlsvkg0HqiWMVYj6weths02Ul06EW-}lWtlm376oc}X;Up5IH{quQ} z|5~ZgjjuMO$~w<6pJr7i>3r<^oNfC<%(GllT-Kj!>{&AFc*MumkG3zUia1x(vqQmQ z&h>w#%bg4S^o-deou&L%N;?0$5L>vvUCwKzyV0`R3X|1JvQ1mJ3av3?`}5WR!a~r9 z$-?am%ii5tdC!KI;Z|zDYiwe~mJ?^@GA`Ty=5A?1sAtqeUCqC#oD5sE<3Pg+p~o(B zRWGsaeiNEWzp+TOSaxT^2Gj)rj6mvPbd3=Yo33a z$1S+;w9D>CuFC~vBwGSx^wu)8KJ`-!S*370{PH>W*3T^$4W29Q$o|M7xw@smFGRsi zV@;h~(VbJh2bw*XTK#8ScObE^^R3pkCDmM|Z_T6?MRV*6)@&)XOWT(4v)e4|$%BqP zH`Zp9`KWAVTJ*K%U1lG*0Q-?!tIvFHyETR7=ahe!l8pJz%HMmqq)KCH9!IvUqi*no z`F66Ot21WD@3uN#SG10oVcI_H`j_`>Y~D|JehXGSnw9V_4&TqoQ}%ZE;`h_0>{@c6 zUT;n8N4sy0&3}6Kf1dfy{l0Zav3l+HW!3qfA19wVu=7Lx-|wL|(O+D?&Rdc9nJY2g z>85$wGEptwR=JoO9tMW{cKgg`PT#iHBQJK|qktFRgZ8Vx|9&BTUjAVZshBdK22h1z z)pToO&#rBSZ;qsN3v=Z@c)->A>vWv<5(8d_s|y8Ya4R=epZRJN?Q@E|{@d~`!iq{; zv#-vW%Kkl6N+XS-C8X)lr)(XuluT}}=1GkcM83@W6VCbX&Nb$!`l)`ucNwmoykO3q zh?CA+&WZ|~XQ}l44|j0e!@ckC7Da1=iI4M3-E@xIf7eVe&?{2A&MB~7Up9?L@-VxV zb5yZy?Jpml=n41Bqib&NULH3)dHp^%d;c}NzjX1hiIM(i(!>Xz4&S?VY38hDnG6la zZ4xQ5brJV-B^h4SD@N2^?t6E+LMv#RM8=^+m9x(>HmR?Ad{c0tz#7Svd0{`QU;963 z{`2?aR`0spEEVyid`=7*{A$SBmMGxUH0{%(Z06fd+H_RAue} z)x{Gn{44oH*6r{)`c^7vvTw%ji>LOMrMrm7>3p+rIBC$;+1YYn!n$e6Nh|h*PP~%A zw`o<~?Ri3IJ(-|V?M`l7R)7sI6xzv$i9PaVC? zCBHMhAl}LI>C%+AB9_Y!4%_{j=V+7pUb_3w_0>8vrx#r=vK0AtcM_Art4W8}HLrei zw$)Wbr?mB1tJ4yna1EB}+nkPN%`+Tsu!oyO9*>xLrF&lLS!B>wvUPD%N=sk5i8{vTmht#P9~`S!o8Z%
$=)RxK>y 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%0ACk=?9>Phk=J)^yHFocQzJ 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

ps3n zQn9tiQ$^^dtj4MUwY70YuEtCopEa$tNzD`O(Rgsa-B0sqP15V0ia+t{?x($9o#vK* z8JWMUc$)pj%BsZ3x37)FrwJ`}-MVGPH1SXo#UioayU*k@yHy6tcFcaXbmyw7MGLAE zE^_+wTWokS#ll$g-RacF6I=`8R%dXWkFZj^8uEL$zp_sFL}rJ~z^4t|O}?4|)1)=) zDw4ll_<82V2d8h3surm4NL#n)iB{LL%-`SN%gf6@-`?NXH^~~5(OcS7E`3dKVOV6G zq@m2@v0Chh?#-Wl0qVL-qgag@A2gT88$Y|g_Rnj72Ak@4bqq7y-&bueuU%Tc_vgmm zsomj1J&ARifvZ+6T@@7sPnu;rzr<75t@e4-SatMPEn3Iwcc*g0Y2oIwr<;<4 ze|~CpI>Erey4uslF{Jt8!rtUPYt(}iG7TT<>3g2JzDrhP*U29d29sB`cRqZ=(e*b= zdKwEy7q9D#8?lbBn|{1`VFnt#6Vh1Vv#T&mF7FyIgXU3|4_96avOV#Adfq{MTI-c|Id0l$-iI7S9Hs1@D-98l?_O1SnO~c3MW|?=VH8@$kY!=Z6IW{QZiPWUL zDNPU4B!#(`eY$ccOkB8jNvOKVQ5FS*kN#@z`G0rb(4OA*<=^V0j`^ouY-QCXs;spR z?-frvb1p0BE%-EU8?T;; zNwt_Oz<%KCy;Sqg4;NZ_7|i2%x&$Xf>dX@3q(zAmZHXK{CZ}E>J1xbKaCg2>-?C8d z2AOiU1>a*=ZvVs_v}*4kbN4e%E0tC=-dM7p!G6Y!eUI1iiZ$$M?$_79kvrdf&1!}n zC0Cyv;+0+YyWu9kmaXj6_c6CLzF**5x@(!xjp?g3s_us}Y?c3e#FR<)g!8^dT-%rz zeASVD%4a$I!gBk6zmyr&;R4bPjwX z{%r1!;@Go7DPRAsj(Y#;$QRknt6nRgHLtjx-_EO>zsliF?Do4x-}cG-_}u@vaN&fI z6XNOZV#0UD*K6c`xE20fG2{LA?el-`S8qT5uKw-qZJpXe8nd6j3u!f9b=Z{%)&Q>|0|K~lH!_EH7Mf6MdjvNqqkcKz!;?Z>Ha7cR^> z9Q@?Lo<>=Xp2H_EOCPzcKktqb^P**$&WC>q%xnS;wJ4dW2x@W#l_Um!Sd^r~?O zKSE*q7Nwl_TX5}Uk`LN!2#dXSo%-g7u~MR-{<*AA zr**hdG(J72mTTpBdx!^K#kTUmxOp1;>ge3pH?Z}$N^@hsL4 zoy-c{V5OjP^(^DWUF+CqUUKe=+aT=EdsyLt@|{0n5aNRlmx-^EuAjl5h8GaPV{JLgECZ{oI#2~N~vMolKGqd**lhS WwC2QHcrq|BFnGH9xvX Date: Wed, 21 May 2025 13:25:08 -0400 Subject: [PATCH 10/56] Updating description of is_frenet parameter --- src/build123d/topology/three_d.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/build123d/topology/three_d.py b/src/build123d/topology/three_d.py index ee92394..c74c0aa 100644 --- a/src/build123d/topology/three_d.py +++ b/src/build123d/topology/three_d.py @@ -1229,6 +1229,21 @@ class Solid(Mixin3D, Shape[TopoDS_Solid]): Sweep the given cross section into a prismatic solid along the provided path + The is_frenet parameter controls how the profile orientation changes as it + follows along the sweep path. If is_frenet is False, the orientation of the + profile is kept consistent from point to point. The resulting shape has the + minimum possible twisting. Unintuitively, when a profile is swept along a + helix, this results in the orientation of the profile slowly creeping + (rotating) as it follows the helix. Setting is_frenet to True prevents this. + + If is_frenet is True the orientation of the profile is based on the local + curvature and tangency vectors of the path. This keeps the orientation of the + profile consistent when sweeping along a helix (because the curvature vector of + a straight helix always points to its axis). However, when path is not a helix, + the resulting shape can have strange looking twists sometimes. For more + information, see Frenet Serret formulas + http://en.wikipedia.org/wiki/Frenet%E2%80%93Serret_formulas. + Args: section (Union[Face, Wire]): cross section to sweep path (Union[Wire, Edge]): sweep path @@ -1294,6 +1309,21 @@ class Solid(Mixin3D, Shape[TopoDS_Solid]): Sweep through a sequence of profiles following a path. + The is_frenet parameter controls how the profile orientation changes as it + follows along the sweep path. If is_frenet is False, the orientation of the + profile is kept consistent from point to point. The resulting shape has the + minimum possible twisting. Unintuitively, when a profile is swept along a + helix, this results in the orientation of the profile slowly creeping + (rotating) as it follows the helix. Setting is_frenet to True prevents this. + + If is_frenet is True the orientation of the profile is based on the local + curvature and tangency vectors of the path. This keeps the orientation of the + profile consistent when sweeping along a helix (because the curvature vector of + a straight helix always points to its axis). However, when path is not a helix, + the resulting shape can have strange looking twists sometimes. For more + information, see Frenet Serret formulas + http://en.wikipedia.org/wiki/Frenet%E2%80%93Serret_formulas. + Args: profiles (Iterable[Union[Wire, Face]]): list of profiles path (Union[Wire, Edge]): The wire to sweep the face resulting from the wires over From 14ef7d1a0d53d30c227d3b63a8bfb47ca8614a32 Mon Sep 17 00:00:00 2001 From: gumyr Date: Thu, 22 May 2025 16:07:08 -0400 Subject: [PATCH 11/56] Improved Edge.param_at_point and Wire.trim - Issue #795 --- src/build123d/topology/one_d.py | 172 ++++++++++++++--------------- tests/test_direct_api/test_edge.py | 22 ++++ 2 files changed, 107 insertions(+), 87 deletions(-) diff --git a/src/build123d/topology/one_d.py b/src/build123d/topology/one_d.py index 1c6faae..9b5ef43 100644 --- a/src/build123d/topology/one_d.py +++ b/src/build123d/topology/one_d.py @@ -60,7 +60,7 @@ from math import radians, inf, pi, cos, copysign, ceil, floor from typing import Literal, overload, TYPE_CHECKING from typing_extensions import Self from numpy import ndarray -from scipy.optimize import minimize +from scipy.optimize import minimize, minimize_scalar from scipy.spatial import ConvexHull import OCP.TopAbs as ta @@ -176,6 +176,7 @@ from build123d.build_enums import ( from build123d.geometry import ( DEG2RAD, TOLERANCE, + TOL_DIGITS, Axis, Color, Location, @@ -2078,14 +2079,25 @@ class Edge(Mixin1D, Shape[TopoDS_Edge]): return None def param_at_point(self, point: VectorLike) -> float: - """Normalized parameter at point along Edge""" + """param_at_point + + Args: + point (VectorLike): point on Edge + + Raises: + ValueError: point not on edge + RuntimeError: failed to find parameter + + Returns: + float: parameter value at point on edge + """ # Note that this search algorithm would ideally be replaced with # an OCP based solution, something like that which is shown below. # However, there are known issues with the OCP methods for some # curves which may return negative values or incorrect values at - # end points. Also note that this search takes about 1.5ms while - # the OCP methods take about 0.4ms. + # end points. Also note that this search takes about 1.3ms on a + # complex curve while the OCP methods take about 0.4ms. # # curve = BRep_Tool.Curve_s(self.wrapped, float(), float()) # param_min, param_max = BRep_Tool.Range_s(self.wrapped) @@ -2095,26 +2107,47 @@ class Edge(Mixin1D, Shape[TopoDS_Edge]): point = Vector(point) - if not isclose_b(self.distance_to(point), 0, abs_tol=TOLERANCE): - raise ValueError(f"point ({point}) is not on edge") + separation = self.distance_to(point) + if not isclose_b(separation, 0, abs_tol=TOLERANCE): + raise ValueError(f"point ({point}) is {separation} from edge") - # Function to be minimized - def func(param: ndarray) -> float: - return (self.position_at(param[0]) - point).length + # This algorithm finds the normalized [0, 1] parameter of a point on an edge + # by minimizing the 3D distance between the edge and the given point. + # + # Because some edges (e.g., BSplines) can have multiple local minima in the + # distance function, we subdivide the [0, 1] domain into 2^n intervals + # (logarithmic refinement) and perform a bounded minimization in each subinterval. + # + # The first solution found with an error smaller than the geometric resolution + # is returned. If no such minimum is found after all subdivisions, a runtime error + # is raised. - # Find the u value that results in a point within tolerance of the target - initial_guess = max( - 0.0, min(1.0, (point - self.position_at(0)).length / self.length) - ) - result = minimize( - func, - x0=initial_guess, - method="Nelder-Mead", - bounds=[(0.0, 1.0)], - tol=TOLERANCE, - ) - u_value = float(result.x[0]) - return u_value + max_divisions = 10 # Logarithmic refinement depth + + for division in range(max_divisions): + intervals = 2**division + step = 1.0 / intervals + + for i in range(intervals): + lo, hi = i * step, (i + 1) * step + + result = minimize_scalar( + lambda u: (self.position_at(u) - point).length, + bounds=(lo, hi), + method="bounded", + options={"xatol": TOLERANCE / 2}, + ) + + # Early exit if we're below resolution limit + if ( + result.fun + < ( + self @ (result.x + TOLERANCE) - self @ (result.x - TOLERANCE) + ).length + ): + return round(float(result.x), TOL_DIGITS) + + raise RuntimeError("Unable to find parameter, Edge is too complex") def project_to_shape( self, @@ -3076,88 +3109,53 @@ class Wire(Mixin1D, Shape[TopoDS_Wire]): return self def trim(self: Wire, start: float, end: float) -> Wire: - """trim - - Create a new wire by keeping only the section between start and end. + """Trim a wire between [start, end] normalized over total length. Args: - start (float): 0.0 <= start < 1.0 - end (float): 0.0 < end <= 1.0 - - Raises: - ValueError: start >= end + start (float): normalized start position (0.0 to <1.0) + end (float): normalized end position (>0.0 to 1.0) Returns: - Wire: trimmed wire + Wire: trimmed Wire """ - - # pylint: disable=too-many-branches if start >= end: raise ValueError("start must be less than end") - edges = self.edges() + # Extract the edges in order + ordered_edges = self.edges().sort_by(self) # If this is really just an edge, skip the complexity of a Wire - if len(edges) == 1: - return Wire([edges[0].trim(start, end)]) + if len(ordered_edges) == 1: + return Wire([ordered_edges[0].trim(start, end)]) - # For each Edge determine the beginning and end wire parameters - # Note that u, v values are parameters along the Wire - edges_uv_values: list[tuple[float, float, Edge]] = [] - found_end_of_wire = False # for finding ends of closed wires - - for edge in edges: - u = self.param_at_point(edge.position_at(0)) - v = self.param_at_point(edge.position_at(1)) - if self.is_closed: # Avoid two beginnings or ends - u = ( - 1 - u - if found_end_of_wire and (isclose_b(u, 0) or isclose_b(u, 1)) - else u - ) - v = ( - 1 - v - if found_end_of_wire and (isclose_b(v, 0) or isclose_b(v, 1)) - else v - ) - found_end_of_wire = ( - isclose_b(u, 0) - or isclose_b(u, 1) - or isclose_b(v, 0) - or isclose_b(v, 1) - or found_end_of_wire - ) - - # Edge might be reversed and require flipping parms - u, v = (v, u) if u > v else (u, v) - - edges_uv_values.append((u, v, edge)) + total_length = self.length + start_len = start * total_length + end_len = end * total_length trimmed_edges = [] - for u, v, edge in edges_uv_values: - if v < start or u > end: # Edge not needed - continue + cur_length = 0.0 - if start <= u and v <= end: # keep whole Edge - trimmed_edges.append(edge) + for edge in ordered_edges: + edge_len = edge.length + edge_start = cur_length + edge_end = cur_length + edge_len + cur_length = edge_end - elif start >= u and end <= v: # Wire trimmed to single Edge - u_edge = edge.param_at_point(self.position_at(start)) - v_edge = edge.param_at_point(self.position_at(end)) - u_edge, v_edge = ( - (v_edge, u_edge) if u_edge > v_edge else (u_edge, v_edge) - ) - trimmed_edges.append(edge.trim(u_edge, v_edge)) + if edge_end <= start_len or edge_start >= end_len: + continue # skip - elif start <= u: # keep start of Edge - u_edge = edge.param_at_point(self.position_at(end)) - if u_edge != 0: - trimmed_edges.append(edge.trim(0, u_edge)) + if edge_start >= start_len and edge_end <= end_len: + trimmed_edges.append(edge) # keep whole Edge + else: + # Normalize trim points relative to this edge + trim_start_len = max(start_len, edge_start) + trim_end_len = min(end_len, edge_end) - else: # v <= end keep end of Edge - v_edge = edge.param_at_point(self.position_at(start)) - if v_edge != 1: - trimmed_edges.append(edge.trim(v_edge, 1)) + u0 = (trim_start_len - edge_start) / edge_len + u1 = (trim_end_len - edge_start) / edge_len + + if abs(u1 - u0) > TOLERANCE: + trimmed_edges.append(edge.trim(u0, u1)) return Wire(trimmed_edges) diff --git a/tests/test_direct_api/test_edge.py b/tests/test_direct_api/test_edge.py index 292b94e..6507cbd 100644 --- a/tests/test_direct_api/test_edge.py +++ b/tests/test_direct_api/test_edge.py @@ -27,6 +27,7 @@ license: """ import math +import numpy as np import unittest from unittest.mock import patch, PropertyMock @@ -272,6 +273,27 @@ class TestEdge(unittest.TestCase): with self.assertRaises(ValueError): edge.param_at_point((-1, 1)) + def test_param_at_point_bspline(self): + # Define a complex spline with inflections and non-monotonic behavior + curve = Edge.make_spline( + [ + (-2, 0, 0), + (-10, 1, 0), + (0, 0, 0), + (1, -2, 0), + (2, 0, 0), + (1, 1, 0), + ] + ) + + # Sample N points along the curve using position_at and check that + # param_at_point returns approximately the same param (inverted) + N = 20 + for u in np.linspace(0.0, 1.0, N): + p = curve.position_at(u) + u_back = curve.param_at_point(p) + self.assertAlmostEqual(u, u_back, delta=1e-6, msg=f"u={u}, u_back={u_back}") + def test_conical_helix(self): helix = Edge.make_helix(1, 4, 1, normal=(-1, 0, 0), angle=10, lefthand=True) self.assertAlmostEqual(helix.bounding_box().min.X, -4, 5) From 30d26904ff86bfb0ddd24fbd259f6d692d35b723 Mon Sep 17 00:00:00 2001 From: gumyr Date: Fri, 23 May 2025 13:47:28 -0400 Subject: [PATCH 12/56] Adding Technical Drawing Tutorial --- docs/assets/stepper_drawing.svg | 771 ++++++++++++++++++++++++++++++++ docs/tech_drawing_tutorial.rst | 73 +++ docs/technical_drawing.py | 188 ++++++++ docs/tutorials.rst | 1 + 4 files changed, 1033 insertions(+) create mode 100644 docs/assets/stepper_drawing.svg create mode 100644 docs/tech_drawing_tutorial.rst create mode 100644 docs/technical_drawing.py diff --git a/docs/assets/stepper_drawing.svg b/docs/assets/stepper_drawing.svg new file mode 100644 index 0000000..6504639 --- /dev/null +++ b/docs/assets/stepper_drawing.svg @@ -0,0 +1,771 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/tech_drawing_tutorial.rst b/docs/tech_drawing_tutorial.rst new file mode 100644 index 0000000..227caab --- /dev/null +++ b/docs/tech_drawing_tutorial.rst @@ -0,0 +1,73 @@ +.. _tech_drawing_tutorial: + +########################## +Technical Drawing Tutorial +########################## + +This example demonstrates how to generate a standard technical drawing of a 3D part +using `build123d`. It creates orthographic and isometric views of a Nema 23 stepper +motor and exports the result as an SVG file suitable for printing or inspection. + +Overview +-------- + +A technical drawing represents a 3D object in 2D using a series of standardized views. +These include: + +- **Plan (Top View)** – as seen from directly above (Z-axis down) +- **Front Elevation** – looking at the object head-on (Y-axis forward) +- **Side Elevation (Right Side)** – viewed from the right (X-axis) +- **Isometric Projection** – a 3D perspective view to help visualize depth + +Each view is aligned to a position on the page and optionally scaled or annotated. + +How It Works +------------ + +The script uses the `project_to_viewport` method to project the 3D part geometry into 2D. +A helper function, `project_to_2d`, sets up the viewport (camera origin and up direction) +and places the result onto a virtual drawing sheet. + +The steps involved are: + +1. Load or construct a 3D part (in this case, a stepper motor). +2. Define a `TechnicalDrawing` border and title block using A4 page size. +3. Generate each of the standard views and apply transformations to place them. +4. Add dimensions using `ExtensionLine` and labels using `Text`. +5. Export the drawing using `ExportSVG`, separating visible and hidden edges by layer + and style. + +Result +------ + +.. image:: /assets/stepper_drawing.svg + :alt: Stepper motor technical drawing + :class: align-center + :width: 80% + +Try It Yourself +--------------- + +You can modify the script to: + +- Replace the part with your own `Part` model +- Adjust camera angles and scale +- Add other views (bottom, rear) +- Enhance with more labels and dimensions + +Code +---- + +.. literalinclude:: technical_drawing.py + :language: python + :start-after: [code] + :end-before: [end] + +Dependencies +------------ + +This example depends on the following packages: + +- `build123d` +- `bd_warehouse` (for the `StepperMotor` part) +- `ocp_vscode` (for local preview) diff --git a/docs/technical_drawing.py b/docs/technical_drawing.py new file mode 100644 index 0000000..55a6efc --- /dev/null +++ b/docs/technical_drawing.py @@ -0,0 +1,188 @@ +""" + +name: technical_drawing.py +by: gumyr +date: May 23, 2025 + +desc: + + Generate a multi-view technical drawing of a part, including isometric and + orthographic projections. + + This module demonstrates how to create a standard technical drawing using + `build123d`. It includes: + - Projection of a 3D part to 2D views (plan, front, side, isometric) + - Drawing borders and dimensioning using extension lines + - SVG export of visible and hidden geometry + - Example part: Nema 23 stepper motor from `bd_warehouse.open_builds` + + The following standard views are generated: + - Plan View (Top) + - Front Elevation + - Side Elevation (Right Side) + - Isometric Projection + + The resulting drawing is exported as an SVG and can be previewed using + the `ocp_vscode` viewer. + +license: + + Copyright 2025 gumyr + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +# [code] +from datetime import date + +from bd_warehouse.open_builds import StepperMotor +from build123d import * +from ocp_vscode import show + + +def project_to_2d( + part: Part, + viewport_origin: VectorLike, + viewport_up: VectorLike, + page_origin: VectorLike, + scale_factor: float = 1.0, +) -> tuple[ShapeList[Edge], ShapeList[Edge]]: + """project_to_2d + + Helper function to generate 2d views translated on the 2d page. + + Args: + part (Part): 3d object + viewport_origin (VectorLike): location of viewport + viewport_up (VectorLike): direction of the viewport Y axis + page_origin (VectorLike): center of 2d object on page + scale_factor (float, optional): part scalar. Defaults to 1.0. + + Returns: + tuple[ShapeList[Edge], ShapeList[Edge]]: visible & hidden edges + """ + scaled_part = part if scale_factor == 1.0 else scale(part, scale_factor) + visible, hidden = scaled_part.project_to_viewport( + viewport_origin, viewport_up, look_at=(0, 0, 0) + ) + visible = [Pos(*page_origin) * e for e in visible] + hidden = [Pos(*page_origin) * e for e in hidden] + + return ShapeList(visible), ShapeList(hidden) + + +# The object that appearing in the drawing +stepper: Part = StepperMotor("Nema23") + +# Create a standard technical drawing border on A4 paper +border = TechnicalDrawing( + designed_by="build123d", + design_date=date.fromisoformat("2025-05-23"), + page_size=PageSize.A4, + title="Nema 23 Stepper", + sub_title="Units: mm", + drawing_number="BD-1", + sheet_number=1, + drawing_scale=1, +) +page_size = border.bounding_box().size + +# Specify the drafting options for extension lines +drafting_options = Draft(font_size=3.5, decimal_precision=1, display_units=False) + +# Lists used to store the 2d visible and hidden lines +visible_lines, hidden_lines = [], [] + +# Isometric Projection - A 3D view where the part is rotated to reveal three +# dimensions equally. +iso_v, iso_h = project_to_2d( + stepper, + (100, 100, 100), + (0, 0, 1), + page_size * 0.3, + 0.75, +) +visible_lines.extend(iso_v) +hidden_lines.extend(iso_h) + +# Plan View (Top) - The view from directly above the part (looking down along +# the Z-axis). +vis, _ = project_to_2d( + stepper, + (0, 0, 100), + (0, 1, 0), + (page_size.X * -0.3, page_size.Y * 0.25), +) +visible_lines.extend(vis) + +# Dimension the top of the stepper +top_bbox = Curve(vis).bounding_box() +perimeter = Pos(*top_bbox.center()) * Rectangle(top_bbox.size.X, top_bbox.size.Y) +d1 = ExtensionLine( + border=perimeter.edges().sort_by(Axis.X)[-1], offset=1 * CM, draft=drafting_options +) +d2 = ExtensionLine( + border=perimeter.edges().sort_by(Axis.Y)[0], offset=1 * CM, draft=drafting_options +) +# Add a label +l1 = Text("Plan View", 6) +l1.position = vis.sort_by(Axis.Y)[-1].center() + (0, 5 * MM) + +# Front Elevation - The primary view, typically looking along the Y-axis, +# showing the height. +vis, _ = project_to_2d( + stepper, + (0, -100, 0), + (0, 0, 1), + (page_size.X * -0.3, page_size.Y * -0.125), +) +visible_lines.extend(vis) +d3 = ExtensionLine( + border=vis.sort_by(Axis.Y)[-1], offset=-5 * MM, draft=drafting_options +) +l2 = Text("Front Elevation", 6) +l2.position = vis.group_by(Axis.Y)[0].sort_by(Edge.length)[-1].center() + (0, -5 * MM) + +# Side Elevation - Often refers to the Right Side View, looking along the X-axis. +vis, _ = project_to_2d( + stepper, + (100, 0, 0), + (0, 0, 1), + (0, page_size.Y * 0.15), +) +visible_lines.extend(vis) +side_bbox = Curve(vis).bounding_box() +perimeter = Pos(*side_bbox.center()) * Rectangle(side_bbox.size.X, side_bbox.size.Y) +d4 = ExtensionLine( + border=perimeter.edges().sort_by(Axis.X)[-1], offset=1 * CM, draft=drafting_options +) +l3 = Text("Side Elevation", 6) +l3.position = vis.group_by(Axis.Y)[0].sort_by(Edge.length)[-1].center() + (0, -5 * MM) + + +# Initialize the SVG exporter +exporter = ExportSVG(unit=Unit.MM) +# Define visible and hidden line layers +exporter.add_layer("Visible") +exporter.add_layer("Hidden", line_color=(99, 99, 99), line_type=LineType.ISO_DOT) +# Add the objects to the appropriate layer +exporter.add_shape(visible_lines, layer="Visible") +exporter.add_shape(hidden_lines, layer="Hidden") +exporter.add_shape(border, layer="Visible") +exporter.add_shape([d1, d2, d3, d4], layer="Visible") +exporter.add_shape([l1, l2, l3], layer="Visible") +# Write the file +exporter.write(f"assets/stepper_drawing.svg") + +show(border, visible_lines, d1, d2, d3, d4, l1, l2, l3) +# [end] diff --git a/docs/tutorials.rst b/docs/tutorials.rst index 7ea3407..5ae7c96 100644 --- a/docs/tutorials.rst +++ b/docs/tutorials.rst @@ -16,3 +16,4 @@ as later tutorials build on the concepts introduced in earlier ones. examples_1.rst tttt.rst tutorial_surface_modeling.rst + tech_drawing_tutorial.rst From 44c3bac548eed9d6f906a54222c3b8c7bc114612 Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 25 May 2025 16:11:35 -0400 Subject: [PATCH 13/56] Added draft operation Issue #807 --- src/build123d/operations_part.py | 56 +++++++++++++++++- src/build123d/topology/three_d.py | 69 +++++++++++++++++++++- tests/test_build_part.py | 66 ++++++++++++++++++++- tests/test_direct_api/test_solid.py | 89 +++++++++++++++++++++++++---- 4 files changed, 264 insertions(+), 16 deletions(-) diff --git a/src/build123d/operations_part.py b/src/build123d/operations_part.py index c1cd10b..31a47db 100644 --- a/src/build123d/operations_part.py +++ b/src/build123d/operations_part.py @@ -30,12 +30,13 @@ from __future__ import annotations from typing import cast from collections.abc import Iterable -from build123d.build_enums import Mode, Until, Kind, Side +from build123d.build_enums import GeomType, Mode, Until, Kind, Side from build123d.build_part import BuildPart from build123d.geometry import Axis, Plane, Vector, VectorLike from build123d.topology import ( Compound, Curve, + DraftAngleError, Edge, Face, Shell, @@ -55,6 +56,59 @@ from build123d.build_common import ( ) +def draft( + faces: Face | Iterable[Face], + neutral_plane: Plane, + angle: float, +) -> Part: + """Part Operation: draft + + Apply a draft angle to the given faces of the part + + Args: + faces: Faces to which the draft should be applied. + neutral_plane: Plane defining the neutral direction and position. + angle: Draft angle in degrees. + """ + context: BuildPart | None = BuildPart._get_context("draft") + + face_list: ShapeList[Face] = flatten_sequence(faces) + assert all(isinstance(f, Face) for f in face_list), "all faces must be of type Face" + validate_inputs(context, "draft", face_list) + + valid_geom_types = {GeomType.PLANE, GeomType.CYLINDER, GeomType.CONE} + unsupported = [f for f in face_list if f.geom_type not in valid_geom_types] + if unsupported: + raise ValueError( + f"Draft not supported on face(s) with geometry: " + f"{', '.join(set(f.geom_type.name for f in unsupported))}" + ) + + # Check that all the faces are associated with the same Solid + topo_parents = set(f.topo_parent for f in face_list) + if len(topo_parents) != 1: + raise ValueError("All faces must share the same topological parent (a Solid)") + parent_solids = next(iter(topo_parents)).solids() + if len(parent_solids) != 1: + raise ValueError("Topological parent must be a single Solid") + + # Create the drafted solid + try: + new_solid = parent_solids[0].draft(face_list, neutral_plane, angle) + except DraftAngleError as err: + raise DraftAngleError( + f"Draft operation failed. " + f"Use `err.face` and `err.problematic_shape` for more information.", + face=err.face, + problematic_shape=err.problematic_shape, + ) from err + + if context is not None: + context._add_to_context(new_solid, clean=False, mode=Mode.REPLACE) + + return Part(Compound([new_solid]).wrapped) + + def extrude( to_extrude: Face | Sketch | None = None, amount: float | None = None, diff --git a/src/build123d/topology/three_d.py b/src/build123d/topology/three_d.py index c74c0aa..32f1561 100644 --- a/src/build123d/topology/three_d.py +++ b/src/build123d/topology/three_d.py @@ -68,7 +68,11 @@ from OCP.BRepClass3d import BRepClass3d_SolidClassifier from OCP.BRepFeat import BRepFeat_MakeDPrism from OCP.BRepFilletAPI import BRepFilletAPI_MakeChamfer, BRepFilletAPI_MakeFillet from OCP.BRepOffset import BRepOffset_MakeOffset, BRepOffset_Skin -from OCP.BRepOffsetAPI import BRepOffsetAPI_MakePipeShell, BRepOffsetAPI_MakeThickSolid +from OCP.BRepOffsetAPI import ( + BRepOffsetAPI_DraftAngle, + BRepOffsetAPI_MakePipeShell, + BRepOffsetAPI_MakeThickSolid, +) from OCP.BRepPrimAPI import ( BRepPrimAPI_MakeBox, BRepPrimAPI_MakeCone, @@ -88,7 +92,7 @@ from OCP.TopExp import TopExp from OCP.TopTools import TopTools_IndexedDataMapOfShapeListOfShape, TopTools_ListOfShape from OCP.TopoDS import TopoDS, TopoDS_Face, TopoDS_Shape, TopoDS_Solid, TopoDS_Wire from OCP.gp import gp_Ax2, gp_Pnt -from build123d.build_enums import CenterOf, Kind, Transition, Until +from build123d.build_enums import CenterOf, GeomType, Kind, Transition, Until from build123d.geometry import ( DEG2RAD, Axis, @@ -431,7 +435,7 @@ class Mixin3D(Shape): """ solid_classifier = BRepClass3d_SolidClassifier(self.wrapped) - solid_classifier.Perform(gp_Pnt(*Vector(point).to_tuple()), tolerance) + solid_classifier.Perform(gp_Pnt(*Vector(point)), tolerance) return solid_classifier.State() == ta.TopAbs_IN or solid_classifier.IsOnAFace() @@ -1421,3 +1425,62 @@ class Solid(Mixin3D, Shape[TopoDS_Solid]): raise RuntimeError("Error applying thicken to given surface") from err return result + + def draft(self, faces: Iterable[Face], neutral_plane: Plane, angle: float) -> Solid: + """Apply a draft angle to the given faces of the solid. + + Args: + faces: Faces to which the draft should be applied. + neutral_plane: Plane defining the neutral direction and position. + angle: Draft angle in degrees. + + Returns: + Solid with the specified draft angles applied. + + Raises: + RuntimeError: If draft application fails on any face or during build. + """ + valid_geom_types = {GeomType.PLANE, GeomType.CYLINDER, GeomType.CONE} + for face in faces: + if face.geom_type not in valid_geom_types: + raise ValueError( + f"Face {face} has unsupported geometry type {face.geom_type.name}. " + "Only PLANAR, CYLINDRICAL, and CONICAL faces are supported." + ) + + draft_angle_builder = BRepOffsetAPI_DraftAngle(self.wrapped) + + for face in faces: + draft_angle_builder.Add( + face.wrapped, + neutral_plane.z_dir.to_dir(), + radians(angle), + neutral_plane.wrapped, + Flag=True, + ) + if not draft_angle_builder.AddDone(): + raise DraftAngleError( + "Draft could not be added to a face.", + face=face, + problematic_shape=draft_angle_builder.ProblematicShape(), + ) + + try: + draft_angle_builder.Build() + result = Solid(draft_angle_builder.Shape()) + except StdFail_NotDone as err: + raise DraftAngleError( + "Draft build failed on the given solid.", + face=None, + problematic_shape=draft_angle_builder.ProblematicShape(), + ) from err + return result + + +class DraftAngleError(RuntimeError): + """Solid.draft custom exception""" + + def __init__(self, message, face=None, problematic_shape=None): + super().__init__(message) + self.face = face + self.problematic_shape = problematic_shape diff --git a/tests/test_build_part.py b/tests/test_build_part.py index f573847..d6fb66a 100644 --- a/tests/test_build_part.py +++ b/tests/test_build_part.py @@ -28,6 +28,8 @@ license: import unittest from math import pi, sin +from unittest.mock import MagicMock, patch + from build123d import * from build123d import LocationList, WorkplaneList @@ -56,7 +58,6 @@ class TestAlign(unittest.TestCase): class TestMakeBrakeFormed(unittest.TestCase): def test_make_brake_formed(self): - # TODO: Fix so this test doesn't raise a DeprecationWarning from NumPy with BuildPart() as bp: with BuildLine() as bl: Polyline((0, 0), (5, 6), (10, 1)) @@ -71,6 +72,67 @@ class TestMakeBrakeFormed(unittest.TestCase): self.assertAlmostEqual(sheet_metal.bounding_box().max.Z, 1, 2) +class TestPartOperationDraft(unittest.TestCase): + + def setUp(self): + self.box = Box(10, 10, 10).solid() + self.sides = self.box.faces().filter_by(Axis.Z, reverse=True) + self.bottom_face = self.box.faces().sort_by(Axis.Z)[0] + self.neutral_plane = Plane(self.bottom_face) + + def test_successful_draft(self): + """Test that a draft operation completes successfully""" + result = draft(self.sides, self.neutral_plane, 5) + self.assertIsInstance(result, Part) + self.assertLess(self.box.volume, result.volume) + + with BuildPart() as draft_box: + Box(10, 10, 10) + draft( + draft_box.faces().filter_by(Axis.Z, reverse=True), + Plane.XY.offset(-5), + 5, + ) + self.assertLess(draft_box.part.volume, 1000) + + def test_invalid_face_type(self): + """Test that a ValueError is raised for unsupported face types""" + torus = Torus(5, 1).solid() + with self.assertRaises(ValueError) as cm: + draft([torus.faces()[0]], self.neutral_plane, 5) + + def test_faces_from_multiple_solids(self): + """Test that using faces from different solids raises an error""" + box2 = Box(5, 5, 5).solid() + mixed = [self.sides[0], box2.faces()[0]] + with self.assertRaises(ValueError) as cm: + draft(mixed, self.neutral_plane, 5) + self.assertIn("same topological parent", str(cm.exception)) + + def test_faces_from_multiple_parts(self): + """Test that using faces from different solids raises an error""" + box2 = Box(5, 5, 5).solid() + part: Part = Part() + [self.box, Pos(X=10) * box2] + mixed = [part.faces().sort_by(Axis.X)[0], part.faces().sort_by(Axis.X)[-1]] + with self.assertRaises(ValueError) as cm: + draft(mixed, self.neutral_plane, 5) + + def test_bad_draft_faces(self): + with self.assertRaises(DraftAngleError): + draft(self.bottom_face, self.neutral_plane, 10) + + @patch("build123d.topology.three_d.BRepOffsetAPI_DraftAngle") + def test_draftangleerror_from_solid_draft(self, mock_draft_angle): + """Simulate a failure in AddDone and catch DraftAngleError""" + mock_builder = MagicMock() + mock_builder.AddDone.return_value = False + mock_builder.ProblematicShape.return_value = "ShapeX" + mock_draft_angle.return_value = mock_builder + + with self.assertRaises(DraftAngleError) as cm: + draft(self.sides, self.neutral_plane, 5) + + class TestBuildPart(unittest.TestCase): """Test the BuildPart Builder derived class""" @@ -171,7 +233,7 @@ class TestBuildPart(unittest.TestCase): def test_named_plane(self): with BuildPart(Plane.YZ) as test: self.assertTupleAlmostEquals( - WorkplaneList._get_context().workplanes[0].z_dir.to_tuple(), + WorkplaneList._get_context().workplanes[0].z_dir, (1, 0, 0), 5, ) diff --git a/tests/test_direct_api/test_solid.py b/tests/test_direct_api/test_solid.py index df44353..640bf31 100644 --- a/tests/test_direct_api/test_solid.py +++ b/tests/test_direct_api/test_solid.py @@ -29,19 +29,27 @@ license: import math import unittest +# Mocks for testing failure cases +from unittest.mock import MagicMock, patch + from build123d.build_enums import GeomType, Kind, Until -from build123d.geometry import ( - Axis, - BoundBox, - Location, - OrientedBoundBox, - Plane, - Pos, - Vector, -) +from build123d.geometry import Axis, Location, Plane, Pos, Vector from build123d.objects_curve import Spline +from build123d.objects_part import Box, Torus from build123d.objects_sketch import Circle, Rectangle -from build123d.topology import Compound, Edge, Face, Shell, Solid, Vertex, Wire +from build123d.topology import ( + Compound, + DraftAngleError, + Edge, + Face, + Shell, + Solid, + Vertex, + Wire, +) +import build123d +from OCP.BRepOffsetAPI import BRepOffsetAPI_DraftAngle +from OCP.StdFail import StdFail_NotDone class TestSolid(unittest.TestCase): @@ -254,5 +262,66 @@ class TestSolid(unittest.TestCase): self.assertAlmostEqual(obb2.volume, 40, 4) +class TestSolidDraft(unittest.TestCase): + + def setUp(self): + # Create a simple box to test draft + self.box: Solid = Box(10, 10, 10).solid() + self.sides = self.box.faces().filter_by(Axis.Z, reverse=True) + self.bottom_face: Face = self.box.faces().sort_by(Axis.Z)[0] + self.neutral_plane = Plane(self.bottom_face) + + def test_successful_draft(self): + """Test that a draft operation completes successfully on a planar face""" + drafted = self.box.draft(self.sides, self.neutral_plane, 5) + self.assertIsInstance(drafted, Solid) + self.assertNotEqual(drafted.volume, self.box.volume) + + def test_unsupported_geometry(self): + """Test that a ValueError is raised on unsupported face geometry""" + # Create toroidal face to simulate unsupported geometry + torus = Torus(5, 1).solid() + with self.assertRaises(ValueError) as cm: + torus.draft([torus.faces()[0]], self.neutral_plane, 5) + self.assertIn("unsupported geometry type", str(cm.exception)) + + @patch("build123d.topology.three_d.BRepOffsetAPI_DraftAngle") + def test_adddone_failure_raises_draftangleerror(self, mock_draft_api): + """Test that failure of AddDone() raises DraftAngleError""" + mock_builder = MagicMock() + mock_builder.AddDone.return_value = False + mock_builder.ProblematicShape.return_value = "BadShape" + mock_draft_api.return_value = mock_builder + + with self.assertRaises(DraftAngleError) as cm: + self.box.draft(self.sides, self.neutral_plane, 5) + self.assertEqual(cm.exception.face, self.sides[0]) + self.assertEqual(cm.exception.problematic_shape, "BadShape") + self.assertIn("Draft could not be added", str(cm.exception)) + + @patch.object( + build123d.topology.three_d.BRepOffsetAPI_DraftAngle, + "Build", + side_effect=StdFail_NotDone, + ) + def test_build_failure_raises_draftangleerror(self, mock_draft_api): + """Test that Build() failure raises DraftAngleError""" + + with self.assertRaises(DraftAngleError) as cm: + self.box.draft(self.sides, self.neutral_plane, 5) + self.assertIsNone(cm.exception.face) + self.assertEqual( + cm.exception.problematic_shape, cm.exception.problematic_shape + ) # Not None + self.assertIn("Draft build failed", str(cm.exception)) + + def test_draftangleerror_contents(self): + """Test that DraftAngleError stores face and problematic shape""" + err = DraftAngleError("msg", face="face123", problematic_shape="shape456") + self.assertEqual(str(err), "msg") + self.assertEqual(err.face, "face123") + self.assertEqual(err.problematic_shape, "shape456") + + if __name__ == "__main__": unittest.main() From 10ec85bcf502aa38f15909955a761f8d18648ee1 Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 25 May 2025 16:16:14 -0400 Subject: [PATCH 14/56] draft - adding missing init files --- src/build123d/__init__.py | 2 ++ src/build123d/topology/__init__.py | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/build123d/__init__.py b/src/build123d/__init__.py index 9ca383a..209c248 100644 --- a/src/build123d/__init__.py +++ b/src/build123d/__init__.py @@ -163,6 +163,7 @@ __all__ = [ "LinearJoint", "CylindricalJoint", "BallJoint", + "DraftAngleError", # Exporter classes "Export2D", "ExportDXF", @@ -197,6 +198,7 @@ __all__ = [ "add", "bounding_box", "chamfer", + "draft", "extrude", "fillet", "full_round", diff --git a/src/build123d/topology/__init__.py b/src/build123d/topology/__init__.py index 11d00d9..6471c29 100644 --- a/src/build123d/topology/__init__.py +++ b/src/build123d/topology/__init__.py @@ -61,12 +61,13 @@ from .one_d import ( topo_explore_connected_faces, ) from .two_d import Face, Shell, Mixin2D, sort_wires_by_build_order -from .three_d import Solid, Mixin3D +from .three_d import Solid, Mixin3D, DraftAngleError from .composite import Compound, Curve, Sketch, Part __all__ = [ "Shape", "Comparable", + "DraftAngleError", "ShapePredicate", "GroupBy", "ShapeList", From 55341a4c679e6b33ce1608d15bb2dc3250d99add Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 25 May 2025 16:25:13 -0400 Subject: [PATCH 15/56] draft - add another missing file, fix typing --- src/build123d/build_common.py | 1 + src/build123d/operations_part.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/build123d/build_common.py b/src/build123d/build_common.py index 947885d..d2d6942 100644 --- a/src/build123d/build_common.py +++ b/src/build123d/build_common.py @@ -155,6 +155,7 @@ operations_apply_to = { "add": ["BuildPart", "BuildSketch", "BuildLine"], "bounding_box": ["BuildPart", "BuildSketch", "BuildLine"], "chamfer": ["BuildPart", "BuildSketch", "BuildLine"], + "draft": ["BuildPart"], "extrude": ["BuildPart"], "fillet": ["BuildPart", "BuildSketch", "BuildLine"], "full_round": ["BuildSketch"], diff --git a/src/build123d/operations_part.py b/src/build123d/operations_part.py index 31a47db..26a9095 100644 --- a/src/build123d/operations_part.py +++ b/src/build123d/operations_part.py @@ -85,7 +85,7 @@ def draft( ) # Check that all the faces are associated with the same Solid - topo_parents = set(f.topo_parent for f in face_list) + topo_parents = set(f.topo_parent for f in face_list if f.topo_parent is not None) if len(topo_parents) != 1: raise ValueError("All faces must share the same topological parent (a Solid)") parent_solids = next(iter(topo_parents)).solids() From 3949645e5c1efd386277527d98c06c73d252a11f Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 25 May 2025 16:57:23 -0400 Subject: [PATCH 16/56] Adding draft example to docs --- docs/assets/examples/cast_bearing_unit.png | Bin 0 -> 152827 bytes docs/examples_1.rst | 22 ++++++ examples/cast_bearing_unit.py | 86 +++++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 docs/assets/examples/cast_bearing_unit.png create mode 100644 examples/cast_bearing_unit.py diff --git a/docs/assets/examples/cast_bearing_unit.png b/docs/assets/examples/cast_bearing_unit.png new file mode 100644 index 0000000000000000000000000000000000000000..231aedee330e64fbdabbe1684a7235fc938adf23 GIT binary patch literal 152827 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 LElU_XCIm6?9Z35pFRg#H9uK& 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 UJgVNrz`(%Z>FVdQ&MBb@0J}-it^fc4 literal 0 HcmV?d00001 diff --git a/docs/examples_1.rst b/docs/examples_1.rst index 75a58b4..3de1337 100644 --- a/docs/examples_1.rst +++ b/docs/examples_1.rst @@ -34,6 +34,11 @@ Most of the examples show the builder and algebra modes. :link: examples-canadian_flag :link-type: ref + .. grid-item-card:: Cast Bearing Unit |Builder| + :img-top: assets/examples/cast_bearing_unit.png + :link: examples-cast_bearing_unit + :link-type: ref + .. grid-item-card:: Circuit Board With Holes |Builder| |Algebra| :img-top: assets/examples/thumbnail_circuit_board_01.png :link: examples-circuit_board @@ -204,6 +209,23 @@ The builder mode example also generates the SVG file `logo.svg`. :end-before: [End] +.. _examples-cast_bearing_unit: + +Cast Bearing Unit +----------------- +.. image:: assets/examples/cast_bearing_unit.png + :align: center + +This example demonstrates the creation of a castable flanged bearing housing +using the `draft` operation to add appropriate draft angles for mold release. + + +.. dropdown:: |Builder| Reference Implementation (Builder Mode) + + .. literalinclude:: ../examples/cast_bearing_unit.py + :start-after: [Code] + :end-before: [End] + .. _examples-canadian_flag: Canadian Flag Blowing in The Wind diff --git a/examples/cast_bearing_unit.py b/examples/cast_bearing_unit.py new file mode 100644 index 0000000..9075561 --- /dev/null +++ b/examples/cast_bearing_unit.py @@ -0,0 +1,86 @@ +""" +An oval flanged bearing unit with tapered sides created with the draft operation. + +name: cast_bearing_unit.py +by: Gumyr +date: May 25, 2025 + +desc: + + This example demonstrates the creation of a castable flanged bearing housing + using the `draft` operation to add appropriate draft angles for mold release. + + ### Highlights: + + - **Component Integration**: The design incorporates a press-fit bore for a + `SingleRowAngularContactBallBearing` and mounting holes for + `SocketHeadCapScrew` fasteners. + - **Draft Angle Application**: Vertical side faces are identified and modified + with a 4-degree draft angle using the `draft()` function. This simulates the + taper needed for cast parts to be removed cleanly from a mold. + - **Filleting**: All edges are filleted to reflect casting-friendly geometry and + improve aesthetics. + - **Parametric Design**: Dimensions such as bolt spacing, bearing size, and + housing depth are parameterized for reuse and adaptation to other sizes. + + The result is a realistic, fabrication-aware model that can be used for + documentation, simulation, or manufacturing workflows. The final assembly + includes the housing, inserted bearing, and positioned screws, rendered with + appropriate coloring for clarity. + +license: + + Copyright 2025 Gumyr + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +""" + +# [Code] +import copy + +from bd_warehouse.bearing import PressFitHole, SingleRowAngularContactBallBearing +from bd_warehouse.fastener import ClearanceHole, SocketHeadCapScrew +from build123d import * +from ocp_vscode import show + +bearing = SingleRowAngularContactBallBearing("M17-47-14") +screw = SocketHeadCapScrew("M10-1.5", length=30 * MM, simple=False) + +A, A1, Db2, H, J = 26, 11, 57, 98.5, 76.5 +with BuildPart() as oval_flanged_bearing_unit: + with BuildSketch() as plan: + housing = Circle(Db2 / 2) + with GridLocations(J, 0, 2, 1) as bolt_centers: + Circle((H - J) / 2) + make_hull() + extrude(amount=A1) + extrude(housing, amount=A) + drafted_faces = oval_flanged_bearing_unit.faces().filter_by(Axis.Z, reverse=True) + draft(drafted_faces, Plane.XY, 4) + fillet(oval_flanged_bearing_unit.edges(), 1) + with Locations(oval_flanged_bearing_unit.faces().sort_by(Axis.Z)[-1]): + PressFitHole(bearing) + with Locations(Pos(Z=A1)): + with Locations(*bolt_centers): + ClearanceHole(screw, counter_sunk=False) + +oval_flanged_bearing_unit.part.color = Color(0x4C6377) + +# Create an assembly of all the positioned parts +oval_flanged_bearing_unit_assembly = Compound( + children=[oval_flanged_bearing_unit.part, bearing.moved(bearing.hole_locations[0])] + + [copy.copy(screw).moved(l) for l in screw.hole_locations] +) +show(oval_flanged_bearing_unit_assembly) +# [End] From ff39e37052559797d8367bb6823095c0bc7acbe7 Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 25 May 2025 17:01:25 -0400 Subject: [PATCH 17/56] Adding draft to cheat sheet --- docs/cheat_sheet.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/cheat_sheet.rst b/docs/cheat_sheet.rst index ecdd42d..ebec505 100644 --- a/docs/cheat_sheet.rst +++ b/docs/cheat_sheet.rst @@ -99,6 +99,7 @@ Cheat Sheet | :func:`~operations_generic.add` | :func:`~operations_generic.chamfer` + | :func:`~operations_part.draft` | :func:`~operations_part.extrude` | :func:`~operations_generic.fillet` | :func:`~operations_part.loft` @@ -228,7 +229,7 @@ Cheat Sheet +----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+ | :class:`~build_enums.Extrinsic` | XYZ, XZY, YZX, YXZ, ZXY, ZYX, XYX, XZX, YZY, YXY, ZXZ, ZYZ | +----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+ - | :class:`~build_enums.FontStyle` | REGULAR, BOLD, BOLDITALIC, ITALIC | + | :class:`~build_enums.FontStyle` | REGULAR, BOLD, BOLDITALIC, ITALIC | +----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+ | :class:`~build_enums.FrameMethod` | CORRECTED, FRENET | +----------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+ From e842b321f3f4b64974c0b4004d55e0920a591656 Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 25 May 2025 18:46:46 -0400 Subject: [PATCH 18/56] add Vector.to_tuple deprecation warning --- src/build123d/geometry.py | 38 ++++++++------ src/build123d/operations_generic.py | 4 +- src/build123d/topology/one_d.py | 6 +-- src/build123d/topology/shape_core.py | 6 +-- src/build123d/topology/two_d.py | 4 +- tests/test_build_common.py | 70 ++++++++++---------------- tests/test_build_generic.py | 20 ++++---- tests/test_build_line.py | 46 ++++++++--------- tests/test_build_sketch.py | 18 +++---- tests/test_direct_api/test_axis.py | 6 +-- tests/test_direct_api/test_edge.py | 2 +- tests/test_direct_api/test_location.py | 8 +-- tests/test_direct_api/test_mixin1_d.py | 12 ++--- tests/test_direct_api/test_plane.py | 4 +- tests/test_direct_api/test_shape.py | 4 +- 15 files changed, 111 insertions(+), 137 deletions(-) diff --git a/src/build123d/geometry.py b/src/build123d/geometry.py index 414c1aa..d733010 100644 --- a/src/build123d/geometry.py +++ b/src/build123d/geometry.py @@ -274,6 +274,12 @@ class Vector: def to_tuple(self) -> tuple[float, float, float]: """Return tuple equivalent""" + warnings.warn( + "to_tuple is deprecated and will be removed in a future version. " + "Use 'tuple(Vector)' instead.", + DeprecationWarning, + stacklevel=2, + ) return (self.X, self.Y, self.Z) @property @@ -728,11 +734,13 @@ class Axis(metaclass=AxisMeta): def __repr__(self) -> str: """Display self""" - return f"({self.position.to_tuple()},{self.direction.to_tuple()})" + return f"({tuple(self.position)},{tuple(self.direction)})" def __str__(self) -> str: """Display self""" - return f"{type(self).__name__}: ({self.position.to_tuple()},{self.direction.to_tuple()})" + return ( + f"{type(self).__name__}: ({tuple(self.position)},{tuple(self.direction)})" + ) def __eq__(self, other: object) -> bool: if not isinstance(other, Axis): @@ -1028,7 +1036,7 @@ class BoundBox: if isinstance(obj, tuple): tmp.Update(*obj) elif isinstance(obj, Vector): - tmp.Update(*obj.to_tuple()) + tmp.Update(*obj) elif isinstance(obj, BoundBox) and obj.wrapped is not None: tmp.Add(obj.wrapped) @@ -1120,7 +1128,7 @@ class BoundBox: def to_align_offset(self, align: Align2DType | Align3DType) -> Vector: """Amount to move object to achieve the desired alignment""" - return to_align_offset(self.min.to_tuple(), self.max.to_tuple(), align) + return to_align_offset(self.min, self.max, align) class Color: @@ -1733,8 +1741,8 @@ class Location: However, `build123d` requires all coordinate systems to be right-handed. Therefore, this implementation: - - Reflects the X and Z directions across the mirror plane - - Recomputes the Y direction as: `Y = X Ă— Z` + - Reflects the X and Z directions across the mirror plane + - Recomputes the Y direction as: `Y = X Ă— Z` This ensures the resulting Location maintains a valid right-handed frame, while remaining as close as possible to the geometric mirror. @@ -2144,7 +2152,7 @@ class Rotation(Location): if tuples: angles = list(*tuples) if vectors: - angles = vectors[0].to_tuple() + angles = tuple(vectors[0]) if len(angles) < 3: angles.extend([0.0] * (3 - len(angles))) rotations = list(filter(lambda item: isinstance(item, Rotation), args)) @@ -2716,9 +2724,9 @@ class Plane(metaclass=PlaneMeta): Returns: Plane as String """ - origin_str = ", ".join(f"{v:.2f}" for v in self._origin.to_tuple()) - x_dir_str = ", ".join(f"{v:.2f}" for v in self.x_dir.to_tuple()) - z_dir_str = ", ".join(f"{v:.2f}" for v in self.z_dir.to_tuple()) + origin_str = ", ".join(f"{v:.2f}" for v in tuple(self._origin)) + x_dir_str = ", ".join(f"{v:.2f}" for v in tuple(self.x_dir)) + z_dir_str = ", ".join(f"{v:.2f}" for v in tuple(self.z_dir)) return f"Plane(o=({origin_str}), x=({x_dir_str}), z=({z_dir_str}))" def reverse(self) -> Plane: @@ -2845,9 +2853,9 @@ class Plane(metaclass=PlaneMeta): global_coord_system = gp_Ax3() local_coord_system = gp_Ax3( - gp_Pnt(*self._origin.to_tuple()), - gp_Dir(*self.z_dir.to_tuple()), - gp_Dir(*self.x_dir.to_tuple()), + gp_Pnt(*self._origin), + gp_Dir(*self.z_dir), + gp_Dir(*self.x_dir), ) forward_t.SetTransformation(global_coord_system, local_coord_system) @@ -2901,8 +2909,8 @@ class Plane(metaclass=PlaneMeta): local_bottom_left = global_bottom_left.transform(transform_matrix) local_top_right = global_top_right.transform(transform_matrix) local_bbox = Bnd_Box( - gp_Pnt(*local_bottom_left.to_tuple()), - gp_Pnt(*local_top_right.to_tuple()), + gp_Pnt(*local_bottom_left), + gp_Pnt(*local_top_right), ) return BoundBox(local_bbox) if hasattr(obj, "wrapped") and obj.wrapped is None: # Empty shape diff --git a/src/build123d/operations_generic.py b/src/build123d/operations_generic.py index c2b2e50..e5b0e9f 100644 --- a/src/build123d/operations_generic.py +++ b/src/build123d/operations_generic.py @@ -758,9 +758,7 @@ def project( # The size of the object determines the size of the target projection screen # as the screen is normal to the direction of parallel projection - shape_list = [ - Vertex(*o.to_tuple()) if isinstance(o, Vector) else o for o in object_list - ] + shape_list = [Vertex(o) if isinstance(o, Vector) else o for o in object_list] object_size = Compound(children=shape_list).bounding_box(optimal=False).diagonal vct_vrt_list = [o for o in object_list if isinstance(o, (Vector, Vertex))] diff --git a/src/build123d/topology/one_d.py b/src/build123d/topology/one_d.py index 9b5ef43..e33e0cc 100644 --- a/src/build123d/topology/one_d.py +++ b/src/build123d/topology/one_d.py @@ -2635,7 +2635,7 @@ class Wire(Mixin1D, Shape[TopoDS_Wire]): for edge_index, edge in enumerate(edges): for i in range(fragments_per_edge): param = i / (fragments_per_edge - 1) - points.append(edge.position_at(param).to_tuple()[:2]) + points.append(tuple(edge.position_at(param))[:2]) points_lookup[edge_index * fragments_per_edge + i] = (edge_index, param) convex_hull = ConvexHull(points) @@ -3029,13 +3029,13 @@ class Wire(Mixin1D, Shape[TopoDS_Wire]): projection_object = BRepProj_Projection( self.wrapped, target_object.wrapped, - gp_Dir(*direction_vector.to_tuple()), + gp_Dir(*direction_vector), ) else: projection_object = BRepProj_Projection( self.wrapped, target_object.wrapped, - gp_Pnt(*center_point.to_tuple()), + gp_Pnt(*center_point), ) # Generate a list of the projected wires with aligned orientation diff --git a/src/build123d/topology/shape_core.py b/src/build123d/topology/shape_core.py index 43ae9c6..d473668 100644 --- a/src/build123d/topology/shape_core.py +++ b/src/build123d/topology/shape_core.py @@ -660,15 +660,15 @@ class Shape(NodeMixin, Generic[TOPODS]): address = node.address name = "" loc = ( - "Center" + str(node.position.to_tuple()) + "Center" + str(tuple(node.position)) if show_center - else "Position" + str(node.position.to_tuple()) + else "Position" + str(tuple(node.position)) ) else: address = id(node) name = node.__class__.__name__.ljust(9) loc = ( - "Center" + str(node.center().to_tuple()) + "Center" + str(tuple(node.center())) if show_center else "Location" + repr(node.location) ) diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index 1df34f7..cd973c7 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -994,7 +994,7 @@ class Face(Mixin2D, Shape[TopoDS_Face]): ) from err if surface_point_vectors: for point in surface_point_vectors: - surface.Add(gp_Pnt(*point.to_tuple())) + surface.Add(gp_Pnt(*point)) try: surface.Build() surface_face = Face(surface.Shape()) @@ -1387,7 +1387,7 @@ class Face(Mixin2D, Shape[TopoDS_Face]): """ solid_classifier = BRepClass3d_SolidClassifier(self.wrapped) - solid_classifier.Perform(gp_Pnt(*Vector(point).to_tuple()), tolerance) + solid_classifier.Perform(gp_Pnt(*Vector(point)), tolerance) return solid_classifier.IsOnAFace() # surface = BRep_Tool.Surface_s(self.wrapped) diff --git a/tests/test_build_common.py b/tests/test_build_common.py index a4c6e0e..318092a 100644 --- a/tests/test_build_common.py +++ b/tests/test_build_common.py @@ -237,18 +237,16 @@ class TestCommonOperations(unittest.TestCase): def test_matmul(self): self.assertTupleAlmostEquals( - (Edge.make_line((0, 0, 0), (1, 1, 1)) @ 0.5).to_tuple(), (0.5, 0.5, 0.5), 5 + Edge.make_line((0, 0, 0), (1, 1, 1)) @ 0.5, (0.5, 0.5, 0.5), 5 ) def test_mod(self): - self.assertTupleAlmostEquals( - (Wire.make_circle(10) % 0.5).to_tuple(), (0, -1, 0), 5 - ) + self.assertTupleAlmostEquals(Wire.make_circle(10) % 0.5, (0, -1, 0), 5) def test_xor(self): helix_loc = Edge.make_helix(2 * pi, 1, 1) ^ 0 - self.assertTupleAlmostEquals(helix_loc.position.to_tuple(), (1, 0, 0), 5) - self.assertTupleAlmostEquals(helix_loc.orientation.to_tuple(), (-45, 0, 180), 5) + self.assertTupleAlmostEquals(helix_loc.position, (1, 0, 0), 5) + self.assertTupleAlmostEquals(helix_loc.orientation, (-45, 0, 180), 5) class TestLocations(unittest.TestCase): @@ -256,11 +254,11 @@ class TestLocations(unittest.TestCase): locs = PolarLocations(1, 5, 45, 90, False).local_locations for i, angle in enumerate(range(45, 135, 18)): self.assertTupleAlmostEquals( - locs[i].position.to_tuple(), - Vector(1, 0).rotate(Axis.Z, angle).to_tuple(), + locs[i].position, + Vector(1, 0).rotate(Axis.Z, angle), 5, ) - self.assertTupleAlmostEquals(locs[i].orientation.to_tuple(), (0, 0, 0), 5) + self.assertTupleAlmostEquals(locs[i].orientation, (0, 0, 0), 5) def test_polar_endpoint(self): locs = PolarLocations( @@ -329,7 +327,7 @@ class TestLocations(unittest.TestCase): self.assertAlmostEqual(hloc.radius, 1, 7) self.assertAlmostEqual(hloc.diagonal, 2, 7) self.assertAlmostEqual(hloc.apothem, 3**0.5 / 2, 7) - + def test_centering(self): with BuildSketch(): with GridLocations(4, 4, 2, 2, align=(Align.CENTER, Align.CENTER)) as l: @@ -390,22 +388,18 @@ class TestLocations(unittest.TestCase): square = Face.make_rect(1, 1, Plane.XZ) with BuildPart(): loc = Locations(square).locations[0] - self.assertTupleAlmostEquals( - loc.position.to_tuple(), Location(Plane.XZ).position.to_tuple(), 5 - ) - self.assertTupleAlmostEquals( - loc.orientation.to_tuple(), Location(Plane.XZ).orientation.to_tuple(), 5 - ) + self.assertTupleAlmostEquals(loc.position, Location(Plane.XZ).position, 5) + self.assertTupleAlmostEquals(loc.orientation, Location(Plane.XZ).orientation, 5) def test_from_plane(self): with BuildPart(): loc = Locations(Plane.XY.offset(1)).locations[0] - self.assertTupleAlmostEquals(loc.position.to_tuple(), (0, 0, 1), 5) + self.assertTupleAlmostEquals(loc.position, (0, 0, 1), 5) def test_from_axis(self): with BuildPart(): loc = Locations(Axis((1, 1, 1), (0, 0, 1))).locations[0] - self.assertTupleAlmostEquals(loc.position.to_tuple(), (1, 1, 1), 5) + self.assertTupleAlmostEquals(loc.position, (1, 1, 1), 5) def test_multiplication(self): circles = GridLocations(2, 2, 2, 2) * Circle(1) @@ -416,25 +410,17 @@ class TestLocations(unittest.TestCase): def test_grid_attributes(self): grid = GridLocations(5, 10, 3, 4) - self.assertTupleAlmostEquals(grid.size.to_tuple(), (10, 30, 0), 5) - self.assertTupleAlmostEquals(grid.min.to_tuple(), (-5, -15, 0), 5) - self.assertTupleAlmostEquals(grid.max.to_tuple(), (5, 15, 0), 5) + self.assertTupleAlmostEquals(grid.size, (10, 30, 0), 5) + self.assertTupleAlmostEquals(grid.min, (-5, -15, 0), 5) + self.assertTupleAlmostEquals(grid.max, (5, 15, 0), 5) def test_mixed_sequence_list(self): locs = Locations((0, 1), [(2, 3), (4, 5)], (6, 7)) self.assertEqual(len(locs.locations), 4) - self.assertTupleAlmostEquals( - locs.locations[0].position.to_tuple(), (0, 1, 0), 5 - ) - self.assertTupleAlmostEquals( - locs.locations[1].position.to_tuple(), (2, 3, 0), 5 - ) - self.assertTupleAlmostEquals( - locs.locations[2].position.to_tuple(), (4, 5, 0), 5 - ) - self.assertTupleAlmostEquals( - locs.locations[3].position.to_tuple(), (6, 7, 0), 5 - ) + self.assertTupleAlmostEquals(locs.locations[0].position, (0, 1, 0), 5) + self.assertTupleAlmostEquals(locs.locations[1].position, (2, 3, 0), 5) + self.assertTupleAlmostEquals(locs.locations[2].position, (4, 5, 0), 5) + self.assertTupleAlmostEquals(locs.locations[3].position, (6, 7, 0), 5) class TestProperties(unittest.TestCase): @@ -744,12 +730,12 @@ class TestValidateInputs(unittest.TestCase): class TestVectorExtensions(unittest.TestCase): def test_vector_localization(self): self.assertTupleAlmostEquals( - (Vector(1, 1, 1) + (1, 2)).to_tuple(), + (Vector(1, 1, 1) + (1, 2)), (2, 3, 1), 5, ) self.assertTupleAlmostEquals( - (Vector(3, 3, 3) - (1, 2)).to_tuple(), + (Vector(3, 3, 3) - (1, 2)), (2, 1, 3), 5, ) @@ -759,16 +745,14 @@ class TestVectorExtensions(unittest.TestCase): Vector(1, 2, 3) - "four" with BuildLine(Plane.YZ): + self.assertTupleAlmostEquals(WorkplaneList.localize((1, 2)), (0, 1, 2), 5) self.assertTupleAlmostEquals( - WorkplaneList.localize((1, 2)).to_tuple(), (0, 1, 2), 5 - ) - self.assertTupleAlmostEquals( - WorkplaneList.localize(Vector(1, 1, 1) + (1, 2)).to_tuple(), + WorkplaneList.localize(Vector(1, 1, 1) + (1, 2)), (1, 2, 3), 5, ) self.assertTupleAlmostEquals( - WorkplaneList.localize(Vector(3, 3, 3) - (1, 2)).to_tuple(), + WorkplaneList.localize(Vector(3, 3, 3) - (1, 2)), (3, 2, 1), 5, ) @@ -780,7 +764,7 @@ class TestVectorExtensions(unittest.TestCase): with BuildLine(pln): n3 = Line((-50, -40), (0, 0)) n4 = Line(n3 @ 1, n3 @ 1 + (0, 10)) - self.assertTupleAlmostEquals((n4 @ 1).to_tuple(), (0, 0, -25), 5) + self.assertTupleAlmostEquals((n4 @ 1), (0, 0, -25), 5) class TestWorkplaneList(unittest.TestCase): @@ -794,8 +778,8 @@ class TestWorkplaneList(unittest.TestCase): def test_localize(self): with BuildLine(Plane.YZ): pnts = WorkplaneList.localize((1, 2), (2, 3)) - self.assertTupleAlmostEquals(pnts[0].to_tuple(), (0, 1, 2), 5) - self.assertTupleAlmostEquals(pnts[1].to_tuple(), (0, 2, 3), 5) + self.assertTupleAlmostEquals(pnts[0], (0, 1, 2), 5) + self.assertTupleAlmostEquals(pnts[1], (0, 2, 3), 5) def test_invalid_workplane(self): with self.assertRaises(ValueError): diff --git a/tests/test_build_generic.py b/tests/test_build_generic.py index 46a6c34..94367dd 100644 --- a/tests/test_build_generic.py +++ b/tests/test_build_generic.py @@ -72,7 +72,7 @@ class AddTests(unittest.TestCase): # Add Edge with BuildLine() as test: add(Edge.make_line((0, 0, 0), (1, 1, 1))) - self.assertTupleAlmostEquals((test.wires()[0] @ 1).to_tuple(), (1, 1, 1), 5) + self.assertTupleAlmostEquals(test.wires()[0] @ 1, (1, 1, 1), 5) # Add Wire with BuildLine() as wire: Polyline((0, 0, 0), (1, 1, 1), (2, 0, 0), (3, 1, 1)) @@ -94,13 +94,11 @@ class AddTests(unittest.TestCase): add(Solid.make_box(10, 10, 10), rotation=(0, 0, 45)) self.assertAlmostEqual(test.part.volume, 1000, 5) self.assertTupleAlmostEquals( - ( - test.part.edges() - .group_by(Axis.Z)[-1] - .group_by(Axis.X)[-1] - .sort_by(Axis.Y)[0] - % 1 - ).to_tuple(), + test.part.edges() + .group_by(Axis.Z)[-1] + .group_by(Axis.X)[-1] + .sort_by(Axis.Y)[0] + % 1, (sqrt(2) / 2, sqrt(2) / 2, 0), 5, ) @@ -680,12 +678,12 @@ class ProjectionTests(unittest.TestCase): def test_project_point(self): pnt: Vector = project(Vector(1, 2, 3), Plane.XY)[0] - self.assertTupleAlmostEquals(pnt.to_tuple(), (1, 2, 0), 5) + self.assertTupleAlmostEquals(pnt, (1, 2, 0), 5) pnt: Vector = project(Vertex(1, 2, 3), Plane.XZ)[0] - self.assertTupleAlmostEquals(pnt.to_tuple(), (1, 3, 0), 5) + self.assertTupleAlmostEquals(pnt, (1, 3, 0), 5) with BuildSketch(Plane.YZ) as s1: pnt = project(Vertex(1, 2, 3), mode=Mode.PRIVATE)[0] - self.assertTupleAlmostEquals(pnt.to_tuple(), (2, 3, 0), 5) + self.assertTupleAlmostEquals(pnt, (2, 3, 0), 5) def test_multiple_results(self): with BuildLine() as l1: diff --git a/tests/test_build_line.py b/tests/test_build_line.py index b473077..309b99d 100644 --- a/tests/test_build_line.py +++ b/tests/test_build_line.py @@ -205,7 +205,7 @@ class BuildLineTests(unittest.TestCase): l3 = Line((0, 0), (10, 10)) l4 = IntersectingLine((0, 10), (1, -1), l3) - self.assertTupleAlmostEquals((l4 @ 1).to_tuple(), (5, 5, 0), 5) + self.assertTupleAlmostEquals(l4 @ 1, (5, 5, 0), 5) self.assertTrue(isinstance(l4, Edge)) with self.assertRaises(ValueError): @@ -214,22 +214,20 @@ class BuildLineTests(unittest.TestCase): def test_jern_arc(self): with BuildLine() as jern: j1 = JernArc((1, 0), (0, 1), 1, 90) - self.assertTupleAlmostEquals((jern.line @ 1).to_tuple(), (0, 1, 0), 5) + self.assertTupleAlmostEquals(jern.line @ 1, (0, 1, 0), 5) self.assertAlmostEqual(j1.radius, 1) self.assertAlmostEqual(j1.length, pi / 2) with BuildLine(Plane.XY.offset(1)) as offset_l: off1 = JernArc((1, 0), (0, 1), 1, 90) - self.assertTupleAlmostEquals((offset_l.line @ 1).to_tuple(), (0, 1, 1), 5) + self.assertTupleAlmostEquals(offset_l.line @ 1, (0, 1, 1), 5) self.assertAlmostEqual(off1.radius, 1) self.assertAlmostEqual(off1.length, pi / 2) plane_iso = Plane(origin=(0, 0, 0), x_dir=(1, 1, 0), z_dir=(1, -1, 1)) with BuildLine(plane_iso) as iso_l: iso1 = JernArc((0, 0), (0, 1), 1, 180) - self.assertTupleAlmostEquals( - (iso_l.line @ 1).to_tuple(), (-sqrt(2), -sqrt(2), 0), 5 - ) + self.assertTupleAlmostEquals(iso_l.line @ 1, (-sqrt(2), -sqrt(2), 0), 5) self.assertAlmostEqual(iso1.radius, 1) self.assertAlmostEqual(iso1.length, pi) @@ -240,11 +238,11 @@ class BuildLineTests(unittest.TestCase): self.assertFalse(l2.is_closed) circle_face = Face(Wire([l1])) self.assertAlmostEqual(circle_face.area, pi, 5) - self.assertTupleAlmostEquals(circle_face.center().to_tuple(), (0, 1, 0), 5) - self.assertTupleAlmostEquals(l1.vertex().to_tuple(), l2.start.to_tuple(), 5) + self.assertTupleAlmostEquals(circle_face.center(), (0, 1, 0), 5) + self.assertTupleAlmostEquals(l1.vertex(), l2.start, 5) l1 = JernArc((0, 0), (1, 0), 1, 90) - self.assertTupleAlmostEquals((l1 @ 1).to_tuple(), (1, 1, 0), 5) + self.assertTupleAlmostEquals(l1 @ 1, (1, 1, 0), 5) self.assertTrue(isinstance(l1, Edge)) def test_polar_line(self): @@ -252,38 +250,38 @@ class BuildLineTests(unittest.TestCase): with BuildLine(): a1 = PolarLine((0, 0), sqrt(2), 45) d1 = PolarLine((0, 0), sqrt(2), direction=(1, 1)) - self.assertTupleAlmostEquals((a1 @ 1).to_tuple(), (1, 1, 0), 5) - self.assertTupleAlmostEquals((a1 @ 1).to_tuple(), (d1 @ 1).to_tuple(), 5) + self.assertTupleAlmostEquals(a1 @ 1, (1, 1, 0), 5) + self.assertTupleAlmostEquals(a1 @ 1, d1 @ 1, 5) self.assertTrue(isinstance(a1, Edge)) self.assertTrue(isinstance(d1, Edge)) with BuildLine(): a2 = PolarLine((0, 0), 1, 30) d2 = PolarLine((0, 0), 1, direction=(sqrt(3), 1)) - self.assertTupleAlmostEquals((a2 @ 1).to_tuple(), (sqrt(3) / 2, 0.5, 0), 5) - self.assertTupleAlmostEquals((a2 @ 1).to_tuple(), (d2 @ 1).to_tuple(), 5) + self.assertTupleAlmostEquals(a2 @ 1, (sqrt(3) / 2, 0.5, 0), 5) + self.assertTupleAlmostEquals(a2 @ 1, d2 @ 1, 5) with BuildLine(): a3 = PolarLine((0, 0), 1, 150) d3 = PolarLine((0, 0), 1, direction=(-sqrt(3), 1)) - self.assertTupleAlmostEquals((a3 @ 1).to_tuple(), (-sqrt(3) / 2, 0.5, 0), 5) - self.assertTupleAlmostEquals((a3 @ 1).to_tuple(), (d3 @ 1).to_tuple(), 5) + self.assertTupleAlmostEquals(a3 @ 1, (-sqrt(3) / 2, 0.5, 0), 5) + self.assertTupleAlmostEquals(a3 @ 1, d3 @ 1, 5) with BuildLine(): a4 = PolarLine((0, 0), 1, angle=30, length_mode=LengthMode.HORIZONTAL) d4 = PolarLine( (0, 0), 1, direction=(sqrt(3), 1), length_mode=LengthMode.HORIZONTAL ) - self.assertTupleAlmostEquals((a4 @ 1).to_tuple(), (1, 1 / sqrt(3), 0), 5) - self.assertTupleAlmostEquals((a4 @ 1).to_tuple(), (d4 @ 1).to_tuple(), 5) + self.assertTupleAlmostEquals(a4 @ 1, (1, 1 / sqrt(3), 0), 5) + self.assertTupleAlmostEquals(a4 @ 1, d4 @ 1, 5) with BuildLine(Plane.XZ): a5 = PolarLine((0, 0), 1, angle=30, length_mode=LengthMode.VERTICAL) d5 = PolarLine( (0, 0), 1, direction=(sqrt(3), 1), length_mode=LengthMode.VERTICAL ) - self.assertTupleAlmostEquals((a5 @ 1).to_tuple(), (sqrt(3), 0, 1), 5) - self.assertTupleAlmostEquals((a5 @ 1).to_tuple(), (d5 @ 1).to_tuple(), 5) + self.assertTupleAlmostEquals(a5 @ 1, (sqrt(3), 0, 1), 5) + self.assertTupleAlmostEquals(a5 @ 1, d5 @ 1, 5) with self.assertRaises(ValueError): PolarLine((0, 0), 1) @@ -292,7 +290,7 @@ class BuildLineTests(unittest.TestCase): """Test spline with no tangents""" with BuildLine() as test: s1 = Spline((0, 0), (1, 1), (2, 0)) - self.assertTupleAlmostEquals((test.edges()[0] @ 1).to_tuple(), (2, 0, 0), 5) + self.assertTupleAlmostEquals(test.edges()[0] @ 1, (2, 0, 0), 5) self.assertTrue(isinstance(s1, Edge)) def test_radius_arc(self): @@ -333,19 +331,17 @@ class BuildLineTests(unittest.TestCase): """Test center arc as arc and circle""" with BuildLine() as arc: CenterArc((0, 0), 10, 0, 180) - self.assertTupleAlmostEquals((arc.edges()[0] @ 1).to_tuple(), (-10, 0, 0), 5) + self.assertTupleAlmostEquals(arc.edges()[0] @ 1, (-10, 0, 0), 5) with BuildLine() as arc: CenterArc((0, 0), 10, 0, 360) - self.assertTupleAlmostEquals( - (arc.edges()[0] @ 0).to_tuple(), (arc.edges()[0] @ 1).to_tuple(), 5 - ) + self.assertTupleAlmostEquals(arc.edges()[0] @ 0, arc.edges()[0] @ 1, 5) with BuildLine(Plane.XZ) as arc: CenterArc((0, 0), 10, 0, 360) self.assertTrue(Face(arc.wires()[0]).is_coplanar(Plane.XZ)) with BuildLine(Plane.XZ) as arc: CenterArc((-100, 0), 100, -45, 90) - self.assertTupleAlmostEquals((arc.edges()[0] @ 0.5).to_tuple(), (0, 0, 0), 5) + self.assertTupleAlmostEquals(arc.edges()[0] @ 0.5, (0, 0, 0), 5) arc = CenterArc((-100, 0), 100, 0, 360) self.assertTrue(Face(Wire([arc])).is_coplanar(Plane.XY)) diff --git a/tests/test_build_sketch.py b/tests/test_build_sketch.py index 52a6194..b2eeb54 100644 --- a/tests/test_build_sketch.py +++ b/tests/test_build_sketch.py @@ -92,9 +92,7 @@ class TestBuildSketch(unittest.TestCase): with BuildLine(): l1 = Line((0, 0), (10, 0)) Line(l1 @ 1, (10, 10)) - self.assertTupleAlmostEquals( - (test.consolidate_edges() @ 1).to_tuple(), (10, 10, 0), 5 - ) + self.assertTupleAlmostEquals(test.consolidate_edges() @ 1, (10, 10, 0), 5) def test_mode_intersect(self): with BuildSketch() as test: @@ -263,9 +261,7 @@ class TestBuildSketchObjects(unittest.TestCase): self.assertEqual(r.align, (Align.CENTER, Align.CENTER)) self.assertEqual(r.mode, Mode.ADD) self.assertAlmostEqual(test.sketch.area, (3 * sqrt(3) / 2) * 2**2, 5) - self.assertTupleAlmostEquals( - test.sketch.faces()[0].normal_at().to_tuple(), (0, 0, 1), 5 - ) + self.assertTupleAlmostEquals(test.sketch.faces()[0].normal_at(), (0, 0, 1), 5) self.assertAlmostEqual(r.apothem, 2 * sqrt(3) / 2) def test_regular_polygon_minor_radius(self): @@ -277,9 +273,7 @@ class TestBuildSketchObjects(unittest.TestCase): self.assertEqual(r.align, (Align.CENTER, Align.CENTER)) self.assertEqual(r.mode, Mode.ADD) self.assertAlmostEqual(test.sketch.area, (3 * sqrt(3) / 4) * (0.5 * 2) ** 2, 5) - self.assertTupleAlmostEquals( - test.sketch.faces()[0].normal_at().to_tuple(), (0, 0, 1), 5 - ) + self.assertTupleAlmostEquals(test.sketch.faces()[0].normal_at(), (0, 0, 1), 5) def test_regular_polygon_align(self): with BuildSketch() as align: @@ -303,7 +297,7 @@ class TestBuildSketchObjects(unittest.TestCase): poly_pts = [Vector(v) for v in regular_poly.vertices()] polar_pts = [p.position for p in PolarLocations(1, side_count)] for poly_pt, polar_pt in zip(poly_pts, polar_pts): - self.assertTupleAlmostEquals(poly_pt.to_tuple(), polar_pt.to_tuple(), 5) + self.assertTupleAlmostEquals(poly_pt, polar_pt, 5) def test_regular_polygon_min_sides(self): with self.assertRaises(ValueError): @@ -325,8 +319,8 @@ class TestBuildSketchObjects(unittest.TestCase): def test_slot_center_point(self): with BuildSketch() as test: s = SlotCenterPoint((0, 0), (2, 0), 2) - self.assertTupleAlmostEquals(s.slot_center.to_tuple(), (0, 0, 0), 5) - self.assertTupleAlmostEquals(s.point.to_tuple(), (2, 0, 0), 5) + self.assertTupleAlmostEquals(s.slot_center, (0, 0, 0), 5) + self.assertTupleAlmostEquals(s.point, (2, 0, 0), 5) self.assertEqual(s.slot_height, 2) self.assertEqual(s.rotation, 0) self.assertEqual(s.mode, Mode.ADD) diff --git a/tests/test_direct_api/test_axis.py b/tests/test_direct_api/test_axis.py index 2f76612..b6ece42 100644 --- a/tests/test_direct_api/test_axis.py +++ b/tests/test_direct_api/test_axis.py @@ -192,7 +192,7 @@ class TestAxis(unittest.TestCase): self.assertIsNone(Axis.X.intersect(Axis((0, 1, 1), (0, 0, 1)))) intersection = Axis((1, 2, 3), (0, 0, 1)) & Plane.XY - self.assertAlmostEqual(intersection.to_tuple(), (1, 2, 0), 5) + self.assertAlmostEqual(intersection, (1, 2, 0), 5) arc = Edge.make_circle(20, start_angle=0, end_angle=180) ax0 = Axis((-20, 30, 0), (4, -3, 0)) @@ -226,10 +226,10 @@ class TestAxis(unittest.TestCase): # self.assertTrue(len(intersections.vertices(), 2)) # np.testing.assert_allclose( - # intersection.vertices()[0].to_tuple(), (-1, 0, 5), 5 + # intersection.vertices()[0], (-1, 0, 5), 5 # ) # np.testing.assert_allclose( - # intersection.vertices()[1].to_tuple(), (1, 0, 5), 5 + # intersection.vertices()[1], (1, 0, 5), 5 # ) def test_axis_equal(self): diff --git a/tests/test_direct_api/test_edge.py b/tests/test_direct_api/test_edge.py index 6507cbd..9a524e8 100644 --- a/tests/test_direct_api/test_edge.py +++ b/tests/test_direct_api/test_edge.py @@ -234,7 +234,7 @@ class TestEdge(unittest.TestCase): for i, loc in enumerate(locs): self.assertAlmostEqual( loc.position, - Vector(1, 0, 0).rotate(Axis.Z, i * 90).to_tuple(), + Vector(1, 0, 0).rotate(Axis.Z, i * 90), 5, ) self.assertAlmostEqual(loc.orientation, (0, 0, 0), 5) diff --git a/tests/test_direct_api/test_location.py b/tests/test_direct_api/test_location.py index 1c6e666..bdfd225 100644 --- a/tests/test_direct_api/test_location.py +++ b/tests/test_direct_api/test_location.py @@ -265,10 +265,10 @@ class TestLocation(unittest.TestCase): loc1 = Location((1, 2, 3), (90, 45, 22.5)) loc2 = copy.copy(loc1) loc3 = copy.deepcopy(loc1) - self.assertAlmostEqual(loc1.position, loc2.position.to_tuple(), 6) - self.assertAlmostEqual(loc1.orientation, loc2.orientation.to_tuple(), 6) - self.assertAlmostEqual(loc1.position, loc3.position.to_tuple(), 6) - self.assertAlmostEqual(loc1.orientation, loc3.orientation.to_tuple(), 6) + self.assertAlmostEqual(loc1.position, loc2.position, 6) + self.assertAlmostEqual(loc1.orientation, loc2.orientation, 6) + self.assertAlmostEqual(loc1.position, loc3.position, 6) + self.assertAlmostEqual(loc1.orientation, loc3.orientation, 6) # deprecated # def test_to_axis(self): diff --git a/tests/test_direct_api/test_mixin1_d.py b/tests/test_direct_api/test_mixin1_d.py index 106c805..f064ac0 100644 --- a/tests/test_direct_api/test_mixin1_d.py +++ b/tests/test_direct_api/test_mixin1_d.py @@ -53,10 +53,8 @@ class TestMixin1D(unittest.TestCase): 5, ) # Not sure what PARAMETER mode returns - but it's in the ballpark - point = ( - Edge.make_line((0, 0, 0), (1, 1, 1)) - .position_at(0.5, position_mode=PositionMode.PARAMETER) - .to_tuple() + point = Edge.make_line((0, 0, 0), (1, 1, 1)).position_at( + 0.5, position_mode=PositionMode.PARAMETER ) self.assertTrue(all([0.0 < v < 1.0 for v in point])) @@ -119,10 +117,8 @@ class TestMixin1D(unittest.TestCase): (-1, 0, 0), 5, ) - tangent = ( - Edge.make_circle(1, start_angle=0, end_angle=90) - .tangent_at(0.0, position_mode=PositionMode.PARAMETER) - .to_tuple() + tangent = Edge.make_circle(1, start_angle=0, end_angle=90).tangent_at( + 0.0, position_mode=PositionMode.PARAMETER ) self.assertTrue(all([0.0 <= v <= 1.0 for v in tangent])) diff --git a/tests/test_direct_api/test_plane.py b/tests/test_direct_api/test_plane.py index df4f31b..1fd2168 100644 --- a/tests/test_direct_api/test_plane.py +++ b/tests/test_direct_api/test_plane.py @@ -275,8 +275,8 @@ class TestPlane(unittest.TestCase): def test_localize_vertex(self): vertex = Vertex(random.random(), random.random(), random.random()) np.testing.assert_allclose( - Plane.YZ.to_local_coords(vertex).to_tuple(), - Plane.YZ.to_local_coords(Vector(vertex)).to_tuple(), + tuple(Plane.YZ.to_local_coords(vertex)), + tuple(Plane.YZ.to_local_coords(Vector(vertex))), 5, ) diff --git a/tests/test_direct_api/test_shape.py b/tests/test_direct_api/test_shape.py index 835b70b..76622ac 100644 --- a/tests/test_direct_api/test_shape.py +++ b/tests/test_direct_api/test_shape.py @@ -317,8 +317,8 @@ class TestShape(unittest.TestCase): c0 = Edge.make_circle(1).locate(Location((0, 2.1, 0))) c1 = Edge.make_circle(1) closest = c0.closest_points(c1) - self.assertAlmostEqual(closest[0], c0.position_at(0.75).to_tuple(), 5) - self.assertAlmostEqual(closest[1], c1.position_at(0.25).to_tuple(), 5) + self.assertAlmostEqual(closest[0], c0.position_at(0.75), 5) + self.assertAlmostEqual(closest[1], c1.position_at(0.25), 5) def test_distance_to(self): c0 = Edge.make_circle(1).locate(Location((0, 2.1, 0))) From 8dd13369485671025261f1e3c300f0141f77686e Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 25 May 2025 19:13:44 -0400 Subject: [PATCH 19/56] Adding draft to operations list --- docs/operations.rst | 93 +++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 45 deletions(-) diff --git a/docs/operations.rst b/docs/operations.rst index 924a0c7..e7532b6 100644 --- a/docs/operations.rst +++ b/docs/operations.rst @@ -21,51 +21,53 @@ The following table summarizes all of the available operations. Operations marke applicable to BuildLine and Algebra Curve, 2D to BuildSketch and Algebra Sketch, 3D to BuildPart and Algebra Part. -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| Operation | Description | 0D | 1D | 2D | 3D | Example | -+==============================================+====================================+====+====+====+====+========================+ -| :func:`~operations_generic.add` | Add object to builder | | âś“ | âś“ | âś“ | :ref:`16 ` | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_generic.bounding_box` | Add bounding box as Shape | | âś“ | âś“ | âś“ | | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_generic.chamfer` | Bevel Vertex or Edge | | | âś“ | âś“ | :ref:`9 ` | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_part.extrude` | Draw 2D Shape into 3D | | | | âś“ | :ref:`3 ` | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_generic.fillet` | Radius Vertex or Edge | | | âś“ | âś“ | :ref:`9 ` | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_sketch.full_round` | Round-off Face along given Edge | | | âś“ | | :ref:`ttt-24-spo-06` | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_part.loft` | Create 3D Shape from sections | | | | âś“ | :ref:`24 ` | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_part.make_brake_formed` | Create sheet metal parts | | | | âś“ | | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_sketch.make_face` | Create a Face from Edges | | | âś“ | | :ref:`4 ` | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_sketch.make_hull` | Create Convex Hull from Edges | | | âś“ | | | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_generic.mirror` | Mirror about Plane | | âś“ | âś“ | âś“ | :ref:`15 ` | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_generic.offset` | Inset or outset Shape | | âś“ | âś“ | âś“ | :ref:`25 ` | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_generic.project` | Project points, lines or Faces | âś“ | âś“ | âś“ | | | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_part.project_workplane` | Create workplane for projection | | | | | | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_part.revolve` | Swing 2D Shape about Axis | | | | âś“ | :ref:`23 ` | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_generic.scale` | Change size of Shape | | âś“ | âś“ | âś“ | | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_part.section` | Generate 2D slices from 3D Shape | | | | âś“ | | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_generic.split` | Divide object by Plane | | âś“ | âś“ | âś“ | :ref:`27 ` | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_generic.sweep` | Extrude 1/2D section(s) along path | | | âś“ | âś“ | :ref:`14 ` | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_part.thicken` | Expand 2D section(s) | | | | âś“ | | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ -| :func:`~operations_sketch.trace` | Convert lines to faces | | | âś“ | | | -+----------------------------------------------+------------------------------------+----+----+----+----+------------------------+ ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| Operation | Description | 0D | 1D | 2D | 3D | Example | ++==============================================+====================================+====+====+====+====+===================================+ +| :func:`~operations_generic.add` | Add object to builder | | âś“ | âś“ | âś“ | :ref:`16 ` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_generic.bounding_box` | Add bounding box as Shape | | âś“ | âś“ | âś“ | | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_generic.chamfer` | Bevel Vertex or Edge | | | âś“ | âś“ | :ref:`9 ` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_part.draft` | Add a draft taper to a part | | | | âś“ | :ref:`examples-cast_bearing_unit` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_part.extrude` | Draw 2D Shape into 3D | | | | âś“ | :ref:`3 ` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_generic.fillet` | Radius Vertex or Edge | | | âś“ | âś“ | :ref:`9 ` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_sketch.full_round` | Round-off Face along given Edge | | | âś“ | | :ref:`ttt-24-spo-06` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_part.loft` | Create 3D Shape from sections | | | | âś“ | :ref:`24 ` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_part.make_brake_formed` | Create sheet metal parts | | | | âś“ | | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_sketch.make_face` | Create a Face from Edges | | | âś“ | | :ref:`4 ` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_sketch.make_hull` | Create Convex Hull from Edges | | | âś“ | | | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_generic.mirror` | Mirror about Plane | | âś“ | âś“ | âś“ | :ref:`15 ` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_generic.offset` | Inset or outset Shape | | âś“ | âś“ | âś“ | :ref:`25 ` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_generic.project` | Project points, lines or Faces | âś“ | âś“ | âś“ | | | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_part.project_workplane` | Create workplane for projection | | | | | | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_part.revolve` | Swing 2D Shape about Axis | | | | âś“ | :ref:`23 ` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_generic.scale` | Change size of Shape | | âś“ | âś“ | âś“ | | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_part.section` | Generate 2D slices from 3D Shape | | | | âś“ | | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_generic.split` | Divide object by Plane | | âś“ | âś“ | âś“ | :ref:`27 ` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_generic.sweep` | Extrude 1/2D section(s) along path | | | âś“ | âś“ | :ref:`14 ` | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_part.thicken` | Expand 2D section(s) | | | | âś“ | | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ +| :func:`~operations_sketch.trace` | Convert lines to faces | | | âś“ | | | ++----------------------------------------------+------------------------------------+----+----+----+----+-----------------------------------+ The following table summarizes all of the selectors that can be used within the scope of a Builder. Note that they will extract objects from the builder that is @@ -104,6 +106,7 @@ Reference .. autofunction:: operations_generic.add .. autofunction:: operations_generic.bounding_box .. autofunction:: operations_generic.chamfer +.. autofunction:: operations_part.draft .. autofunction:: operations_part.extrude .. autofunction:: operations_generic.fillet .. autofunction:: operations_sketch.full_round From cdaf1caa4c72436ebfe0907e1fb05e246d568cbc Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 25 May 2025 19:21:59 -0400 Subject: [PATCH 20/56] Removing bd_warehouse dependency --- docs/assets/examples/cast_bearing_unit.png | Bin 152827 -> 65651 bytes examples/cast_bearing_unit.py | 21 ++++----------------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/docs/assets/examples/cast_bearing_unit.png b/docs/assets/examples/cast_bearing_unit.png index 231aedee330e64fbdabbe1684a7235fc938adf23..e0bebf1835b25058352aa9cfd7e11add4a127e8c 100644 GIT binary patch literal 65651 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 literal 152827 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 LElU_XCIm6?9Z35pFRg#H9uK& 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 UJgVNrz`(%Z>FVdQ&MBb@0J}-it^fc4 diff --git a/examples/cast_bearing_unit.py b/examples/cast_bearing_unit.py index 9075561..51f40a8 100644 --- a/examples/cast_bearing_unit.py +++ b/examples/cast_bearing_unit.py @@ -47,16 +47,9 @@ license: """ # [Code] -import copy - -from bd_warehouse.bearing import PressFitHole, SingleRowAngularContactBallBearing -from bd_warehouse.fastener import ClearanceHole, SocketHeadCapScrew from build123d import * from ocp_vscode import show -bearing = SingleRowAngularContactBallBearing("M17-47-14") -screw = SocketHeadCapScrew("M10-1.5", length=30 * MM, simple=False) - A, A1, Db2, H, J = 26, 11, 57, 98.5, 76.5 with BuildPart() as oval_flanged_bearing_unit: with BuildSketch() as plan: @@ -70,17 +63,11 @@ with BuildPart() as oval_flanged_bearing_unit: draft(drafted_faces, Plane.XY, 4) fillet(oval_flanged_bearing_unit.edges(), 1) with Locations(oval_flanged_bearing_unit.faces().sort_by(Axis.Z)[-1]): - PressFitHole(bearing) - with Locations(Pos(Z=A1)): - with Locations(*bolt_centers): - ClearanceHole(screw, counter_sunk=False) + CounterBoreHole(14 / 2, 47 / 2, 14) + with Locations(*bolt_centers): + Hole(5) oval_flanged_bearing_unit.part.color = Color(0x4C6377) -# Create an assembly of all the positioned parts -oval_flanged_bearing_unit_assembly = Compound( - children=[oval_flanged_bearing_unit.part, bearing.moved(bearing.hole_locations[0])] - + [copy.copy(screw).moved(l) for l in screw.hole_locations] -) -show(oval_flanged_bearing_unit_assembly) +show(oval_flanged_bearing_unit) # [End] From 86849a329bcee8249de3d888c7880480ba23b208 Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 25 May 2025 19:41:11 -0400 Subject: [PATCH 21/56] Fixing bad localization test --- tests/test_direct_api/test_plane.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/test_direct_api/test_plane.py b/tests/test_direct_api/test_plane.py index 1fd2168..a2220b9 100644 --- a/tests/test_direct_api/test_plane.py +++ b/tests/test_direct_api/test_plane.py @@ -273,11 +273,13 @@ class TestPlane(unittest.TestCase): np.testing.assert_allclose(target_point, local_box_vertices[i], 1e-7) def test_localize_vertex(self): - vertex = Vertex(random.random(), random.random(), random.random()) - np.testing.assert_allclose( - tuple(Plane.YZ.to_local_coords(vertex)), - tuple(Plane.YZ.to_local_coords(Vector(vertex))), - 5, + v_x, v_y, v_z = (random.random(), random.random(), random.random()) + vertex = Vertex(v_x, v_y, v_z) + self.assertAlmostEqual( + Plane.YZ.to_local_coords(Vector(vertex)), (v_y, v_z, v_x), 5 + ) + self.assertAlmostEqual( + Vector(Plane.YZ.to_local_coords(vertex)), (v_y, v_z, v_x), 5 ) def test_repr(self): From 83cea3938d842ac2aa17ce269433cbf05909b6d4 Mon Sep 17 00:00:00 2001 From: gumyr Date: Mon, 26 May 2025 14:27:43 -0400 Subject: [PATCH 22/56] Deprecating Color.to_tuple Issue #155 --- src/build123d/geometry.py | 9 +++++++-- tests/test_direct_api/test_json.py | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/build123d/geometry.py b/src/build123d/geometry.py index d733010..5b395cc 100644 --- a/src/build123d/geometry.py +++ b/src/build123d/geometry.py @@ -1266,9 +1266,14 @@ class Color: self.iter_index += 1 return value - # @deprecated def to_tuple(self): """Value as tuple""" + warnings.warn( + "to_tuple is deprecated and will be removed in a future version. " + "Use 'tuple(Color)' instead.", + DeprecationWarning, + stacklevel=2, + ) return tuple(self) def __copy__(self) -> Color: @@ -1332,7 +1337,7 @@ class GeomEncoder(json.JSONEncoder): if isinstance(o, Axis): return {"Axis": (tuple(o.position), tuple(o.direction))} if isinstance(o, Color): - return {"Color": o.to_tuple()} + return {"Color": tuple(o)} if isinstance(o, Location): return {"Location": o.to_tuple()} if isinstance(o, Plane): diff --git a/tests/test_direct_api/test_json.py b/tests/test_direct_api/test_json.py index e253148..1099158 100644 --- a/tests/test_direct_api/test_json.py +++ b/tests/test_direct_api/test_json.py @@ -52,7 +52,7 @@ class TestGeomEncode(unittest.TestCase): c_json = json.dumps(Color("red"), cls=GeomEncoder) color = json.loads(c_json, object_hook=GeomEncoder.geometry_hook) - self.assertEqual(Color("red").to_tuple(), color.to_tuple()) + self.assertEqual(tuple(Color("red")), tuple(color)) loc = Location((0, 1, 2), (4, 8, 16)) l_json = json.dumps(loc, cls=GeomEncoder) From 2e0c193aa8a7c667c976e0d6dec49cdc4a0312d6 Mon Sep 17 00:00:00 2001 From: gumyr Date: Mon, 26 May 2025 15:56:01 -0400 Subject: [PATCH 23/56] Deprecating Axis.to_plane, refactored Plane constructor Issue #155 --- src/build123d/geometry.py | 131 +++++++++++++++------------ src/build123d/topology/one_d.py | 2 +- src/build123d/topology/shape_core.py | 10 +- src/build123d/topology/two_d.py | 4 +- tests/test_direct_api/test_axis.py | 10 +- tests/test_direct_api/test_plane.py | 50 ++++++++++ 6 files changed, 137 insertions(+), 70 deletions(-) diff --git a/src/build123d/geometry.py b/src/build123d/geometry.py index 5b395cc..599d117 100644 --- a/src/build123d/geometry.py +++ b/src/build123d/geometry.py @@ -758,6 +758,12 @@ class Axis(metaclass=AxisMeta): def to_plane(self) -> Plane: """Return self as Plane""" + warnings.warn( + "to_tuple is deprecated and will be removed in a future version. " + "Use 'Plane(Axis)' instead.", + DeprecationWarning, + stacklevel=2, + ) return Plane(origin=self.position, z_dir=self.direction) def is_coaxial( @@ -2523,85 +2529,89 @@ class Plane(metaclass=PlaneMeta): return Vector(normal) @overload - def __init__(self, gp_pln: gp_Pln): # pragma: no cover + def __init__(self, gp_pln: gp_Pln): """Return a plane from a OCCT gp_pln""" - @overload - def __init__(self, face: Face, x_dir: VectorLike | None = None): # pragma: no cover - """Return a plane extending the face. - Note: for non planar face this will return the underlying work plane""" - - @overload - def __init__(self, location: Location): # pragma: no cover - """Return a plane aligned with a given location""" - @overload def __init__( self, origin: VectorLike, x_dir: VectorLike | None = None, z_dir: VectorLike = (0, 0, 1), - ): # pragma: no cover + ): """Return a new plane at origin with x_dir and z_dir""" + @overload + def __init__(self, face: Face, x_dir: VectorLike | None = None): + """Return a plane extending the face. + Note: for non planar face this will return the underlying work plane""" + + @overload + def __init__(self, location: Location): + """Return a plane aligned with a given location""" + + @overload + def __init__(self, axis: Axis, x_dir: VectorLike | None = None): + """Return a plane with the z_dir aligned with the axis and optional x_dir direction""" + def __init__(self, *args, **kwargs): # pylint: disable=too-many-locals,too-many-branches,too-many-statements - """Create a plane from either an OCCT gp_pln or coordinates""" + """Create a plane from either an OCCT gp_pln, Face, Location, or coordinates""" - def optarg(kwargs, name, args, index, default): - if name in kwargs: - return kwargs[name] - if len(args) > index: - return args[index] - return default - - arg_plane = None - arg_face = None - arg_location = None - arg_origin = None - arg_x_dir = None - arg_z_dir = (0, 0, 1) - - arg0 = args[0] if args else None type_error_message = "Expected gp_Pln, Face, Location, or VectorLike" - if "gp_pln" in kwargs: - arg_plane = kwargs["gp_pln"] - elif isinstance(arg0, gp_Pln): - arg_plane = arg0 - elif "face" in kwargs: - arg_face = kwargs["face"] - arg_x_dir = kwargs.get("x_dir", None) - # Check for Face by using the OCCT class to avoid circular imports of the Face class - elif hasattr(arg0, "wrapped") and isinstance(arg0.wrapped, TopoDS_Face): - arg_face = arg0 - arg_x_dir = optarg(kwargs, "x_dir", args, 1, arg_x_dir) - elif "location" in kwargs: - arg_location = kwargs["location"] - elif isinstance(arg0, Location): - arg_location = arg0 - elif "origin" in kwargs: - arg_origin = kwargs["origin"] - arg_x_dir = kwargs.get("x_dir", arg_x_dir) - arg_z_dir = kwargs.get("z_dir", arg_z_dir) - else: - try: - arg_origin = Vector(arg0) - except TypeError as exc: - raise TypeError(type_error_message) from exc - arg_x_dir = optarg(kwargs, "x_dir", args, 1, arg_x_dir) - arg_z_dir = optarg(kwargs, "z_dir", args, 2, arg_z_dir) + arg_plane = kwargs.pop("gp_pln", None) + arg_face = kwargs.pop("face", None) + arg_location = kwargs.pop("location", None) + arg_axis = kwargs.pop("axis", None) + arg_origin = kwargs.pop("origin", None) + arg_x_dir = kwargs.pop("x_dir", None) + arg_z_dir = kwargs.pop("z_dir", (0, 0, 1)) + + if kwargs: + raise TypeError(f"Unexpected keyword arguments: {', '.join(kwargs)}") + + if args: + arg0 = args[0] + if arg_plane is None and isinstance(arg0, gp_Pln): + arg_plane = arg0 + elif ( + arg_face is None + and hasattr(arg0, "wrapped") + and isinstance(arg0.wrapped, TopoDS_Face) + ): + arg_face = arg0 + if arg_x_dir is None and len(args) > 1: + arg_x_dir = args[1] + elif arg_location is None and isinstance(arg0, Location): + arg_location = arg0 + elif arg_axis is None and isinstance(arg0, Axis): + arg_axis = arg0 + if len(args) > 1: + try: + arg_x_dir = Vector(args[1]) + except Exception as exc: + raise TypeError(type_error_message) from exc + elif arg_origin is None: + try: + arg_origin = Vector(arg0) + if arg_x_dir is None and len(args) > 1: + arg_x_dir = Vector(args[1]).normalized() + if len(args) > 2: + arg_z_dir = Vector(args[2]).normalized() + except Exception as exc: + raise TypeError(type_error_message) from exc if arg_plane: self.wrapped = arg_plane elif arg_face: - # Determine if face is planar surface = BRep_Tool.Surface_s(arg_face.wrapped) if not arg_face.is_planar: raise ValueError("Planes can only be created from planar faces") properties = GProp_GProps() BRepGProp.SurfaceProperties_s(arg_face.wrapped, properties) self._origin = Vector(properties.CentreOfMass()) + if isinstance(surface, Geom_BoundedSurface): point = gp_Pnt() face_x_dir = gp_Vec() @@ -2609,6 +2619,7 @@ class Plane(metaclass=PlaneMeta): surface.D1(0.5, 0.5, point, face_x_dir, tangent_v) else: face_x_dir = surface.Position().XDirection() + self.x_dir = Vector(arg_x_dir) if arg_x_dir else Vector(face_x_dir) self.x_dir = Vector(round(i, 14) for i in self.x_dir) self.z_dir = Plane.get_topods_face_normal(arg_face.wrapped) @@ -2623,10 +2634,16 @@ class Plane(metaclass=PlaneMeta): self.x_dir = Vector(round(i, 14) for i in self.x_dir) self.z_dir = Plane.get_topods_face_normal(topo_face) self.z_dir = Vector(round(i, 14) for i in self.z_dir) - elif arg_origin: + elif arg_axis: + self._origin = arg_axis.position + self.x_dir = Vector(arg_x_dir) if arg_x_dir is not None else None + self.z_dir = arg_axis.direction + elif arg_origin is not None: self._origin = Vector(arg_origin) self.x_dir = Vector(arg_x_dir) if arg_x_dir else None self.z_dir = Vector(arg_z_dir) + else: + raise TypeError(type_error_message) if hasattr(self, "wrapped"): self._origin = Vector(self.wrapped.Location()) @@ -2638,17 +2655,19 @@ class Plane(metaclass=PlaneMeta): raise ValueError("z_dir must be non null") self.z_dir = self.z_dir.normalized() - if not self.x_dir: + if self.x_dir is None: ax3 = gp_Ax3(self._origin.to_pnt(), self.z_dir.to_dir()) self.x_dir = Vector(ax3.XDirection()).normalized() else: if Vector(self.x_dir).length == 0.0: raise ValueError("x_dir must be non null") self.x_dir = Vector(self.x_dir).normalized() + self.y_dir = self.z_dir.cross(self.x_dir).normalized() self.wrapped = gp_Pln( gp_Ax3(self._origin.to_pnt(), self.z_dir.to_dir(), self.x_dir.to_dir()) ) + self.local_coord_system = None #: gp_Ax3 | None self.reverse_transform = None #: Matrix | None self.forward_transform = None #: Matrix | None diff --git a/src/build123d/topology/one_d.py b/src/build123d/topology/one_d.py index e33e0cc..4e96d7f 100644 --- a/src/build123d/topology/one_d.py +++ b/src/build123d/topology/one_d.py @@ -437,7 +437,7 @@ class Mixin1D(Shape): if all(a0.is_coaxial(a1) for a0, a1 in combinations(as_axis, 2)): origin = as_axis[0].position x_dir = as_axis[0].direction - z_dir = as_axis[0].to_plane().x_dir + z_dir = Plane(as_axis[0]).x_dir c_plane = Plane(origin, z_dir=z_dir) result = c_plane.shift_origin((0, 0)) diff --git a/src/build123d/topology/shape_core.py b/src/build123d/topology/shape_core.py index d473668..2a5b975 100644 --- a/src/build123d/topology/shape_core.py +++ b/src/build123d/topology/shape_core.py @@ -2599,29 +2599,27 @@ class ShapeList(list[T]): if inclusive == (True, True): objects = filter( lambda o: minimum - <= axis.to_plane().to_local_coords(o).center().Z + <= Plane(axis).to_local_coords(o).center().Z <= maximum, self, ) elif inclusive == (True, False): objects = filter( lambda o: minimum - <= axis.to_plane().to_local_coords(o).center().Z + <= Plane(axis).to_local_coords(o).center().Z < maximum, self, ) elif inclusive == (False, True): objects = filter( lambda o: minimum - < axis.to_plane().to_local_coords(o).center().Z + < Plane(axis).to_local_coords(o).center().Z <= maximum, self, ) elif inclusive == (False, False): objects = filter( - lambda o: minimum - < axis.to_plane().to_local_coords(o).center().Z - < maximum, + lambda o: minimum < Plane(axis).to_local_coords(o).center().Z < maximum, self, ) diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index cd973c7..5981d58 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -235,7 +235,7 @@ class Mixin2D(Shape): while intersect_maker.More(): inter_pt = intersect_maker.Pnt() # Calculate distance along axis - distance = other.to_plane().to_local_coords(Vector(inter_pt)).Z + distance = Plane(other).to_local_coords(Vector(inter_pt)).Z intersections.append( ( intersect_maker.Face(), # TopoDS_Face @@ -729,7 +729,7 @@ class Face(Mixin2D, Shape[TopoDS_Face]): axis = self.axis_of_rotation if axis is None or self.radii is None: raise ValueError("Can't find curvature of empty object") - loc = Location(axis.to_plane()) + loc = Location(Plane(axis)) axis_circle = Edge.make_circle(self.radii[0]).locate(loc) _, pnt_on_axis_circle, _ = axis_circle.distance_to_with_closest_points( self.center() diff --git a/tests/test_direct_api/test_axis.py b/tests/test_direct_api/test_axis.py index b6ece42..c0bbd46 100644 --- a/tests/test_direct_api/test_axis.py +++ b/tests/test_direct_api/test_axis.py @@ -113,11 +113,11 @@ class TestAxis(unittest.TestCase): self.assertAlmostEqual(axis.position, (1, 2, 3), 6) self.assertAlmostEqual(axis.direction, (0, 1, 0), 6) - def test_axis_to_plane(self): - x_plane = Axis.X.to_plane() - self.assertTrue(isinstance(x_plane, Plane)) - self.assertAlmostEqual(x_plane.origin, (0, 0, 0), 5) - self.assertAlmostEqual(x_plane.z_dir, (1, 0, 0), 5) + # def test_axis_to_plane(self): + # x_plane = Axis.X.to_plane() + # self.assertTrue(isinstance(x_plane, Plane)) + # self.assertAlmostEqual(x_plane.origin, (0, 0, 0), 5) + # self.assertAlmostEqual(x_plane.z_dir, (1, 0, 0), 5) def test_axis_is_coaxial(self): self.assertTrue(Axis.X.is_coaxial(Axis((0, 0, 0), (1, 0, 0)))) diff --git a/tests/test_direct_api/test_plane.py b/tests/test_direct_api/test_plane.py index a2220b9..e9e7faa 100644 --- a/tests/test_direct_api/test_plane.py +++ b/tests/test_direct_api/test_plane.py @@ -123,6 +123,8 @@ class TestPlane(unittest.TestCase): Plane() with self.assertRaises(TypeError): Plane(o, z_dir="up") + with self.assertRaises(TypeError): + Plane(o, forward="up") # rotated location around z loc = Location((0, 0, 0), (0, 0, 45)) @@ -211,6 +213,54 @@ class TestPlane(unittest.TestCase): self.assertAlmostEqual(p.y_dir, expected[i][1], 6) self.assertAlmostEqual(p.z_dir, expected[i][2], 6) + def test_plane_from_axis(self): + origin = Vector(1, 2, 3) + direction = Vector(0, 0, 1) + axis = Axis(origin, direction) + plane = Plane(axis) + + self.assertEqual(plane.origin, origin) + self.assertTrue(plane.z_dir, direction.normalized()) + self.assertAlmostEqual(plane.x_dir.length, 1.0, places=12) + self.assertAlmostEqual(plane.y_dir.length, 1.0, places=12) + self.assertAlmostEqual(plane.z_dir.length, 1.0, places=12) + + def test_plane_from_axis_with_x_dir(self): + origin = Vector(0, 0, 0) + z_dir = Vector(0, 0, 1) + x_dir = Vector(1, 0, 0) + axis = Axis(origin, z_dir) + plane = Plane(axis, x_dir) + + self.assertEqual(plane.origin, origin) + self.assertEqual(plane.z_dir, z_dir.normalized()) + self.assertEqual(plane.x_dir, x_dir.normalized()) + self.assertEqual(plane.y_dir, z_dir.cross(x_dir).normalized()) + + def test_plane_from_axis_with_kwargs(self): + axis = Axis((0, 0, 0), (0, 1, 0)) + x_dir = Vector(1, 0, 0) + plane = Plane(axis=axis, x_dir=x_dir) + + self.assertEqual(plane.z_dir, Vector(0, 1, 0)) + self.assertEqual(plane.x_dir, x_dir.normalized()) + + def test_plane_from_axis_without_x_dir(self): + axis = Axis((0, 0, 0), (1, 0, 0)) + plane = Plane(axis) + + self.assertEqual(plane.z_dir, Vector(1, 0, 0)) + self.assertAlmostEqual(plane.x_dir.length, 1.0, places=12) + self.assertAlmostEqual(plane.y_dir.length, 1.0, places=12) + self.assertGreater(plane.z_dir.cross(plane.x_dir).dot(plane.y_dir), 0.99) + + def test_plane_from_axis_invalid_x_dir(self): + axis = Axis((0, 0, 0), (0, 0, 1)) + with self.assertRaises(ValueError): + Plane(axis, x_dir=(0, 0, 0)) + with self.assertRaises(TypeError): + Plane(axis, "front") + def test_plane_neg(self): p = Plane( origin=(1, 2, 3), From ce3e6ba3a4c221c2b75d37886b4de4f4070bc4be Mon Sep 17 00:00:00 2001 From: gumyr Date: Mon, 26 May 2025 21:02:01 -0400 Subject: [PATCH 24/56] Deprecating Vertex.to_tuple - Issue #155 --- src/build123d/build_common.py | 2 +- src/build123d/drafting.py | 5 +---- src/build123d/objects_curve.py | 10 ++++------ src/build123d/operations_generic.py | 20 ++++---------------- src/build123d/operations_part.py | 8 +++----- src/build123d/topology/zero_d.py | 11 ++++++++++- tests/test_build_common.py | 18 ++++++++---------- tests/test_direct_api/test_shape_list.py | 3 +-- 8 files changed, 32 insertions(+), 45 deletions(-) diff --git a/src/build123d/build_common.py b/src/build123d/build_common.py index d2d6942..096a9c0 100644 --- a/src/build123d/build_common.py +++ b/src/build123d/build_common.py @@ -1111,7 +1111,7 @@ class Locations(LocationList): elif isinstance(point, Vector): local_locations.append(Location(point)) elif isinstance(point, Vertex): - local_locations.append(Location(Vector(point.to_tuple()))) + local_locations.append(Location(Vector(point))) elif isinstance(point, tuple): local_locations.append(Location(Vector(point))) elif isinstance(point, Plane): diff --git a/src/build123d/drafting.py b/src/build123d/drafting.py index 176e6e6..18821fa 100644 --- a/src/build123d/drafting.py +++ b/src/build123d/drafting.py @@ -277,10 +277,7 @@ class Draft: if isinstance(path, (Edge, Wire)): processed_path = path elif isinstance(path, Iterable): - pnts = [ - Vector(p.to_tuple()) if isinstance(p, Vertex) else Vector(p) - for p in path - ] + pnts = [Vector(p) for p in path] if len(pnts) == 2: processed_path = Edge.make_line(*pnts) else: diff --git a/src/build123d/objects_curve.py b/src/build123d/objects_curve.py index 0eaa4b3..199cdc6 100644 --- a/src/build123d/objects_curve.py +++ b/src/build123d/objects_curve.py @@ -32,7 +32,7 @@ import copy as copy_module from collections.abc import Iterable from math import copysign, cos, radians, sin, sqrt from scipy.optimize import minimize -import sympy # type: ignore +import sympy # type: ignore from build123d.build_common import WorkplaneList, flatten_sequence, validate_inputs from build123d.build_enums import ( @@ -456,7 +456,7 @@ class Helix(BaseEdgeObject): defined by cone_angle. If cone_angle is not 0, radius is the initial helix radius at center. cone_angle > 0 - increases the final radius. cone_angle < 0 decreases the final radius. + increases the final radius. cone_angle < 0 decreases the final radius. Args: pitch (float): distance between loops @@ -564,7 +564,7 @@ class FilletPolyline(BaseLineObject): if len(edges) != 2: continue other_vertices = {ve for e in edges for ve in e.vertices() if ve != vertex} - third_edge = Edge.make_line(*[v.to_tuple() for v in other_vertices]) + third_edge = Edge.make_line(*[v for v in other_vertices]) fillet_face = Face(Wire(edges + [third_edge])).fillet_2d(radius, [vertex]) fillets.append(fillet_face.edges().filter_by(GeomType.CIRCLE)[0]) @@ -1095,9 +1095,7 @@ class PointArcTangentLine(BaseEdgeObject): tangent_point = WorkplaneList.localize(point) if context is None: # Making the plane validates points and arc are coplanar - coplane = Edge.make_line(tangent_point, arc.arc_center).common_plane( - arc - ) + coplane = Edge.make_line(tangent_point, arc.arc_center).common_plane(arc) if coplane is None: raise ValueError("PointArcTangentLine only works on a single plane.") diff --git a/src/build123d/operations_generic.py b/src/build123d/operations_generic.py index e5b0e9f..9fd524b 100644 --- a/src/build123d/operations_generic.py +++ b/src/build123d/operations_generic.py @@ -376,14 +376,8 @@ def chamfer( object_list = ShapeList( filter( lambda v: not ( - isclose_b( - (Vector(*v.to_tuple()) - target.position_at(0)).length, - 0.0, - ) - or isclose_b( - (Vector(*v.to_tuple()) - target.position_at(1)).length, - 0.0, - ) + isclose_b((Vector(v) - target.position_at(0)).length, 0.0) + or isclose_b((Vector(v) - target.position_at(1)).length, 0.0) ), object_list, ) @@ -479,14 +473,8 @@ def fillet( object_list = ShapeList( filter( lambda v: not ( - isclose_b( - (Vector(*v.to_tuple()) - target.position_at(0)).length, - 0.0, - ) - or isclose_b( - (Vector(*v.to_tuple()) - target.position_at(1)).length, - 0.0, - ) + isclose_b((Vector(v) - target.position_at(0)).length, 0.0) + or isclose_b((Vector(v) - target.position_at(1)).length, 0.0) ), object_list, ) diff --git a/src/build123d/operations_part.py b/src/build123d/operations_part.py index 26a9095..2fc2126 100644 --- a/src/build123d/operations_part.py +++ b/src/build123d/operations_part.py @@ -392,12 +392,10 @@ def make_brake_formed( raise TypeError("station_widths must be either a single number or an iterable") for vertex in line_vertices: - others = offset_vertices.sort_by_distance(Vector(vertex.X, vertex.Y, vertex.Z)) + others = offset_vertices.sort_by_distance(Vector(vertex)) for other in others[1:]: - if abs(Vector(*(vertex - other).to_tuple()).length - thickness) < 1e-2: - station_edges.append( - Edge.make_line(vertex.to_tuple(), other.to_tuple()) - ) + if abs(Vector((vertex - other)).length - thickness) < 1e-2: + station_edges.append(Edge.make_line(vertex, other)) break station_edges = station_edges.sort_by(line) diff --git a/src/build123d/topology/zero_d.py b/src/build123d/topology/zero_d.py index f0bd1a0..bd19653 100644 --- a/src/build123d/topology/zero_d.py +++ b/src/build123d/topology/zero_d.py @@ -54,6 +54,8 @@ license: from __future__ import annotations import itertools +import warnings + from typing import overload, TYPE_CHECKING from collections.abc import Iterable @@ -132,7 +134,8 @@ class Vertex(Shape[TopoDS_Vertex]): ) super().__init__(ocp_vx) - self.X, self.Y, self.Z = self.to_tuple() + pnt = BRep_Tool.Pnt_s(self.wrapped) + self.X, self.Y, self.Z = pnt.X(), pnt.Y(), pnt.Z() # ---- Properties ---- @@ -272,6 +275,12 @@ class Vertex(Shape[TopoDS_Vertex]): def to_tuple(self) -> tuple[float, float, float]: """Return vertex as three tuple of floats""" + warnings.warn( + "to_tuple is deprecated and will be removed in a future version. " + "Use 'tuple(Vertex)' instead.", + DeprecationWarning, + stacklevel=2, + ) geom_point = BRep_Tool.Pnt_s(self.wrapped) return (geom_point.X(), geom_point.Y(), geom_point.Z()) diff --git a/tests/test_build_common.py b/tests/test_build_common.py index 318092a..dbdabc5 100644 --- a/tests/test_build_common.py +++ b/tests/test_build_common.py @@ -435,27 +435,25 @@ class TestRotation(unittest.TestCase): def test_init(self): thirty_by_three = Rotation(30, 30, 30) box_vertices = Solid.make_box(1, 1, 1).moved(thirty_by_three).vertices() + self.assertTupleAlmostEquals(tuple(box_vertices[0]), (0.5, -0.4330127, 0.75), 5) + self.assertTupleAlmostEquals(tuple(box_vertices[1]), (0.0, 0.0, 0.0), 7) self.assertTupleAlmostEquals( - box_vertices[0].to_tuple(), (0.5, -0.4330127, 0.75), 5 - ) - self.assertTupleAlmostEquals(box_vertices[1].to_tuple(), (0.0, 0.0, 0.0), 7) - self.assertTupleAlmostEquals( - box_vertices[2].to_tuple(), (0.0669872, 0.191987, 1.399519), 5 + tuple(box_vertices[2]), (0.0669872, 0.191987, 1.399519), 5 ) self.assertTupleAlmostEquals( - box_vertices[3].to_tuple(), (-0.4330127, 0.625, 0.6495190), 5 + tuple(box_vertices[3]), (-0.4330127, 0.625, 0.6495190), 5 ) self.assertTupleAlmostEquals( - box_vertices[4].to_tuple(), (1.25, 0.2165063, 0.625), 5 + tuple(box_vertices[4]), (1.25, 0.2165063, 0.625), 5 ) self.assertTupleAlmostEquals( - box_vertices[5].to_tuple(), (0.75, 0.649519, -0.125), 5 + tuple(box_vertices[5]), (0.75, 0.649519, -0.125), 5 ) self.assertTupleAlmostEquals( - box_vertices[6].to_tuple(), (0.816987, 0.841506, 1.274519), 5 + tuple(box_vertices[6]), (0.816987, 0.841506, 1.274519), 5 ) self.assertTupleAlmostEquals( - box_vertices[7].to_tuple(), (0.3169872, 1.2745190, 0.52451905), 5 + tuple(box_vertices[7]), (0.3169872, 1.2745190, 0.52451905), 5 ) diff --git a/tests/test_direct_api/test_shape_list.py b/tests/test_direct_api/test_shape_list.py index 7ccf4a5..535e034 100644 --- a/tests/test_direct_api/test_shape_list.py +++ b/tests/test_direct_api/test_shape_list.py @@ -32,7 +32,6 @@ import math import re import unittest -import numpy as np from IPython.lib import pretty from build123d.build_common import GridLocations, PolarLocations from build123d.build_enums import GeomType, SortBy @@ -304,7 +303,7 @@ class TestShapeList(unittest.TestCase): def test_vertex(self): sl = ShapeList([Edge.make_circle(1)]) - np.testing.assert_allclose(sl.vertex().to_tuple(), (1, 0, 0), 1e-5) + self.assertAlmostEqual(tuple(sl.vertex()), (1, 0, 0), 5) sl = ShapeList([Face.make_rect(1, 1), Face.make_rect(1, 1, Plane((4, 4)))]) with self.assertWarns(UserWarning): sl.vertex() From 421dc667845509401ba308b6294333d91c25ea6a Mon Sep 17 00:00:00 2001 From: gumyr Date: Tue, 27 May 2025 09:43:01 -0400 Subject: [PATCH 25/56] Deprecating Edge/Wire.to_wire and Face.to_arcs --- src/build123d/topology/one_d.py | 12 ++++++++++++ src/build123d/topology/shape_core.py | 4 +++- src/build123d/topology/three_d.py | 6 +++--- src/build123d/topology/two_d.py | 9 +++++++++ tests/test_direct_api/test_edge.py | 4 ++-- tests/test_direct_api/test_face.py | 22 +++++++++++----------- 6 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/build123d/topology/one_d.py b/src/build123d/topology/one_d.py index 4e96d7f..5cff57d 100644 --- a/src/build123d/topology/one_d.py +++ b/src/build123d/topology/one_d.py @@ -2231,6 +2231,12 @@ class Edge(Mixin1D, Shape[TopoDS_Edge]): def to_wire(self) -> Wire: """Edge as Wire""" + warnings.warn( + "to_wire is deprecated and will be removed in a future version. " + "Use 'Wire(Edge)' instead.", + DeprecationWarning, + stacklevel=2, + ) return Wire([self]) def trim(self, start: float, end: float) -> Edge: @@ -3106,6 +3112,12 @@ class Wire(Mixin1D, Shape[TopoDS_Wire]): def to_wire(self) -> Wire: """Return Wire - used as a pair with Edge.to_wire when self is Wire | Edge""" + warnings.warn( + "to_wire is deprecated and will be removed in a future version. " + "Use 'Wire(Wire)' instead.", + DeprecationWarning, + stacklevel=2, + ) return self def trim(self: Wire, start: float, end: float) -> Wire: diff --git a/src/build123d/topology/shape_core.py b/src/build123d/topology/shape_core.py index 2a5b975..fda2700 100644 --- a/src/build123d/topology/shape_core.py +++ b/src/build123d/topology/shape_core.py @@ -1916,7 +1916,9 @@ class Shape(NodeMixin, Generic[TOPODS]): ) -> Self: """to_splines - Approximate shape with b-splines of the specified degree. + A shape-processing utility that forces all geometry in a shape to be converted into + BSplines. It's useful when working with tools or export formats that require uniform + geometry, or for downstream processing that only understands BSpline representations. Args: degree (int, optional): Maximum degree. Defaults to 3. diff --git a/src/build123d/topology/three_d.py b/src/build123d/topology/three_d.py index 32f1561..b0d86f4 100644 --- a/src/build123d/topology/three_d.py +++ b/src/build123d/topology/three_d.py @@ -665,7 +665,7 @@ class Solid(Mixin3D, Shape[TopoDS_Solid]): builder.SetMode(coordinate_system) rotate = True elif isinstance(binormal, (Wire, Edge)): - builder.SetMode(binormal.to_wire().wrapped, True) + builder.SetMode(Wire(binormal).wrapped, True) return rotate @@ -1271,7 +1271,7 @@ class Solid(Mixin3D, Shape[TopoDS_Solid]): shapes = [] for wire in [outer_wire] + inner_wires: - builder = BRepOffsetAPI_MakePipeShell(path.to_wire().wrapped) + builder = BRepOffsetAPI_MakePipeShell(Wire(path).wrapped) rotate = False @@ -1339,7 +1339,7 @@ class Solid(Mixin3D, Shape[TopoDS_Solid]): Returns: Solid: swept object """ - path_as_wire = path.to_wire().wrapped + path_as_wire = Wire(path).wrapped builder = BRepOffsetAPI_MakePipeShell(path_as_wire) diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index 5981d58..4bfb5e0 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -1627,12 +1627,21 @@ class Face(Mixin2D, Shape[TopoDS_Face]): Approximate planar face with arcs and straight line segments. + This is a utility used internally to convert or adapt a face for Boolean operations. Its + purpose is not typically for general use, but rather as a helper within the Boolean kernel + to ensure input faces are in a compatible and canonical form. + Args: tolerance (float, optional): Approximation tolerance. Defaults to 1e-3. Returns: Face: approximated face """ + warnings.warn( + "The 'to_arcs' method is deprecated and will be removed in a future version.", + DeprecationWarning, + stacklevel=2, + ) if self.wrapped is None: raise ValueError("Cannot approximate an empty shape") diff --git a/tests/test_direct_api/test_edge.py b/tests/test_direct_api/test_edge.py index 9a524e8..8599c44 100644 --- a/tests/test_direct_api/test_edge.py +++ b/tests/test_direct_api/test_edge.py @@ -37,7 +37,7 @@ from build123d.geometry import Axis, Plane, Vector from build123d.objects_curve import CenterArc, EllipticalCenterArc from build123d.objects_sketch import Circle, Rectangle, RegularPolygon from build123d.operations_generic import sweep -from build123d.topology import Edge, Face +from build123d.topology import Edge, Face, Wire from OCP.GeomProjLib import GeomProjLib @@ -122,7 +122,7 @@ class TestEdge(unittest.TestCase): for end in [0, 1]: self.assertAlmostEqual( edge.position_at(end), - edge.to_wire().position_at(end), + Wire(edge).position_at(end), 5, ) diff --git a/tests/test_direct_api/test_face.py b/tests/test_direct_api/test_face.py index 5106228..162eda2 100644 --- a/tests/test_direct_api/test_face.py +++ b/tests/test_direct_api/test_face.py @@ -183,7 +183,7 @@ class TestFace(unittest.TestCase): happy = Face(outer, inners) self.assertAlmostEqual(happy.area, math.pi * (10**2 - 2), 5) - outer = Edge.make_circle(10, end_angle=180).to_wire() + outer = Wire(Edge.make_circle(10, end_angle=180)) with self.assertRaises(ValueError): Face(outer, inners) with self.assertRaises(ValueError): @@ -192,7 +192,7 @@ class TestFace(unittest.TestCase): outer = Wire.make_circle(10) inners = [ Wire.make_circle(1).locate(Location((-2, 2, 0))), - Edge.make_circle(1, end_angle=180).to_wire().locate(Location((2, 2, 0))), + Wire(Edge.make_circle(1, end_angle=180)).locate(Location((2, 2, 0))), ] with self.assertRaises(ValueError): Face(outer, inners) @@ -423,15 +423,15 @@ class TestFace(unittest.TestCase): with self.assertRaises(ValueError): Face.sweep(edge, Polyline((0, 0), (0.1, 0), (0.2, 0.1))) - def test_to_arcs(self): - with BuildSketch() as bs: - with BuildLine() as bl: - Polyline((0, 0), (1, 0), (1.5, 0.5), (2, 0), (2, 1), (0, 1), (0, 0)) - fillet(bl.vertices(), radius=0.1) - make_face() - smooth = bs.faces()[0] - fragmented = smooth.to_arcs() - self.assertLess(len(smooth.edges()), len(fragmented.edges())) + # def test_to_arcs(self): + # with BuildSketch() as bs: + # with BuildLine() as bl: + # Polyline((0, 0), (1, 0), (1.5, 0.5), (2, 0), (2, 1), (0, 1), (0, 0)) + # fillet(bl.vertices(), radius=0.1) + # make_face() + # smooth = bs.faces()[0] + # fragmented = smooth.to_arcs() + # self.assertLess(len(smooth.edges()), len(fragmented.edges())) def test_outer_wire(self): face = (Face.make_rect(1, 1) - Face.make_rect(0.5, 0.5)).face() From f445de32c98f6df1fab1bef5b8a5b8211f9df205 Mon Sep 17 00:00:00 2001 From: gumyr Date: Tue, 27 May 2025 10:43:33 -0400 Subject: [PATCH 26/56] Deprecating Location.to_tuple Issue #155 --- src/build123d/geometry.py | 49 ++++++++++++++++++++++---- tests/test_build_common.py | 10 +++--- tests/test_build_generic.py | 2 +- tests/test_direct_api/test_json.py | 1 - tests/test_direct_api/test_location.py | 39 +++++++++----------- 5 files changed, 65 insertions(+), 36 deletions(-) diff --git a/src/build123d/geometry.py b/src/build123d/geometry.py index 599d117..81f4075 100644 --- a/src/build123d/geometry.py +++ b/src/build123d/geometry.py @@ -1345,7 +1345,8 @@ class GeomEncoder(json.JSONEncoder): if isinstance(o, Color): return {"Color": tuple(o)} if isinstance(o, Location): - return {"Location": o.to_tuple()} + tup = tuple(o) + return {f"Location": (tuple(tup[0]), tuple(tup[1]))} if isinstance(o, Plane): return {"Plane": (tuple(o.origin), tuple(o.x_dir), tuple(o.z_dir))} if isinstance(o, Vector): @@ -1457,6 +1458,9 @@ class Location: def __init__( self, *args, **kwargs ): # pylint: disable=too-many-branches, too-many-locals, too-many-statements + + self.location_index = 0 + position = kwargs.pop("position", None) orientation = kwargs.pop("orientation", None) ordering = kwargs.pop("ordering", None) @@ -1549,7 +1553,7 @@ class Location: Vector: Position part of Location """ - return Vector(self.to_tuple()[0]) + return Vector(tuple(self)[0]) @position.setter def position(self, value: VectorLike): @@ -1574,7 +1578,7 @@ class Location: Vector: orientation part of Location """ - return Vector(self.to_tuple()[1]) + return Vector(tuple(self)[1]) @orientation.setter def orientation(self, rotation: VectorLike): @@ -1726,6 +1730,30 @@ class Location: ) ) + def __iter__(self): + """Initialize to beginning""" + self.location_index = 0 + return self + + def __next__(self): + """return the next value""" + transformation = self.wrapped.Transformation() + trans = transformation.TranslationPart() + rot = transformation.GetRotation() + rv_trans: Vector = Vector(trans.X(), trans.Y(), trans.Z()) + rv_rot: Vector = Vector( + degrees(a) for a in rot.GetEulerAngles(gp_EulerSequence.gp_Intrinsic_XYZ) + ) # type: ignore[assignment] + if self.location_index == 0: + self.location_index += 1 + value = rv_trans + elif self.location_index == 1: + self.location_index += 1 + value = rv_rot + else: + raise StopIteration + return value + def __neg__(self) -> Location: """Flip the orientation without changing the position operator -""" return Location(-Plane(self)) @@ -1793,6 +1821,13 @@ class Location: def to_tuple(self) -> tuple[tuple[float, float, float], tuple[float, float, float]]: """Convert the location to a translation, rotation tuple.""" + warnings.warn( + "to_tuple is deprecated and will be removed in a future version. " + "Use 'tuple(Location)' instead.", + DeprecationWarning, + stacklevel=2, + ) + transformation = self.wrapped.Transformation() trans = transformation.TranslationPart() rot = transformation.GetRotation() @@ -1812,8 +1847,8 @@ class Location: Returns: Location as String """ - position_str = ", ".join(f"{v:.2f}" for v in self.to_tuple()[0]) - orientation_str = ", ".join(f"{v:.2f}" for v in self.to_tuple()[1]) + position_str = ", ".join(f"{v:.2f}" for v in tuple(self)[0]) + orientation_str = ", ".join(f"{v:.2f}" for v in tuple(self)[1]) return f"(p=({position_str}), o=({orientation_str}))" def __str__(self): @@ -1824,8 +1859,8 @@ class Location: Returns: Location as String """ - position_str = ", ".join(f"{v:.2f}" for v in self.to_tuple()[0]) - orientation_str = ", ".join(f"{v:.2f}" for v in self.to_tuple()[1]) + position_str = ", ".join(f"{v:.2f}" for v in tuple(self)[0]) + orientation_str = ", ".join(f"{v:.2f}" for v in tuple(self)[1]) return f"Location: (position=({position_str}), orientation=({orientation_str}))" @overload diff --git a/tests/test_build_common.py b/tests/test_build_common.py index dbdabc5..922b041 100644 --- a/tests/test_build_common.py +++ b/tests/test_build_common.py @@ -282,7 +282,7 @@ class TestLocations(unittest.TestCase): def test_no_centering(self): with BuildSketch(): with GridLocations(4, 4, 2, 2, align=(Align.MIN, Align.MIN)) as l: - pts = [loc.to_tuple()[0] for loc in l.locations] + pts = [tuple(loc)[0] for loc in l.locations] self.assertTupleAlmostEquals(pts[0], (0, 0, 0), 5) self.assertTupleAlmostEquals(pts[1], (0, 4, 0), 5) self.assertTupleAlmostEquals(pts[2], (4, 0, 0), 5) @@ -331,7 +331,7 @@ class TestLocations(unittest.TestCase): def test_centering(self): with BuildSketch(): with GridLocations(4, 4, 2, 2, align=(Align.CENTER, Align.CENTER)) as l: - pts = [loc.to_tuple()[0] for loc in l.locations] + pts = [tuple(loc)[0] for loc in l.locations] self.assertTupleAlmostEquals(pts[0], (-2, -2, 0), 5) self.assertTupleAlmostEquals(pts[1], (-2, 2, 0), 5) self.assertTupleAlmostEquals(pts[2], (2, -2, 0), 5) @@ -341,7 +341,7 @@ class TestLocations(unittest.TestCase): with BuildSketch(): with Locations((-2, -2), (2, 2)): with GridLocations(1, 1, 2, 2) as nested_grid: - pts = [loc.to_tuple()[0] for loc in nested_grid.local_locations] + pts = [tuple(loc)[0] for loc in nested_grid.local_locations] self.assertTupleAlmostEquals(pts[0], (-2.50, -2.50, 0.00), 5) self.assertTupleAlmostEquals(pts[1], (-2.50, -1.50, 0.00), 5) self.assertTupleAlmostEquals(pts[2], (-1.50, -2.50, 0.00), 5) @@ -355,8 +355,8 @@ class TestLocations(unittest.TestCase): with BuildSketch(): with PolarLocations(6, 3): with GridLocations(1, 1, 2, 2) as polar_grid: - pts = [loc.to_tuple()[0] for loc in polar_grid.local_locations] - ort = [loc.to_tuple()[1] for loc in polar_grid.local_locations] + pts = [tuple(loc)[0] for loc in polar_grid.local_locations] + ort = [tuple(loc)[1] for loc in polar_grid.local_locations] self.assertTupleAlmostEquals(pts[0], (5.50, -0.50, 0.00), 2) self.assertTupleAlmostEquals(pts[1], (5.50, 0.50, 0.00), 2) diff --git a/tests/test_build_generic.py b/tests/test_build_generic.py index 94367dd..d3248e0 100644 --- a/tests/test_build_generic.py +++ b/tests/test_build_generic.py @@ -403,7 +403,7 @@ class LocationsTests(unittest.TestCase): with BuildPart(): with Locations(Location(Vector())): self.assertTupleAlmostEquals( - LocationList._get_context().locations[0].to_tuple()[0], (0, 0, 0), 5 + tuple(LocationList._get_context().locations[0])[0], (0, 0, 0), 5 ) def test_errors(self): diff --git a/tests/test_direct_api/test_json.py b/tests/test_direct_api/test_json.py index 1099158..b18be83 100644 --- a/tests/test_direct_api/test_json.py +++ b/tests/test_direct_api/test_json.py @@ -27,7 +27,6 @@ license: """ import json -import os import unittest from build123d.geometry import ( Axis, diff --git a/tests/test_direct_api/test_location.py b/tests/test_direct_api/test_location.py index bdfd225..40f0e0a 100644 --- a/tests/test_direct_api/test_location.py +++ b/tests/test_direct_api/test_location.py @@ -26,7 +26,6 @@ license: """ -# Always equal to any other object, to test that __eq__ cooperation is working import copy import json import math @@ -34,7 +33,6 @@ import os import unittest from random import uniform -import numpy as np from OCP.gp import ( gp_Ax1, gp_Dir, @@ -51,6 +49,8 @@ from build123d.topology import Edge, Solid, Vertex class AlwaysEqual: + """Always equal to any other object, to test that __eq__ cooperation is working""" + def __eq__(self, other): return True @@ -59,7 +59,7 @@ class TestLocation(unittest.TestCase): def test_location(self): loc0 = Location() T = loc0.wrapped.Transformation().TranslationPart() - np.testing.assert_allclose((T.X(), T.Y(), T.Z()), (0, 0, 0), 1e-6) + self.assertAlmostEqual((T.X(), T.Y(), T.Z()), (0, 0, 0), 5) angle = math.degrees( loc0.wrapped.Transformation().GetRotation().GetRotationAngle() ) @@ -69,19 +69,19 @@ class TestLocation(unittest.TestCase): loc0 = Location((0, 0, 1)) T = loc0.wrapped.Transformation().TranslationPart() - np.testing.assert_allclose((T.X(), T.Y(), T.Z()), (0, 0, 1), 1e-6) + self.assertAlmostEqual((T.X(), T.Y(), T.Z()), (0, 0, 1), 5) # List loc0 = Location([0, 0, 1]) T = loc0.wrapped.Transformation().TranslationPart() - np.testing.assert_allclose((T.X(), T.Y(), T.Z()), (0, 0, 1), 1e-6) + self.assertAlmostEqual((T.X(), T.Y(), T.Z()), (0, 0, 1), 5) # Vector loc1 = Location(Vector(0, 0, 1)) T = loc1.wrapped.Transformation().TranslationPart() - np.testing.assert_allclose((T.X(), T.Y(), T.Z()), (0, 0, 1), 1e-6) + self.assertAlmostEqual((T.X(), T.Y(), T.Z()), (0, 0, 1), 5) # rotation + translation loc2 = Location(Vector(0, 0, 1), Vector(0, 0, 1), 45) @@ -103,13 +103,8 @@ class TestLocation(unittest.TestCase): # Test creation from the OCP.gp.gp_Trsf object loc4 = Location(gp_Trsf()) - np.testing.assert_allclose(loc4.to_tuple()[0], (0, 0, 0), 1e-7) - np.testing.assert_allclose(loc4.to_tuple()[1], (0, 0, 0), 1e-7) - - # Test creation from Plane and Vector - # loc4 = Location(Plane.XY, (0, 0, 1)) - # np.testing.assert_allclose(loc4.to_tuple()[0], (0, 0, 1), 1e-7) - # np.testing.assert_allclose(loc4.to_tuple()[1], (0, 0, 0), 1e-7) + self.assertAlmostEqual(tuple(loc4)[0], (0, 0, 0), 5) + self.assertAlmostEqual(tuple(loc4)[1], (0, 0, 0), 5) # Test composition loc4 = Location((0, 0, 0), Vector(0, 0, 1), 15) @@ -119,7 +114,7 @@ class TestLocation(unittest.TestCase): loc7 = loc4**2 T = loc5.wrapped.Transformation().TranslationPart() - np.testing.assert_allclose((T.X(), T.Y(), T.Z()), (0, 0, 1), 1e-6) + self.assertAlmostEqual((T.X(), T.Y(), T.Z()), (0, 0, 1), 5) angle5 = math.degrees( loc5.wrapped.Transformation().GetRotation().GetRotationAngle() @@ -165,21 +160,21 @@ class TestLocation(unittest.TestCase): t.SetRotationPart(q) loc2 = Location(t) - np.testing.assert_allclose(loc1.to_tuple()[0], loc2.to_tuple()[0], 1e-6) - np.testing.assert_allclose(loc1.to_tuple()[1], loc2.to_tuple()[1], 1e-6) + self.assertAlmostEqual(tuple(loc1)[0], tuple(loc2)[0], 5) + self.assertAlmostEqual(tuple(loc1)[1], tuple(loc2)[1], 5) loc1 = Location((1, 2), 34) - np.testing.assert_allclose(loc1.to_tuple()[0], (1, 2, 0), 1e-6) - np.testing.assert_allclose(loc1.to_tuple()[1], (0, 0, 34), 1e-6) + self.assertAlmostEqual(tuple(loc1)[0], (1, 2, 0), 5) + self.assertAlmostEqual(tuple(loc1)[1], (0, 0, 34), 5) rot_angles = (-115.00, 35.00, -135.00) loc2 = Location((1, 2, 3), rot_angles) - np.testing.assert_allclose(loc2.to_tuple()[0], (1, 2, 3), 1e-6) - np.testing.assert_allclose(loc2.to_tuple()[1], rot_angles, 1e-6) + self.assertAlmostEqual(tuple(loc2)[0], (1, 2, 3), 5) + self.assertAlmostEqual(tuple(loc2)[1], rot_angles, 5) loc3 = Location(loc2) - np.testing.assert_allclose(loc3.to_tuple()[0], (1, 2, 3), 1e-6) - np.testing.assert_allclose(loc3.to_tuple()[1], rot_angles, 1e-6) + self.assertAlmostEqual(tuple(loc3)[0], (1, 2, 3), 5) + self.assertAlmostEqual(tuple(loc3)[1], rot_angles, 5) def test_location_kwarg_parameters(self): loc = Location(position=(10, 20, 30)) From 560a5369b718242d7b8d547e1a00e4519e40aac1 Mon Sep 17 00:00:00 2001 From: gumyr Date: Tue, 27 May 2025 14:38:21 -0400 Subject: [PATCH 27/56] Convert Shape methods to properties: is_null, is_valid, shape_type --- src/build123d/operations_part.py | 4 +- src/build123d/topology/shape_core.py | 61 +++++++++------------ src/build123d/topology/three_d.py | 8 +-- src/build123d/topology/two_d.py | 8 +-- tests/test_build_generic.py | 4 +- tests/test_direct_api/test_compound.py | 4 +- tests/test_direct_api/test_face.py | 10 ++-- tests/test_direct_api/test_import_export.py | 4 +- tests/test_direct_api/test_mixin3_d.py | 12 ++-- tests/test_direct_api/test_shape.py | 12 ++-- tests/test_direct_api/test_shells.py | 8 +-- tests/test_direct_api/test_solid.py | 2 +- tests/test_direct_api/test_wire.py | 16 +++--- tests/test_mesher.py | 4 +- 14 files changed, 75 insertions(+), 82 deletions(-) diff --git a/src/build123d/operations_part.py b/src/build123d/operations_part.py index 2fc2126..7a196f7 100644 --- a/src/build123d/operations_part.py +++ b/src/build123d/operations_part.py @@ -304,11 +304,11 @@ def loft( new_solid = Solid.make_loft(loft_wires, ruled) # Try to recover an invalid loft - if not new_solid.is_valid(): + if not new_solid.is_valid: new_solid = Solid(Shell(new_solid.faces() + section_list)) if clean: new_solid = new_solid.clean() - if not new_solid.is_valid(): + if not new_solid.is_valid: raise RuntimeError("Failed to create valid loft") if context is not None: diff --git a/src/build123d/topology/shape_core.py b/src/build123d/topology/shape_core.py index fda2700..52377b6 100644 --- a/src/build123d/topology/shape_core.py +++ b/src/build123d/topology/shape_core.py @@ -422,6 +422,14 @@ class Shape(NodeMixin, Generic[TOPODS]): return True + @property + def is_null(self) -> bool: + """Returns true if this shape is null. In other words, it references no + underlying shape with the potential to be given a location and an + orientation. + """ + return self.wrapped is None or self.wrapped.IsNull() + @property def is_planar_face(self) -> bool: """Is the shape a planar face even though its geom_type may not be PLANE""" @@ -431,6 +439,18 @@ class Shape(NodeMixin, Generic[TOPODS]): is_face_planar = GeomLib_IsPlanarSurface(surface, TOLERANCE) return is_face_planar.IsPlanar() + @property + def is_valid(self) -> bool: + """Returns True if no defect is detected on the shape S or any of its + subshapes. See the OCCT docs on BRepCheck_Analyzer::IsValid for a full + description of what is checked. + """ + if self.wrapped is None: + return True + chk = BRepCheck_Analyzer(self.wrapped) + chk.SetParallel(True) + return chk.IsValid() + @property def location(self) -> Location | None: """Get this Shape's Location""" @@ -543,6 +563,11 @@ class Shape(NodeMixin, Generic[TOPODS]): (Vector(principal_props.ThirdAxisOfInertia()), principal_moments[2]), ] + @property + def shape_type(self) -> Shapes: + """Return the shape type string for this class""" + return tcast(Shapes, Shape.shape_LUT[shapetype(self.wrapped)]) + @property def static_moments(self) -> tuple[float, float, float]: """ @@ -1188,7 +1213,7 @@ class Shape(NodeMixin, Generic[TOPODS]): """fix - try to fix shape if not valid""" if self.wrapped is None: return self - if not self.is_valid(): + if not self.is_valid: shape_copy: Shape = copy.deepcopy(self, None) shape_copy.wrapped = tcast(TOPODS, fix(self.wrapped)) @@ -1332,7 +1357,7 @@ class Shape(NodeMixin, Generic[TOPODS]): return None if ( not isinstance(shape_intersections, ShapeList) - and shape_intersections.is_null() + and shape_intersections.is_null ): return None return shape_intersections @@ -1352,18 +1377,6 @@ class Shape(NodeMixin, Generic[TOPODS]): return False return self.wrapped.IsEqual(other.wrapped) - def is_null(self) -> bool: - """Returns true if this shape is null. In other words, it references no - underlying shape with the potential to be given a location and an - orientation. - - Args: - - Returns: - - """ - return self.wrapped is None or self.wrapped.IsNull() - def is_same(self, other: Shape) -> bool: """Returns True if other and this shape are same, i.e. if they share the same TShape with the same Locations. Orientations may differ. Also see @@ -1379,22 +1392,6 @@ class Shape(NodeMixin, Generic[TOPODS]): return False return self.wrapped.IsSame(other.wrapped) - def is_valid(self) -> bool: - """Returns True if no defect is detected on the shape S or any of its - subshapes. See the OCCT docs on BRepCheck_Analyzer::IsValid for a full - description of what is checked. - - Args: - - Returns: - - """ - if self.wrapped is None: - return True - chk = BRepCheck_Analyzer(self.wrapped) - chk.SetParallel(True) - return chk.IsValid() - def locate(self, loc: Location) -> Self: """Apply a location in absolute sense to self @@ -1677,10 +1674,6 @@ class Shape(NodeMixin, Generic[TOPODS]): return self._apply_transform(transformation) - def shape_type(self) -> Shapes: - """Return the shape type string for this class""" - return tcast(Shapes, Shape.shape_LUT[shapetype(self.wrapped)]) - def shell(self) -> Shell | None: """Return the Shell""" return None diff --git a/src/build123d/topology/three_d.py b/src/build123d/topology/three_d.py index b0d86f4..e4131ce 100644 --- a/src/build123d/topology/three_d.py +++ b/src/build123d/topology/three_d.py @@ -259,7 +259,7 @@ class Mixin3D(Shape): try: new_shape = self.__class__(chamfer_builder.Shape()) - if not new_shape.is_valid(): + if not new_shape.is_valid: raise Standard_Failure except (StdFail_NotDone, Standard_Failure) as err: raise ValueError( @@ -343,7 +343,7 @@ class Mixin3D(Shape): try: new_shape = self.__class__(fillet_builder.Shape()) - if not new_shape.is_valid(): + if not new_shape.is_valid: raise Standard_Failure except (StdFail_NotDone, Standard_Failure) as err: raise ValueError( @@ -485,7 +485,7 @@ class Mixin3D(Shape): # Do these numbers work? - if not try with the smaller window try: new_shape = self.__class__(fillet_builder.Shape()) - if not new_shape.is_valid(): + if not new_shape.is_valid: raise fillet_exception except fillet_exception: return __max_fillet(window_min, window_mid, current_iteration + 1) @@ -499,7 +499,7 @@ class Mixin3D(Shape): ) return return_value - if not self.is_valid(): + if not self.is_valid: raise ValueError("Invalid Shape") native_edges = [e.wrapped for e in edge_list] diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index 4bfb5e0..9aad804 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -374,7 +374,7 @@ class Mixin2D(Shape): raise RuntimeError( f"Length error of {length_error:.6f} exceeds tolerance {tolerance}" ) - if not wrapped_edge.is_valid(): + if not wrapped_edge.is_valid: raise RuntimeError("Wrapped edge is invalid") if not snap_to_face: @@ -1016,7 +1016,7 @@ class Face(Mixin2D, Shape[TopoDS_Face]): ) from err surface_face = surface_face.fix() - if not surface_face.is_valid(): + if not surface_face.is_valid: raise RuntimeError("non planar face is invalid") return surface_face @@ -1443,7 +1443,7 @@ class Face(Mixin2D, Shape[TopoDS_Face]): ) from err surface_face = surface_face.fix() - # if not surface_face.is_valid(): + # if not surface_face.is_valid: # raise RuntimeError("non planar face is invalid") return surface_face @@ -2021,7 +2021,7 @@ class Face(Mixin2D, Shape[TopoDS_Face]): # # Part 5: Validate # - if not wrapped_wire.is_valid(): + if not wrapped_wire.is_valid: raise RuntimeError("wrapped wire is not valid") return wrapped_wire diff --git a/tests/test_build_generic.py b/tests/test_build_generic.py index d3248e0..ac02ca5 100644 --- a/tests/test_build_generic.py +++ b/tests/test_build_generic.py @@ -522,7 +522,7 @@ class OffsetTests(unittest.TestCase): def test_face_offset_with_holes(self): sk = Rectangle(100, 100) - GridLocations(80, 80, 2, 2) * Circle(5) sk2 = offset(sk, -5) - self.assertTrue(sk2.face().is_valid()) + self.assertTrue(sk2.face().is_valid) self.assertLess(sk2.area, sk.area) self.assertEqual(len(sk2), 1) @@ -881,7 +881,7 @@ class TestSweep(unittest.TestCase): Rectangle(2 * lip, 2 * lip, align=(Align.CENTER, Align.CENTER)) sweep(sections=sk2.sketch, path=topedgs, mode=Mode.SUBTRACT) - self.assertTrue(p.part.is_valid()) + self.assertTrue(p.part.is_valid) def test_path_error(self): e1 = Edge.make_line((0, 0), (1, 0)) diff --git a/tests/test_direct_api/test_compound.py b/tests/test_direct_api/test_compound.py index e4eb6f2..9f93460 100644 --- a/tests/test_direct_api/test_compound.py +++ b/tests/test_direct_api/test_compound.py @@ -51,10 +51,10 @@ class TestCompound(unittest.TestCase): box1 = Solid.make_box(1, 1, 1) box2 = Solid.make_box(1, 1, 1, Plane((1, 0, 0))) combined = Compound([box1]).fuse(box2, glue=True) - self.assertTrue(combined.is_valid()) + self.assertTrue(combined.is_valid) self.assertAlmostEqual(combined.volume, 2, 5) fuzzy = Compound([box1]).fuse(box2, tol=1e-6) - self.assertTrue(fuzzy.is_valid()) + self.assertTrue(fuzzy.is_valid) self.assertAlmostEqual(fuzzy.volume, 2, 5) def test_remove(self): diff --git a/tests/test_direct_api/test_face.py b/tests/test_direct_api/test_face.py index 162eda2..6e57a55 100644 --- a/tests/test_direct_api/test_face.py +++ b/tests/test_direct_api/test_face.py @@ -65,7 +65,7 @@ class TestFace(unittest.TestCase): bottom_edge = Edge.make_circle(radius=1, end_angle=90) top_edge = Edge.make_circle(radius=1, plane=Plane((0, 0, 1)), end_angle=90) curved = Face.make_surface_from_curves(bottom_edge, top_edge) - self.assertTrue(curved.is_valid()) + self.assertTrue(curved.is_valid) self.assertAlmostEqual(curved.area, math.pi / 2, 5) self.assertAlmostEqual( curved.normal_at(), (math.sqrt(2) / 2, math.sqrt(2) / 2, 0), 5 @@ -74,7 +74,7 @@ class TestFace(unittest.TestCase): bottom_wire = Wire.make_circle(1) top_wire = Wire.make_circle(1, Plane((0, 0, 1))) curved = Face.make_surface_from_curves(bottom_wire, top_wire) - self.assertTrue(curved.is_valid()) + self.assertTrue(curved.is_valid) self.assertAlmostEqual(curved.area, 2 * math.pi, 5) def test_center(self): @@ -303,7 +303,7 @@ class TestFace(unittest.TestCase): for j in range(4 - i % 2) ] cylinder_walls_with_holes = cylinder_wall.make_holes(projected_wires) - self.assertTrue(cylinder_walls_with_holes.is_valid()) + self.assertTrue(cylinder_walls_with_holes.is_valid) self.assertLess(cylinder_walls_with_holes.area, cylinder_wall.area) def test_is_inside(self): @@ -377,7 +377,7 @@ class TestFace(unittest.TestCase): surface_points=[Vector(0, 0, -5)], interior_wires=[hole], ) - self.assertTrue(surface.is_valid()) + self.assertTrue(surface.is_valid) self.assertEqual(surface.geom_type, GeomType.BSPLINE) bbox = surface.bounding_box() self.assertAlmostEqual(bbox.min, (-50.5, -24.5, -5.113393280136395), 5) @@ -877,7 +877,7 @@ class TestFace(unittest.TestCase): with self.assertRaises(RuntimeError): surface.wrap(star.outer_wire(), target) - @patch.object(Wire, "is_valid", return_value=False) + @patch.object(Wire, "is_valid", new_callable=PropertyMock, return_value=False) def test_wrap_invalid_wire(self, mock_is_valid): surface = Cone(5, 2, 10).faces().filter_by(GeomType.PLANE, reverse=True)[0] target = surface.location_at(0.5, 0.5, x_dir=(1, 0, 0)) diff --git a/tests/test_direct_api/test_import_export.py b/tests/test_direct_api/test_import_export.py index 9b22dd5..8f9f29e 100644 --- a/tests/test_direct_api/test_import_export.py +++ b/tests/test_direct_api/test_import_export.py @@ -40,11 +40,11 @@ class TestImportExport(unittest.TestCase): original_box = Solid.make_box(1, 1, 1) export_step(original_box, "test_box.step") step_box = import_step("test_box.step") - self.assertTrue(step_box.is_valid()) + self.assertTrue(step_box.is_valid) self.assertAlmostEqual(step_box.volume, 1, 5) export_brep(step_box, "test_box.brep") brep_box = import_brep("test_box.brep") - self.assertTrue(brep_box.is_valid()) + self.assertTrue(brep_box.is_valid) self.assertAlmostEqual(brep_box.volume, 1, 5) os.remove("test_box.step") os.remove("test_box.brep") diff --git a/tests/test_direct_api/test_mixin3_d.py b/tests/test_direct_api/test_mixin3_d.py index 5e04e7b..1bee8fc 100644 --- a/tests/test_direct_api/test_mixin3_d.py +++ b/tests/test_direct_api/test_mixin3_d.py @@ -27,7 +27,7 @@ license: """ import unittest -from unittest.mock import patch +from unittest.mock import patch, PropertyMock from build123d.build_enums import CenterOf, Kind from build123d.geometry import Axis, Plane @@ -67,7 +67,7 @@ class TestMixin3D(unittest.TestCase): face = box.faces().sort_by(Axis.Z)[0] self.assertRaises(ValueError, box.chamfer, 0.1, None, edge, face=face) - @patch.object(Shape, "is_valid", return_value=False) + @patch.object(Shape, "is_valid", new_callable=PropertyMock, return_value=False) def test_chamfer_invalid_shape_raises_error(self, mock_is_valid): box = Solid.make_box(1, 1, 1) @@ -111,7 +111,7 @@ class TestMixin3D(unittest.TestCase): d = Solid.make_box(1, 1, 1, Plane((-0.5, -0.5, 0))).dprism( None, [f], additive=False ) - self.assertTrue(d.is_valid()) + self.assertTrue(d.is_valid) self.assertAlmostEqual(d.volume, 1 - 0.5**2, 5) # face with depth @@ -119,7 +119,7 @@ class TestMixin3D(unittest.TestCase): d = Solid.make_box(1, 1, 1, Plane((-0.5, -0.5, 0))).dprism( None, [f], depth=0.5, thru_all=False, additive=False ) - self.assertTrue(d.is_valid()) + self.assertTrue(d.is_valid) self.assertAlmostEqual(d.volume, 1 - 0.5**3, 5) # face until @@ -128,7 +128,7 @@ class TestMixin3D(unittest.TestCase): d = Solid.make_box(1, 1, 1, Plane((-0.5, -0.5, 0))).dprism( None, [f], up_to_face=limit, thru_all=False, additive=False ) - self.assertTrue(d.is_valid()) + self.assertTrue(d.is_valid) self.assertAlmostEqual(d.volume, 1 - 0.5**3, 5) # wire @@ -136,7 +136,7 @@ class TestMixin3D(unittest.TestCase): d = Solid.make_box(1, 1, 1, Plane((-0.5, -0.5, 0))).dprism( None, [w], additive=False ) - self.assertTrue(d.is_valid()) + self.assertTrue(d.is_valid) self.assertAlmostEqual(d.volume, 1 - 0.5**2, 5) def test_center(self): diff --git a/tests/test_direct_api/test_shape.py b/tests/test_direct_api/test_shape.py index 76622ac..f159fbb 100644 --- a/tests/test_direct_api/test_shape.py +++ b/tests/test_direct_api/test_shape.py @@ -29,7 +29,7 @@ license: # Always equal to any other object, to test that __eq__ cooperation is working import unittest from random import uniform -from unittest.mock import patch +from unittest.mock import patch, PropertyMock import numpy as np from build123d.build_enums import CenterOf, Keep @@ -100,7 +100,7 @@ class TestShape(unittest.TestCase): Shape.combined_center(objs, center_of=CenterOf.GEOMETRY) def test_shape_type(self): - self.assertEqual(Vertex().shape_type(), "Vertex") + self.assertEqual(Vertex().shape_type, "Vertex") def test_scale(self): self.assertAlmostEqual(Solid.make_box(1, 1, 1).scale(2).volume, 2**3, 5) @@ -109,10 +109,10 @@ class TestShape(unittest.TestCase): box1 = Solid.make_box(1, 1, 1) box2 = Solid.make_box(1, 1, 1, Plane((1, 0, 0))) combined = box1.fuse(box2, glue=True) - self.assertTrue(combined.is_valid()) + self.assertTrue(combined.is_valid) self.assertAlmostEqual(combined.volume, 2, 5) fuzzy = box1.fuse(box2, tol=1e-6) - self.assertTrue(fuzzy.is_valid()) + self.assertTrue(fuzzy.is_valid) self.assertAlmostEqual(fuzzy.volume, 2, 5) def test_faces_intersected_by_axis(self): @@ -245,7 +245,7 @@ class TestShape(unittest.TestCase): # invalid_object = box.fillet(0.75, box.edges()) # invalid_object.max_fillet(invalid_object.edges()) - @patch.object(Shape, "is_valid", return_value=False) + @patch.object(Shape, "is_valid", new_callable=PropertyMock, return_value=False) def test_max_fillet_invalid_shape_raises_error(self, mock_is_valid): box = Solid.make_box(1, 1, 1) @@ -526,7 +526,7 @@ class TestShape(unittest.TestCase): self.assertEqual(hash(empty), 0) self.assertFalse(empty.is_same(Solid())) self.assertFalse(empty.is_equal(Solid())) - self.assertTrue(empty.is_valid()) + self.assertTrue(empty.is_valid) empty_bbox = empty.bounding_box() self.assertEqual(tuple(empty_bbox.size), (0, 0, 0)) self.assertIs(empty, empty.mirror(Plane.XY)) diff --git a/tests/test_direct_api/test_shells.py b/tests/test_direct_api/test_shells.py index 6c9023b..d465433 100644 --- a/tests/test_direct_api/test_shells.py +++ b/tests/test_direct_api/test_shells.py @@ -41,12 +41,12 @@ class TestShells(unittest.TestCase): def test_shell_init(self): box_faces = Solid.make_box(1, 1, 1).faces() box_shell = Shell(box_faces) - self.assertTrue(box_shell.is_valid()) + self.assertTrue(box_shell.is_valid) def test_shell_init_single_face(self): face = Solid.make_cone(1, 0, 2).faces().filter_by(GeomType.CONE).first shell = Shell(face) - self.assertTrue(shell.is_valid()) + self.assertTrue(shell.is_valid) def test_center(self): box_faces = Solid.make_box(1, 1, 1).faces() @@ -71,9 +71,9 @@ class TestShells(unittest.TestCase): x_section = Rot(90) * Spline((0, -5), (-3, -2), (-2, 0), (-3, 2), (0, 5)) surface = sweep(x_section, Circle(5).wire()) single_face = Shell(surface.face()) - self.assertTrue(single_face.is_valid()) + self.assertTrue(single_face.is_valid) single_face = Shell(surface.faces()) - self.assertTrue(single_face.is_valid()) + self.assertTrue(single_face.is_valid) def test_sweep(self): path_c1 = JernArc((0, 0), (-1, 0), 1, 180) diff --git a/tests/test_direct_api/test_solid.py b/tests/test_direct_api/test_solid.py index 640bf31..a0fa0f3 100644 --- a/tests/test_direct_api/test_solid.py +++ b/tests/test_direct_api/test_solid.py @@ -59,7 +59,7 @@ class TestSolid(unittest.TestCase): box = Solid(box_shell) self.assertAlmostEqual(box.area, 6, 5) self.assertAlmostEqual(box.volume, 1, 5) - self.assertTrue(box.is_valid()) + self.assertTrue(box.is_valid) def test_extrude(self): v = Edge.extrude(Vertex(1, 1, 1), (0, 0, 1)) diff --git a/tests/test_direct_api/test_wire.py b/tests/test_direct_api/test_wire.py index 3391b88..51e398e 100644 --- a/tests/test_direct_api/test_wire.py +++ b/tests/test_direct_api/test_wire.py @@ -191,26 +191,26 @@ class TestWire(unittest.TestCase): e1 = Edge.make_line((1, 0), (1, 1)) w0 = Wire.make_circle(1) w1 = Wire(e0) - self.assertTrue(w1.is_valid()) + self.assertTrue(w1.is_valid) w2 = Wire([e0]) self.assertAlmostEqual(w2.length, 1, 5) - self.assertTrue(w2.is_valid()) + self.assertTrue(w2.is_valid) w3 = Wire([e0, e1]) - self.assertTrue(w3.is_valid()) + self.assertTrue(w3.is_valid) self.assertAlmostEqual(w3.length, 2, 5) w4 = Wire(w0.wrapped) - self.assertTrue(w4.is_valid()) + self.assertTrue(w4.is_valid) w5 = Wire(obj=w0.wrapped) - self.assertTrue(w5.is_valid()) + self.assertTrue(w5.is_valid) w6 = Wire(obj=w0.wrapped, label="w6", color=Color("red")) - self.assertTrue(w6.is_valid()) + self.assertTrue(w6.is_valid) self.assertEqual(w6.label, "w6") np.testing.assert_allclose(tuple(w6.color), (1.0, 0.0, 0.0, 1.0), 1e-5) w7 = Wire(w6) - self.assertTrue(w7.is_valid()) + self.assertTrue(w7.is_valid) c0 = Polyline((0, 0), (1, 0), (1, 1)) w8 = Wire(c0) - self.assertTrue(w8.is_valid()) + self.assertTrue(w8.is_valid) with self.assertRaises(ValueError): Wire(bob="fred") diff --git a/tests/test_mesher.py b/tests/test_mesher.py index 65edaff..0be4ccb 100644 --- a/tests/test_mesher.py +++ b/tests/test_mesher.py @@ -208,7 +208,7 @@ class TestHollowImport(unittest.TestCase): export_stl(test_shape, "test.stl") importer = Mesher() stl = importer.read("test.stl") - self.assertTrue(stl[0].is_valid()) + self.assertTrue(stl[0].is_valid) class TestImportDegenerateTriangles(unittest.TestCase): @@ -221,7 +221,7 @@ class TestImportDegenerateTriangles(unittest.TestCase): stl = importer.read("cyl_w_rect_hole.stl")[0] self.assertEqual(type(stl), Solid) self.assertTrue(stl.is_manifold) - self.assertTrue(stl.is_valid()) + self.assertTrue(stl.is_valid) self.assertEqual(sum(f.area == 0 for f in stl.faces()), 0) From ffc97ef6f0f7e60f23909391300806d5190e20ea Mon Sep 17 00:00:00 2001 From: gumyr Date: Tue, 27 May 2025 15:35:34 -0400 Subject: [PATCH 28/56] Deprecating Shape.relocate Issue #768 --- src/build123d/topology/shape_core.py | 6 ++++++ tests/test_direct_api/test_shape.py | 28 ++++++++++++++-------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/build123d/topology/shape_core.py b/src/build123d/topology/shape_core.py index 52377b6..a7abb07 100644 --- a/src/build123d/topology/shape_core.py +++ b/src/build123d/topology/shape_core.py @@ -1623,6 +1623,12 @@ class Shape(NodeMixin, Generic[TOPODS]): Args: loc (Location): new location to set for self """ + warnings.warn( + "The 'relocate' method is deprecated and will be removed in a future version." + "Use move, moved, locate, or located instead", + DeprecationWarning, + stacklevel=2, + ) if self.wrapped is None: raise ValueError("Cannot relocate an empty shape") if loc.wrapped is None: diff --git a/tests/test_direct_api/test_shape.py b/tests/test_direct_api/test_shape.py index f159fbb..715680b 100644 --- a/tests/test_direct_api/test_shape.py +++ b/tests/test_direct_api/test_shape.py @@ -347,19 +347,19 @@ class TestShape(unittest.TestCase): obj = Solid() self.assertIs(obj, obj.clean()) - def test_relocate(self): - box = Solid.make_box(10, 10, 10).move(Location((20, -5, -5))) - cylinder = Solid.make_cylinder(2, 50).move(Location((0, 0, 0), (0, 90, 0))) + # def test_relocate(self): + # box = Solid.make_box(10, 10, 10).move(Location((20, -5, -5))) + # cylinder = Solid.make_cylinder(2, 50).move(Location((0, 0, 0), (0, 90, 0))) - box_with_hole = box.cut(cylinder) - box_with_hole.relocate(box.location) + # box_with_hole = box.cut(cylinder) + # box_with_hole.relocate(box.location) - self.assertEqual(box.location, box_with_hole.location) + # self.assertEqual(box.location, box_with_hole.location) - bbox1 = box.bounding_box() - bbox2 = box_with_hole.bounding_box() - self.assertAlmostEqual(bbox1.min, bbox2.min, 5) - self.assertAlmostEqual(bbox1.max, bbox2.max, 5) + # bbox1 = box.bounding_box() + # bbox2 = box_with_hole.bounding_box() + # self.assertAlmostEqual(bbox1.min, bbox2.min, 5) + # self.assertAlmostEqual(bbox1.max, bbox2.max, 5) def test_project_to_viewport(self): # Basic test @@ -560,10 +560,10 @@ class TestShape(unittest.TestCase): empty.moved(Location()) with self.assertRaises(ValueError): box.moved(empty_loc) - with self.assertRaises(ValueError): - empty.relocate(Location()) - with self.assertRaises(ValueError): - box.relocate(empty_loc) + # with self.assertRaises(ValueError): + # empty.relocate(Location()) + # with self.assertRaises(ValueError): + # box.relocate(empty_loc) with self.assertRaises(ValueError): empty.distance_to(Vector(1, 1, 1)) with self.assertRaises(ValueError): From c5d5f443a662548b83c41b8646b6ca5290f94c8a Mon Sep 17 00:00:00 2001 From: gumyr Date: Wed, 28 May 2025 10:17:10 -0400 Subject: [PATCH 29/56] Fixing _wrap_edge start, add point to _wrap_face Issue #998 --- src/build123d/topology/two_d.py | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index 9aad804..186ec3f 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -338,17 +338,26 @@ class Mixin2D(Shape): loop_count = 0 length_error = sys.float_info.max - while length_error > tolerance and loop_count < max_loops: - # Get starting point and normal - surface_origin = surface_loc.position - surface_normal = surface_loc.z_axis.direction + # Find the location on the surface to start + if planar_edge.position_at(0).length > tolerance: + # The start point isn't at the surface_loc so wrap a line to find it + to_start_edge = Edge.make_line((0, 0), planar_edge @ 0) + wrapped_to_start_edge = self._wrap_edge( + to_start_edge, surface_loc, snap_to_face=True + ) + start_pnt = wrapped_to_start_edge @ 1 + _, start_normal = _intersect_surface_normal( + start_pnt, (start_pnt - target_object_center) + ) + else: + # The start point is at the surface location + start_pnt = surface_loc.position + start_normal = surface_loc.z_axis.direction + while length_error > tolerance and loop_count < max_loops: # Seed the wrapped path wrapped_edge_points: list[VectorLike] = [] - planar_position = planar_edge.position_at(0) - current_point, current_normal = _find_point_on_surface( - surface_origin, surface_normal, planar_position - ) + current_point, current_normal = start_pnt, start_normal wrapped_edge_points.append(current_point) # Subdivide and propagate @@ -1861,7 +1870,9 @@ class Face(Mixin2D, Shape[TopoDS_Face]): for w in planar_face.inner_wires() ] wrapped_face = Face.make_surface( - wrapped_perimeter, interior_wires=wrapped_holes + wrapped_perimeter, + surface_points=[surface_loc.position], + interior_wires=wrapped_holes, ) # Potentially flip the wrapped face to match the surface From ed0ec6175a0c095490b1f66b6836ca000bcb6755 Mon Sep 17 00:00:00 2001 From: Vivek Gani Date: Wed, 28 May 2025 11:57:27 -0500 Subject: [PATCH 30/56] Ensure tolerance is passed to wrap_edge function... In doing some corner-case testing (wrapping a long ellipse around a cylinder), I noticed an exception regarding tolerance came up and was referencing the default tolerance of 0.001 rather than a user-set one. --- src/build123d/topology/two_d.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index 186ec3f..a7c5fb1 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -343,7 +343,7 @@ class Mixin2D(Shape): # The start point isn't at the surface_loc so wrap a line to find it to_start_edge = Edge.make_line((0, 0), planar_edge @ 0) wrapped_to_start_edge = self._wrap_edge( - to_start_edge, surface_loc, snap_to_face=True + to_start_edge, surface_loc, snap_to_face=True, tolerance=tolerance ) start_pnt = wrapped_to_start_edge @ 1 _, start_normal = _intersect_surface_normal( From 87048fabc4fc9a105149884823b05c38ad61cc60 Mon Sep 17 00:00:00 2001 From: Jonathan Wagenet Date: Wed, 28 May 2025 14:43:30 -0400 Subject: [PATCH 31/56] ArcArcTangentArc: correct arc in situation where RadiusArc places center on incorrect side to resolve #983 --- src/build123d/objects_curve.py | 14 +++++++++----- tests/test_build_line.py | 9 +++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/build123d/objects_curve.py b/src/build123d/objects_curve.py index 0eaa4b3..ac6bc06 100644 --- a/src/build123d/objects_curve.py +++ b/src/build123d/objects_curve.py @@ -32,7 +32,7 @@ import copy as copy_module from collections.abc import Iterable from math import copysign, cos, radians, sin, sqrt from scipy.optimize import minimize -import sympy # type: ignore +import sympy # type: ignore from build123d.build_common import WorkplaneList, flatten_sequence, validate_inputs from build123d.build_enums import ( @@ -456,7 +456,7 @@ class Helix(BaseEdgeObject): defined by cone_angle. If cone_angle is not 0, radius is the initial helix radius at center. cone_angle > 0 - increases the final radius. cone_angle < 0 decreases the final radius. + increases the final radius. cone_angle < 0 decreases the final radius. Args: pitch (float): distance between loops @@ -1095,9 +1095,7 @@ class PointArcTangentLine(BaseEdgeObject): tangent_point = WorkplaneList.localize(point) if context is None: # Making the plane validates points and arc are coplanar - coplane = Edge.make_line(tangent_point, arc.arc_center).common_plane( - arc - ) + coplane = Edge.make_line(tangent_point, arc.arc_center).common_plane(arc) if coplane is None: raise ValueError("PointArcTangentLine only works on a single plane.") @@ -1478,4 +1476,10 @@ class ArcArcTangentArc(BaseEdgeObject): intersect.reverse() arc = RadiusArc(intersect[0], intersect[1], radius=radius) + + # Check and flip arc if not tangent + _, _, point = start_arc.distance_to_with_closest_points(arc) + if start_arc.tangent_at(point).cross(arc.tangent_at(point)).length > TOLERANCE: + arc = RadiusArc(intersect[0], intersect[1], radius=-radius) + super().__init__(arc, mode) diff --git a/tests/test_build_line.py b/tests/test_build_line.py index b473077..ea5d9b4 100644 --- a/tests/test_build_line.py +++ b/tests/test_build_line.py @@ -729,6 +729,15 @@ class BuildLineTests(unittest.TestCase): self.assertGreater(side_sign * coincident_dir, 0) self.assertGreater(center_dir, 0) + # Verify arc is tangent for a reversed start arc + c1 = CenterArc((0, 80), 40, 0, -180) + c2 = CenterArc((80, 0), 40, 90, 180) + arc = ArcArcTangentArc(c1, c2, 25, side=Side.RIGHT) + _, _, point = c1.distance_to_with_closest_points(arc) + self.assertAlmostEqual( + c1.tangent_at(point).cross(arc.tangent_at(point)).length, 0, 5 + ) + ## Error Handling start_arc = CenterArc(start_point, start_r, 0, 360) end_arc = CenterArc(end_point, end_r, 0, 360) From 2191d0dc6926d0e717dd82b181b15a94b3524039 Mon Sep 17 00:00:00 2001 From: Jonathan Wagenet Date: Sun, 6 Apr 2025 23:42:08 -0400 Subject: [PATCH 32/56] SlotArc: remove duplicated rotation --- src/build123d/objects_sketch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build123d/objects_sketch.py b/src/build123d/objects_sketch.py index 7e15e48..f5ad11f 100644 --- a/src/build123d/objects_sketch.py +++ b/src/build123d/objects_sketch.py @@ -387,7 +387,7 @@ class SlotArc(BaseSketchObject): self.slot_height = height arc = arc if isinstance(arc, Wire) else Wire([arc]) - face = Face(arc.offset_2d(height / 2)).rotate(Axis.Z, rotation) + face = Face(arc.offset_2d(height / 2)) super().__init__(face, rotation, None, mode) From 1e1c81a09364d00259a20f4962835dd535da06f2 Mon Sep 17 00:00:00 2001 From: Jonathan Wagenet Date: Sun, 6 Apr 2025 23:44:45 -0400 Subject: [PATCH 33/56] SlotOverall: remove width != height else branch to make circle. width <= height ValueError makes this branch inaccessible. --- src/build123d/objects_sketch.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/build123d/objects_sketch.py b/src/build123d/objects_sketch.py index f5ad11f..4ad3951 100644 --- a/src/build123d/objects_sketch.py +++ b/src/build123d/objects_sketch.py @@ -521,17 +521,14 @@ class SlotOverall(BaseSketchObject): self.width = width self.slot_height = height - if width != height: - face = Face( - Wire( - [ - Edge.make_line(Vector(-width / 2 + height / 2, 0, 0), Vector()), - Edge.make_line(Vector(), Vector(+width / 2 - height / 2, 0, 0)), - ] - ).offset_2d(height / 2) - ) - else: - face = cast(Face, Circle(width / 2, mode=mode).face()) + face = Face( + Wire( + [ + Edge.make_line(Vector(-width / 2 + height / 2, 0, 0), Vector()), + Edge.make_line(Vector(), Vector(+width / 2 - height / 2, 0, 0)), + ] + ).offset_2d(height / 2) + ) super().__init__(face, rotation, align, mode) From 7dfe461d0838f0d458c9ac6d3da39829ae762d54 Mon Sep 17 00:00:00 2001 From: Jonathan Wagenet Date: Sun, 6 Apr 2025 23:56:37 -0400 Subject: [PATCH 34/56] SlotCenterPoint: change half_line.length validation to resolve #948 --- src/build123d/objects_sketch.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/build123d/objects_sketch.py b/src/build123d/objects_sketch.py index 4ad3951..bfab9e3 100644 --- a/src/build123d/objects_sketch.py +++ b/src/build123d/objects_sketch.py @@ -426,10 +426,10 @@ class SlotCenterPoint(BaseSketchObject): half_line = point_v - center_v - if half_line.length * 2 <= height: + if half_line.length <= 0: raise ValueError( - f"Slots must have width > height. " - "Got: {height=} width={half_line.length * 2} (computed)" + "Distance between center and point must be greater than 0 " + f"Got: distance = {half_line.length} (computed)" ) face = Face( From 811dd569d3bedabe26685f432edc49c1ca8b52be Mon Sep 17 00:00:00 2001 From: Jonathan Wagenet Date: Wed, 28 May 2025 21:57:26 -0400 Subject: [PATCH 35/56] Update SlotCenterPoint ValueError test --- tests/test_build_sketch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_build_sketch.py b/tests/test_build_sketch.py index b2eeb54..58afd7d 100644 --- a/tests/test_build_sketch.py +++ b/tests/test_build_sketch.py @@ -532,7 +532,7 @@ class TestBuildSketchObjects(unittest.TestCase): [ (SlotOverall, (5, 10)), (SlotCenterToCenter, (-1, 10)), - (SlotCenterPoint, ((0, 0, 0), (2, 0, 0), 10)), + (SlotCenterPoint, ((0, 0, 0), (0, 0, 0), 10)), ], ) def test_invalid_slots(slot, args): From 644200f565c675f56e21a0a5ca2e52fc2e3bb053 Mon Sep 17 00:00:00 2001 From: gumyr Date: Fri, 30 May 2025 09:12:48 -0400 Subject: [PATCH 36/56] Fixed misplaced label for vertical dimension lines Issue #915 --- src/build123d/drafting.py | 4 ++-- tests/test_drafting.py | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/build123d/drafting.py b/src/build123d/drafting.py index 18821fa..ea93fd4 100644 --- a/src/build123d/drafting.py +++ b/src/build123d/drafting.py @@ -455,7 +455,7 @@ class DimensionLine(BaseSketchObject): else: self_intersection_area = self_intersection.area d_line += placed_label - bbox_size = d_line.bounding_box().size + bbox_size = d_line.bounding_box().diagonal # Minimize size while avoiding intersections if sketch is None: @@ -469,7 +469,7 @@ class DimensionLine(BaseSketchObject): else: common_area = line_intersection.area common_area += self_intersection_area - score = (d_line.area - 10 * common_area) / bbox_size.X + score = (d_line.area - 10 * common_area) / bbox_size d_lines[d_line] = score # Sort by score to find the best option diff --git a/tests/test_drafting.py b/tests/test_drafting.py index 3d6ab41..1bb97ab 100644 --- a/tests/test_drafting.py +++ b/tests/test_drafting.py @@ -260,6 +260,11 @@ class DimensionLineTestCase(unittest.TestCase): with self.assertRaises(ValueError): DimensionLine([(0, 0, 0), (5, 0, 0)], draft=metric, arrows=(False, False)) + def test_vertical(self): + d_line = DimensionLine([(0, 0), (0, 100)], Draft()) + bbox = d_line.bounding_box() + self.assertAlmostEqual(bbox.size.Y, 100, 5) # numbers within + class ExtensionLineTestCase(unittest.TestCase): def test_min_x(self): From 6b5a2b6f9c1494849376472bfae488959d16ce51 Mon Sep 17 00:00:00 2001 From: gumyr Date: Fri, 30 May 2025 09:25:20 -0400 Subject: [PATCH 37/56] Fix typing problem --- src/build123d/geometry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/build123d/geometry.py b/src/build123d/geometry.py index 81f4075..0404ca4 100644 --- a/src/build123d/geometry.py +++ b/src/build123d/geometry.py @@ -1735,14 +1735,14 @@ class Location: self.location_index = 0 return self - def __next__(self): + def __next__(self) -> Vector: """return the next value""" transformation = self.wrapped.Transformation() trans = transformation.TranslationPart() rot = transformation.GetRotation() rv_trans: Vector = Vector(trans.X(), trans.Y(), trans.Z()) rv_rot: Vector = Vector( - degrees(a) for a in rot.GetEulerAngles(gp_EulerSequence.gp_Intrinsic_XYZ) + *[degrees(a) for a in rot.GetEulerAngles(gp_EulerSequence.gp_Intrinsic_XYZ)] ) # type: ignore[assignment] if self.location_index == 0: self.location_index += 1 From 3f1650d041b953d911392a26a484ff0f866e704a Mon Sep 17 00:00:00 2001 From: gumyr Date: Fri, 30 May 2025 09:53:12 -0400 Subject: [PATCH 38/56] Fixed mypy-1.16.0 typing problems --- src/build123d/build_common.py | 9 ++++++--- src/build123d/build_line.py | 12 ++++++++++-- src/build123d/build_part.py | 12 ++++++++++-- src/build123d/build_sketch.py | 12 ++++++++++-- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/build123d/build_common.py b/src/build123d/build_common.py index 096a9c0..23424c7 100644 --- a/src/build123d/build_common.py +++ b/src/build123d/build_common.py @@ -50,7 +50,7 @@ import functools from abc import ABC, abstractmethod from itertools import product from math import sqrt, cos, pi -from typing import Any, cast, overload, Protocol, Type, TypeVar +from typing import Any, cast, overload, Protocol, Type, TypeVar, Generic from collections.abc import Callable, Iterable from typing_extensions import Self @@ -178,8 +178,11 @@ operations_apply_to = { B = TypeVar("B", bound="Builder") """Builder type hint""" +ShapeT = TypeVar("ShapeT", bound=Shape) +"""Builder's are generic shape creators""" -class Builder(ABC): + +class Builder(ABC, Generic[ShapeT]): """Builder Base class for the build123d Builders. @@ -231,7 +234,7 @@ class Builder(ABC): @property @abstractmethod - def _obj(self) -> Shape: + def _obj(self) -> Shape | None: """Object to pass to parent""" raise NotImplementedError # pragma: no cover diff --git a/src/build123d/build_line.py b/src/build123d/build_line.py index 79c8252..52e9e74 100644 --- a/src/build123d/build_line.py +++ b/src/build123d/build_line.py @@ -36,7 +36,7 @@ from build123d.geometry import Location, Plane from build123d.topology import Curve, Edge, Face -class BuildLine(Builder): +class BuildLine(Builder[Curve]): """BuildLine The BuildLine class is a subclass of Builder for building lines (objects @@ -89,7 +89,15 @@ class BuildLine(Builder): """Set the current line""" self._line = value - _obj = line # Alias _obj to line + @property + def _obj(self) -> Curve | None: + """Alias _obj to line""" + return self._line + + @_obj.setter + def _obj(self, value: Curve) -> None: + """Set the current line""" + self._line = value def __exit__(self, exception_type, exception_value, traceback): """Upon exiting restore context and send object to parent""" diff --git a/src/build123d/build_part.py b/src/build123d/build_part.py index 3120f44..d37bdae 100644 --- a/src/build123d/build_part.py +++ b/src/build123d/build_part.py @@ -37,7 +37,7 @@ from build123d.geometry import Location, Plane from build123d.topology import Edge, Face, Joint, Part, Solid, Wire -class BuildPart(Builder): +class BuildPart(Builder[Part]): """BuildPart The BuildPart class is another subclass of Builder for building parts @@ -80,7 +80,15 @@ class BuildPart(Builder): """Set the current part""" self._part = value - _obj = part # Alias _obj to part + @property + def _obj(self) -> Part | None: + """Alias _obj to part""" + return self._part + + @_obj.setter + def _obj(self, value: Part) -> None: + """Set the current part""" + self._part = value @property def pending_edges_as_wire(self) -> Wire: diff --git a/src/build123d/build_sketch.py b/src/build123d/build_sketch.py index 7509000..496ef4e 100644 --- a/src/build123d/build_sketch.py +++ b/src/build123d/build_sketch.py @@ -36,7 +36,7 @@ from build123d.geometry import Location, Plane from build123d.topology import Compound, Edge, Face, ShapeList, Sketch, Wire -class BuildSketch(Builder): +class BuildSketch(Builder[Sketch]): """BuildSketch The BuildSketch class is a subclass of Builder for building planar 2D @@ -83,7 +83,15 @@ class BuildSketch(Builder): """Set the builder's object""" self._sketch_local = value - _obj = sketch_local # Alias _obj to sketch_local + @property + def _obj(self) -> Sketch | None: + """Alias _obj to sketch""" + return self._sketch_local + + @_obj.setter + def _obj(self, value: Sketch) -> None: + """Set the current sketch""" + self._sketch_local = value @property def sketch(self): From b74f8023a3e92fbe790b2ef73b2068269002383e Mon Sep 17 00:00:00 2001 From: gumyr Date: Fri, 30 May 2025 10:46:49 -0400 Subject: [PATCH 39/56] Fixed more mypy-1.16.0 typing problems --- src/build123d/build_common.py | 38 ++++++++++++++++------------- src/build123d/operations_generic.py | 30 ++++++++++++++--------- tests/test_build_common.py | 2 +- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/build123d/build_common.py b/src/build123d/build_common.py index 23424c7..e5edde3 100644 --- a/src/build123d/build_common.py +++ b/src/build123d/build_common.py @@ -251,6 +251,8 @@ class Builder(ABC, Generic[ShapeT]): @property def new_edges(self) -> ShapeList[Edge]: """Edges that changed during last operation""" + if self._obj is None: + return ShapeList() before_list = [] if self.obj_before is None else [self.obj_before] return new_edges(*(before_list + self.to_combine), combined=self._obj) @@ -538,7 +540,8 @@ class Builder(ABC, Generic[ShapeT]): """ vertex_list: list[Vertex] = [] if select == Select.ALL: - for obj_edge in self._obj.edges(): + obj_edges = [] if self._obj is None else self._obj.edges() + for obj_edge in obj_edges: vertex_list.extend(obj_edge.vertices()) elif select == Select.LAST: vertex_list = self.lasts[Vertex] @@ -582,7 +585,7 @@ class Builder(ABC, Generic[ShapeT]): ShapeList[Edge]: Edges extracted """ if select == Select.ALL: - edge_list = self._obj.edges() + edge_list = ShapeList() if self._obj is None else self._obj.edges() elif select == Select.LAST: edge_list = self.lasts[Edge] elif select == Select.NEW: @@ -625,7 +628,7 @@ class Builder(ABC, Generic[ShapeT]): ShapeList[Wire]: Wires extracted """ if select == Select.ALL: - wire_list = self._obj.wires() + wire_list = ShapeList() if self._obj is None else self._obj.wires() elif select == Select.LAST: wire_list = Wire.combine(self.lasts[Edge]) elif select == Select.NEW: @@ -668,7 +671,7 @@ class Builder(ABC, Generic[ShapeT]): ShapeList[Face]: Faces extracted """ if select == Select.ALL: - face_list = self._obj.faces() + face_list = ShapeList() if self._obj is None else self._obj.faces() elif select == Select.LAST: face_list = self.lasts[Face] elif select == Select.NEW: @@ -711,7 +714,7 @@ class Builder(ABC, Generic[ShapeT]): ShapeList[Solid]: Solids extracted """ if select == Select.ALL: - solid_list = self._obj.solids() + solid_list = ShapeList() if self._obj is None else self._obj.solids() elif select == Select.LAST: solid_list = self.lasts[Solid] elif select == Select.NEW: @@ -748,17 +751,18 @@ class Builder(ABC, Generic[ShapeT]): ) -> ShapeList: """Extract Shapes""" obj_type = self._shape if obj_type is None else obj_type + if self._obj is None: + return ShapeList() + if obj_type == Vertex: - result = self._obj.vertices() - elif obj_type == Edge: - result = self._obj.edges() - elif obj_type == Face: - result = self._obj.faces() - elif obj_type == Solid: - result = self._obj.solids() - else: - result = None - return result + return self._obj.vertices() + if obj_type == Edge: + return self._obj.edges() + if obj_type == Face: + return self._obj.faces() + if obj_type == Solid: + return self._obj.solids() + return ShapeList() def validate_inputs( self, validating_class, objects: Shape | Iterable[Shape] | None = None @@ -1381,8 +1385,8 @@ def __gen_context_component_getter( @functools.wraps(func) def getter(select: Select = Select.ALL) -> T2: # Retrieve the current Builder context based on the method name - context = Builder._get_context(func.__name__) - if not context: + context: Builder | None = Builder._get_context(func.__name__) + if context is None: raise RuntimeError( f"{func.__name__}() requires a Builder context to be in scope" ) diff --git a/src/build123d/operations_generic.py b/src/build123d/operations_generic.py index 9fd524b..69d75cc 100644 --- a/src/build123d/operations_generic.py +++ b/src/build123d/operations_generic.py @@ -119,11 +119,11 @@ def add( ( obj.unwrap(fully=False) if isinstance(obj, Compound) - else obj._obj if isinstance(obj, Builder) else obj + else obj._obj if isinstance(obj, Builder) and obj._obj is not None else obj ) for obj in object_list + if not (isinstance(obj, Builder) and obj._obj is None) ] - validate_inputs(context, "add", object_iter) if isinstance(context, BuildPart): @@ -364,11 +364,14 @@ def chamfer( return new_sketch if target._dim == 1: - target = ( - Wire(target.wrapped) - if isinstance(target, BaseLineObject) - else target.wires()[0] - ) + if isinstance(target, BaseLineObject): + if target.wrapped is None: + target = Wire([]) # empty wire + else: + target = Wire(target.wrapped) + else: + target = target.wires()[0] + if not all([isinstance(obj, Vertex) for obj in object_list]): raise ValueError("1D fillet operation takes only Vertices") # Remove any end vertices as these can't be filleted @@ -461,11 +464,14 @@ def fillet( return new_sketch if target._dim == 1: - target = ( - Wire(target.wrapped) - if isinstance(target, BaseLineObject) - else target.wires()[0] - ) + if isinstance(target, BaseLineObject): + if target.wrapped is None: + target = Wire([]) # empty wire + else: + target = Wire(target.wrapped) + else: + target = target.wires()[0] + if not all([isinstance(obj, Vertex) for obj in object_list]): raise ValueError("1D fillet operation takes only Vertices") # Remove any end vertices as these can't be filleted diff --git a/tests/test_build_common.py b/tests/test_build_common.py index 922b041..419e433 100644 --- a/tests/test_build_common.py +++ b/tests/test_build_common.py @@ -690,7 +690,7 @@ class TestShapeList(unittest.TestCase): def test_shapes(self): with BuildPart() as test: Box(1, 1, 1) - self.assertIsNone(test._shapes(Compound)) + self.assertEqual(test._shapes(Compound), []) def test_operators(self): with BuildPart() as test: From 6aaadd12a4cccc8b181144ce409d00623a82a312 Mon Sep 17 00:00:00 2001 From: gumyr Date: Sat, 31 May 2025 09:41:50 -0400 Subject: [PATCH 40/56] Adding example of making many holes --- docs/assets/examples/fast_grid_holes.png | Bin 0 -> 54056 bytes docs/examples_1.rst | 31 +++++++++++ examples/fast_grid_holes.py | 65 +++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 docs/assets/examples/fast_grid_holes.png create mode 100644 examples/fast_grid_holes.py diff --git a/docs/assets/examples/fast_grid_holes.png b/docs/assets/examples/fast_grid_holes.png new file mode 100644 index 0000000000000000000000000000000000000000..f402e154b9079e162fec5072bd00d4a4d9e6d70d GIT binary patch literal 54056 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 NJzf1=);T3K0RYYtnc4sV literal 0 HcmV?d00001 diff --git a/docs/examples_1.rst b/docs/examples_1.rst index 3de1337..364c2fb 100644 --- a/docs/examples_1.rst +++ b/docs/examples_1.rst @@ -49,6 +49,11 @@ Most of the examples show the builder and algebra modes. :link: clock_face :link-type: ref + .. grid-item-card:: Fast Grid Holes |Algebra| + :img-top: assets/examples/fast_grid_holes.png + :link: fast_grid_holes + :link-type: ref + .. grid-item-card:: Handle |Builder| |Algebra| :img-top: assets/examples/handle.png :link: handle @@ -325,6 +330,32 @@ a detailed and visually appealing clock design. :class:`~build_common.PolarLocations` are used to position features on the clock face. +.. _fast_grid_holes: + +Fast Grid Holes +--------------- +.. image:: assets/examples/fast_grid_holes.png + :align: center + +.. dropdown:: |Algebra| Reference Implementation (Algebra Mode) + + .. literalinclude:: ../examples/fast_grid_holes.py + :start-after: [Code] + :end-before: [End] + +This example demonstrates an efficient approach to creating a large number of holes +(625 in this case) in a planar part using build123d. + +Instead of modeling and subtracting 3D solids for each hole—which is computationally +expensive—this method constructs a 2D Face from an outer perimeter wire and a list of +hole wires. The entire face is then extruded in a single operation to form the final +3D object. This approach significantly reduces modeling time and complexity. + +The hexagonal hole pattern is generated using HexLocations, and each location is +populated with a hexagonal wire. These wires are passed directly to the Face constructor +as holes. On a typical Linux laptop, this script completes in approximately 1.02 seconds, +compared to substantially longer runtimes for boolean subtraction of individual holes in 3D. + .. _handle: diff --git a/examples/fast_grid_holes.py b/examples/fast_grid_holes.py new file mode 100644 index 0000000..1d6ca82 --- /dev/null +++ b/examples/fast_grid_holes.py @@ -0,0 +1,65 @@ +""" +A fast way to make many holes. + +name: fast_grid_holes.py +by: Gumyr +date: May 31, 2025 + +desc: + + This example demonstrates an efficient approach to creating a large number of holes + (625 in this case) in a planar part using build123d. + + Instead of modeling and subtracting 3D solids for each hole—which is computationally + expensive—this method constructs a 2D Face from an outer perimeter wire and a list of + hole wires. The entire face is then extruded in a single operation to form the final + 3D object. This approach significantly reduces modeling time and complexity. + + The hexagonal hole pattern is generated using HexLocations, and each location is + populated with a hexagonal wire. These wires are passed directly to the Face constructor + as holes. On a typical Linux laptop, this script completes in approximately 1.02 seconds, + compared to substantially longer runtimes for boolean subtraction of individual holes in 3D. + +license: + + Copyright 2025 Gumyr + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +""" + +# [Code] +import timeit +from build123d import * +from ocp_vscode import show + +start_time = timeit.default_timer() + +# Calculate the locations of 625 holes +major_r = 10 +hole_locs = HexLocations(major_r, 25, 25) + +# Create wires for both the perimeter and all the holes +face_perimeter = Rectangle(500, 600).wire() +hex_hole = RegularPolygon(major_r - 1, 6, major_radius=True).wire() +holes = hole_locs * hex_hole + +# Create a new Face from the perimeter and hole wires +grid_pattern = Face(face_perimeter, holes) + +# Extrude to a 3D part +grid = extrude(grid_pattern, 1) + +print(f"Time: {timeit.default_timer() - start_time:0.3f}s") +show(grid) +# [End] From b25b330c9b2eadc70c90241ed83deba1dd584652 Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 1 Jun 2025 19:51:29 -0400 Subject: [PATCH 41/56] Adding global_location property --- src/build123d/topology/shape_core.py | 69 +++++++++++++++++----------- tests/test_direct_api/test_shape.py | 57 ++++++++++++++++++++++- 2 files changed, 98 insertions(+), 28 deletions(-) diff --git a/src/build123d/topology/shape_core.py b/src/build123d/topology/shape_core.py index a7abb07..ddd8317 100644 --- a/src/build123d/topology/shape_core.py +++ b/src/build123d/topology/shape_core.py @@ -50,24 +50,27 @@ import copy import itertools import warnings from abc import ABC, abstractmethod +from collections.abc import Callable, Iterable, Iterator +from functools import reduce from typing import ( - cast as tcast, + TYPE_CHECKING, Any, Generic, + Literal, Optional, Protocol, SupportsIndex, TypeVar, Union, - overload, - TYPE_CHECKING, ) - -from collections.abc import Callable, Iterable, Iterator +from typing import cast as tcast +from typing import overload import OCP.GeomAbs as ga import OCP.TopAbs as ta -from IPython.lib.pretty import pretty, RepresentationPrinter +from anytree import NodeMixin, RenderTree +from IPython.lib.pretty import RepresentationPrinter, pretty +from OCP.Bnd import Bnd_Box, Bnd_OBB from OCP.BOPAlgo import BOPAlgo_GlueEnum from OCP.BRep import BRep_Tool from OCP.BRepAdaptor import BRepAdaptor_Curve, BRepAdaptor_Surface @@ -98,11 +101,12 @@ from OCP.BRepGProp import BRepGProp, BRepGProp_Face from OCP.BRepIntCurveSurface import BRepIntCurveSurface_Inter from OCP.BRepMesh import BRepMesh_IncrementalMesh from OCP.BRepTools import BRepTools -from OCP.Bnd import Bnd_Box, Bnd_OBB -from OCP.GProp import GProp_GProps +from OCP.gce import gce_MakeLin from OCP.Geom import Geom_Line from OCP.GeomAPI import GeomAPI_ProjectPointOnSurf from OCP.GeomLib import GeomLib_IsPlanarSurface +from OCP.gp import gp_Ax1, gp_Ax2, gp_Ax3, gp_Dir, gp_Pnt, gp_Trsf, gp_Vec +from OCP.GProp import GProp_GProps from OCP.ShapeAnalysis import ShapeAnalysis_Curve from OCP.ShapeCustom import ShapeCustom, ShapeCustom_RestrictionParameters from OCP.ShapeFix import ShapeFix_Shape @@ -110,26 +114,25 @@ from OCP.ShapeUpgrade import ShapeUpgrade_UnifySameDomain from OCP.TopAbs import TopAbs_Orientation, TopAbs_ShapeEnum from OCP.TopExp import TopExp, TopExp_Explorer from OCP.TopLoc import TopLoc_Location -from OCP.TopTools import ( - TopTools_IndexedDataMapOfShapeListOfShape, - TopTools_ListOfShape, - TopTools_SequenceOfShape, -) from OCP.TopoDS import ( TopoDS, TopoDS_Compound, + TopoDS_Edge, TopoDS_Face, TopoDS_Iterator, TopoDS_Shape, TopoDS_Shell, TopoDS_Solid, TopoDS_Vertex, - TopoDS_Edge, TopoDS_Wire, ) -from OCP.gce import gce_MakeLin -from OCP.gp import gp_Ax1, gp_Ax2, gp_Ax3, gp_Dir, gp_Pnt, gp_Trsf, gp_Vec -from anytree import NodeMixin, RenderTree +from OCP.TopTools import ( + TopTools_IndexedDataMapOfShapeListOfShape, + TopTools_ListOfShape, + TopTools_SequenceOfShape, +) +from typing_extensions import Self + from build123d.build_enums import CenterOf, GeomType, Keep, SortBy, Transition from build123d.geometry import ( DEG2RAD, @@ -145,19 +148,16 @@ from build123d.geometry import ( VectorLike, logger, ) -from typing_extensions import Self - -from typing import Literal - if TYPE_CHECKING: # pragma: no cover - from .zero_d import Vertex # pylint: disable=R0801 - from .one_d import Edge, Wire # pylint: disable=R0801 - from .two_d import Face, Shell # pylint: disable=R0801 - from .three_d import Solid # pylint: disable=R0801 - from .composite import Compound # pylint: disable=R0801 from build123d.build_part import BuildPart # pylint: disable=R0801 + from .composite import Compound # pylint: disable=R0801 + from .one_d import Edge, Wire # pylint: disable=R0801 + from .three_d import Solid # pylint: disable=R0801 + from .two_d import Face, Shell # pylint: disable=R0801 + from .zero_d import Vertex # pylint: disable=R0801 + Shapes = Literal["Vertex", "Edge", "Wire", "Face", "Shell", "Solid", "Compound"] TrimmingTool = Union[Plane, "Shell", "Face"] TOPODS = TypeVar("TOPODS", bound=TopoDS_Shape) @@ -451,6 +451,23 @@ class Shape(NodeMixin, Generic[TOPODS]): chk.SetParallel(True) return chk.IsValid() + @property + def global_location(self) -> Location: + """ + The location of this Shape relative to the global coordinate system. + + This property computes the composite transformation by traversing the + hierarchy from the root of the assembly to this node, combining the + location of each ancestor. It reflects the absolute position and + orientation of the shape in world space, even when the shape is deeply + nested within an assembly. + + Note: + This is only meaningful when the Shape is part of an assembly tree + where parent-child relationships define relative placements. + """ + return reduce(lambda loc, n: loc * n.location, self.path, Location()) + @property def location(self) -> Location | None: """Get this Shape's Location""" diff --git a/tests/test_direct_api/test_shape.py b/tests/test_direct_api/test_shape.py index 715680b..3646fb2 100644 --- a/tests/test_direct_api/test_shape.py +++ b/tests/test_direct_api/test_shape.py @@ -29,9 +29,10 @@ license: # Always equal to any other object, to test that __eq__ cooperation is working import unittest from random import uniform -from unittest.mock import patch, PropertyMock +from unittest.mock import PropertyMock, patch import numpy as np +from anytree import PreOrderIter from build123d.build_enums import CenterOf, Keep from build123d.geometry import ( Axis, @@ -43,7 +44,7 @@ from build123d.geometry import ( Rotation, Vector, ) -from build123d.objects_part import Box, Cylinder +from build123d.objects_part import Box, Cone, Cylinder, Sphere from build123d.objects_sketch import Circle from build123d.operations_part import extrude from build123d.topology import ( @@ -615,5 +616,57 @@ class TestShape(unittest.TestCase): self.assertIsNone(Vertex(1, 1, 1).compound()) +class TestGlobalLocation(unittest.TestCase): + def test_global_location_hierarchy(self): + # Create a hierarchy: root → child → grandchild + root = Box(1, 1, 1) + root.location = Location((10, 0, 0)) + + child = Box(1, 1, 1) + child.location = Location((0, 20, 0)) + child.parent = root + + grandchild = Box(1, 1, 1) + grandchild.location = Location((0, 0, 30)) + grandchild.parent = child + + # Compute expected global location manually + expected_location = root.location * child.location * grandchild.location + + self.assertAlmostEqual( + grandchild.global_location.position, expected_location.position + ) + self.assertAlmostEqual( + grandchild.global_location.orientation, expected_location.orientation + ) + + def test_global_location_in_assembly(self): + cone = Cone(2, 1, 3) + cone.label = "Cone" + box = Box(1, 2, 3) + box.label = "Box" + sphere = Sphere(1) + sphere.label = "Sphere" + + assembly1 = Compound(label="Assembly1", children=[cone]) + assembly1.move(Location((3, 3, 3), (90, 0, 0))) + assembly2 = Compound(label="Assembly2", children=[assembly1, box]) + assembly2.move(Location((2, 4, 6), (0, 0, 90))) + assembly3 = Compound(label="Assembly3", children=[assembly2, sphere]) + assembly3.move(Location((3, 6, 9))) + deep_shape: Shape = next( + iter(PreOrderIter(assembly3, filter_=lambda n: n.label in ("Cone"))) + ) + print(deep_shape.path) + self.assertAlmostEqual( + deep_shape.global_location.position, (2, 13, 18), places=6 + ) + self.assertAlmostEqual( + deep_shape.global_location.orientation, (0, 90, 90), places=6 + ) + + +from ocp_vscode import show + if __name__ == "__main__": unittest.main() From 10a3a2519d7083193b94593940f23f3f947056c1 Mon Sep 17 00:00:00 2001 From: gumyr Date: Mon, 2 Jun 2025 14:25:58 -0400 Subject: [PATCH 42/56] Adding Face.location_at(point) --- src/build123d/topology/two_d.py | 143 +++++++++++++++++++++++++---- tests/test_direct_api/test_face.py | 31 +++++++ 2 files changed, 154 insertions(+), 20 deletions(-) diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index a7c5fb1..5065c14 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -325,6 +325,9 @@ class Mixin2D(Shape): world_point, world_point - target_object_center ) + if self.wrapped is None: + raise ValueError("Can't wrap around an empty face") + # Initial setup target_object_center = self.center(CenterOf.BOUNDING_BOX) @@ -383,7 +386,7 @@ class Mixin2D(Shape): raise RuntimeError( f"Length error of {length_error:.6f} exceeds tolerance {tolerance}" ) - if not wrapped_edge.is_valid: + if wrapped_edge.wrapped is None or not wrapped_edge.is_valid: raise RuntimeError("Wrapped edge is invalid") if not snap_to_face: @@ -529,10 +532,12 @@ class Face(Mixin2D, Shape[TopoDS_Face]): return None if self.geom_type == GeomType.CYLINDER: - return Axis(self.geom_adaptor().Cylinder().Axis()) + return Axis( + self.geom_adaptor().Cylinder().Axis() # type:ignore[attr-defined] + ) if self.geom_type == GeomType.TORUS: - return Axis(self.geom_adaptor().Torus().Axis()) + return Axis(self.geom_adaptor().Torus().Axis()) # type:ignore[attr-defined] return None @@ -790,8 +795,8 @@ class Face(Mixin2D, Shape[TopoDS_Face]): """Return the major and minor radii of a torus otherwise None""" if self.geom_type == GeomType.TORUS: return ( - self.geom_adaptor().MajorRadius(), - self.geom_adaptor().MinorRadius(), + self.geom_adaptor().MajorRadius(), # type:ignore[attr-defined] + self.geom_adaptor().MinorRadius(), # type:ignore[attr-defined] ) return None @@ -803,7 +808,7 @@ class Face(Mixin2D, Shape[TopoDS_Face]): self.geom_type in [GeomType.CYLINDER, GeomType.SPHERE] and type(self.geom_adaptor()) != Geom_RectangularTrimmedSurface ): - return self.geom_adaptor().Radius() + return self.geom_adaptor().Radius() # type:ignore[attr-defined] else: return None @@ -841,6 +846,8 @@ class Face(Mixin2D, Shape[TopoDS_Face]): Returns: Face: extruded shape """ + if obj.wrapped is None: + raise ValueError("Can't extrude empty object") return Face(TopoDS.Face_s(_extrude_topods_shape(obj.wrapped, direction))) @classmethod @@ -987,11 +994,13 @@ class Face(Mixin2D, Shape[TopoDS_Face]): raise ValueError("exterior must be a Wire or list of Edges") for edge in outside_edges: + if edge.wrapped is None: + raise ValueError("exterior contains empty edges") surface.Add(edge.wrapped, GeomAbs_C0) try: surface.Build() - surface_face = Face(surface.Shape()) + surface_face = Face(surface.Shape()) # type:ignore[call-overload] except ( Standard_Failure, StdFail_NotDone, @@ -1006,7 +1015,7 @@ class Face(Mixin2D, Shape[TopoDS_Face]): surface.Add(gp_Pnt(*point)) try: surface.Build() - surface_face = Face(surface.Shape()) + surface_face = Face(surface.Shape()) # type:ignore[call-overload] except StdFail_NotDone as err: raise RuntimeError( "Error building non-planar face with provided surface_points" @@ -1016,6 +1025,8 @@ class Face(Mixin2D, Shape[TopoDS_Face]): if interior_wires: makeface_object = BRepBuilderAPI_MakeFace(surface_face.wrapped) for wire in interior_wires: + if wire.wrapped is None: + raise ValueError("interior_wires contain an empty wire") makeface_object.Add(wire.wrapped) try: surface_face = Face(makeface_object.Face()) @@ -1167,7 +1178,7 @@ class Face(Mixin2D, Shape[TopoDS_Face]): True, ) - return cls(revol_builder.Shape()) + return cls(revol_builder.Shape()) # type:ignore[call-overload] @classmethod def sew_faces(cls, faces: Iterable[Face]) -> list[ShapeList[Face]]: @@ -1198,7 +1209,8 @@ class Face(Mixin2D, Shape[TopoDS_Face]): elif isinstance(top_level_shape, TopoDS_Solid): sewn_faces.append( ShapeList( - Face(f) for f in _topods_entities(top_level_shape, "Face") + Face(f) # type:ignore[call-overload] + for f in _topods_entities(top_level_shape, "Face") ) ) else: @@ -1245,7 +1257,7 @@ class Face(Mixin2D, Shape[TopoDS_Face]): builder.Add(profile.wrapped, False, False) builder.SetTransitionMode(Shape._transModeDict[transition]) builder.Build() - result = Face(builder.Shape()) + result = Face(builder.Shape()) # type:ignore[call-overload] if SkipClean.clean: result = result.clean() @@ -1403,16 +1415,105 @@ class Face(Mixin2D, Shape[TopoDS_Face]): # projector = GeomAPI_ProjectPointOnSurf(Vector(point).to_pnt(), surface) # return projector.LowerDistance() <= TOLERANCE + @overload def location_at( - self, u: float, v: float, x_dir: VectorLike | None = None - ) -> Location: - """Location at the u/v position of face""" - origin = self.position_at(u, v) - if x_dir is None: - pln = Plane(origin, z_dir=self.normal_at(u, v)) + self, + surface_point: VectorLike | None = None, + *, + x_dir: VectorLike | None = None, + ) -> Location: ... + + @overload + def location_at( + self, u: float, v: float, *, x_dir: VectorLike | None = None + ) -> Location: ... + + def location_at(self, *args, **kwargs) -> Location: + """location_at + + Get the location (origin and orientation) on the surface of the face. + + This method supports two overloads: + + 1. `location_at(u: float, v: float, *, x_dir: VectorLike | None = None) -> Location` + - Specifies the point in normalized UV parameter space of the face. + - `u` and `v` are floats between 0.0 and 1.0. + - Optionally override the local X direction using `x_dir`. + + 2. `location_at(surface_point: VectorLike, *, x_dir: VectorLike | None = None) -> Location` + - Projects the given 3D point onto the face surface. + - The point must be reasonably close to the face. + - Optionally override the local X direction using `x_dir`. + + If no arguments are provided, the location at the center of the face + (u=0.5, v=0.5) is returned. + + Args: + u (float): Normalized horizontal surface parameter (optional). + v (float): Normalized vertical surface parameter (optional). + surface_point (VectorLike): A 3D point near the surface (optional). + x_dir (VectorLike, optional): Direction for the local X axis. If not given, + the tangent in the U direction is used. + + Returns: + Location: A full 3D placement at the specified point on the face surface. + + Raises: + ValueError: If only one of `u` or `v` is provided or invalid keyword args are passed. + """ + surface_point, u, v = None, -1.0, -1.0 + + if args: + if isinstance(args[0], (Vector, Sequence)): + surface_point = args[0] + elif isinstance(args[0], (int, float)): + u = args[0] + if len(args) == 2 and isinstance(args[1], (int, float)): + v = args[1] + + unknown_args = set(kwargs.keys()).difference( + {"surface_point", "u", "v", "x_dir"} + ) + if unknown_args: + raise ValueError(f"Unexpected argument(s) {', '.join(unknown_args)}") + + surface_point = kwargs.get("surface_point", surface_point) + u = kwargs.get("u", u) + v = kwargs.get("v", v) + user_x_dir = kwargs.get("x_dir", None) + + if surface_point is None and u < 0 and v < 0: + u, v = 0.5, 0.5 + elif surface_point is None and (u < 0 or v < 0): + raise ValueError("Both u & v values must be specified") + + geom_surface: Geom_Surface = self.geom_adaptor() + u_min, u_max, v_min, v_max = self._uv_bounds() + + if surface_point is None: + u_val = u_min + u * (u_max - u_min) + v_val = v_min + v * (v_max - v_min) else: - pln = Plane(origin, x_dir=Vector(x_dir), z_dir=self.normal_at(u, v)) - return Location(pln) + projector = GeomAPI_ProjectPointOnSurf( + Vector(surface_point).to_pnt(), geom_surface + ) + u_val, v_val = projector.LowerDistanceParameters() + + # Evaluate point and partials + pnt = gp_Pnt() + du = gp_Vec() + dv = gp_Vec() + geom_surface.D1(u_val, v_val, pnt, du, dv) + + origin = Vector(pnt) + z_dir = Vector(du).cross(Vector(dv)).normalized() + x_dir = ( + Vector(user_x_dir).normalized() + if user_x_dir is not None + else Vector(du).normalized() + ) + + return Location(Plane(origin=origin, x_dir=x_dir, z_dir=z_dir)) def make_holes(self, interior_wires: list[Wire]) -> Face: """Make Holes in Face @@ -1609,7 +1710,9 @@ class Face(Mixin2D, Shape[TopoDS_Face]): (extruded_topods_self,), (target_object.wrapped,), BRepAlgoAPI_Common() ) if not topods_shape.IsNull(): - intersected_shapes.append(Face(topods_shape)) + intersected_shapes.append( + Face(topods_shape) # type:ignore[call-overload] + ) else: for target_shell in target_object.shells(): topods_shape = _topods_bool_op( diff --git a/tests/test_direct_api/test_face.py b/tests/test_direct_api/test_face.py index 6e57a55..66971de 100644 --- a/tests/test_direct_api/test_face.py +++ b/tests/test_direct_api/test_face.py @@ -458,6 +458,37 @@ class TestFace(unittest.TestCase): face = Cylinder(1, 1).faces().filter_by(GeomType.CYLINDER)[0] self.assertAlmostEqual(face.normal_at(0, 1), (1, 0, 0), 5) + def test_location_at(self): + face = Face.make_rect(1, 1) + + # Default center (u=0, v=0) + loc = face.location_at(0, 0) + self.assertAlmostEqual(loc.position, (-0.5, -0.5, 0), 5) + self.assertAlmostEqual(loc.z_axis.direction, (0, 0, 1), 5) + + # Using surface_point instead of u,v + point = face.position_at(0, 0) + loc2 = face.location_at(point) + self.assertAlmostEqual(loc2.position, (-0.5, -0.5, 0), 5) + self.assertAlmostEqual(loc2.z_axis.direction, (0, 0, 1), 5) + + # Bad args + with self.assertRaises(ValueError): + face.location_at(0) + with self.assertRaises(ValueError): + face.location_at(center=(0, 0)) + + # Curved surface: verify z-direction is outward normal + face = Cylinder(1, 1).faces().filter_by(GeomType.CYLINDER)[0] + loc3 = face.location_at(0, 1) + self.assertAlmostEqual(loc3.z_axis.direction, (1, 0, 0), 5) + + # Curved surface: verify center + face = Cylinder(1, 1).faces().filter_by(GeomType.CYLINDER)[0] + loc4 = face.location_at() + self.assertAlmostEqual(loc4.position, (-1, 0, 0), 5) + self.assertAlmostEqual(loc4.z_axis.direction, (-1, 0, 0), 5) + def test_without_holes(self): # Planar test frame = (Rectangle(1, 1) - Rectangle(0.5, 0.5)).face() From 3f2d0a445d05dc031a328888420f94af067a3c0c Mon Sep 17 00:00:00 2001 From: gumyr Date: Mon, 2 Jun 2025 14:55:17 -0400 Subject: [PATCH 43/56] Add Shell.location_at(point) --- src/build123d/topology/two_d.py | 22 ++++++++++++++++++++++ tests/test_direct_api/test_shells.py | 7 +++++++ 2 files changed, 29 insertions(+) diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index 5065c14..0524db6 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -2309,6 +2309,28 @@ class Shell(Mixin2D, Shape[TopoDS_Shell]): BRepGProp.LinearProperties_s(self.wrapped, properties) return Vector(properties.CentreOfMass()) + def location_at( + self, + surface_point: VectorLike, + *, + x_dir: VectorLike | None = None, + ) -> Location: + """location_at + + Get the location (origin and orientation) on the surface of the shell. + + Args: + surface_point (VectorLike): A 3D point near the surface. + x_dir (VectorLike, optional): Direction for the local X axis. If not given, + the tangent in the U direction is used. + + Returns: + Location: A full 3D placement at the specified point on the shell surface. + """ + # Find the closest Face and get the location from it + face = self.faces().sort_by(lambda f: f.distance_to(surface_point))[0] + return face.location_at(surface_point, x_dir=x_dir) + def sort_wires_by_build_order(wire_list: list[Wire]) -> list[list[Wire]]: """Tries to determine how wires should be combined into faces. diff --git a/tests/test_direct_api/test_shells.py b/tests/test_direct_api/test_shells.py index d465433..bd81945 100644 --- a/tests/test_direct_api/test_shells.py +++ b/tests/test_direct_api/test_shells.py @@ -116,6 +116,13 @@ class TestShells(unittest.TestCase): outer_vol = 3 * 12 * 7 self.assertAlmostEqual(thick.volume, outer_vol - inner_vol) + def test_location_at(self): + shell = Solid.make_cylinder(1, 2).shell() + top_center = shell.location_at((0, 0, 2)) + self.assertAlmostEqual(top_center.position, (0, 0, 2), 5) + self.assertAlmostEqual(top_center.z_axis.direction, (0, 0, 1), 5) + self.assertAlmostEqual(top_center.x_axis.direction, (1, 0, 0), 5) + if __name__ == "__main__": unittest.main() From 08a901492312d89b23c7ad2e7db64d9ddf76c334 Mon Sep 17 00:00:00 2001 From: gumyr Date: Tue, 3 Jun 2025 19:07:58 -0400 Subject: [PATCH 44/56] Added abstract Mixin2d.location_at --- src/build123d/topology/two_d.py | 46 ++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index 0524db6..db27087 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -58,18 +58,18 @@ from __future__ import annotations import copy import sys import warnings -from typing import Any, overload, TypeVar, TYPE_CHECKING - +from abc import ABC, abstractmethod from collections.abc import Iterable, Sequence +from typing import TYPE_CHECKING, Any, TypeVar, overload import OCP.TopAbs as ta -from OCP.BRep import BRep_Tool, BRep_Builder +from OCP.BRep import BRep_Builder, BRep_Tool from OCP.BRepAdaptor import BRepAdaptor_Surface from OCP.BRepAlgo import BRepAlgo from OCP.BRepAlgoAPI import BRepAlgoAPI_Common from OCP.BRepBuilderAPI import ( - BRepBuilderAPI_MakeFace, BRepBuilderAPI_MakeEdge, + BRepBuilderAPI_MakeFace, BRepBuilderAPI_MakeWire, ) from OCP.BRepClass3d import BRepClass3d_SolidClassifier @@ -80,30 +80,31 @@ from OCP.BRepIntCurveSurface import BRepIntCurveSurface_Inter from OCP.BRepOffsetAPI import BRepOffsetAPI_MakeFilling, BRepOffsetAPI_MakePipeShell from OCP.BRepPrimAPI import BRepPrimAPI_MakeRevol from OCP.BRepTools import BRepTools, BRepTools_ReShape -from OCP.GProp import GProp_GProps -from OCP.Geom import Geom_BezierSurface, Geom_Surface, Geom_RectangularTrimmedSurface +from OCP.gce import gce_MakeLin +from OCP.Geom import Geom_BezierSurface, Geom_RectangularTrimmedSurface, Geom_Surface +from OCP.GeomAbs import GeomAbs_C0 from OCP.GeomAPI import ( GeomAPI_ExtremaCurveCurve, GeomAPI_PointsToBSplineSurface, GeomAPI_ProjectPointOnSurf, ) -from OCP.GeomAbs import GeomAbs_C0 from OCP.GeomProjLib import GeomProjLib +from OCP.gp import gp_Pnt, gp_Vec +from OCP.GProp import GProp_GProps from OCP.Precision import Precision from OCP.ShapeFix import ShapeFix_Solid, ShapeFix_Wire from OCP.Standard import ( + Standard_ConstructionError, Standard_Failure, Standard_NoSuchObject, - Standard_ConstructionError, ) from OCP.StdFail import StdFail_NotDone -from OCP.TColStd import TColStd_HArray2OfReal from OCP.TColgp import TColgp_HArray2OfPnt +from OCP.TColStd import TColStd_HArray2OfReal from OCP.TopExp import TopExp -from OCP.TopTools import TopTools_IndexedDataMapOfShapeListOfShape, TopTools_ListOfShape from OCP.TopoDS import TopoDS, TopoDS_Face, TopoDS_Shape, TopoDS_Shell, TopoDS_Solid -from OCP.gce import gce_MakeLin -from OCP.gp import gp_Pnt, gp_Vec +from OCP.TopTools import TopTools_IndexedDataMapOfShapeListOfShape, TopTools_ListOfShape +from typing_extensions import Self from build123d.build_enums import CenterOf, GeomType, Keep, SortBy, Transition from build123d.geometry import ( @@ -117,38 +118,36 @@ from build123d.geometry import ( Vector, VectorLike, ) -from typing_extensions import Self -from .one_d import Mixin1D, Edge, Wire +from .one_d import Edge, Mixin1D, Wire from .shape_core import ( Shape, ShapeList, SkipClean, - downcast, - get_top_level_topods_shapes, _sew_topods_faces, - shapetype, _topods_entities, _topods_face_normal_at, + downcast, + get_top_level_topods_shapes, + shapetype, ) from .utils import ( _extrude_topods_shape, - find_max_dimension, _make_loft, _make_topods_face_from_wires, _topods_bool_op, + find_max_dimension, ) from .zero_d import Vertex - if TYPE_CHECKING: # pragma: no cover - from .three_d import Solid # pylint: disable=R0801 from .composite import Compound, Curve # pylint: disable=R0801 + from .three_d import Solid # pylint: disable=R0801 T = TypeVar("T", Edge, Wire, "Face") -class Mixin2D(Shape): +class Mixin2D(ABC, Shape): """Additional methods to add to Face and Shell class""" project_to_viewport = Mixin1D.project_to_viewport @@ -258,6 +257,11 @@ class Mixin2D(Shape): return result + @abstractmethod + def location_at(self, *args: Any, **kwargs: Any) -> Location: + """A location from a face or shell""" + pass + def offset(self, amount: float) -> Self: """Return a copy of self moved along the normal by amount""" return copy.deepcopy(self).moved(Location(self.normal_at() * amount)) From 62ebfb9262f6ec8a7a1d76c36c9103c1629f3862 Mon Sep 17 00:00:00 2001 From: Jonathan Wagenet Date: Wed, 4 Jun 2025 15:50:11 -0400 Subject: [PATCH 45/56] Revert "SlotOverall: remove width != height else branch to make circle. width <= height ValueError makes this branch inaccessible." This reverts commit 1e1c81a09364d00259a20f4962835dd535da06f2. --- src/build123d/objects_sketch.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/build123d/objects_sketch.py b/src/build123d/objects_sketch.py index bfab9e3..d159d1d 100644 --- a/src/build123d/objects_sketch.py +++ b/src/build123d/objects_sketch.py @@ -521,14 +521,17 @@ class SlotOverall(BaseSketchObject): self.width = width self.slot_height = height - face = Face( - Wire( - [ - Edge.make_line(Vector(-width / 2 + height / 2, 0, 0), Vector()), - Edge.make_line(Vector(), Vector(+width / 2 - height / 2, 0, 0)), - ] - ).offset_2d(height / 2) - ) + if width != height: + face = Face( + Wire( + [ + Edge.make_line(Vector(-width / 2 + height / 2, 0, 0), Vector()), + Edge.make_line(Vector(), Vector(+width / 2 - height / 2, 0, 0)), + ] + ).offset_2d(height / 2) + ) + else: + face = cast(Face, Circle(width / 2, mode=mode).face()) super().__init__(face, rotation, align, mode) From 82f65f7bb0020bc4f173717e15efb473a3a6b7ee Mon Sep 17 00:00:00 2001 From: Jonathan Wagenet Date: Wed, 4 Jun 2025 16:29:35 -0400 Subject: [PATCH 46/56] SlotOverall, SlotCenterToCenter: (re)implement and test circle degenerate case --- src/build123d/objects_sketch.py | 27 ++++++++++++++++----------- tests/test_build_sketch.py | 29 ++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/build123d/objects_sketch.py b/src/build123d/objects_sketch.py index d159d1d..a630e29 100644 --- a/src/build123d/objects_sketch.py +++ b/src/build123d/objects_sketch.py @@ -464,7 +464,7 @@ class SlotCenterToCenter(BaseSketchObject): rotation: float = 0, mode: Mode = Mode.ADD, ): - if center_separation <= 0: + if center_separation < 0: raise ValueError( f"Requires center_separation > 0. Got: {center_separation=}" ) @@ -475,14 +475,18 @@ class SlotCenterToCenter(BaseSketchObject): self.center_separation = center_separation self.slot_height = height - face = Face( - Wire( - [ - Edge.make_line(Vector(-center_separation / 2, 0, 0), Vector()), - Edge.make_line(Vector(), Vector(+center_separation / 2, 0, 0)), - ] - ).offset_2d(height / 2) - ) + if center_separation > 0: + face = Face( + Wire( + [ + Edge.make_line(Vector(-center_separation / 2, 0, 0), Vector()), + Edge.make_line(Vector(), Vector(+center_separation / 2, 0, 0)), + ] + ).offset_2d(height / 2) + ) + else: + face = cast(Face, Circle(height / 2, mode=mode).face()) + super().__init__(face, rotation, None, mode) @@ -510,7 +514,7 @@ class SlotOverall(BaseSketchObject): align: Align | tuple[Align, Align] | None = (Align.CENTER, Align.CENTER), mode: Mode = Mode.ADD, ): - if width <= height: + if width < height: raise ValueError( f"Slot requires that width > height. Got: {width=}, {height=}" ) @@ -521,7 +525,7 @@ class SlotOverall(BaseSketchObject): self.width = width self.slot_height = height - if width != height: + if width > height: face = Face( Wire( [ @@ -532,6 +536,7 @@ class SlotOverall(BaseSketchObject): ) else: face = cast(Face, Circle(width / 2, mode=mode).face()) + super().__init__(face, rotation, align, mode) diff --git a/tests/test_build_sketch.py b/tests/test_build_sketch.py index 58afd7d..bb898a0 100644 --- a/tests/test_build_sketch.py +++ b/tests/test_build_sketch.py @@ -328,25 +328,40 @@ class TestBuildSketchObjects(unittest.TestCase): self.assertEqual(s.faces()[0].normal_at(), Vector(0, 0, 1)) def test_slot_center_to_center(self): + height = 2 with BuildSketch() as test: - s = SlotCenterToCenter(4, 2) + s = SlotCenterToCenter(4, height) self.assertEqual(s.center_separation, 4) - self.assertEqual(s.slot_height, 2) + self.assertEqual(s.slot_height, height) self.assertEqual(s.rotation, 0) self.assertEqual(s.mode, Mode.ADD) - self.assertAlmostEqual(test.sketch.area, pi + 4 * 2, 5) + self.assertAlmostEqual(test.sketch.area, pi + 4 * height, 5) self.assertEqual(s.faces()[0].normal_at(), Vector(0, 0, 1)) + # Circle degenerate + s1 = SlotCenterToCenter(0, height) + self.assertTrue(len(s1.edges()) == 1) + self.assertEqual(s1.edge().geom_type, GeomType.CIRCLE) + self.assertAlmostEqual(s1.edge().radius, height / 2) + + def test_slot_overall(self): + height = 2 with BuildSketch() as test: - s = SlotOverall(6, 2) + s = SlotOverall(6, height) self.assertEqual(s.width, 6) - self.assertEqual(s.slot_height, 2) + self.assertEqual(s.slot_height, height) self.assertEqual(s.rotation, 0) self.assertEqual(s.mode, Mode.ADD) - self.assertAlmostEqual(test.sketch.area, pi + 4 * 2, 5) + self.assertAlmostEqual(test.sketch.area, pi + 4 * height, 5) self.assertEqual(s.faces()[0].normal_at(), Vector(0, 0, 1)) + # Circle degenerat + s1 = SlotOverall(2, height) + self.assertTrue(len(s1.edges()) == 1) + self.assertEqual(s1.edge().geom_type, GeomType.CIRCLE) + self.assertAlmostEqual(s1.edge().radius, height / 2) + def test_text(self): with BuildSketch() as test: t = Text("test", 2) @@ -530,7 +545,7 @@ class TestBuildSketchObjects(unittest.TestCase): @pytest.mark.parametrize( "slot,args", [ - (SlotOverall, (5, 10)), + (SlotOverall, (9, 10)), (SlotCenterToCenter, (-1, 10)), (SlotCenterPoint, ((0, 0, 0), (0, 0, 0), 10)), ], From fbc170ebdc3128112512d9473b5b4b26b0d8f109 Mon Sep 17 00:00:00 2001 From: gumyr Date: Tue, 10 Jun 2025 16:34:44 -0400 Subject: [PATCH 47/56] Fixing _ocp_section --- src/build123d/topology/shape_core.py | 28 ++++++------- tests/test_direct_api/test_shape.py | 62 +++++++++++++++++----------- 2 files changed, 49 insertions(+), 41 deletions(-) diff --git a/src/build123d/topology/shape_core.py b/src/build123d/topology/shape_core.py index ddd8317..4ad12e1 100644 --- a/src/build123d/topology/shape_core.py +++ b/src/build123d/topology/shape_core.py @@ -2162,7 +2162,7 @@ class Shape(NodeMixin, Generic[TOPODS]): def _ocp_section( self: Shape, other: Vertex | Edge | Wire | Face - ) -> tuple[list[Vertex], list[Edge]]: + ) -> tuple[ShapeList[Vertex], ShapeList[Edge]]: """_ocp_section Create a BRepAlgoAPI_Section object @@ -2180,38 +2180,34 @@ class Shape(NodeMixin, Generic[TOPODS]): other (Union[Vertex, Edge, Wire, Face]): shape to section with Returns: - tuple[list[Vertex], list[Edge]]: section results + tuple[ShapeList[Vertex], ShapeList[Edge]]: section results """ if self.wrapped is None or other.wrapped is None: - return ([], []) + return (ShapeList(), ShapeList()) - try: - section = BRepAlgoAPI_Section(other.geom_adaptor(), self.wrapped) - except (TypeError, AttributeError): - try: - section = BRepAlgoAPI_Section(self.geom_adaptor(), other.wrapped) - except (TypeError, AttributeError): - return ([], []) - - # Perform the intersection calculation + section = BRepAlgoAPI_Section(self.wrapped, other.wrapped) + section.SetRunParallel(True) + section.Approximation(True) + section.ComputePCurveOn1(True) + section.ComputePCurveOn2(True) section.Build() # Get the resulting shapes from the intersection - intersection_shape = section.Shape() + intersection_shape: TopoDS_Shape = section.Shape() - vertices = [] + vertices: list[Vertex] = [] # Iterate through the intersection shape to find intersection points/edges explorer = TopExp_Explorer(intersection_shape, TopAbs_ShapeEnum.TopAbs_VERTEX) while explorer.More(): vertices.append(self.__class__.cast(downcast(explorer.Current()))) explorer.Next() - edges = [] + edges: ShapeList[Edge] = ShapeList() explorer = TopExp_Explorer(intersection_shape, TopAbs_ShapeEnum.TopAbs_EDGE) while explorer.More(): edges.append(self.__class__.cast(downcast(explorer.Current()))) explorer.Next() - return (vertices, edges) + return (ShapeList(set(vertices)), edges) def _repr_html_(self): """Jupyter 3D representation support""" diff --git a/tests/test_direct_api/test_shape.py b/tests/test_direct_api/test_shape.py index 3646fb2..f31ee32 100644 --- a/tests/test_direct_api/test_shape.py +++ b/tests/test_direct_api/test_shape.py @@ -33,7 +33,7 @@ from unittest.mock import PropertyMock, patch import numpy as np from anytree import PreOrderIter -from build123d.build_enums import CenterOf, Keep +from build123d.build_enums import CenterOf, GeomType, Keep from build123d.geometry import ( Axis, Color, @@ -460,44 +460,56 @@ class TestShape(unittest.TestCase): def test_ocp_section(self): # Vertex verts, edges = Vertex(1, 2, 0)._ocp_section(Vertex(1, 2, 0)) - self.assertListEqual(verts, []) # ? - self.assertListEqual(edges, []) + self.assertEqual(len(verts), 1) + self.assertEqual(len(edges), 0) + self.assertAlmostEqual(Vector(verts[0]), (1, 2, 0), 5) verts, edges = Vertex(1, 2, 0)._ocp_section(Edge.make_line((0, 0), (2, 4))) - self.assertListEqual(verts, []) # ? - self.assertListEqual(edges, []) + self.assertEqual(len(verts), 1) + self.assertEqual(len(edges), 0) + self.assertAlmostEqual(Vector(verts[0]), (1, 2, 0), 5) verts, edges = Vertex(1, 2, 0)._ocp_section(Face.make_rect(5, 5)) - np.testing.assert_allclose(tuple(verts[0]), (1, 2, 0), 1e-5) + self.assertAlmostEqual(Vector(verts[0]), (1, 2, 0), 5) self.assertListEqual(edges, []) verts, edges = Vertex(1, 2, 0)._ocp_section(Face.make_plane(Plane.XY)) - np.testing.assert_allclose(tuple(verts[0]), (1, 2, 0), 1e-5) + self.assertAlmostEqual(Vector(verts[0]), (1, 2, 0), 5) self.assertListEqual(edges, []) - # spline = Spline((-10, 10, -10), (-10, -5, -5), (20, 0, 5)) - # cylinder = Pos(Z=-10) * extrude(Circle(5), 20) - # cylinder2 = (Rot((0, 90, 0)) * cylinder).face() - # pln = Plane.XY - # box1 = Box(10, 10, 10, align=(Align.CENTER, Align.CENTER, Align.MIN)) - # box2 = Pos(Z=-10) * box1 + cylinder = Face.extrude(Edge.make_circle(5, Plane.XY.offset(-10)), (0, 0, 20)) + cylinder2 = Face.extrude(Edge.make_circle(5, Plane.YZ.offset(-10)), (20, 0, 0)) + pln = Plane.XY - # # vertices, edges = ocp_section(spline, Face.make_rect(1e6, 1e6, pln)) - # vertices1, edges1 = spline.ocp_section(Face.make_plane(pln)) - # print(vertices1, edges1) + v_edge = Edge.make_line((-5, 0, -20), (-5, 0, 20)) + vertices1, edges1 = cylinder._ocp_section(v_edge) + vertices1 = ShapeList(vertices1).sort_by(Axis.Z) + self.assertEqual(len(vertices1), 2) - # vertices2, edges2 = cylinder.ocp_section(Face.make_plane(pln)) - # print(vertices2, edges2) + self.assertAlmostEqual(Vector(vertices1[0]), (-5, 0, -10), 5) + self.assertAlmostEqual(Vector(vertices1[1]), (-5, 0, 10), 5) + self.assertEqual(len(edges1), 1) + self.assertAlmostEqual(edges1[0].length, 20, 5) - # vertices3, edges3 = cylinder2.ocp_section(Face.make_plane(pln)) - # print(vertices3, edges3) + vertices2, edges2 = cylinder._ocp_section(Face.make_plane(pln)) + self.assertEqual(len(vertices2), 1) + self.assertEqual(len(edges2), 1) + self.assertAlmostEqual(Vector(vertices2[0]), (5, 0, 0), 5) + self.assertEqual(edges2[0].geom_type, GeomType.CIRCLE) + self.assertAlmostEqual(edges2[0].radius, 5, 5) - # # vertices4, edges4 = cylinder2.ocp_section(cylinder) + vertices4, edges4 = cylinder2._ocp_section(cylinder) + self.assertGreaterEqual(len(vertices4), 0) + self.assertGreaterEqual(len(edges4), 2) + self.assertTrue(all(e.geom_type == GeomType.ELLIPSE for e in edges4)) - # vertices5, edges5 = box1.ocp_section(Face.make_plane(pln)) - # print(vertices5, edges5) + cylinder3 = Cylinder(5, 20).solid() + cylinder4 = Rotation(0, 90, 0) * cylinder3 - # vertices6, edges6 = box1.ocp_section(box2.faces().sort_by(Axis.Z)[-1]) + vertices5, edges5 = cylinder3._ocp_section(cylinder4) + self.assertGreaterEqual(len(vertices5), 0) + self.assertGreaterEqual(len(edges5), 2) + self.assertTrue(all(e.geom_type == GeomType.ELLIPSE for e in edges5)) def test_copy_attributes_to(self): box = Box(1, 1, 1) @@ -657,7 +669,7 @@ class TestGlobalLocation(unittest.TestCase): deep_shape: Shape = next( iter(PreOrderIter(assembly3, filter_=lambda n: n.label in ("Cone"))) ) - print(deep_shape.path) + # print(deep_shape.path) self.assertAlmostEqual( deep_shape.global_location.position, (2, 13, 18), places=6 ) From 02439d3a3628eb775ae46c1bb10d6d264f009448 Mon Sep 17 00:00:00 2001 From: gumyr Date: Thu, 12 Jun 2025 15:23:12 -0400 Subject: [PATCH 48/56] Fixing fillet/chamfer parent id Issue #393 --- src/build123d/topology/shape_core.py | 2 +- tests/test_build_sketch.py | 3 +-- tests/test_direct_api/test_mixin1_d.py | 9 ++++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/build123d/topology/shape_core.py b/src/build123d/topology/shape_core.py index 4ad12e1..84a7c3d 100644 --- a/src/build123d/topology/shape_core.py +++ b/src/build123d/topology/shape_core.py @@ -800,7 +800,7 @@ class Shape(NodeMixin, Generic[TOPODS]): [shape.__class__.cast(i) for i in shape.entities(entity_type)] ) for item in shape_list: - item.topo_parent = shape + item.topo_parent = shape if shape.topo_parent is None else shape.topo_parent return shape_list @staticmethod diff --git a/tests/test_build_sketch.py b/tests/test_build_sketch.py index bb898a0..443d441 100644 --- a/tests/test_build_sketch.py +++ b/tests/test_build_sketch.py @@ -344,7 +344,6 @@ class TestBuildSketchObjects(unittest.TestCase): self.assertEqual(s1.edge().geom_type, GeomType.CIRCLE) self.assertAlmostEqual(s1.edge().radius, height / 2) - def test_slot_overall(self): height = 2 with BuildSketch() as test: @@ -537,7 +536,7 @@ class TestBuildSketchObjects(unittest.TestCase): self.assertLess(tri_round.area, tri.area) # Test flipping the face - flipped = -Rectangle(34, 10).face() + flipped = -Face.make_rect(34, 10) rounded = full_round((flipped.edges() << Axis.X)[0]).face() self.assertEqual(flipped.normal_at(), rounded.normal_at()) diff --git a/tests/test_direct_api/test_mixin1_d.py b/tests/test_direct_api/test_mixin1_d.py index f064ac0..8e917a4 100644 --- a/tests/test_direct_api/test_mixin1_d.py +++ b/tests/test_direct_api/test_mixin1_d.py @@ -40,7 +40,7 @@ from build123d.build_enums import ( from build123d.geometry import Axis, Location, Plane, Vector from build123d.objects_curve import Polyline from build123d.objects_part import Box, Cylinder -from build123d.topology import Compound, Edge, Face, Wire +from build123d.topology import Compound, Edge, Face, Solid, Wire class TestMixin1D(unittest.TestCase): @@ -360,6 +360,13 @@ class TestMixin1D(unittest.TestCase): wire = Wire.make_rect(1, 1) self.assertAlmostEqual(wire.volume, 0, 5) + def test_edges(self): + box = Solid.make_box(1, 1, 1) + top_x = box.faces().sort_by(Axis.Z)[-1].edges().sort_by(Axis.X)[-1] + self.assertEqual(top_x.topo_parent, box) + self.assertTrue(isinstance(top_x, Edge)) + self.assertAlmostEqual(top_x.center(), (1, 0.5, 1), 5) + if __name__ == "__main__": unittest.main() From 344ba7a9ae1c1a7d4544dcb0481a3bdd884ae808 Mon Sep 17 00:00:00 2001 From: gumyr Date: Fri, 13 Jun 2025 10:07:18 -0400 Subject: [PATCH 49/56] Reset topo_parent when - Face Issue #1008 --- src/build123d/topology/two_d.py | 3 +++ tests/test_direct_api/test_face.py | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index db27087..647cbb6 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -200,6 +200,9 @@ class Mixin2D(ABC, Shape): new_surface = copy.deepcopy(self) new_surface.wrapped = downcast(self.wrapped.Complemented()) + # As the surface has been modified, the parent is no longer valid + new_surface.topo_parent = None + return new_surface def face(self) -> Face | None: diff --git a/tests/test_direct_api/test_face.py b/tests/test_direct_api/test_face.py index 66971de..7bf2f5f 100644 --- a/tests/test_direct_api/test_face.py +++ b/tests/test_direct_api/test_face.py @@ -169,6 +169,13 @@ class TestFace(unittest.TestCase): flipped_square = -square self.assertAlmostEqual(flipped_square.normal_at(), (0, 0, -1), 5) + # Ensure the topo_parent is cleared when a face is negated + # (otherwise the original Rectangle would be the topo_parent) + flipped = -Rectangle(34, 10).face() + left_edge = flipped.edges().sort_by(Axis.X)[0] + parent_face = left_edge.topo_parent + self.assertAlmostEqual(flipped.normal_at(), parent_face.normal_at(), 5) + def test_offset(self): bbox = Face.make_rect(2, 2, Plane.XY).offset(5).bounding_box() self.assertAlmostEqual(bbox.min, (-1, -1, 5), 5) From ddb07572be464ec950b248ae064db0ab53730e4d Mon Sep 17 00:00:00 2001 From: gumyr Date: Sun, 15 Jun 2025 14:05:20 -0400 Subject: [PATCH 50/56] Assigning topo_parent to inner/outer wires methods Issue #393 --- src/build123d/topology/one_d.py | 6 +++++- src/build123d/topology/two_d.py | 10 +++++++--- tests/test_direct_api/test_mixin1_d.py | 18 ++++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/build123d/topology/one_d.py b/src/build123d/topology/one_d.py index 5cff57d..e7b02e4 100644 --- a/src/build123d/topology/one_d.py +++ b/src/build123d/topology/one_d.py @@ -493,7 +493,11 @@ class Mixin1D(Shape): edge_list: ShapeList[Edge] = ShapeList() while explorer.More(): - edge_list.append(Edge(explorer.Current())) + next_edge = Edge(explorer.Current()) + next_edge.topo_parent = ( + self if self.topo_parent is None else self.topo_parent + ) + edge_list.append(next_edge) explorer.Next() return edge_list else: diff --git a/src/build123d/topology/two_d.py b/src/build123d/topology/two_d.py index 647cbb6..1a1e9dc 100644 --- a/src/build123d/topology/two_d.py +++ b/src/build123d/topology/two_d.py @@ -1383,8 +1383,10 @@ class Face(Mixin2D, Shape[TopoDS_Face]): def inner_wires(self) -> ShapeList[Wire]: """Extract the inner or hole wires from this Face""" outer = self.outer_wire() - - return ShapeList([w for w in self.wires() if not w.is_same(outer)]) + inners = [w for w in self.wires() if not w.is_same(outer)] + for w in inners: + w.topo_parent = self if self.topo_parent is None else self.topo_parent + return ShapeList(inners) def is_coplanar(self, plane: Plane) -> bool: """Is this planar face coplanar with the provided plane""" @@ -1654,7 +1656,9 @@ class Face(Mixin2D, Shape[TopoDS_Face]): def outer_wire(self) -> Wire: """Extract the perimeter wire from this Face""" - return Wire(BRepTools.OuterWire_s(self.wrapped)) + outer = Wire(BRepTools.OuterWire_s(self.wrapped)) + outer.topo_parent = self if self.topo_parent is None else self.topo_parent + return outer def position_at(self, u: float, v: float) -> Vector: """position_at diff --git a/tests/test_direct_api/test_mixin1_d.py b/tests/test_direct_api/test_mixin1_d.py index 8e917a4..df8f2d4 100644 --- a/tests/test_direct_api/test_mixin1_d.py +++ b/tests/test_direct_api/test_mixin1_d.py @@ -40,6 +40,8 @@ from build123d.build_enums import ( from build123d.geometry import Axis, Location, Plane, Vector from build123d.objects_curve import Polyline from build123d.objects_part import Box, Cylinder +from build123d.operations_part import extrude +from build123d.operations_generic import fillet from build123d.topology import Compound, Edge, Face, Solid, Wire @@ -367,6 +369,22 @@ class TestMixin1D(unittest.TestCase): self.assertTrue(isinstance(top_x, Edge)) self.assertAlmostEqual(top_x.center(), (1, 0.5, 1), 5) + def test_edges_topo_parent(self): + phone_case_plan = Face.make_rect(80, 150) - Face.make_rect( + 25, 25, Plane((-20, 55)) + ) + phone_case = extrude(phone_case_plan, 2) + window_edges = phone_case.faces().sort_by(Axis.Z)[-1].inner_wires()[0].edges() + for e in window_edges: + self.assertEqual(e.topo_parent, phone_case) + phone_case_f = fillet(window_edges, 1) + self.assertLess(phone_case_f.volume, phone_case.volume) + perimeter = phone_case_f.faces().sort_by(Axis.Z)[-1].outer_wire().edges() + for e in perimeter: + self.assertEqual(e.topo_parent, phone_case_f) + phone_case_ff = fillet(perimeter, 1) + self.assertLess(phone_case_ff.volume, phone_case_f.volume) + if __name__ == "__main__": unittest.main() From f3f9fd23574072d0217becf3260de9064bbb7a52 Mon Sep 17 00:00:00 2001 From: gumyr Date: Mon, 30 Jun 2025 11:21:11 -0400 Subject: [PATCH 51/56] Improving trace - Issue #1021 --- src/build123d/operations_sketch.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/build123d/operations_sketch.py b/src/build123d/operations_sketch.py index 0d4c43b..6cdf780 100644 --- a/src/build123d/operations_sketch.py +++ b/src/build123d/operations_sketch.py @@ -32,13 +32,14 @@ from __future__ import annotations from collections.abc import Iterable from scipy.spatial import Voronoi from typing import cast -from build123d.build_enums import Mode, SortBy +from build123d.build_enums import Mode, SortBy, Transition from build123d.topology import ( Compound, Curve, Edge, Face, ShapeList, + Shell, Wire, Sketch, topo_explore_connected_edges, @@ -298,10 +299,15 @@ def trace( else: raise ValueError("No objects to trace") + # Group the edges into wires to allow for nice transitions + trace_wires = Wire.combine(trace_edges) + new_faces: list[Face] = [] - for edge in trace_edges: - trace_pen = edge.perpendicular_line(line_width, 0) - new_faces.extend(Face.sweep(trace_pen, edge).faces()) + for to_trace in trace_wires: + trace_pen = to_trace.perpendicular_line(line_width, 0) + new_faces.extend( + Shell.sweep(trace_pen, to_trace, transition=Transition.RIGHT).faces() + ) if context is not None: context._add_to_context(*new_faces, mode=mode) context.pending_edges = ShapeList() From 742a3dccb372a39d50cb231de481f3add34efcd9 Mon Sep 17 00:00:00 2001 From: Jonathan Wagenet Date: Mon, 30 Jun 2025 23:01:33 -0400 Subject: [PATCH 52/56] Add missing step to Fix #1017 --- .../examples/nema-17-bracket.step | 4030 +++++++++++++++++ 1 file changed, 4030 insertions(+) create mode 100644 docs/topology_selection/examples/nema-17-bracket.step diff --git a/docs/topology_selection/examples/nema-17-bracket.step b/docs/topology_selection/examples/nema-17-bracket.step new file mode 100644 index 0000000..c950780 --- /dev/null +++ b/docs/topology_selection/examples/nema-17-bracket.step @@ -0,0 +1,4030 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('Open CASCADE Model'),'2;1'); +FILE_NAME('nema-17-bracket','2025-04-01T21:12:35',('Author'),( + 'Open CASCADE'),'Open CASCADE STEP processor 7.8','build123d', + 'Unknown'); +FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); +ENDSEC; +DATA; +#1 = APPLICATION_PROTOCOL_DEFINITION('international standard', + 'automotive_design',2000,#2); +#2 = APPLICATION_CONTEXT( + 'core data for automotive mechanical design processes'); +#3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10); +#4 = PRODUCT_DEFINITION_SHAPE('','',#5); +#5 = PRODUCT_DEFINITION('design','',#6,#9); +#6 = PRODUCT_DEFINITION_FORMATION('','',#7); +#7 = PRODUCT('nema-17-bracket','nema-17-bracket','',(#8)); +#8 = PRODUCT_CONTEXT('',#2,'mechanical'); +#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#10 = ADVANCED_BREP_SHAPE_REPRESENTATION('',(#11,#15),#3331); +#11 = AXIS2_PLACEMENT_3D('',#12,#13,#14); +#12 = CARTESIAN_POINT('',(0.,0.,0.)); +#13 = DIRECTION('',(0.,0.,1.)); +#14 = DIRECTION('',(1.,0.,-0.)); +#15 = MANIFOLD_SOLID_BREP('',#16); +#16 = CLOSED_SHELL('',(#17,#348,#513,#567,#616,#739,#788,#815,#869,#923, + #977,#1031,#1085,#1907,#1956,#2625,#2649,#2676,#2683,#2730,#2757, + #2784,#2791,#2838,#2865,#2892,#2899,#2946,#2973,#3000,#3007,#3054, + #3081,#3108,#3115,#3162,#3189,#3216,#3223,#3270,#3297,#3324)); +#17 = ADVANCED_FACE('',(#18,#193,#224,#255,#286,#317),#32,.F.); +#18 = FACE_BOUND('',#19,.F.); +#19 = EDGE_LOOP('',(#20,#55,#83,#111,#139,#167)); +#20 = ORIENTED_EDGE('',*,*,#21,.F.); +#21 = EDGE_CURVE('',#22,#24,#26,.T.); +#22 = VERTEX_POINT('',#23); +#23 = CARTESIAN_POINT('',(-4.440892098501E-16,-20.5,3.)); +#24 = VERTEX_POINT('',#25); +#25 = CARTESIAN_POINT('',(0.,-20.5,49.)); +#26 = SURFACE_CURVE('',#27,(#31,#43),.PCURVE_S1.); +#27 = LINE('',#28,#29); +#28 = CARTESIAN_POINT('',(0.,-20.5,0.)); +#29 = VECTOR('',#30,1.); +#30 = DIRECTION('',(0.,0.,1.)); +#31 = PCURVE('',#32,#37); +#32 = PLANE('',#33); +#33 = AXIS2_PLACEMENT_3D('',#34,#35,#36); +#34 = CARTESIAN_POINT('',(0.,-20.5,0.)); +#35 = DIRECTION('',(1.,0.,0.)); +#36 = DIRECTION('',(0.,0.,1.)); +#37 = DEFINITIONAL_REPRESENTATION('',(#38),#42); +#38 = LINE('',#39,#40); +#39 = CARTESIAN_POINT('',(0.,0.)); +#40 = VECTOR('',#41,1.); +#41 = DIRECTION('',(1.,0.)); +#42 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#43 = PCURVE('',#44,#49); +#44 = PLANE('',#45); +#45 = AXIS2_PLACEMENT_3D('',#46,#47,#48); +#46 = CARTESIAN_POINT('',(0.,-20.5,0.)); +#47 = DIRECTION('',(0.,1.,0.)); +#48 = DIRECTION('',(0.,0.,1.)); +#49 = DEFINITIONAL_REPRESENTATION('',(#50),#54); +#50 = LINE('',#51,#52); +#51 = CARTESIAN_POINT('',(0.,0.)); +#52 = VECTOR('',#53,1.); +#53 = DIRECTION('',(1.,0.)); +#54 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#55 = ORIENTED_EDGE('',*,*,#56,.T.); +#56 = EDGE_CURVE('',#22,#57,#59,.T.); +#57 = VERTEX_POINT('',#58); +#58 = CARTESIAN_POINT('',(-4.440892098501E-16,20.5,3.)); +#59 = SURFACE_CURVE('',#60,(#64,#71),.PCURVE_S1.); +#60 = LINE('',#61,#62); +#61 = CARTESIAN_POINT('',(-4.440892098501E-16,-20.5,3.)); +#62 = VECTOR('',#63,1.); +#63 = DIRECTION('',(0.,1.,0.)); +#64 = PCURVE('',#32,#65); +#65 = DEFINITIONAL_REPRESENTATION('',(#66),#70); +#66 = LINE('',#67,#68); +#67 = CARTESIAN_POINT('',(3.,0.)); +#68 = VECTOR('',#69,1.); +#69 = DIRECTION('',(0.,-1.)); +#70 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#71 = PCURVE('',#72,#77); +#72 = CYLINDRICAL_SURFACE('',#73,3.); +#73 = AXIS2_PLACEMENT_3D('',#74,#75,#76); +#74 = CARTESIAN_POINT('',(3.,-20.5,3.)); +#75 = DIRECTION('',(0.,1.,0.)); +#76 = DIRECTION('',(-1.,0.,0.)); +#77 = DEFINITIONAL_REPRESENTATION('',(#78),#82); +#78 = LINE('',#79,#80); +#79 = CARTESIAN_POINT('',(-0.,0.)); +#80 = VECTOR('',#81,1.); +#81 = DIRECTION('',(-0.,1.)); +#82 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#83 = ORIENTED_EDGE('',*,*,#84,.F.); +#84 = EDGE_CURVE('',#85,#57,#87,.T.); +#85 = VERTEX_POINT('',#86); +#86 = CARTESIAN_POINT('',(0.,20.5,49.)); +#87 = SURFACE_CURVE('',#88,(#92,#99),.PCURVE_S1.); +#88 = LINE('',#89,#90); +#89 = CARTESIAN_POINT('',(0.,20.5,51.)); +#90 = VECTOR('',#91,1.); +#91 = DIRECTION('',(0.,0.,-1.)); +#92 = PCURVE('',#32,#93); +#93 = DEFINITIONAL_REPRESENTATION('',(#94),#98); +#94 = LINE('',#95,#96); +#95 = CARTESIAN_POINT('',(51.,-41.)); +#96 = VECTOR('',#97,1.); +#97 = DIRECTION('',(-1.,0.)); +#98 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#99 = PCURVE('',#100,#105); +#100 = PLANE('',#101); +#101 = AXIS2_PLACEMENT_3D('',#102,#103,#104); +#102 = CARTESIAN_POINT('',(0.,20.5,0.)); +#103 = DIRECTION('',(0.,1.,0.)); +#104 = DIRECTION('',(0.,0.,1.)); +#105 = DEFINITIONAL_REPRESENTATION('',(#106),#110); +#106 = LINE('',#107,#108); +#107 = CARTESIAN_POINT('',(51.,0.)); +#108 = VECTOR('',#109,1.); +#109 = DIRECTION('',(-1.,0.)); +#110 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#111 = ORIENTED_EDGE('',*,*,#112,.T.); +#112 = EDGE_CURVE('',#85,#113,#115,.T.); +#113 = VERTEX_POINT('',#114); +#114 = CARTESIAN_POINT('',(0.,18.5,51.)); +#115 = SURFACE_CURVE('',#116,(#120,#127),.PCURVE_S1.); +#116 = LINE('',#117,#118); +#117 = CARTESIAN_POINT('',(0.,22.,47.5)); +#118 = VECTOR('',#119,1.); +#119 = DIRECTION('',(0.,-0.707106781187,0.707106781187)); +#120 = PCURVE('',#32,#121); +#121 = DEFINITIONAL_REPRESENTATION('',(#122),#126); +#122 = LINE('',#123,#124); +#123 = CARTESIAN_POINT('',(47.5,-42.5)); +#124 = VECTOR('',#125,1.); +#125 = DIRECTION('',(0.707106781187,0.707106781187)); +#126 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#127 = PCURVE('',#128,#133); +#128 = PLANE('',#129); +#129 = AXIS2_PLACEMENT_3D('',#130,#131,#132); +#130 = CARTESIAN_POINT('',(0.,19.5,50.)); +#131 = DIRECTION('',(0.,0.707106781187,0.707106781187)); +#132 = DIRECTION('',(-1.,-0.,0.)); +#133 = DEFINITIONAL_REPRESENTATION('',(#134),#138); +#134 = LINE('',#135,#136); +#135 = CARTESIAN_POINT('',(-0.,-3.535533905933)); +#136 = VECTOR('',#137,1.); +#137 = DIRECTION('',(-0.,1.)); +#138 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#139 = ORIENTED_EDGE('',*,*,#140,.F.); +#140 = EDGE_CURVE('',#141,#113,#143,.T.); +#141 = VERTEX_POINT('',#142); +#142 = CARTESIAN_POINT('',(0.,-18.5,51.)); +#143 = SURFACE_CURVE('',#144,(#148,#155),.PCURVE_S1.); +#144 = LINE('',#145,#146); +#145 = CARTESIAN_POINT('',(0.,-20.5,51.)); +#146 = VECTOR('',#147,1.); +#147 = DIRECTION('',(0.,1.,0.)); +#148 = PCURVE('',#32,#149); +#149 = DEFINITIONAL_REPRESENTATION('',(#150),#154); +#150 = LINE('',#151,#152); +#151 = CARTESIAN_POINT('',(51.,0.)); +#152 = VECTOR('',#153,1.); +#153 = DIRECTION('',(0.,-1.)); +#154 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#155 = PCURVE('',#156,#161); +#156 = PLANE('',#157); +#157 = AXIS2_PLACEMENT_3D('',#158,#159,#160); +#158 = CARTESIAN_POINT('',(0.,-20.5,51.)); +#159 = DIRECTION('',(0.,0.,1.)); +#160 = DIRECTION('',(1.,0.,0.)); +#161 = DEFINITIONAL_REPRESENTATION('',(#162),#166); +#162 = LINE('',#163,#164); +#163 = CARTESIAN_POINT('',(0.,0.)); +#164 = VECTOR('',#165,1.); +#165 = DIRECTION('',(0.,1.)); +#166 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#167 = ORIENTED_EDGE('',*,*,#168,.F.); +#168 = EDGE_CURVE('',#24,#141,#169,.T.); +#169 = SURFACE_CURVE('',#170,(#174,#181),.PCURVE_S1.); +#170 = LINE('',#171,#172); +#171 = CARTESIAN_POINT('',(0.,-32.25,37.25)); +#172 = VECTOR('',#173,1.); +#173 = DIRECTION('',(-0.,0.707106781187,0.707106781187)); +#174 = PCURVE('',#32,#175); +#175 = DEFINITIONAL_REPRESENTATION('',(#176),#180); +#176 = LINE('',#177,#178); +#177 = CARTESIAN_POINT('',(37.25,11.75)); +#178 = VECTOR('',#179,1.); +#179 = DIRECTION('',(0.707106781187,-0.707106781187)); +#180 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#181 = PCURVE('',#182,#187); +#182 = PLANE('',#183); +#183 = AXIS2_PLACEMENT_3D('',#184,#185,#186); +#184 = CARTESIAN_POINT('',(0.,-19.5,50.)); +#185 = DIRECTION('',(0.,0.707106781187,-0.707106781187)); +#186 = DIRECTION('',(-1.,-0.,-0.)); +#187 = DEFINITIONAL_REPRESENTATION('',(#188),#192); +#188 = LINE('',#189,#190); +#189 = CARTESIAN_POINT('',(-0.,-18.03122292025)); +#190 = VECTOR('',#191,1.); +#191 = DIRECTION('',(-0.,1.)); +#192 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#193 = FACE_BOUND('',#194,.F.); +#194 = EDGE_LOOP('',(#195)); +#195 = ORIENTED_EDGE('',*,*,#196,.F.); +#196 = EDGE_CURVE('',#197,#197,#199,.T.); +#197 = VERTEX_POINT('',#198); +#198 = CARTESIAN_POINT('',(0.,17.15,14.5)); +#199 = SURFACE_CURVE('',#200,(#205,#212),.PCURVE_S1.); +#200 = CIRCLE('',#201,1.65); +#201 = AXIS2_PLACEMENT_3D('',#202,#203,#204); +#202 = CARTESIAN_POINT('',(0.,15.5,14.5)); +#203 = DIRECTION('',(1.,0.,0.)); +#204 = DIRECTION('',(0.,1.,0.)); +#205 = PCURVE('',#32,#206); +#206 = DEFINITIONAL_REPRESENTATION('',(#207),#211); +#207 = CIRCLE('',#208,1.65); +#208 = AXIS2_PLACEMENT_2D('',#209,#210); +#209 = CARTESIAN_POINT('',(14.5,-36.)); +#210 = DIRECTION('',(0.,-1.)); +#211 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#212 = PCURVE('',#213,#218); +#213 = CYLINDRICAL_SURFACE('',#214,1.65); +#214 = AXIS2_PLACEMENT_3D('',#215,#216,#217); +#215 = CARTESIAN_POINT('',(0.,15.5,14.5)); +#216 = DIRECTION('',(-1.,-0.,-0.)); +#217 = DIRECTION('',(0.,1.,0.)); +#218 = DEFINITIONAL_REPRESENTATION('',(#219),#223); +#219 = LINE('',#220,#221); +#220 = CARTESIAN_POINT('',(-0.,0.)); +#221 = VECTOR('',#222,1.); +#222 = DIRECTION('',(-1.,0.)); +#223 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#224 = FACE_BOUND('',#225,.F.); +#225 = EDGE_LOOP('',(#226)); +#226 = ORIENTED_EDGE('',*,*,#227,.F.); +#227 = EDGE_CURVE('',#228,#228,#230,.T.); +#228 = VERTEX_POINT('',#229); +#229 = CARTESIAN_POINT('',(0.,17.15,45.5)); +#230 = SURFACE_CURVE('',#231,(#236,#243),.PCURVE_S1.); +#231 = CIRCLE('',#232,1.65); +#232 = AXIS2_PLACEMENT_3D('',#233,#234,#235); +#233 = CARTESIAN_POINT('',(0.,15.5,45.5)); +#234 = DIRECTION('',(1.,0.,0.)); +#235 = DIRECTION('',(0.,1.,0.)); +#236 = PCURVE('',#32,#237); +#237 = DEFINITIONAL_REPRESENTATION('',(#238),#242); +#238 = CIRCLE('',#239,1.65); +#239 = AXIS2_PLACEMENT_2D('',#240,#241); +#240 = CARTESIAN_POINT('',(45.5,-36.)); +#241 = DIRECTION('',(0.,-1.)); +#242 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#243 = PCURVE('',#244,#249); +#244 = CYLINDRICAL_SURFACE('',#245,1.65); +#245 = AXIS2_PLACEMENT_3D('',#246,#247,#248); +#246 = CARTESIAN_POINT('',(0.,15.5,45.5)); +#247 = DIRECTION('',(-1.,-0.,-0.)); +#248 = DIRECTION('',(0.,1.,0.)); +#249 = DEFINITIONAL_REPRESENTATION('',(#250),#254); +#250 = LINE('',#251,#252); +#251 = CARTESIAN_POINT('',(-0.,0.)); +#252 = VECTOR('',#253,1.); +#253 = DIRECTION('',(-1.,0.)); +#254 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#255 = FACE_BOUND('',#256,.F.); +#256 = EDGE_LOOP('',(#257)); +#257 = ORIENTED_EDGE('',*,*,#258,.F.); +#258 = EDGE_CURVE('',#259,#259,#261,.T.); +#259 = VERTEX_POINT('',#260); +#260 = CARTESIAN_POINT('',(0.,-13.85,14.5)); +#261 = SURFACE_CURVE('',#262,(#267,#274),.PCURVE_S1.); +#262 = CIRCLE('',#263,1.65); +#263 = AXIS2_PLACEMENT_3D('',#264,#265,#266); +#264 = CARTESIAN_POINT('',(0.,-15.5,14.5)); +#265 = DIRECTION('',(1.,0.,0.)); +#266 = DIRECTION('',(0.,1.,0.)); +#267 = PCURVE('',#32,#268); +#268 = DEFINITIONAL_REPRESENTATION('',(#269),#273); +#269 = CIRCLE('',#270,1.65); +#270 = AXIS2_PLACEMENT_2D('',#271,#272); +#271 = CARTESIAN_POINT('',(14.5,-5.)); +#272 = DIRECTION('',(0.,-1.)); +#273 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#274 = PCURVE('',#275,#280); +#275 = CYLINDRICAL_SURFACE('',#276,1.65); +#276 = AXIS2_PLACEMENT_3D('',#277,#278,#279); +#277 = CARTESIAN_POINT('',(0.,-15.5,14.5)); +#278 = DIRECTION('',(-1.,-0.,-0.)); +#279 = DIRECTION('',(0.,1.,0.)); +#280 = DEFINITIONAL_REPRESENTATION('',(#281),#285); +#281 = LINE('',#282,#283); +#282 = CARTESIAN_POINT('',(-0.,0.)); +#283 = VECTOR('',#284,1.); +#284 = DIRECTION('',(-1.,0.)); +#285 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#286 = FACE_BOUND('',#287,.F.); +#287 = EDGE_LOOP('',(#288)); +#288 = ORIENTED_EDGE('',*,*,#289,.F.); +#289 = EDGE_CURVE('',#290,#290,#292,.T.); +#290 = VERTEX_POINT('',#291); +#291 = CARTESIAN_POINT('',(0.,16.,30.)); +#292 = SURFACE_CURVE('',#293,(#298,#305),.PCURVE_S1.); +#293 = CIRCLE('',#294,16.); +#294 = AXIS2_PLACEMENT_3D('',#295,#296,#297); +#295 = CARTESIAN_POINT('',(0.,0.,30.)); +#296 = DIRECTION('',(1.,0.,0.)); +#297 = DIRECTION('',(0.,1.,0.)); +#298 = PCURVE('',#32,#299); +#299 = DEFINITIONAL_REPRESENTATION('',(#300),#304); +#300 = CIRCLE('',#301,16.); +#301 = AXIS2_PLACEMENT_2D('',#302,#303); +#302 = CARTESIAN_POINT('',(30.,-20.5)); +#303 = DIRECTION('',(0.,-1.)); +#304 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#305 = PCURVE('',#306,#311); +#306 = CYLINDRICAL_SURFACE('',#307,16.); +#307 = AXIS2_PLACEMENT_3D('',#308,#309,#310); +#308 = CARTESIAN_POINT('',(0.,0.,30.)); +#309 = DIRECTION('',(-1.,-0.,-0.)); +#310 = DIRECTION('',(0.,1.,0.)); +#311 = DEFINITIONAL_REPRESENTATION('',(#312),#316); +#312 = LINE('',#313,#314); +#313 = CARTESIAN_POINT('',(-0.,0.)); +#314 = VECTOR('',#315,1.); +#315 = DIRECTION('',(-1.,0.)); +#316 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#317 = FACE_BOUND('',#318,.F.); +#318 = EDGE_LOOP('',(#319)); +#319 = ORIENTED_EDGE('',*,*,#320,.F.); +#320 = EDGE_CURVE('',#321,#321,#323,.T.); +#321 = VERTEX_POINT('',#322); +#322 = CARTESIAN_POINT('',(0.,-13.85,45.5)); +#323 = SURFACE_CURVE('',#324,(#329,#336),.PCURVE_S1.); +#324 = CIRCLE('',#325,1.65); +#325 = AXIS2_PLACEMENT_3D('',#326,#327,#328); +#326 = CARTESIAN_POINT('',(0.,-15.5,45.5)); +#327 = DIRECTION('',(1.,0.,0.)); +#328 = DIRECTION('',(0.,1.,0.)); +#329 = PCURVE('',#32,#330); +#330 = DEFINITIONAL_REPRESENTATION('',(#331),#335); +#331 = CIRCLE('',#332,1.65); +#332 = AXIS2_PLACEMENT_2D('',#333,#334); +#333 = CARTESIAN_POINT('',(45.5,-5.)); +#334 = DIRECTION('',(0.,-1.)); +#335 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#336 = PCURVE('',#337,#342); +#337 = CYLINDRICAL_SURFACE('',#338,1.65); +#338 = AXIS2_PLACEMENT_3D('',#339,#340,#341); +#339 = CARTESIAN_POINT('',(0.,-15.5,45.5)); +#340 = DIRECTION('',(-1.,-0.,-0.)); +#341 = DIRECTION('',(0.,1.,0.)); +#342 = DEFINITIONAL_REPRESENTATION('',(#343),#347); +#343 = LINE('',#344,#345); +#344 = CARTESIAN_POINT('',(-0.,0.)); +#345 = VECTOR('',#346,1.); +#346 = DIRECTION('',(-1.,0.)); +#347 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#348 = ADVANCED_FACE('',(#349),#44,.F.); +#349 = FACE_BOUND('',#350,.F.); +#350 = EDGE_LOOP('',(#351,#381,#407,#408,#431,#459,#487)); +#351 = ORIENTED_EDGE('',*,*,#352,.F.); +#352 = EDGE_CURVE('',#353,#355,#357,.T.); +#353 = VERTEX_POINT('',#354); +#354 = CARTESIAN_POINT('',(3.,-20.5,-4.440892098501E-16)); +#355 = VERTEX_POINT('',#356); +#356 = CARTESIAN_POINT('',(33.,-20.5,0.)); +#357 = SURFACE_CURVE('',#358,(#362,#369),.PCURVE_S1.); +#358 = LINE('',#359,#360); +#359 = CARTESIAN_POINT('',(0.,-20.5,0.)); +#360 = VECTOR('',#361,1.); +#361 = DIRECTION('',(1.,0.,0.)); +#362 = PCURVE('',#44,#363); +#363 = DEFINITIONAL_REPRESENTATION('',(#364),#368); +#364 = LINE('',#365,#366); +#365 = CARTESIAN_POINT('',(0.,0.)); +#366 = VECTOR('',#367,1.); +#367 = DIRECTION('',(0.,1.)); +#368 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#369 = PCURVE('',#370,#375); +#370 = PLANE('',#371); +#371 = AXIS2_PLACEMENT_3D('',#372,#373,#374); +#372 = CARTESIAN_POINT('',(0.,-20.5,0.)); +#373 = DIRECTION('',(0.,0.,1.)); +#374 = DIRECTION('',(1.,0.,0.)); +#375 = DEFINITIONAL_REPRESENTATION('',(#376),#380); +#376 = LINE('',#377,#378); +#377 = CARTESIAN_POINT('',(0.,0.)); +#378 = VECTOR('',#379,1.); +#379 = DIRECTION('',(1.,0.)); +#380 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#381 = ORIENTED_EDGE('',*,*,#382,.F.); +#382 = EDGE_CURVE('',#22,#353,#383,.T.); +#383 = SURFACE_CURVE('',#384,(#389,#400),.PCURVE_S1.); +#384 = CIRCLE('',#385,3.); +#385 = AXIS2_PLACEMENT_3D('',#386,#387,#388); +#386 = CARTESIAN_POINT('',(3.,-20.5,3.)); +#387 = DIRECTION('',(-0.,-1.,0.)); +#388 = DIRECTION('',(0.,-0.,1.)); +#389 = PCURVE('',#44,#390); +#390 = DEFINITIONAL_REPRESENTATION('',(#391),#399); +#391 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#392,#393,#394,#395,#396,#397 +,#398),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#392 = CARTESIAN_POINT('',(6.,3.)); +#393 = CARTESIAN_POINT('',(6.,-2.196152422707)); +#394 = CARTESIAN_POINT('',(1.5,0.401923788647)); +#395 = CARTESIAN_POINT('',(-3.,3.)); +#396 = CARTESIAN_POINT('',(1.5,5.598076211353)); +#397 = CARTESIAN_POINT('',(6.,8.196152422707)); +#398 = CARTESIAN_POINT('',(6.,3.)); +#399 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#400 = PCURVE('',#72,#401); +#401 = DEFINITIONAL_REPRESENTATION('',(#402),#406); +#402 = LINE('',#403,#404); +#403 = CARTESIAN_POINT('',(1.570796326795,-0.)); +#404 = VECTOR('',#405,1.); +#405 = DIRECTION('',(-1.,0.)); +#406 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#407 = ORIENTED_EDGE('',*,*,#21,.T.); +#408 = ORIENTED_EDGE('',*,*,#409,.T.); +#409 = EDGE_CURVE('',#24,#410,#412,.T.); +#410 = VERTEX_POINT('',#411); +#411 = CARTESIAN_POINT('',(3.,-20.5,49.)); +#412 = SURFACE_CURVE('',#413,(#417,#424),.PCURVE_S1.); +#413 = LINE('',#414,#415); +#414 = CARTESIAN_POINT('',(0.,-20.5,49.)); +#415 = VECTOR('',#416,1.); +#416 = DIRECTION('',(1.,0.,0.)); +#417 = PCURVE('',#44,#418); +#418 = DEFINITIONAL_REPRESENTATION('',(#419),#423); +#419 = LINE('',#420,#421); +#420 = CARTESIAN_POINT('',(49.,0.)); +#421 = VECTOR('',#422,1.); +#422 = DIRECTION('',(0.,1.)); +#423 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#424 = PCURVE('',#182,#425); +#425 = DEFINITIONAL_REPRESENTATION('',(#426),#430); +#426 = LINE('',#427,#428); +#427 = CARTESIAN_POINT('',(-0.,-1.414213562373)); +#428 = VECTOR('',#429,1.); +#429 = DIRECTION('',(-1.,0.)); +#430 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#431 = ORIENTED_EDGE('',*,*,#432,.F.); +#432 = EDGE_CURVE('',#433,#410,#435,.T.); +#433 = VERTEX_POINT('',#434); +#434 = CARTESIAN_POINT('',(3.,-20.5,3.)); +#435 = SURFACE_CURVE('',#436,(#440,#447),.PCURVE_S1.); +#436 = LINE('',#437,#438); +#437 = CARTESIAN_POINT('',(3.,-20.5,0.)); +#438 = VECTOR('',#439,1.); +#439 = DIRECTION('',(0.,0.,1.)); +#440 = PCURVE('',#44,#441); +#441 = DEFINITIONAL_REPRESENTATION('',(#442),#446); +#442 = LINE('',#443,#444); +#443 = CARTESIAN_POINT('',(0.,3.)); +#444 = VECTOR('',#445,1.); +#445 = DIRECTION('',(1.,0.)); +#446 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#447 = PCURVE('',#448,#453); +#448 = PLANE('',#449); +#449 = AXIS2_PLACEMENT_3D('',#450,#451,#452); +#450 = CARTESIAN_POINT('',(3.,-20.5,0.)); +#451 = DIRECTION('',(1.,0.,0.)); +#452 = DIRECTION('',(0.,0.,1.)); +#453 = DEFINITIONAL_REPRESENTATION('',(#454),#458); +#454 = LINE('',#455,#456); +#455 = CARTESIAN_POINT('',(0.,0.)); +#456 = VECTOR('',#457,1.); +#457 = DIRECTION('',(1.,0.)); +#458 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#459 = ORIENTED_EDGE('',*,*,#460,.T.); +#460 = EDGE_CURVE('',#433,#461,#463,.T.); +#461 = VERTEX_POINT('',#462); +#462 = CARTESIAN_POINT('',(33.,-20.5,3.)); +#463 = SURFACE_CURVE('',#464,(#468,#475),.PCURVE_S1.); +#464 = LINE('',#465,#466); +#465 = CARTESIAN_POINT('',(0.,-20.5,3.)); +#466 = VECTOR('',#467,1.); +#467 = DIRECTION('',(1.,0.,0.)); +#468 = PCURVE('',#44,#469); +#469 = DEFINITIONAL_REPRESENTATION('',(#470),#474); +#470 = LINE('',#471,#472); +#471 = CARTESIAN_POINT('',(3.,0.)); +#472 = VECTOR('',#473,1.); +#473 = DIRECTION('',(0.,1.)); +#474 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#475 = PCURVE('',#476,#481); +#476 = PLANE('',#477); +#477 = AXIS2_PLACEMENT_3D('',#478,#479,#480); +#478 = CARTESIAN_POINT('',(0.,-20.5,3.)); +#479 = DIRECTION('',(0.,0.,1.)); +#480 = DIRECTION('',(1.,0.,0.)); +#481 = DEFINITIONAL_REPRESENTATION('',(#482),#486); +#482 = LINE('',#483,#484); +#483 = CARTESIAN_POINT('',(0.,0.)); +#484 = VECTOR('',#485,1.); +#485 = DIRECTION('',(1.,0.)); +#486 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#487 = ORIENTED_EDGE('',*,*,#488,.F.); +#488 = EDGE_CURVE('',#355,#461,#489,.T.); +#489 = SURFACE_CURVE('',#490,(#494,#501),.PCURVE_S1.); +#490 = LINE('',#491,#492); +#491 = CARTESIAN_POINT('',(33.,-20.5,0.)); +#492 = VECTOR('',#493,1.); +#493 = DIRECTION('',(0.,0.,1.)); +#494 = PCURVE('',#44,#495); +#495 = DEFINITIONAL_REPRESENTATION('',(#496),#500); +#496 = LINE('',#497,#498); +#497 = CARTESIAN_POINT('',(0.,33.)); +#498 = VECTOR('',#499,1.); +#499 = DIRECTION('',(1.,0.)); +#500 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#501 = PCURVE('',#502,#507); +#502 = PLANE('',#503); +#503 = AXIS2_PLACEMENT_3D('',#504,#505,#506); +#504 = CARTESIAN_POINT('',(34.,-19.5,0.)); +#505 = DIRECTION('',(-0.707106781187,0.707106781187,0.)); +#506 = DIRECTION('',(0.,0.,1.)); +#507 = DEFINITIONAL_REPRESENTATION('',(#508),#512); +#508 = LINE('',#509,#510); +#509 = CARTESIAN_POINT('',(0.,-1.414213562373)); +#510 = VECTOR('',#511,1.); +#511 = DIRECTION('',(1.,0.)); +#512 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#513 = ADVANCED_FACE('',(#514),#72,.T.); +#514 = FACE_BOUND('',#515,.F.); +#515 = EDGE_LOOP('',(#516,#517,#540,#566)); +#516 = ORIENTED_EDGE('',*,*,#382,.T.); +#517 = ORIENTED_EDGE('',*,*,#518,.T.); +#518 = EDGE_CURVE('',#353,#519,#521,.T.); +#519 = VERTEX_POINT('',#520); +#520 = CARTESIAN_POINT('',(3.,20.5,-4.440892098501E-16)); +#521 = SURFACE_CURVE('',#522,(#526,#533),.PCURVE_S1.); +#522 = LINE('',#523,#524); +#523 = CARTESIAN_POINT('',(3.,-20.5,-4.440892098501E-16)); +#524 = VECTOR('',#525,1.); +#525 = DIRECTION('',(0.,1.,0.)); +#526 = PCURVE('',#72,#527); +#527 = DEFINITIONAL_REPRESENTATION('',(#528),#532); +#528 = LINE('',#529,#530); +#529 = CARTESIAN_POINT('',(-1.570796326795,0.)); +#530 = VECTOR('',#531,1.); +#531 = DIRECTION('',(-0.,1.)); +#532 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#533 = PCURVE('',#370,#534); +#534 = DEFINITIONAL_REPRESENTATION('',(#535),#539); +#535 = LINE('',#536,#537); +#536 = CARTESIAN_POINT('',(3.,0.)); +#537 = VECTOR('',#538,1.); +#538 = DIRECTION('',(0.,1.)); +#539 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#540 = ORIENTED_EDGE('',*,*,#541,.F.); +#541 = EDGE_CURVE('',#57,#519,#542,.T.); +#542 = SURFACE_CURVE('',#543,(#548,#555),.PCURVE_S1.); +#543 = CIRCLE('',#544,3.); +#544 = AXIS2_PLACEMENT_3D('',#545,#546,#547); +#545 = CARTESIAN_POINT('',(3.,20.5,3.)); +#546 = DIRECTION('',(-0.,-1.,0.)); +#547 = DIRECTION('',(0.,-0.,1.)); +#548 = PCURVE('',#72,#549); +#549 = DEFINITIONAL_REPRESENTATION('',(#550),#554); +#550 = LINE('',#551,#552); +#551 = CARTESIAN_POINT('',(1.570796326795,41.)); +#552 = VECTOR('',#553,1.); +#553 = DIRECTION('',(-1.,0.)); +#554 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#555 = PCURVE('',#100,#556); +#556 = DEFINITIONAL_REPRESENTATION('',(#557),#565); +#557 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#558,#559,#560,#561,#562,#563 +,#564),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#558 = CARTESIAN_POINT('',(6.,3.)); +#559 = CARTESIAN_POINT('',(6.,-2.196152422707)); +#560 = CARTESIAN_POINT('',(1.5,0.401923788647)); +#561 = CARTESIAN_POINT('',(-3.,3.)); +#562 = CARTESIAN_POINT('',(1.5,5.598076211353)); +#563 = CARTESIAN_POINT('',(6.,8.196152422707)); +#564 = CARTESIAN_POINT('',(6.,3.)); +#565 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#566 = ORIENTED_EDGE('',*,*,#56,.F.); +#567 = ADVANCED_FACE('',(#568),#182,.F.); +#568 = FACE_BOUND('',#569,.T.); +#569 = EDGE_LOOP('',(#570,#571,#572,#595)); +#570 = ORIENTED_EDGE('',*,*,#168,.F.); +#571 = ORIENTED_EDGE('',*,*,#409,.T.); +#572 = ORIENTED_EDGE('',*,*,#573,.T.); +#573 = EDGE_CURVE('',#410,#574,#576,.T.); +#574 = VERTEX_POINT('',#575); +#575 = CARTESIAN_POINT('',(3.,-18.5,51.)); +#576 = SURFACE_CURVE('',#577,(#581,#588),.PCURVE_S1.); +#577 = LINE('',#578,#579); +#578 = CARTESIAN_POINT('',(3.,-32.25,37.25)); +#579 = VECTOR('',#580,1.); +#580 = DIRECTION('',(-0.,0.707106781187,0.707106781187)); +#581 = PCURVE('',#182,#582); +#582 = DEFINITIONAL_REPRESENTATION('',(#583),#587); +#583 = LINE('',#584,#585); +#584 = CARTESIAN_POINT('',(-3.,-18.03122292025)); +#585 = VECTOR('',#586,1.); +#586 = DIRECTION('',(-0.,1.)); +#587 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#588 = PCURVE('',#448,#589); +#589 = DEFINITIONAL_REPRESENTATION('',(#590),#594); +#590 = LINE('',#591,#592); +#591 = CARTESIAN_POINT('',(37.25,11.75)); +#592 = VECTOR('',#593,1.); +#593 = DIRECTION('',(0.707106781187,-0.707106781187)); +#594 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#595 = ORIENTED_EDGE('',*,*,#596,.F.); +#596 = EDGE_CURVE('',#141,#574,#597,.T.); +#597 = SURFACE_CURVE('',#598,(#602,#609),.PCURVE_S1.); +#598 = LINE('',#599,#600); +#599 = CARTESIAN_POINT('',(0.,-18.5,51.)); +#600 = VECTOR('',#601,1.); +#601 = DIRECTION('',(1.,0.,0.)); +#602 = PCURVE('',#182,#603); +#603 = DEFINITIONAL_REPRESENTATION('',(#604),#608); +#604 = LINE('',#605,#606); +#605 = CARTESIAN_POINT('',(-0.,1.414213562373)); +#606 = VECTOR('',#607,1.); +#607 = DIRECTION('',(-1.,0.)); +#608 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#609 = PCURVE('',#156,#610); +#610 = DEFINITIONAL_REPRESENTATION('',(#611),#615); +#611 = LINE('',#612,#613); +#612 = CARTESIAN_POINT('',(0.,2.)); +#613 = VECTOR('',#614,1.); +#614 = DIRECTION('',(1.,0.)); +#615 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#616 = ADVANCED_FACE('',(#617),#100,.T.); +#617 = FACE_BOUND('',#618,.T.); +#618 = EDGE_LOOP('',(#619,#620,#643,#666,#689,#717,#738)); +#619 = ORIENTED_EDGE('',*,*,#84,.F.); +#620 = ORIENTED_EDGE('',*,*,#621,.T.); +#621 = EDGE_CURVE('',#85,#622,#624,.T.); +#622 = VERTEX_POINT('',#623); +#623 = CARTESIAN_POINT('',(3.,20.5,49.)); +#624 = SURFACE_CURVE('',#625,(#629,#636),.PCURVE_S1.); +#625 = LINE('',#626,#627); +#626 = CARTESIAN_POINT('',(0.,20.5,49.)); +#627 = VECTOR('',#628,1.); +#628 = DIRECTION('',(1.,0.,0.)); +#629 = PCURVE('',#100,#630); +#630 = DEFINITIONAL_REPRESENTATION('',(#631),#635); +#631 = LINE('',#632,#633); +#632 = CARTESIAN_POINT('',(49.,0.)); +#633 = VECTOR('',#634,1.); +#634 = DIRECTION('',(0.,1.)); +#635 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#636 = PCURVE('',#128,#637); +#637 = DEFINITIONAL_REPRESENTATION('',(#638),#642); +#638 = LINE('',#639,#640); +#639 = CARTESIAN_POINT('',(-0.,-1.414213562373)); +#640 = VECTOR('',#641,1.); +#641 = DIRECTION('',(-1.,0.)); +#642 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#643 = ORIENTED_EDGE('',*,*,#644,.F.); +#644 = EDGE_CURVE('',#645,#622,#647,.T.); +#645 = VERTEX_POINT('',#646); +#646 = CARTESIAN_POINT('',(3.,20.5,3.)); +#647 = SURFACE_CURVE('',#648,(#652,#659),.PCURVE_S1.); +#648 = LINE('',#649,#650); +#649 = CARTESIAN_POINT('',(3.,20.5,0.)); +#650 = VECTOR('',#651,1.); +#651 = DIRECTION('',(0.,0.,1.)); +#652 = PCURVE('',#100,#653); +#653 = DEFINITIONAL_REPRESENTATION('',(#654),#658); +#654 = LINE('',#655,#656); +#655 = CARTESIAN_POINT('',(0.,3.)); +#656 = VECTOR('',#657,1.); +#657 = DIRECTION('',(1.,0.)); +#658 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#659 = PCURVE('',#448,#660); +#660 = DEFINITIONAL_REPRESENTATION('',(#661),#665); +#661 = LINE('',#662,#663); +#662 = CARTESIAN_POINT('',(0.,-41.)); +#663 = VECTOR('',#664,1.); +#664 = DIRECTION('',(1.,0.)); +#665 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#666 = ORIENTED_EDGE('',*,*,#667,.T.); +#667 = EDGE_CURVE('',#645,#668,#670,.T.); +#668 = VERTEX_POINT('',#669); +#669 = CARTESIAN_POINT('',(33.,20.5,3.)); +#670 = SURFACE_CURVE('',#671,(#675,#682),.PCURVE_S1.); +#671 = LINE('',#672,#673); +#672 = CARTESIAN_POINT('',(0.,20.5,3.)); +#673 = VECTOR('',#674,1.); +#674 = DIRECTION('',(1.,0.,0.)); +#675 = PCURVE('',#100,#676); +#676 = DEFINITIONAL_REPRESENTATION('',(#677),#681); +#677 = LINE('',#678,#679); +#678 = CARTESIAN_POINT('',(3.,0.)); +#679 = VECTOR('',#680,1.); +#680 = DIRECTION('',(0.,1.)); +#681 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#682 = PCURVE('',#476,#683); +#683 = DEFINITIONAL_REPRESENTATION('',(#684),#688); +#684 = LINE('',#685,#686); +#685 = CARTESIAN_POINT('',(0.,41.)); +#686 = VECTOR('',#687,1.); +#687 = DIRECTION('',(1.,0.)); +#688 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#689 = ORIENTED_EDGE('',*,*,#690,.F.); +#690 = EDGE_CURVE('',#691,#668,#693,.T.); +#691 = VERTEX_POINT('',#692); +#692 = CARTESIAN_POINT('',(33.,20.5,0.)); +#693 = SURFACE_CURVE('',#694,(#698,#705),.PCURVE_S1.); +#694 = LINE('',#695,#696); +#695 = CARTESIAN_POINT('',(33.,20.5,0.)); +#696 = VECTOR('',#697,1.); +#697 = DIRECTION('',(0.,0.,1.)); +#698 = PCURVE('',#100,#699); +#699 = DEFINITIONAL_REPRESENTATION('',(#700),#704); +#700 = LINE('',#701,#702); +#701 = CARTESIAN_POINT('',(0.,33.)); +#702 = VECTOR('',#703,1.); +#703 = DIRECTION('',(1.,0.)); +#704 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#705 = PCURVE('',#706,#711); +#706 = PLANE('',#707); +#707 = AXIS2_PLACEMENT_3D('',#708,#709,#710); +#708 = CARTESIAN_POINT('',(34.,19.5,0.)); +#709 = DIRECTION('',(0.707106781187,0.707106781187,0.)); +#710 = DIRECTION('',(0.,-0.,1.)); +#711 = DEFINITIONAL_REPRESENTATION('',(#712),#716); +#712 = LINE('',#713,#714); +#713 = CARTESIAN_POINT('',(0.,-1.414213562373)); +#714 = VECTOR('',#715,1.); +#715 = DIRECTION('',(1.,0.)); +#716 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#717 = ORIENTED_EDGE('',*,*,#718,.T.); +#718 = EDGE_CURVE('',#691,#519,#719,.T.); +#719 = SURFACE_CURVE('',#720,(#724,#731),.PCURVE_S1.); +#720 = LINE('',#721,#722); +#721 = CARTESIAN_POINT('',(35.,20.5,0.)); +#722 = VECTOR('',#723,1.); +#723 = DIRECTION('',(-1.,0.,0.)); +#724 = PCURVE('',#100,#725); +#725 = DEFINITIONAL_REPRESENTATION('',(#726),#730); +#726 = LINE('',#727,#728); +#727 = CARTESIAN_POINT('',(0.,35.)); +#728 = VECTOR('',#729,1.); +#729 = DIRECTION('',(0.,-1.)); +#730 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#731 = PCURVE('',#370,#732); +#732 = DEFINITIONAL_REPRESENTATION('',(#733),#737); +#733 = LINE('',#734,#735); +#734 = CARTESIAN_POINT('',(35.,41.)); +#735 = VECTOR('',#736,1.); +#736 = DIRECTION('',(-1.,0.)); +#737 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#738 = ORIENTED_EDGE('',*,*,#541,.F.); +#739 = ADVANCED_FACE('',(#740),#156,.T.); +#740 = FACE_BOUND('',#741,.T.); +#741 = EDGE_LOOP('',(#742,#743,#744,#767)); +#742 = ORIENTED_EDGE('',*,*,#140,.F.); +#743 = ORIENTED_EDGE('',*,*,#596,.T.); +#744 = ORIENTED_EDGE('',*,*,#745,.T.); +#745 = EDGE_CURVE('',#574,#746,#748,.T.); +#746 = VERTEX_POINT('',#747); +#747 = CARTESIAN_POINT('',(3.,18.5,51.)); +#748 = SURFACE_CURVE('',#749,(#753,#760),.PCURVE_S1.); +#749 = LINE('',#750,#751); +#750 = CARTESIAN_POINT('',(3.,-20.5,51.)); +#751 = VECTOR('',#752,1.); +#752 = DIRECTION('',(0.,1.,0.)); +#753 = PCURVE('',#156,#754); +#754 = DEFINITIONAL_REPRESENTATION('',(#755),#759); +#755 = LINE('',#756,#757); +#756 = CARTESIAN_POINT('',(3.,0.)); +#757 = VECTOR('',#758,1.); +#758 = DIRECTION('',(0.,1.)); +#759 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#760 = PCURVE('',#448,#761); +#761 = DEFINITIONAL_REPRESENTATION('',(#762),#766); +#762 = LINE('',#763,#764); +#763 = CARTESIAN_POINT('',(51.,0.)); +#764 = VECTOR('',#765,1.); +#765 = DIRECTION('',(0.,-1.)); +#766 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#767 = ORIENTED_EDGE('',*,*,#768,.F.); +#768 = EDGE_CURVE('',#113,#746,#769,.T.); +#769 = SURFACE_CURVE('',#770,(#774,#781),.PCURVE_S1.); +#770 = LINE('',#771,#772); +#771 = CARTESIAN_POINT('',(0.,18.5,51.)); +#772 = VECTOR('',#773,1.); +#773 = DIRECTION('',(1.,0.,0.)); +#774 = PCURVE('',#156,#775); +#775 = DEFINITIONAL_REPRESENTATION('',(#776),#780); +#776 = LINE('',#777,#778); +#777 = CARTESIAN_POINT('',(0.,39.)); +#778 = VECTOR('',#779,1.); +#779 = DIRECTION('',(1.,0.)); +#780 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#781 = PCURVE('',#128,#782); +#782 = DEFINITIONAL_REPRESENTATION('',(#783),#787); +#783 = LINE('',#784,#785); +#784 = CARTESIAN_POINT('',(-0.,1.414213562373)); +#785 = VECTOR('',#786,1.); +#786 = DIRECTION('',(-1.,0.)); +#787 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#788 = ADVANCED_FACE('',(#789),#128,.T.); +#789 = FACE_BOUND('',#790,.F.); +#790 = EDGE_LOOP('',(#791,#792,#793,#814)); +#791 = ORIENTED_EDGE('',*,*,#112,.F.); +#792 = ORIENTED_EDGE('',*,*,#621,.T.); +#793 = ORIENTED_EDGE('',*,*,#794,.T.); +#794 = EDGE_CURVE('',#622,#746,#795,.T.); +#795 = SURFACE_CURVE('',#796,(#800,#807),.PCURVE_S1.); +#796 = LINE('',#797,#798); +#797 = CARTESIAN_POINT('',(3.,22.,47.5)); +#798 = VECTOR('',#799,1.); +#799 = DIRECTION('',(0.,-0.707106781187,0.707106781187)); +#800 = PCURVE('',#128,#801); +#801 = DEFINITIONAL_REPRESENTATION('',(#802),#806); +#802 = LINE('',#803,#804); +#803 = CARTESIAN_POINT('',(-3.,-3.535533905933)); +#804 = VECTOR('',#805,1.); +#805 = DIRECTION('',(-0.,1.)); +#806 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#807 = PCURVE('',#448,#808); +#808 = DEFINITIONAL_REPRESENTATION('',(#809),#813); +#809 = LINE('',#810,#811); +#810 = CARTESIAN_POINT('',(47.5,-42.5)); +#811 = VECTOR('',#812,1.); +#812 = DIRECTION('',(0.707106781187,0.707106781187)); +#813 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#814 = ORIENTED_EDGE('',*,*,#768,.F.); +#815 = ADVANCED_FACE('',(#816),#213,.F.); +#816 = FACE_BOUND('',#817,.T.); +#817 = EDGE_LOOP('',(#818,#841,#842,#843)); +#818 = ORIENTED_EDGE('',*,*,#819,.F.); +#819 = EDGE_CURVE('',#197,#820,#822,.T.); +#820 = VERTEX_POINT('',#821); +#821 = CARTESIAN_POINT('',(3.,17.15,14.5)); +#822 = SEAM_CURVE('',#823,(#827,#834),.PCURVE_S1.); +#823 = LINE('',#824,#825); +#824 = CARTESIAN_POINT('',(0.,17.15,14.5)); +#825 = VECTOR('',#826,1.); +#826 = DIRECTION('',(1.,0.,0.)); +#827 = PCURVE('',#213,#828); +#828 = DEFINITIONAL_REPRESENTATION('',(#829),#833); +#829 = LINE('',#830,#831); +#830 = CARTESIAN_POINT('',(-6.28318530718,0.)); +#831 = VECTOR('',#832,1.); +#832 = DIRECTION('',(-0.,-1.)); +#833 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#834 = PCURVE('',#213,#835); +#835 = DEFINITIONAL_REPRESENTATION('',(#836),#840); +#836 = LINE('',#837,#838); +#837 = CARTESIAN_POINT('',(-0.,0.)); +#838 = VECTOR('',#839,1.); +#839 = DIRECTION('',(-0.,-1.)); +#840 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#841 = ORIENTED_EDGE('',*,*,#196,.F.); +#842 = ORIENTED_EDGE('',*,*,#819,.T.); +#843 = ORIENTED_EDGE('',*,*,#844,.F.); +#844 = EDGE_CURVE('',#820,#820,#845,.T.); +#845 = SURFACE_CURVE('',#846,(#851,#858),.PCURVE_S1.); +#846 = CIRCLE('',#847,1.65); +#847 = AXIS2_PLACEMENT_3D('',#848,#849,#850); +#848 = CARTESIAN_POINT('',(3.,15.5,14.5)); +#849 = DIRECTION('',(-1.,0.,0.)); +#850 = DIRECTION('',(0.,1.,0.)); +#851 = PCURVE('',#213,#852); +#852 = DEFINITIONAL_REPRESENTATION('',(#853),#857); +#853 = LINE('',#854,#855); +#854 = CARTESIAN_POINT('',(-6.28318530718,-3.)); +#855 = VECTOR('',#856,1.); +#856 = DIRECTION('',(1.,-0.)); +#857 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#858 = PCURVE('',#448,#859); +#859 = DEFINITIONAL_REPRESENTATION('',(#860),#868); +#860 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#861,#862,#863,#864,#865,#866 +,#867),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#861 = CARTESIAN_POINT('',(14.5,-37.65)); +#862 = CARTESIAN_POINT('',(11.642116167511,-37.65)); +#863 = CARTESIAN_POINT('',(13.071058083756,-35.175)); +#864 = CARTESIAN_POINT('',(14.5,-32.7)); +#865 = CARTESIAN_POINT('',(15.928941916244,-35.175)); +#866 = CARTESIAN_POINT('',(17.357883832489,-37.65)); +#867 = CARTESIAN_POINT('',(14.5,-37.65)); +#868 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#869 = ADVANCED_FACE('',(#870),#244,.F.); +#870 = FACE_BOUND('',#871,.T.); +#871 = EDGE_LOOP('',(#872,#895,#896,#897)); +#872 = ORIENTED_EDGE('',*,*,#873,.F.); +#873 = EDGE_CURVE('',#228,#874,#876,.T.); +#874 = VERTEX_POINT('',#875); +#875 = CARTESIAN_POINT('',(3.,17.15,45.5)); +#876 = SEAM_CURVE('',#877,(#881,#888),.PCURVE_S1.); +#877 = LINE('',#878,#879); +#878 = CARTESIAN_POINT('',(0.,17.15,45.5)); +#879 = VECTOR('',#880,1.); +#880 = DIRECTION('',(1.,0.,0.)); +#881 = PCURVE('',#244,#882); +#882 = DEFINITIONAL_REPRESENTATION('',(#883),#887); +#883 = LINE('',#884,#885); +#884 = CARTESIAN_POINT('',(-6.28318530718,0.)); +#885 = VECTOR('',#886,1.); +#886 = DIRECTION('',(-0.,-1.)); +#887 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#888 = PCURVE('',#244,#889); +#889 = DEFINITIONAL_REPRESENTATION('',(#890),#894); +#890 = LINE('',#891,#892); +#891 = CARTESIAN_POINT('',(-0.,0.)); +#892 = VECTOR('',#893,1.); +#893 = DIRECTION('',(-0.,-1.)); +#894 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#895 = ORIENTED_EDGE('',*,*,#227,.F.); +#896 = ORIENTED_EDGE('',*,*,#873,.T.); +#897 = ORIENTED_EDGE('',*,*,#898,.F.); +#898 = EDGE_CURVE('',#874,#874,#899,.T.); +#899 = SURFACE_CURVE('',#900,(#905,#912),.PCURVE_S1.); +#900 = CIRCLE('',#901,1.65); +#901 = AXIS2_PLACEMENT_3D('',#902,#903,#904); +#902 = CARTESIAN_POINT('',(3.,15.5,45.5)); +#903 = DIRECTION('',(-1.,0.,0.)); +#904 = DIRECTION('',(0.,1.,0.)); +#905 = PCURVE('',#244,#906); +#906 = DEFINITIONAL_REPRESENTATION('',(#907),#911); +#907 = LINE('',#908,#909); +#908 = CARTESIAN_POINT('',(-6.28318530718,-3.)); +#909 = VECTOR('',#910,1.); +#910 = DIRECTION('',(1.,-0.)); +#911 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#912 = PCURVE('',#448,#913); +#913 = DEFINITIONAL_REPRESENTATION('',(#914),#922); +#914 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#915,#916,#917,#918,#919,#920 +,#921),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#915 = CARTESIAN_POINT('',(45.5,-37.65)); +#916 = CARTESIAN_POINT('',(42.642116167511,-37.65)); +#917 = CARTESIAN_POINT('',(44.071058083756,-35.175)); +#918 = CARTESIAN_POINT('',(45.5,-32.7)); +#919 = CARTESIAN_POINT('',(46.928941916244,-35.175)); +#920 = CARTESIAN_POINT('',(48.357883832489,-37.65)); +#921 = CARTESIAN_POINT('',(45.5,-37.65)); +#922 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#923 = ADVANCED_FACE('',(#924),#275,.F.); +#924 = FACE_BOUND('',#925,.T.); +#925 = EDGE_LOOP('',(#926,#949,#950,#951)); +#926 = ORIENTED_EDGE('',*,*,#927,.F.); +#927 = EDGE_CURVE('',#259,#928,#930,.T.); +#928 = VERTEX_POINT('',#929); +#929 = CARTESIAN_POINT('',(3.,-13.85,14.5)); +#930 = SEAM_CURVE('',#931,(#935,#942),.PCURVE_S1.); +#931 = LINE('',#932,#933); +#932 = CARTESIAN_POINT('',(0.,-13.85,14.5)); +#933 = VECTOR('',#934,1.); +#934 = DIRECTION('',(1.,0.,0.)); +#935 = PCURVE('',#275,#936); +#936 = DEFINITIONAL_REPRESENTATION('',(#937),#941); +#937 = LINE('',#938,#939); +#938 = CARTESIAN_POINT('',(-6.28318530718,0.)); +#939 = VECTOR('',#940,1.); +#940 = DIRECTION('',(-0.,-1.)); +#941 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#942 = PCURVE('',#275,#943); +#943 = DEFINITIONAL_REPRESENTATION('',(#944),#948); +#944 = LINE('',#945,#946); +#945 = CARTESIAN_POINT('',(-0.,0.)); +#946 = VECTOR('',#947,1.); +#947 = DIRECTION('',(-0.,-1.)); +#948 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#949 = ORIENTED_EDGE('',*,*,#258,.F.); +#950 = ORIENTED_EDGE('',*,*,#927,.T.); +#951 = ORIENTED_EDGE('',*,*,#952,.F.); +#952 = EDGE_CURVE('',#928,#928,#953,.T.); +#953 = SURFACE_CURVE('',#954,(#959,#966),.PCURVE_S1.); +#954 = CIRCLE('',#955,1.65); +#955 = AXIS2_PLACEMENT_3D('',#956,#957,#958); +#956 = CARTESIAN_POINT('',(3.,-15.5,14.5)); +#957 = DIRECTION('',(-1.,0.,0.)); +#958 = DIRECTION('',(0.,1.,0.)); +#959 = PCURVE('',#275,#960); +#960 = DEFINITIONAL_REPRESENTATION('',(#961),#965); +#961 = LINE('',#962,#963); +#962 = CARTESIAN_POINT('',(-6.28318530718,-3.)); +#963 = VECTOR('',#964,1.); +#964 = DIRECTION('',(1.,-0.)); +#965 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#966 = PCURVE('',#448,#967); +#967 = DEFINITIONAL_REPRESENTATION('',(#968),#976); +#968 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#969,#970,#971,#972,#973,#974 +,#975),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2,2,2,2,1),( + -2.094395102393,0.,2.094395102393,4.188790204786,6.28318530718, +8.377580409573),.UNSPECIFIED.) CURVE() GEOMETRIC_REPRESENTATION_ITEM() +RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5,1.,0.5,1.)) REPRESENTATION_ITEM( + '') ); +#969 = CARTESIAN_POINT('',(14.5,-6.65)); +#970 = CARTESIAN_POINT('',(11.642116167511,-6.65)); +#971 = CARTESIAN_POINT('',(13.071058083756,-4.175)); +#972 = CARTESIAN_POINT('',(14.5,-1.7)); +#973 = CARTESIAN_POINT('',(15.928941916244,-4.175)); +#974 = CARTESIAN_POINT('',(17.357883832489,-6.65)); +#975 = CARTESIAN_POINT('',(14.5,-6.65)); +#976 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#977 = ADVANCED_FACE('',(#978),#306,.F.); +#978 = FACE_BOUND('',#979,.T.); +#979 = EDGE_LOOP('',(#980,#1003,#1004,#1005)); +#980 = ORIENTED_EDGE('',*,*,#981,.F.); +#981 = EDGE_CURVE('',#290,#982,#984,.T.); +#982 = VERTEX_POINT('',#983); +#983 = CARTESIAN_POINT('',(3.,16.,30.)); +#984 = SEAM_CURVE('',#985,(#989,#996),.PCURVE_S1.); +#985 = LINE('',#986,#987); +#986 = CARTESIAN_POINT('',(0.,16.,30.)); +#987 = VECTOR('',#988,1.); +#988 = DIRECTION('',(1.,0.,0.)); +#989 = PCURVE('',#306,#990); +#990 = DEFINITIONAL_REPRESENTATION('',(#991),#995); +#991 = LINE('',#992,#993); +#992 = CARTESIAN_POINT('',(-6.28318530718,0.)); +#993 = VECTOR('',#994,1.); +#994 = DIRECTION('',(-0.,-1.)); +#995 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#996 = PCURVE('',#306,#997); +#997 = DEFINITIONAL_REPRESENTATION('',(#998),#1002); +#998 = LINE('',#999,#1000); +#999 = CARTESIAN_POINT('',(-0.,0.)); +#1000 = VECTOR('',#1001,1.); +#1001 = DIRECTION('',(-0.,-1.)); +#1002 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1003 = ORIENTED_EDGE('',*,*,#289,.F.); +#1004 = ORIENTED_EDGE('',*,*,#981,.T.); +#1005 = ORIENTED_EDGE('',*,*,#1006,.F.); +#1006 = EDGE_CURVE('',#982,#982,#1007,.T.); +#1007 = SURFACE_CURVE('',#1008,(#1013,#1020),.PCURVE_S1.); +#1008 = CIRCLE('',#1009,16.); +#1009 = AXIS2_PLACEMENT_3D('',#1010,#1011,#1012); +#1010 = CARTESIAN_POINT('',(3.,0.,30.)); +#1011 = DIRECTION('',(-1.,0.,0.)); +#1012 = DIRECTION('',(0.,1.,0.)); +#1013 = PCURVE('',#306,#1014); +#1014 = DEFINITIONAL_REPRESENTATION('',(#1015),#1019); +#1015 = LINE('',#1016,#1017); +#1016 = CARTESIAN_POINT('',(-6.28318530718,-3.)); +#1017 = VECTOR('',#1018,1.); +#1018 = DIRECTION('',(1.,-0.)); +#1019 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1020 = PCURVE('',#448,#1021); +#1021 = DEFINITIONAL_REPRESENTATION('',(#1022),#1030); +#1022 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1023,#1024,#1025,#1026, +#1027,#1028,#1029),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1023 = CARTESIAN_POINT('',(30.,-36.5)); +#1024 = CARTESIAN_POINT('',(2.287187078898,-36.5)); +#1025 = CARTESIAN_POINT('',(16.143593539449,-12.5)); +#1026 = CARTESIAN_POINT('',(30.,11.5)); +#1027 = CARTESIAN_POINT('',(43.856406460551,-12.5)); +#1028 = CARTESIAN_POINT('',(57.712812921102,-36.5)); +#1029 = CARTESIAN_POINT('',(30.,-36.5)); +#1030 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1031 = ADVANCED_FACE('',(#1032),#337,.F.); +#1032 = FACE_BOUND('',#1033,.T.); +#1033 = EDGE_LOOP('',(#1034,#1057,#1058,#1059)); +#1034 = ORIENTED_EDGE('',*,*,#1035,.F.); +#1035 = EDGE_CURVE('',#321,#1036,#1038,.T.); +#1036 = VERTEX_POINT('',#1037); +#1037 = CARTESIAN_POINT('',(3.,-13.85,45.5)); +#1038 = SEAM_CURVE('',#1039,(#1043,#1050),.PCURVE_S1.); +#1039 = LINE('',#1040,#1041); +#1040 = CARTESIAN_POINT('',(0.,-13.85,45.5)); +#1041 = VECTOR('',#1042,1.); +#1042 = DIRECTION('',(1.,0.,0.)); +#1043 = PCURVE('',#337,#1044); +#1044 = DEFINITIONAL_REPRESENTATION('',(#1045),#1049); +#1045 = LINE('',#1046,#1047); +#1046 = CARTESIAN_POINT('',(-6.28318530718,0.)); +#1047 = VECTOR('',#1048,1.); +#1048 = DIRECTION('',(-0.,-1.)); +#1049 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1050 = PCURVE('',#337,#1051); +#1051 = DEFINITIONAL_REPRESENTATION('',(#1052),#1056); +#1052 = LINE('',#1053,#1054); +#1053 = CARTESIAN_POINT('',(-0.,0.)); +#1054 = VECTOR('',#1055,1.); +#1055 = DIRECTION('',(-0.,-1.)); +#1056 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1057 = ORIENTED_EDGE('',*,*,#320,.F.); +#1058 = ORIENTED_EDGE('',*,*,#1035,.T.); +#1059 = ORIENTED_EDGE('',*,*,#1060,.F.); +#1060 = EDGE_CURVE('',#1036,#1036,#1061,.T.); +#1061 = SURFACE_CURVE('',#1062,(#1067,#1074),.PCURVE_S1.); +#1062 = CIRCLE('',#1063,1.65); +#1063 = AXIS2_PLACEMENT_3D('',#1064,#1065,#1066); +#1064 = CARTESIAN_POINT('',(3.,-15.5,45.5)); +#1065 = DIRECTION('',(-1.,0.,0.)); +#1066 = DIRECTION('',(0.,1.,0.)); +#1067 = PCURVE('',#337,#1068); +#1068 = DEFINITIONAL_REPRESENTATION('',(#1069),#1073); +#1069 = LINE('',#1070,#1071); +#1070 = CARTESIAN_POINT('',(-6.28318530718,-3.)); +#1071 = VECTOR('',#1072,1.); +#1072 = DIRECTION('',(1.,-0.)); +#1073 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1074 = PCURVE('',#448,#1075); +#1075 = DEFINITIONAL_REPRESENTATION('',(#1076),#1084); +#1076 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1077,#1078,#1079,#1080, +#1081,#1082,#1083),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1077 = CARTESIAN_POINT('',(45.5,-6.65)); +#1078 = CARTESIAN_POINT('',(42.642116167511,-6.65)); +#1079 = CARTESIAN_POINT('',(44.071058083756,-4.175)); +#1080 = CARTESIAN_POINT('',(45.5,-1.7)); +#1081 = CARTESIAN_POINT('',(46.928941916244,-4.175)); +#1082 = CARTESIAN_POINT('',(48.357883832489,-6.65)); +#1083 = CARTESIAN_POINT('',(45.5,-6.65)); +#1084 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1085 = ADVANCED_FACE('',(#1086,#1163,#1287,#1411,#1535,#1659,#1783), + #370,.F.); +#1086 = FACE_BOUND('',#1087,.F.); +#1087 = EDGE_LOOP('',(#1088,#1089,#1112,#1140,#1161,#1162)); +#1088 = ORIENTED_EDGE('',*,*,#352,.T.); +#1089 = ORIENTED_EDGE('',*,*,#1090,.T.); +#1090 = EDGE_CURVE('',#355,#1091,#1093,.T.); +#1091 = VERTEX_POINT('',#1092); +#1092 = CARTESIAN_POINT('',(35.,-18.5,0.)); +#1093 = SURFACE_CURVE('',#1094,(#1098,#1105),.PCURVE_S1.); +#1094 = LINE('',#1095,#1096); +#1095 = CARTESIAN_POINT('',(25.25,-28.25,0.)); +#1096 = VECTOR('',#1097,1.); +#1097 = DIRECTION('',(0.707106781187,0.707106781187,-0.)); +#1098 = PCURVE('',#370,#1099); +#1099 = DEFINITIONAL_REPRESENTATION('',(#1100),#1104); +#1100 = LINE('',#1101,#1102); +#1101 = CARTESIAN_POINT('',(25.25,-7.75)); +#1102 = VECTOR('',#1103,1.); +#1103 = DIRECTION('',(0.707106781187,0.707106781187)); +#1104 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1105 = PCURVE('',#502,#1106); +#1106 = DEFINITIONAL_REPRESENTATION('',(#1107),#1111); +#1107 = LINE('',#1108,#1109); +#1108 = CARTESIAN_POINT('',(0.,-12.37436867076)); +#1109 = VECTOR('',#1110,1.); +#1110 = DIRECTION('',(0.,1.)); +#1111 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1112 = ORIENTED_EDGE('',*,*,#1113,.T.); +#1113 = EDGE_CURVE('',#1091,#1114,#1116,.T.); +#1114 = VERTEX_POINT('',#1115); +#1115 = CARTESIAN_POINT('',(35.,18.5,0.)); +#1116 = SURFACE_CURVE('',#1117,(#1121,#1128),.PCURVE_S1.); +#1117 = LINE('',#1118,#1119); +#1118 = CARTESIAN_POINT('',(35.,-20.5,0.)); +#1119 = VECTOR('',#1120,1.); +#1120 = DIRECTION('',(0.,1.,0.)); +#1121 = PCURVE('',#370,#1122); +#1122 = DEFINITIONAL_REPRESENTATION('',(#1123),#1127); +#1123 = LINE('',#1124,#1125); +#1124 = CARTESIAN_POINT('',(35.,0.)); +#1125 = VECTOR('',#1126,1.); +#1126 = DIRECTION('',(0.,1.)); +#1127 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1128 = PCURVE('',#1129,#1134); +#1129 = PLANE('',#1130); +#1130 = AXIS2_PLACEMENT_3D('',#1131,#1132,#1133); +#1131 = CARTESIAN_POINT('',(35.,-20.5,0.)); +#1132 = DIRECTION('',(1.,0.,0.)); +#1133 = DIRECTION('',(0.,0.,1.)); +#1134 = DEFINITIONAL_REPRESENTATION('',(#1135),#1139); +#1135 = LINE('',#1136,#1137); +#1136 = CARTESIAN_POINT('',(0.,0.)); +#1137 = VECTOR('',#1138,1.); +#1138 = DIRECTION('',(0.,-1.)); +#1139 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1140 = ORIENTED_EDGE('',*,*,#1141,.F.); +#1141 = EDGE_CURVE('',#691,#1114,#1142,.T.); +#1142 = SURFACE_CURVE('',#1143,(#1147,#1154),.PCURVE_S1.); +#1143 = LINE('',#1144,#1145); +#1144 = CARTESIAN_POINT('',(35.5,18.,0.)); +#1145 = VECTOR('',#1146,1.); +#1146 = DIRECTION('',(0.707106781187,-0.707106781187,0.)); +#1147 = PCURVE('',#370,#1148); +#1148 = DEFINITIONAL_REPRESENTATION('',(#1149),#1153); +#1149 = LINE('',#1150,#1151); +#1150 = CARTESIAN_POINT('',(35.5,38.5)); +#1151 = VECTOR('',#1152,1.); +#1152 = DIRECTION('',(0.707106781187,-0.707106781187)); +#1153 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1154 = PCURVE('',#706,#1155); +#1155 = DEFINITIONAL_REPRESENTATION('',(#1156),#1160); +#1156 = LINE('',#1157,#1158); +#1157 = CARTESIAN_POINT('',(0.,2.12132034356)); +#1158 = VECTOR('',#1159,1.); +#1159 = DIRECTION('',(0.,1.)); +#1160 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1161 = ORIENTED_EDGE('',*,*,#718,.T.); +#1162 = ORIENTED_EDGE('',*,*,#518,.F.); +#1163 = FACE_BOUND('',#1164,.F.); +#1164 = EDGE_LOOP('',(#1165,#1195,#1228,#1256)); +#1165 = ORIENTED_EDGE('',*,*,#1166,.F.); +#1166 = EDGE_CURVE('',#1167,#1169,#1171,.T.); +#1167 = VERTEX_POINT('',#1168); +#1168 = CARTESIAN_POINT('',(7.75,-12.5,0.)); +#1169 = VERTEX_POINT('',#1170); +#1170 = CARTESIAN_POINT('',(7.75,-15.5,0.)); +#1171 = SURFACE_CURVE('',#1172,(#1176,#1183),.PCURVE_S1.); +#1172 = LINE('',#1173,#1174); +#1173 = CARTESIAN_POINT('',(7.75,-12.5,0.)); +#1174 = VECTOR('',#1175,1.); +#1175 = DIRECTION('',(0.,-1.,0.)); +#1176 = PCURVE('',#370,#1177); +#1177 = DEFINITIONAL_REPRESENTATION('',(#1178),#1182); +#1178 = LINE('',#1179,#1180); +#1179 = CARTESIAN_POINT('',(7.75,8.)); +#1180 = VECTOR('',#1181,1.); +#1181 = DIRECTION('',(0.,-1.)); +#1182 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1183 = PCURVE('',#1184,#1189); +#1184 = PLANE('',#1185); +#1185 = AXIS2_PLACEMENT_3D('',#1186,#1187,#1188); +#1186 = CARTESIAN_POINT('',(7.75,-12.5,0.)); +#1187 = DIRECTION('',(1.,0.,-0.)); +#1188 = DIRECTION('',(0.,-1.,0.)); +#1189 = DEFINITIONAL_REPRESENTATION('',(#1190),#1194); +#1190 = LINE('',#1191,#1192); +#1191 = CARTESIAN_POINT('',(0.,0.)); +#1192 = VECTOR('',#1193,1.); +#1193 = DIRECTION('',(1.,0.)); +#1194 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1195 = ORIENTED_EDGE('',*,*,#1196,.T.); +#1196 = EDGE_CURVE('',#1167,#1197,#1199,.T.); +#1197 = VERTEX_POINT('',#1198); +#1198 = CARTESIAN_POINT('',(12.25,-12.5,0.)); +#1199 = SURFACE_CURVE('',#1200,(#1205,#1216),.PCURVE_S1.); +#1200 = CIRCLE('',#1201,2.25); +#1201 = AXIS2_PLACEMENT_3D('',#1202,#1203,#1204); +#1202 = CARTESIAN_POINT('',(10.,-12.5,0.)); +#1203 = DIRECTION('',(-0.,-0.,-1.)); +#1204 = DIRECTION('',(0.,-1.,0.)); +#1205 = PCURVE('',#370,#1206); +#1206 = DEFINITIONAL_REPRESENTATION('',(#1207),#1215); +#1207 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1208,#1209,#1210,#1211, +#1212,#1213,#1214),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1208 = CARTESIAN_POINT('',(10.,5.75)); +#1209 = CARTESIAN_POINT('',(6.10288568297,5.75)); +#1210 = CARTESIAN_POINT('',(8.051442841485,9.125)); +#1211 = CARTESIAN_POINT('',(10.,12.5)); +#1212 = CARTESIAN_POINT('',(11.948557158515,9.125)); +#1213 = CARTESIAN_POINT('',(13.89711431703,5.75)); +#1214 = CARTESIAN_POINT('',(10.,5.75)); +#1215 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1216 = PCURVE('',#1217,#1222); +#1217 = CYLINDRICAL_SURFACE('',#1218,2.25); +#1218 = AXIS2_PLACEMENT_3D('',#1219,#1220,#1221); +#1219 = CARTESIAN_POINT('',(10.,-12.5,0.)); +#1220 = DIRECTION('',(-0.,-0.,-1.)); +#1221 = DIRECTION('',(0.,-1.,0.)); +#1222 = DEFINITIONAL_REPRESENTATION('',(#1223),#1227); +#1223 = LINE('',#1224,#1225); +#1224 = CARTESIAN_POINT('',(0.,0.)); +#1225 = VECTOR('',#1226,1.); +#1226 = DIRECTION('',(1.,0.)); +#1227 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1228 = ORIENTED_EDGE('',*,*,#1229,.F.); +#1229 = EDGE_CURVE('',#1230,#1197,#1232,.T.); +#1230 = VERTEX_POINT('',#1231); +#1231 = CARTESIAN_POINT('',(12.25,-15.5,0.)); +#1232 = SURFACE_CURVE('',#1233,(#1237,#1244),.PCURVE_S1.); +#1233 = LINE('',#1234,#1235); +#1234 = CARTESIAN_POINT('',(12.25,-15.5,0.)); +#1235 = VECTOR('',#1236,1.); +#1236 = DIRECTION('',(0.,1.,0.)); +#1237 = PCURVE('',#370,#1238); +#1238 = DEFINITIONAL_REPRESENTATION('',(#1239),#1243); +#1239 = LINE('',#1240,#1241); +#1240 = CARTESIAN_POINT('',(12.25,5.)); +#1241 = VECTOR('',#1242,1.); +#1242 = DIRECTION('',(0.,1.)); +#1243 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1244 = PCURVE('',#1245,#1250); +#1245 = PLANE('',#1246); +#1246 = AXIS2_PLACEMENT_3D('',#1247,#1248,#1249); +#1247 = CARTESIAN_POINT('',(12.25,-15.5,0.)); +#1248 = DIRECTION('',(-1.,0.,0.)); +#1249 = DIRECTION('',(0.,1.,0.)); +#1250 = DEFINITIONAL_REPRESENTATION('',(#1251),#1255); +#1251 = LINE('',#1252,#1253); +#1252 = CARTESIAN_POINT('',(0.,0.)); +#1253 = VECTOR('',#1254,1.); +#1254 = DIRECTION('',(1.,0.)); +#1255 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1256 = ORIENTED_EDGE('',*,*,#1257,.T.); +#1257 = EDGE_CURVE('',#1230,#1169,#1258,.T.); +#1258 = SURFACE_CURVE('',#1259,(#1264,#1275),.PCURVE_S1.); +#1259 = CIRCLE('',#1260,2.25); +#1260 = AXIS2_PLACEMENT_3D('',#1261,#1262,#1263); +#1261 = CARTESIAN_POINT('',(10.,-15.5,0.)); +#1262 = DIRECTION('',(0.,0.,-1.)); +#1263 = DIRECTION('',(0.,1.,0.)); +#1264 = PCURVE('',#370,#1265); +#1265 = DEFINITIONAL_REPRESENTATION('',(#1266),#1274); +#1266 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1267,#1268,#1269,#1270, +#1271,#1272,#1273),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1267 = CARTESIAN_POINT('',(10.,7.25)); +#1268 = CARTESIAN_POINT('',(13.89711431703,7.25)); +#1269 = CARTESIAN_POINT('',(11.948557158515,3.875)); +#1270 = CARTESIAN_POINT('',(10.,0.5)); +#1271 = CARTESIAN_POINT('',(8.051442841485,3.875)); +#1272 = CARTESIAN_POINT('',(6.10288568297,7.25)); +#1273 = CARTESIAN_POINT('',(10.,7.25)); +#1274 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1275 = PCURVE('',#1276,#1281); +#1276 = CYLINDRICAL_SURFACE('',#1277,2.25); +#1277 = AXIS2_PLACEMENT_3D('',#1278,#1279,#1280); +#1278 = CARTESIAN_POINT('',(10.,-15.5,0.)); +#1279 = DIRECTION('',(0.,0.,-1.)); +#1280 = DIRECTION('',(0.,1.,0.)); +#1281 = DEFINITIONAL_REPRESENTATION('',(#1282),#1286); +#1282 = LINE('',#1283,#1284); +#1283 = CARTESIAN_POINT('',(0.,0.)); +#1284 = VECTOR('',#1285,1.); +#1285 = DIRECTION('',(1.,0.)); +#1286 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1287 = FACE_BOUND('',#1288,.F.); +#1288 = EDGE_LOOP('',(#1289,#1319,#1352,#1380)); +#1289 = ORIENTED_EDGE('',*,*,#1290,.F.); +#1290 = EDGE_CURVE('',#1291,#1293,#1295,.T.); +#1291 = VERTEX_POINT('',#1292); +#1292 = CARTESIAN_POINT('',(21.5,-13.25,0.)); +#1293 = VERTEX_POINT('',#1294); +#1294 = CARTESIAN_POINT('',(18.5,-13.25,0.)); +#1295 = SURFACE_CURVE('',#1296,(#1300,#1307),.PCURVE_S1.); +#1296 = LINE('',#1297,#1298); +#1297 = CARTESIAN_POINT('',(21.5,-13.25,0.)); +#1298 = VECTOR('',#1299,1.); +#1299 = DIRECTION('',(-1.,0.,0.)); +#1300 = PCURVE('',#370,#1301); +#1301 = DEFINITIONAL_REPRESENTATION('',(#1302),#1306); +#1302 = LINE('',#1303,#1304); +#1303 = CARTESIAN_POINT('',(21.5,7.25)); +#1304 = VECTOR('',#1305,1.); +#1305 = DIRECTION('',(-1.,0.)); +#1306 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1307 = PCURVE('',#1308,#1313); +#1308 = PLANE('',#1309); +#1309 = AXIS2_PLACEMENT_3D('',#1310,#1311,#1312); +#1310 = CARTESIAN_POINT('',(21.5,-13.25,0.)); +#1311 = DIRECTION('',(0.,-1.,0.)); +#1312 = DIRECTION('',(-1.,0.,0.)); +#1313 = DEFINITIONAL_REPRESENTATION('',(#1314),#1318); +#1314 = LINE('',#1315,#1316); +#1315 = CARTESIAN_POINT('',(0.,-0.)); +#1316 = VECTOR('',#1317,1.); +#1317 = DIRECTION('',(1.,0.)); +#1318 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1319 = ORIENTED_EDGE('',*,*,#1320,.T.); +#1320 = EDGE_CURVE('',#1291,#1321,#1323,.T.); +#1321 = VERTEX_POINT('',#1322); +#1322 = CARTESIAN_POINT('',(21.5,-17.75,0.)); +#1323 = SURFACE_CURVE('',#1324,(#1329,#1340),.PCURVE_S1.); +#1324 = CIRCLE('',#1325,2.25); +#1325 = AXIS2_PLACEMENT_3D('',#1326,#1327,#1328); +#1326 = CARTESIAN_POINT('',(21.5,-15.5,0.)); +#1327 = DIRECTION('',(0.,0.,-1.)); +#1328 = DIRECTION('',(-1.,0.,0.)); +#1329 = PCURVE('',#370,#1330); +#1330 = DEFINITIONAL_REPRESENTATION('',(#1331),#1339); +#1331 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1332,#1333,#1334,#1335, +#1336,#1337,#1338),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1332 = CARTESIAN_POINT('',(19.25,5.)); +#1333 = CARTESIAN_POINT('',(19.25,8.89711431703)); +#1334 = CARTESIAN_POINT('',(22.625,6.948557158515)); +#1335 = CARTESIAN_POINT('',(26.,5.)); +#1336 = CARTESIAN_POINT('',(22.625,3.051442841485)); +#1337 = CARTESIAN_POINT('',(19.25,1.10288568297)); +#1338 = CARTESIAN_POINT('',(19.25,5.)); +#1339 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1340 = PCURVE('',#1341,#1346); +#1341 = CYLINDRICAL_SURFACE('',#1342,2.25); +#1342 = AXIS2_PLACEMENT_3D('',#1343,#1344,#1345); +#1343 = CARTESIAN_POINT('',(21.5,-15.5,0.)); +#1344 = DIRECTION('',(0.,0.,-1.)); +#1345 = DIRECTION('',(-1.,0.,0.)); +#1346 = DEFINITIONAL_REPRESENTATION('',(#1347),#1351); +#1347 = LINE('',#1348,#1349); +#1348 = CARTESIAN_POINT('',(0.,0.)); +#1349 = VECTOR('',#1350,1.); +#1350 = DIRECTION('',(1.,0.)); +#1351 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1352 = ORIENTED_EDGE('',*,*,#1353,.F.); +#1353 = EDGE_CURVE('',#1354,#1321,#1356,.T.); +#1354 = VERTEX_POINT('',#1355); +#1355 = CARTESIAN_POINT('',(18.5,-17.75,0.)); +#1356 = SURFACE_CURVE('',#1357,(#1361,#1368),.PCURVE_S1.); +#1357 = LINE('',#1358,#1359); +#1358 = CARTESIAN_POINT('',(18.5,-17.75,0.)); +#1359 = VECTOR('',#1360,1.); +#1360 = DIRECTION('',(1.,0.,0.)); +#1361 = PCURVE('',#370,#1362); +#1362 = DEFINITIONAL_REPRESENTATION('',(#1363),#1367); +#1363 = LINE('',#1364,#1365); +#1364 = CARTESIAN_POINT('',(18.5,2.75)); +#1365 = VECTOR('',#1366,1.); +#1366 = DIRECTION('',(1.,0.)); +#1367 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1368 = PCURVE('',#1369,#1374); +#1369 = PLANE('',#1370); +#1370 = AXIS2_PLACEMENT_3D('',#1371,#1372,#1373); +#1371 = CARTESIAN_POINT('',(18.5,-17.75,0.)); +#1372 = DIRECTION('',(0.,1.,0.)); +#1373 = DIRECTION('',(1.,0.,0.)); +#1374 = DEFINITIONAL_REPRESENTATION('',(#1375),#1379); +#1375 = LINE('',#1376,#1377); +#1376 = CARTESIAN_POINT('',(0.,0.)); +#1377 = VECTOR('',#1378,1.); +#1378 = DIRECTION('',(1.,0.)); +#1379 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1380 = ORIENTED_EDGE('',*,*,#1381,.T.); +#1381 = EDGE_CURVE('',#1354,#1293,#1382,.T.); +#1382 = SURFACE_CURVE('',#1383,(#1388,#1399),.PCURVE_S1.); +#1383 = CIRCLE('',#1384,2.25); +#1384 = AXIS2_PLACEMENT_3D('',#1385,#1386,#1387); +#1385 = CARTESIAN_POINT('',(18.5,-15.5,0.)); +#1386 = DIRECTION('',(0.,0.,-1.)); +#1387 = DIRECTION('',(1.,0.,0.)); +#1388 = PCURVE('',#370,#1389); +#1389 = DEFINITIONAL_REPRESENTATION('',(#1390),#1398); +#1390 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1391,#1392,#1393,#1394, +#1395,#1396,#1397),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1391 = CARTESIAN_POINT('',(20.75,5.)); +#1392 = CARTESIAN_POINT('',(20.75,1.10288568297)); +#1393 = CARTESIAN_POINT('',(17.375,3.051442841485)); +#1394 = CARTESIAN_POINT('',(14.,5.)); +#1395 = CARTESIAN_POINT('',(17.375,6.948557158515)); +#1396 = CARTESIAN_POINT('',(20.75,8.89711431703)); +#1397 = CARTESIAN_POINT('',(20.75,5.)); +#1398 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1399 = PCURVE('',#1400,#1405); +#1400 = CYLINDRICAL_SURFACE('',#1401,2.25); +#1401 = AXIS2_PLACEMENT_3D('',#1402,#1403,#1404); +#1402 = CARTESIAN_POINT('',(18.5,-15.5,0.)); +#1403 = DIRECTION('',(0.,0.,-1.)); +#1404 = DIRECTION('',(1.,0.,0.)); +#1405 = DEFINITIONAL_REPRESENTATION('',(#1406),#1410); +#1406 = LINE('',#1407,#1408); +#1407 = CARTESIAN_POINT('',(0.,0.)); +#1408 = VECTOR('',#1409,1.); +#1409 = DIRECTION('',(1.,0.)); +#1410 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1411 = FACE_BOUND('',#1412,.F.); +#1412 = EDGE_LOOP('',(#1413,#1443,#1476,#1504)); +#1413 = ORIENTED_EDGE('',*,*,#1414,.F.); +#1414 = EDGE_CURVE('',#1415,#1417,#1419,.T.); +#1415 = VERTEX_POINT('',#1416); +#1416 = CARTESIAN_POINT('',(27.75,-12.5,0.)); +#1417 = VERTEX_POINT('',#1418); +#1418 = CARTESIAN_POINT('',(27.75,-15.5,0.)); +#1419 = SURFACE_CURVE('',#1420,(#1424,#1431),.PCURVE_S1.); +#1420 = LINE('',#1421,#1422); +#1421 = CARTESIAN_POINT('',(27.75,-12.5,0.)); +#1422 = VECTOR('',#1423,1.); +#1423 = DIRECTION('',(0.,-1.,0.)); +#1424 = PCURVE('',#370,#1425); +#1425 = DEFINITIONAL_REPRESENTATION('',(#1426),#1430); +#1426 = LINE('',#1427,#1428); +#1427 = CARTESIAN_POINT('',(27.75,8.)); +#1428 = VECTOR('',#1429,1.); +#1429 = DIRECTION('',(0.,-1.)); +#1430 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1431 = PCURVE('',#1432,#1437); +#1432 = PLANE('',#1433); +#1433 = AXIS2_PLACEMENT_3D('',#1434,#1435,#1436); +#1434 = CARTESIAN_POINT('',(27.75,-12.5,0.)); +#1435 = DIRECTION('',(1.,0.,-0.)); +#1436 = DIRECTION('',(0.,-1.,0.)); +#1437 = DEFINITIONAL_REPRESENTATION('',(#1438),#1442); +#1438 = LINE('',#1439,#1440); +#1439 = CARTESIAN_POINT('',(0.,0.)); +#1440 = VECTOR('',#1441,1.); +#1441 = DIRECTION('',(1.,0.)); +#1442 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1443 = ORIENTED_EDGE('',*,*,#1444,.T.); +#1444 = EDGE_CURVE('',#1415,#1445,#1447,.T.); +#1445 = VERTEX_POINT('',#1446); +#1446 = CARTESIAN_POINT('',(32.25,-12.5,0.)); +#1447 = SURFACE_CURVE('',#1448,(#1453,#1464),.PCURVE_S1.); +#1448 = CIRCLE('',#1449,2.25); +#1449 = AXIS2_PLACEMENT_3D('',#1450,#1451,#1452); +#1450 = CARTESIAN_POINT('',(30.,-12.5,0.)); +#1451 = DIRECTION('',(-0.,-0.,-1.)); +#1452 = DIRECTION('',(0.,-1.,0.)); +#1453 = PCURVE('',#370,#1454); +#1454 = DEFINITIONAL_REPRESENTATION('',(#1455),#1463); +#1455 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1456,#1457,#1458,#1459, +#1460,#1461,#1462),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1456 = CARTESIAN_POINT('',(30.,5.75)); +#1457 = CARTESIAN_POINT('',(26.10288568297,5.75)); +#1458 = CARTESIAN_POINT('',(28.051442841485,9.125)); +#1459 = CARTESIAN_POINT('',(30.,12.5)); +#1460 = CARTESIAN_POINT('',(31.948557158515,9.125)); +#1461 = CARTESIAN_POINT('',(33.89711431703,5.75)); +#1462 = CARTESIAN_POINT('',(30.,5.75)); +#1463 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1464 = PCURVE('',#1465,#1470); +#1465 = CYLINDRICAL_SURFACE('',#1466,2.25); +#1466 = AXIS2_PLACEMENT_3D('',#1467,#1468,#1469); +#1467 = CARTESIAN_POINT('',(30.,-12.5,0.)); +#1468 = DIRECTION('',(-0.,-0.,-1.)); +#1469 = DIRECTION('',(0.,-1.,0.)); +#1470 = DEFINITIONAL_REPRESENTATION('',(#1471),#1475); +#1471 = LINE('',#1472,#1473); +#1472 = CARTESIAN_POINT('',(0.,0.)); +#1473 = VECTOR('',#1474,1.); +#1474 = DIRECTION('',(1.,0.)); +#1475 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1476 = ORIENTED_EDGE('',*,*,#1477,.F.); +#1477 = EDGE_CURVE('',#1478,#1445,#1480,.T.); +#1478 = VERTEX_POINT('',#1479); +#1479 = CARTESIAN_POINT('',(32.25,-15.5,0.)); +#1480 = SURFACE_CURVE('',#1481,(#1485,#1492),.PCURVE_S1.); +#1481 = LINE('',#1482,#1483); +#1482 = CARTESIAN_POINT('',(32.25,-15.5,0.)); +#1483 = VECTOR('',#1484,1.); +#1484 = DIRECTION('',(0.,1.,0.)); +#1485 = PCURVE('',#370,#1486); +#1486 = DEFINITIONAL_REPRESENTATION('',(#1487),#1491); +#1487 = LINE('',#1488,#1489); +#1488 = CARTESIAN_POINT('',(32.25,5.)); +#1489 = VECTOR('',#1490,1.); +#1490 = DIRECTION('',(0.,1.)); +#1491 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1492 = PCURVE('',#1493,#1498); +#1493 = PLANE('',#1494); +#1494 = AXIS2_PLACEMENT_3D('',#1495,#1496,#1497); +#1495 = CARTESIAN_POINT('',(32.25,-15.5,0.)); +#1496 = DIRECTION('',(-1.,0.,0.)); +#1497 = DIRECTION('',(0.,1.,0.)); +#1498 = DEFINITIONAL_REPRESENTATION('',(#1499),#1503); +#1499 = LINE('',#1500,#1501); +#1500 = CARTESIAN_POINT('',(0.,0.)); +#1501 = VECTOR('',#1502,1.); +#1502 = DIRECTION('',(1.,0.)); +#1503 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1504 = ORIENTED_EDGE('',*,*,#1505,.T.); +#1505 = EDGE_CURVE('',#1478,#1417,#1506,.T.); +#1506 = SURFACE_CURVE('',#1507,(#1512,#1523),.PCURVE_S1.); +#1507 = CIRCLE('',#1508,2.25); +#1508 = AXIS2_PLACEMENT_3D('',#1509,#1510,#1511); +#1509 = CARTESIAN_POINT('',(30.,-15.5,0.)); +#1510 = DIRECTION('',(0.,0.,-1.)); +#1511 = DIRECTION('',(0.,1.,0.)); +#1512 = PCURVE('',#370,#1513); +#1513 = DEFINITIONAL_REPRESENTATION('',(#1514),#1522); +#1514 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1515,#1516,#1517,#1518, +#1519,#1520,#1521),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1515 = CARTESIAN_POINT('',(30.,7.25)); +#1516 = CARTESIAN_POINT('',(33.89711431703,7.25)); +#1517 = CARTESIAN_POINT('',(31.948557158515,3.875)); +#1518 = CARTESIAN_POINT('',(30.,0.5)); +#1519 = CARTESIAN_POINT('',(28.051442841485,3.875)); +#1520 = CARTESIAN_POINT('',(26.10288568297,7.25)); +#1521 = CARTESIAN_POINT('',(30.,7.25)); +#1522 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1523 = PCURVE('',#1524,#1529); +#1524 = CYLINDRICAL_SURFACE('',#1525,2.25); +#1525 = AXIS2_PLACEMENT_3D('',#1526,#1527,#1528); +#1526 = CARTESIAN_POINT('',(30.,-15.5,0.)); +#1527 = DIRECTION('',(0.,0.,-1.)); +#1528 = DIRECTION('',(0.,1.,0.)); +#1529 = DEFINITIONAL_REPRESENTATION('',(#1530),#1534); +#1530 = LINE('',#1531,#1532); +#1531 = CARTESIAN_POINT('',(0.,0.)); +#1532 = VECTOR('',#1533,1.); +#1533 = DIRECTION('',(1.,0.)); +#1534 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1535 = FACE_BOUND('',#1536,.F.); +#1536 = EDGE_LOOP('',(#1537,#1567,#1600,#1628)); +#1537 = ORIENTED_EDGE('',*,*,#1538,.F.); +#1538 = EDGE_CURVE('',#1539,#1541,#1543,.T.); +#1539 = VERTEX_POINT('',#1540); +#1540 = CARTESIAN_POINT('',(7.75,15.5,0.)); +#1541 = VERTEX_POINT('',#1542); +#1542 = CARTESIAN_POINT('',(7.75,12.5,0.)); +#1543 = SURFACE_CURVE('',#1544,(#1548,#1555),.PCURVE_S1.); +#1544 = LINE('',#1545,#1546); +#1545 = CARTESIAN_POINT('',(7.75,15.5,0.)); +#1546 = VECTOR('',#1547,1.); +#1547 = DIRECTION('',(0.,-1.,0.)); +#1548 = PCURVE('',#370,#1549); +#1549 = DEFINITIONAL_REPRESENTATION('',(#1550),#1554); +#1550 = LINE('',#1551,#1552); +#1551 = CARTESIAN_POINT('',(7.75,36.)); +#1552 = VECTOR('',#1553,1.); +#1553 = DIRECTION('',(0.,-1.)); +#1554 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1555 = PCURVE('',#1556,#1561); +#1556 = PLANE('',#1557); +#1557 = AXIS2_PLACEMENT_3D('',#1558,#1559,#1560); +#1558 = CARTESIAN_POINT('',(7.75,15.5,0.)); +#1559 = DIRECTION('',(1.,0.,-0.)); +#1560 = DIRECTION('',(0.,-1.,0.)); +#1561 = DEFINITIONAL_REPRESENTATION('',(#1562),#1566); +#1562 = LINE('',#1563,#1564); +#1563 = CARTESIAN_POINT('',(0.,0.)); +#1564 = VECTOR('',#1565,1.); +#1565 = DIRECTION('',(1.,0.)); +#1566 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1567 = ORIENTED_EDGE('',*,*,#1568,.T.); +#1568 = EDGE_CURVE('',#1539,#1569,#1571,.T.); +#1569 = VERTEX_POINT('',#1570); +#1570 = CARTESIAN_POINT('',(12.25,15.5,0.)); +#1571 = SURFACE_CURVE('',#1572,(#1577,#1588),.PCURVE_S1.); +#1572 = CIRCLE('',#1573,2.25); +#1573 = AXIS2_PLACEMENT_3D('',#1574,#1575,#1576); +#1574 = CARTESIAN_POINT('',(10.,15.5,0.)); +#1575 = DIRECTION('',(-0.,-0.,-1.)); +#1576 = DIRECTION('',(0.,-1.,0.)); +#1577 = PCURVE('',#370,#1578); +#1578 = DEFINITIONAL_REPRESENTATION('',(#1579),#1587); +#1579 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1580,#1581,#1582,#1583, +#1584,#1585,#1586),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1580 = CARTESIAN_POINT('',(10.,33.75)); +#1581 = CARTESIAN_POINT('',(6.10288568297,33.75)); +#1582 = CARTESIAN_POINT('',(8.051442841485,37.125)); +#1583 = CARTESIAN_POINT('',(10.,40.5)); +#1584 = CARTESIAN_POINT('',(11.948557158515,37.125)); +#1585 = CARTESIAN_POINT('',(13.89711431703,33.75)); +#1586 = CARTESIAN_POINT('',(10.,33.75)); +#1587 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1588 = PCURVE('',#1589,#1594); +#1589 = CYLINDRICAL_SURFACE('',#1590,2.25); +#1590 = AXIS2_PLACEMENT_3D('',#1591,#1592,#1593); +#1591 = CARTESIAN_POINT('',(10.,15.5,0.)); +#1592 = DIRECTION('',(-0.,-0.,-1.)); +#1593 = DIRECTION('',(0.,-1.,0.)); +#1594 = DEFINITIONAL_REPRESENTATION('',(#1595),#1599); +#1595 = LINE('',#1596,#1597); +#1596 = CARTESIAN_POINT('',(0.,0.)); +#1597 = VECTOR('',#1598,1.); +#1598 = DIRECTION('',(1.,0.)); +#1599 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1600 = ORIENTED_EDGE('',*,*,#1601,.F.); +#1601 = EDGE_CURVE('',#1602,#1569,#1604,.T.); +#1602 = VERTEX_POINT('',#1603); +#1603 = CARTESIAN_POINT('',(12.25,12.5,0.)); +#1604 = SURFACE_CURVE('',#1605,(#1609,#1616),.PCURVE_S1.); +#1605 = LINE('',#1606,#1607); +#1606 = CARTESIAN_POINT('',(12.25,12.5,0.)); +#1607 = VECTOR('',#1608,1.); +#1608 = DIRECTION('',(0.,1.,0.)); +#1609 = PCURVE('',#370,#1610); +#1610 = DEFINITIONAL_REPRESENTATION('',(#1611),#1615); +#1611 = LINE('',#1612,#1613); +#1612 = CARTESIAN_POINT('',(12.25,33.)); +#1613 = VECTOR('',#1614,1.); +#1614 = DIRECTION('',(0.,1.)); +#1615 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1616 = PCURVE('',#1617,#1622); +#1617 = PLANE('',#1618); +#1618 = AXIS2_PLACEMENT_3D('',#1619,#1620,#1621); +#1619 = CARTESIAN_POINT('',(12.25,12.5,0.)); +#1620 = DIRECTION('',(-1.,0.,0.)); +#1621 = DIRECTION('',(0.,1.,0.)); +#1622 = DEFINITIONAL_REPRESENTATION('',(#1623),#1627); +#1623 = LINE('',#1624,#1625); +#1624 = CARTESIAN_POINT('',(0.,0.)); +#1625 = VECTOR('',#1626,1.); +#1626 = DIRECTION('',(1.,0.)); +#1627 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1628 = ORIENTED_EDGE('',*,*,#1629,.T.); +#1629 = EDGE_CURVE('',#1602,#1541,#1630,.T.); +#1630 = SURFACE_CURVE('',#1631,(#1636,#1647),.PCURVE_S1.); +#1631 = CIRCLE('',#1632,2.25); +#1632 = AXIS2_PLACEMENT_3D('',#1633,#1634,#1635); +#1633 = CARTESIAN_POINT('',(10.,12.5,0.)); +#1634 = DIRECTION('',(0.,0.,-1.)); +#1635 = DIRECTION('',(0.,1.,0.)); +#1636 = PCURVE('',#370,#1637); +#1637 = DEFINITIONAL_REPRESENTATION('',(#1638),#1646); +#1638 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1639,#1640,#1641,#1642, +#1643,#1644,#1645),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1639 = CARTESIAN_POINT('',(10.,35.25)); +#1640 = CARTESIAN_POINT('',(13.89711431703,35.25)); +#1641 = CARTESIAN_POINT('',(11.948557158515,31.875)); +#1642 = CARTESIAN_POINT('',(10.,28.5)); +#1643 = CARTESIAN_POINT('',(8.051442841485,31.875)); +#1644 = CARTESIAN_POINT('',(6.10288568297,35.25)); +#1645 = CARTESIAN_POINT('',(10.,35.25)); +#1646 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1647 = PCURVE('',#1648,#1653); +#1648 = CYLINDRICAL_SURFACE('',#1649,2.25); +#1649 = AXIS2_PLACEMENT_3D('',#1650,#1651,#1652); +#1650 = CARTESIAN_POINT('',(10.,12.5,0.)); +#1651 = DIRECTION('',(0.,0.,-1.)); +#1652 = DIRECTION('',(0.,1.,0.)); +#1653 = DEFINITIONAL_REPRESENTATION('',(#1654),#1658); +#1654 = LINE('',#1655,#1656); +#1655 = CARTESIAN_POINT('',(0.,0.)); +#1656 = VECTOR('',#1657,1.); +#1657 = DIRECTION('',(1.,0.)); +#1658 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1659 = FACE_BOUND('',#1660,.F.); +#1660 = EDGE_LOOP('',(#1661,#1691,#1724,#1752)); +#1661 = ORIENTED_EDGE('',*,*,#1662,.F.); +#1662 = EDGE_CURVE('',#1663,#1665,#1667,.T.); +#1663 = VERTEX_POINT('',#1664); +#1664 = CARTESIAN_POINT('',(21.5,17.75,0.)); +#1665 = VERTEX_POINT('',#1666); +#1666 = CARTESIAN_POINT('',(18.5,17.75,0.)); +#1667 = SURFACE_CURVE('',#1668,(#1672,#1679),.PCURVE_S1.); +#1668 = LINE('',#1669,#1670); +#1669 = CARTESIAN_POINT('',(21.5,17.75,0.)); +#1670 = VECTOR('',#1671,1.); +#1671 = DIRECTION('',(-1.,0.,0.)); +#1672 = PCURVE('',#370,#1673); +#1673 = DEFINITIONAL_REPRESENTATION('',(#1674),#1678); +#1674 = LINE('',#1675,#1676); +#1675 = CARTESIAN_POINT('',(21.5,38.25)); +#1676 = VECTOR('',#1677,1.); +#1677 = DIRECTION('',(-1.,0.)); +#1678 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1679 = PCURVE('',#1680,#1685); +#1680 = PLANE('',#1681); +#1681 = AXIS2_PLACEMENT_3D('',#1682,#1683,#1684); +#1682 = CARTESIAN_POINT('',(21.5,17.75,0.)); +#1683 = DIRECTION('',(0.,-1.,0.)); +#1684 = DIRECTION('',(-1.,0.,0.)); +#1685 = DEFINITIONAL_REPRESENTATION('',(#1686),#1690); +#1686 = LINE('',#1687,#1688); +#1687 = CARTESIAN_POINT('',(0.,-0.)); +#1688 = VECTOR('',#1689,1.); +#1689 = DIRECTION('',(1.,0.)); +#1690 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1691 = ORIENTED_EDGE('',*,*,#1692,.T.); +#1692 = EDGE_CURVE('',#1663,#1693,#1695,.T.); +#1693 = VERTEX_POINT('',#1694); +#1694 = CARTESIAN_POINT('',(21.5,13.25,0.)); +#1695 = SURFACE_CURVE('',#1696,(#1701,#1712),.PCURVE_S1.); +#1696 = CIRCLE('',#1697,2.25); +#1697 = AXIS2_PLACEMENT_3D('',#1698,#1699,#1700); +#1698 = CARTESIAN_POINT('',(21.5,15.5,0.)); +#1699 = DIRECTION('',(0.,0.,-1.)); +#1700 = DIRECTION('',(-1.,0.,0.)); +#1701 = PCURVE('',#370,#1702); +#1702 = DEFINITIONAL_REPRESENTATION('',(#1703),#1711); +#1703 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1704,#1705,#1706,#1707, +#1708,#1709,#1710),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1704 = CARTESIAN_POINT('',(19.25,36.)); +#1705 = CARTESIAN_POINT('',(19.25,39.89711431703)); +#1706 = CARTESIAN_POINT('',(22.625,37.948557158515)); +#1707 = CARTESIAN_POINT('',(26.,36.)); +#1708 = CARTESIAN_POINT('',(22.625,34.051442841485)); +#1709 = CARTESIAN_POINT('',(19.25,32.10288568297)); +#1710 = CARTESIAN_POINT('',(19.25,36.)); +#1711 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1712 = PCURVE('',#1713,#1718); +#1713 = CYLINDRICAL_SURFACE('',#1714,2.25); +#1714 = AXIS2_PLACEMENT_3D('',#1715,#1716,#1717); +#1715 = CARTESIAN_POINT('',(21.5,15.5,0.)); +#1716 = DIRECTION('',(0.,0.,-1.)); +#1717 = DIRECTION('',(-1.,0.,0.)); +#1718 = DEFINITIONAL_REPRESENTATION('',(#1719),#1723); +#1719 = LINE('',#1720,#1721); +#1720 = CARTESIAN_POINT('',(0.,0.)); +#1721 = VECTOR('',#1722,1.); +#1722 = DIRECTION('',(1.,0.)); +#1723 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1724 = ORIENTED_EDGE('',*,*,#1725,.F.); +#1725 = EDGE_CURVE('',#1726,#1693,#1728,.T.); +#1726 = VERTEX_POINT('',#1727); +#1727 = CARTESIAN_POINT('',(18.5,13.25,0.)); +#1728 = SURFACE_CURVE('',#1729,(#1733,#1740),.PCURVE_S1.); +#1729 = LINE('',#1730,#1731); +#1730 = CARTESIAN_POINT('',(18.5,13.25,0.)); +#1731 = VECTOR('',#1732,1.); +#1732 = DIRECTION('',(1.,0.,0.)); +#1733 = PCURVE('',#370,#1734); +#1734 = DEFINITIONAL_REPRESENTATION('',(#1735),#1739); +#1735 = LINE('',#1736,#1737); +#1736 = CARTESIAN_POINT('',(18.5,33.75)); +#1737 = VECTOR('',#1738,1.); +#1738 = DIRECTION('',(1.,0.)); +#1739 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1740 = PCURVE('',#1741,#1746); +#1741 = PLANE('',#1742); +#1742 = AXIS2_PLACEMENT_3D('',#1743,#1744,#1745); +#1743 = CARTESIAN_POINT('',(18.5,13.25,0.)); +#1744 = DIRECTION('',(0.,1.,0.)); +#1745 = DIRECTION('',(1.,0.,0.)); +#1746 = DEFINITIONAL_REPRESENTATION('',(#1747),#1751); +#1747 = LINE('',#1748,#1749); +#1748 = CARTESIAN_POINT('',(0.,0.)); +#1749 = VECTOR('',#1750,1.); +#1750 = DIRECTION('',(1.,0.)); +#1751 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1752 = ORIENTED_EDGE('',*,*,#1753,.T.); +#1753 = EDGE_CURVE('',#1726,#1665,#1754,.T.); +#1754 = SURFACE_CURVE('',#1755,(#1760,#1771),.PCURVE_S1.); +#1755 = CIRCLE('',#1756,2.25); +#1756 = AXIS2_PLACEMENT_3D('',#1757,#1758,#1759); +#1757 = CARTESIAN_POINT('',(18.5,15.5,0.)); +#1758 = DIRECTION('',(0.,0.,-1.)); +#1759 = DIRECTION('',(1.,0.,0.)); +#1760 = PCURVE('',#370,#1761); +#1761 = DEFINITIONAL_REPRESENTATION('',(#1762),#1770); +#1762 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1763,#1764,#1765,#1766, +#1767,#1768,#1769),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1763 = CARTESIAN_POINT('',(20.75,36.)); +#1764 = CARTESIAN_POINT('',(20.75,32.10288568297)); +#1765 = CARTESIAN_POINT('',(17.375,34.051442841485)); +#1766 = CARTESIAN_POINT('',(14.,36.)); +#1767 = CARTESIAN_POINT('',(17.375,37.948557158515)); +#1768 = CARTESIAN_POINT('',(20.75,39.89711431703)); +#1769 = CARTESIAN_POINT('',(20.75,36.)); +#1770 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1771 = PCURVE('',#1772,#1777); +#1772 = CYLINDRICAL_SURFACE('',#1773,2.25); +#1773 = AXIS2_PLACEMENT_3D('',#1774,#1775,#1776); +#1774 = CARTESIAN_POINT('',(18.5,15.5,0.)); +#1775 = DIRECTION('',(0.,0.,-1.)); +#1776 = DIRECTION('',(1.,0.,0.)); +#1777 = DEFINITIONAL_REPRESENTATION('',(#1778),#1782); +#1778 = LINE('',#1779,#1780); +#1779 = CARTESIAN_POINT('',(0.,0.)); +#1780 = VECTOR('',#1781,1.); +#1781 = DIRECTION('',(1.,0.)); +#1782 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1783 = FACE_BOUND('',#1784,.F.); +#1784 = EDGE_LOOP('',(#1785,#1815,#1848,#1876)); +#1785 = ORIENTED_EDGE('',*,*,#1786,.F.); +#1786 = EDGE_CURVE('',#1787,#1789,#1791,.T.); +#1787 = VERTEX_POINT('',#1788); +#1788 = CARTESIAN_POINT('',(27.75,15.5,0.)); +#1789 = VERTEX_POINT('',#1790); +#1790 = CARTESIAN_POINT('',(27.75,12.5,0.)); +#1791 = SURFACE_CURVE('',#1792,(#1796,#1803),.PCURVE_S1.); +#1792 = LINE('',#1793,#1794); +#1793 = CARTESIAN_POINT('',(27.75,15.5,0.)); +#1794 = VECTOR('',#1795,1.); +#1795 = DIRECTION('',(0.,-1.,0.)); +#1796 = PCURVE('',#370,#1797); +#1797 = DEFINITIONAL_REPRESENTATION('',(#1798),#1802); +#1798 = LINE('',#1799,#1800); +#1799 = CARTESIAN_POINT('',(27.75,36.)); +#1800 = VECTOR('',#1801,1.); +#1801 = DIRECTION('',(0.,-1.)); +#1802 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1803 = PCURVE('',#1804,#1809); +#1804 = PLANE('',#1805); +#1805 = AXIS2_PLACEMENT_3D('',#1806,#1807,#1808); +#1806 = CARTESIAN_POINT('',(27.75,15.5,0.)); +#1807 = DIRECTION('',(1.,0.,-0.)); +#1808 = DIRECTION('',(0.,-1.,0.)); +#1809 = DEFINITIONAL_REPRESENTATION('',(#1810),#1814); +#1810 = LINE('',#1811,#1812); +#1811 = CARTESIAN_POINT('',(0.,0.)); +#1812 = VECTOR('',#1813,1.); +#1813 = DIRECTION('',(1.,0.)); +#1814 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1815 = ORIENTED_EDGE('',*,*,#1816,.T.); +#1816 = EDGE_CURVE('',#1787,#1817,#1819,.T.); +#1817 = VERTEX_POINT('',#1818); +#1818 = CARTESIAN_POINT('',(32.25,15.5,0.)); +#1819 = SURFACE_CURVE('',#1820,(#1825,#1836),.PCURVE_S1.); +#1820 = CIRCLE('',#1821,2.25); +#1821 = AXIS2_PLACEMENT_3D('',#1822,#1823,#1824); +#1822 = CARTESIAN_POINT('',(30.,15.5,0.)); +#1823 = DIRECTION('',(-0.,-0.,-1.)); +#1824 = DIRECTION('',(0.,-1.,0.)); +#1825 = PCURVE('',#370,#1826); +#1826 = DEFINITIONAL_REPRESENTATION('',(#1827),#1835); +#1827 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1828,#1829,#1830,#1831, +#1832,#1833,#1834),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1828 = CARTESIAN_POINT('',(30.,33.75)); +#1829 = CARTESIAN_POINT('',(26.10288568297,33.75)); +#1830 = CARTESIAN_POINT('',(28.051442841485,37.125)); +#1831 = CARTESIAN_POINT('',(30.,40.5)); +#1832 = CARTESIAN_POINT('',(31.948557158515,37.125)); +#1833 = CARTESIAN_POINT('',(33.89711431703,33.75)); +#1834 = CARTESIAN_POINT('',(30.,33.75)); +#1835 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1836 = PCURVE('',#1837,#1842); +#1837 = CYLINDRICAL_SURFACE('',#1838,2.25); +#1838 = AXIS2_PLACEMENT_3D('',#1839,#1840,#1841); +#1839 = CARTESIAN_POINT('',(30.,15.5,0.)); +#1840 = DIRECTION('',(-0.,-0.,-1.)); +#1841 = DIRECTION('',(0.,-1.,0.)); +#1842 = DEFINITIONAL_REPRESENTATION('',(#1843),#1847); +#1843 = LINE('',#1844,#1845); +#1844 = CARTESIAN_POINT('',(0.,0.)); +#1845 = VECTOR('',#1846,1.); +#1846 = DIRECTION('',(1.,0.)); +#1847 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1848 = ORIENTED_EDGE('',*,*,#1849,.F.); +#1849 = EDGE_CURVE('',#1850,#1817,#1852,.T.); +#1850 = VERTEX_POINT('',#1851); +#1851 = CARTESIAN_POINT('',(32.25,12.5,0.)); +#1852 = SURFACE_CURVE('',#1853,(#1857,#1864),.PCURVE_S1.); +#1853 = LINE('',#1854,#1855); +#1854 = CARTESIAN_POINT('',(32.25,12.5,0.)); +#1855 = VECTOR('',#1856,1.); +#1856 = DIRECTION('',(0.,1.,0.)); +#1857 = PCURVE('',#370,#1858); +#1858 = DEFINITIONAL_REPRESENTATION('',(#1859),#1863); +#1859 = LINE('',#1860,#1861); +#1860 = CARTESIAN_POINT('',(32.25,33.)); +#1861 = VECTOR('',#1862,1.); +#1862 = DIRECTION('',(0.,1.)); +#1863 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1864 = PCURVE('',#1865,#1870); +#1865 = PLANE('',#1866); +#1866 = AXIS2_PLACEMENT_3D('',#1867,#1868,#1869); +#1867 = CARTESIAN_POINT('',(32.25,12.5,0.)); +#1868 = DIRECTION('',(-1.,0.,0.)); +#1869 = DIRECTION('',(0.,1.,0.)); +#1870 = DEFINITIONAL_REPRESENTATION('',(#1871),#1875); +#1871 = LINE('',#1872,#1873); +#1872 = CARTESIAN_POINT('',(0.,0.)); +#1873 = VECTOR('',#1874,1.); +#1874 = DIRECTION('',(1.,0.)); +#1875 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1876 = ORIENTED_EDGE('',*,*,#1877,.T.); +#1877 = EDGE_CURVE('',#1850,#1789,#1878,.T.); +#1878 = SURFACE_CURVE('',#1879,(#1884,#1895),.PCURVE_S1.); +#1879 = CIRCLE('',#1880,2.25); +#1880 = AXIS2_PLACEMENT_3D('',#1881,#1882,#1883); +#1881 = CARTESIAN_POINT('',(30.,12.5,0.)); +#1882 = DIRECTION('',(0.,0.,-1.)); +#1883 = DIRECTION('',(0.,1.,0.)); +#1884 = PCURVE('',#370,#1885); +#1885 = DEFINITIONAL_REPRESENTATION('',(#1886),#1894); +#1886 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#1887,#1888,#1889,#1890, +#1891,#1892,#1893),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#1887 = CARTESIAN_POINT('',(30.,35.25)); +#1888 = CARTESIAN_POINT('',(33.89711431703,35.25)); +#1889 = CARTESIAN_POINT('',(31.948557158515,31.875)); +#1890 = CARTESIAN_POINT('',(30.,28.5)); +#1891 = CARTESIAN_POINT('',(28.051442841485,31.875)); +#1892 = CARTESIAN_POINT('',(26.10288568297,35.25)); +#1893 = CARTESIAN_POINT('',(30.,35.25)); +#1894 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1895 = PCURVE('',#1896,#1901); +#1896 = CYLINDRICAL_SURFACE('',#1897,2.25); +#1897 = AXIS2_PLACEMENT_3D('',#1898,#1899,#1900); +#1898 = CARTESIAN_POINT('',(30.,12.5,0.)); +#1899 = DIRECTION('',(0.,0.,-1.)); +#1900 = DIRECTION('',(0.,1.,0.)); +#1901 = DEFINITIONAL_REPRESENTATION('',(#1902),#1906); +#1902 = LINE('',#1903,#1904); +#1903 = CARTESIAN_POINT('',(0.,0.)); +#1904 = VECTOR('',#1905,1.); +#1905 = DIRECTION('',(1.,0.)); +#1906 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1907 = ADVANCED_FACE('',(#1908),#502,.F.); +#1908 = FACE_BOUND('',#1909,.F.); +#1909 = EDGE_LOOP('',(#1910,#1911,#1912,#1935)); +#1910 = ORIENTED_EDGE('',*,*,#1090,.F.); +#1911 = ORIENTED_EDGE('',*,*,#488,.T.); +#1912 = ORIENTED_EDGE('',*,*,#1913,.T.); +#1913 = EDGE_CURVE('',#461,#1914,#1916,.T.); +#1914 = VERTEX_POINT('',#1915); +#1915 = CARTESIAN_POINT('',(35.,-18.5,3.)); +#1916 = SURFACE_CURVE('',#1917,(#1921,#1928),.PCURVE_S1.); +#1917 = LINE('',#1918,#1919); +#1918 = CARTESIAN_POINT('',(25.25,-28.25,3.)); +#1919 = VECTOR('',#1920,1.); +#1920 = DIRECTION('',(0.707106781187,0.707106781187,-0.)); +#1921 = PCURVE('',#502,#1922); +#1922 = DEFINITIONAL_REPRESENTATION('',(#1923),#1927); +#1923 = LINE('',#1924,#1925); +#1924 = CARTESIAN_POINT('',(3.,-12.37436867076)); +#1925 = VECTOR('',#1926,1.); +#1926 = DIRECTION('',(0.,1.)); +#1927 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1928 = PCURVE('',#476,#1929); +#1929 = DEFINITIONAL_REPRESENTATION('',(#1930),#1934); +#1930 = LINE('',#1931,#1932); +#1931 = CARTESIAN_POINT('',(25.25,-7.75)); +#1932 = VECTOR('',#1933,1.); +#1933 = DIRECTION('',(0.707106781187,0.707106781187)); +#1934 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1935 = ORIENTED_EDGE('',*,*,#1936,.F.); +#1936 = EDGE_CURVE('',#1091,#1914,#1937,.T.); +#1937 = SURFACE_CURVE('',#1938,(#1942,#1949),.PCURVE_S1.); +#1938 = LINE('',#1939,#1940); +#1939 = CARTESIAN_POINT('',(35.,-18.5,0.)); +#1940 = VECTOR('',#1941,1.); +#1941 = DIRECTION('',(0.,0.,1.)); +#1942 = PCURVE('',#502,#1943); +#1943 = DEFINITIONAL_REPRESENTATION('',(#1944),#1948); +#1944 = LINE('',#1945,#1946); +#1945 = CARTESIAN_POINT('',(0.,1.414213562373)); +#1946 = VECTOR('',#1947,1.); +#1947 = DIRECTION('',(1.,0.)); +#1948 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1949 = PCURVE('',#1129,#1950); +#1950 = DEFINITIONAL_REPRESENTATION('',(#1951),#1955); +#1951 = LINE('',#1952,#1953); +#1952 = CARTESIAN_POINT('',(0.,-2.)); +#1953 = VECTOR('',#1954,1.); +#1954 = DIRECTION('',(1.,0.)); +#1955 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1956 = ADVANCED_FACE('',(#1957,#2025,#2125,#2225,#2325,#2425,#2525), + #476,.T.); +#1957 = FACE_BOUND('',#1958,.T.); +#1958 = EDGE_LOOP('',(#1959,#1960,#1979,#1980,#1981,#2004)); +#1959 = ORIENTED_EDGE('',*,*,#667,.F.); +#1960 = ORIENTED_EDGE('',*,*,#1961,.F.); +#1961 = EDGE_CURVE('',#433,#645,#1962,.T.); +#1962 = SURFACE_CURVE('',#1963,(#1967,#1973),.PCURVE_S1.); +#1963 = LINE('',#1964,#1965); +#1964 = CARTESIAN_POINT('',(3.,-20.5,3.)); +#1965 = VECTOR('',#1966,1.); +#1966 = DIRECTION('',(0.,1.,0.)); +#1967 = PCURVE('',#476,#1968); +#1968 = DEFINITIONAL_REPRESENTATION('',(#1969),#1972); +#1969 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#1970,#1971),.UNSPECIFIED.,.F., + .F.,(2,2),(0.,41.),.PIECEWISE_BEZIER_KNOTS.); +#1970 = CARTESIAN_POINT('',(3.,0.)); +#1971 = CARTESIAN_POINT('',(3.,41.)); +#1972 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1973 = PCURVE('',#448,#1974); +#1974 = DEFINITIONAL_REPRESENTATION('',(#1975),#1978); +#1975 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#1976,#1977),.UNSPECIFIED.,.F., + .F.,(2,2),(0.,41.),.PIECEWISE_BEZIER_KNOTS.); +#1976 = CARTESIAN_POINT('',(3.,0.)); +#1977 = CARTESIAN_POINT('',(3.,-41.)); +#1978 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1979 = ORIENTED_EDGE('',*,*,#460,.T.); +#1980 = ORIENTED_EDGE('',*,*,#1913,.T.); +#1981 = ORIENTED_EDGE('',*,*,#1982,.T.); +#1982 = EDGE_CURVE('',#1914,#1983,#1985,.T.); +#1983 = VERTEX_POINT('',#1984); +#1984 = CARTESIAN_POINT('',(35.,18.5,3.)); +#1985 = SURFACE_CURVE('',#1986,(#1990,#1997),.PCURVE_S1.); +#1986 = LINE('',#1987,#1988); +#1987 = CARTESIAN_POINT('',(35.,-20.5,3.)); +#1988 = VECTOR('',#1989,1.); +#1989 = DIRECTION('',(0.,1.,0.)); +#1990 = PCURVE('',#476,#1991); +#1991 = DEFINITIONAL_REPRESENTATION('',(#1992),#1996); +#1992 = LINE('',#1993,#1994); +#1993 = CARTESIAN_POINT('',(35.,0.)); +#1994 = VECTOR('',#1995,1.); +#1995 = DIRECTION('',(0.,1.)); +#1996 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#1997 = PCURVE('',#1129,#1998); +#1998 = DEFINITIONAL_REPRESENTATION('',(#1999),#2003); +#1999 = LINE('',#2000,#2001); +#2000 = CARTESIAN_POINT('',(3.,0.)); +#2001 = VECTOR('',#2002,1.); +#2002 = DIRECTION('',(0.,-1.)); +#2003 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2004 = ORIENTED_EDGE('',*,*,#2005,.F.); +#2005 = EDGE_CURVE('',#668,#1983,#2006,.T.); +#2006 = SURFACE_CURVE('',#2007,(#2011,#2018),.PCURVE_S1.); +#2007 = LINE('',#2008,#2009); +#2008 = CARTESIAN_POINT('',(35.5,18.,3.)); +#2009 = VECTOR('',#2010,1.); +#2010 = DIRECTION('',(0.707106781187,-0.707106781187,0.)); +#2011 = PCURVE('',#476,#2012); +#2012 = DEFINITIONAL_REPRESENTATION('',(#2013),#2017); +#2013 = LINE('',#2014,#2015); +#2014 = CARTESIAN_POINT('',(35.5,38.5)); +#2015 = VECTOR('',#2016,1.); +#2016 = DIRECTION('',(0.707106781187,-0.707106781187)); +#2017 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2018 = PCURVE('',#706,#2019); +#2019 = DEFINITIONAL_REPRESENTATION('',(#2020),#2024); +#2020 = LINE('',#2021,#2022); +#2021 = CARTESIAN_POINT('',(3.,2.12132034356)); +#2022 = VECTOR('',#2023,1.); +#2023 = DIRECTION('',(0.,1.)); +#2024 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2025 = FACE_BOUND('',#2026,.T.); +#2026 = EDGE_LOOP('',(#2027,#2050,#2078,#2099)); +#2027 = ORIENTED_EDGE('',*,*,#2028,.F.); +#2028 = EDGE_CURVE('',#2029,#2031,#2033,.T.); +#2029 = VERTEX_POINT('',#2030); +#2030 = CARTESIAN_POINT('',(7.75,-12.5,3.)); +#2031 = VERTEX_POINT('',#2032); +#2032 = CARTESIAN_POINT('',(7.75,-15.5,3.)); +#2033 = SURFACE_CURVE('',#2034,(#2038,#2044),.PCURVE_S1.); +#2034 = LINE('',#2035,#2036); +#2035 = CARTESIAN_POINT('',(7.75,-16.5,3.)); +#2036 = VECTOR('',#2037,1.); +#2037 = DIRECTION('',(0.,-1.,0.)); +#2038 = PCURVE('',#476,#2039); +#2039 = DEFINITIONAL_REPRESENTATION('',(#2040),#2043); +#2040 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2041,#2042),.UNSPECIFIED.,.F., + .F.,(2,2),(-4.,-1.),.PIECEWISE_BEZIER_KNOTS.); +#2041 = CARTESIAN_POINT('',(7.75,8.)); +#2042 = CARTESIAN_POINT('',(7.75,5.)); +#2043 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2044 = PCURVE('',#1184,#2045); +#2045 = DEFINITIONAL_REPRESENTATION('',(#2046),#2049); +#2046 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2047,#2048),.UNSPECIFIED.,.F., + .F.,(2,2),(-4.,-1.),.PIECEWISE_BEZIER_KNOTS.); +#2047 = CARTESIAN_POINT('',(0.,-3.)); +#2048 = CARTESIAN_POINT('',(3.,-3.)); +#2049 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2050 = ORIENTED_EDGE('',*,*,#2051,.T.); +#2051 = EDGE_CURVE('',#2029,#2052,#2054,.T.); +#2052 = VERTEX_POINT('',#2053); +#2053 = CARTESIAN_POINT('',(12.25,-12.5,3.)); +#2054 = SURFACE_CURVE('',#2055,(#2060,#2071),.PCURVE_S1.); +#2055 = CIRCLE('',#2056,2.25); +#2056 = AXIS2_PLACEMENT_3D('',#2057,#2058,#2059); +#2057 = CARTESIAN_POINT('',(10.,-12.5,3.)); +#2058 = DIRECTION('',(-0.,-0.,-1.)); +#2059 = DIRECTION('',(0.,-1.,0.)); +#2060 = PCURVE('',#476,#2061); +#2061 = DEFINITIONAL_REPRESENTATION('',(#2062),#2070); +#2062 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2063,#2064,#2065,#2066, +#2067,#2068,#2069),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#2063 = CARTESIAN_POINT('',(10.,5.75)); +#2064 = CARTESIAN_POINT('',(6.10288568297,5.75)); +#2065 = CARTESIAN_POINT('',(8.051442841485,9.125)); +#2066 = CARTESIAN_POINT('',(10.,12.5)); +#2067 = CARTESIAN_POINT('',(11.948557158515,9.125)); +#2068 = CARTESIAN_POINT('',(13.89711431703,5.75)); +#2069 = CARTESIAN_POINT('',(10.,5.75)); +#2070 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2071 = PCURVE('',#1217,#2072); +#2072 = DEFINITIONAL_REPRESENTATION('',(#2073),#2077); +#2073 = LINE('',#2074,#2075); +#2074 = CARTESIAN_POINT('',(0.,-3.)); +#2075 = VECTOR('',#2076,1.); +#2076 = DIRECTION('',(1.,0.)); +#2077 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2078 = ORIENTED_EDGE('',*,*,#2079,.F.); +#2079 = EDGE_CURVE('',#2080,#2052,#2082,.T.); +#2080 = VERTEX_POINT('',#2081); +#2081 = CARTESIAN_POINT('',(12.25,-15.5,3.)); +#2082 = SURFACE_CURVE('',#2083,(#2087,#2093),.PCURVE_S1.); +#2083 = LINE('',#2084,#2085); +#2084 = CARTESIAN_POINT('',(12.25,-18.,3.)); +#2085 = VECTOR('',#2086,1.); +#2086 = DIRECTION('',(0.,1.,-0.)); +#2087 = PCURVE('',#476,#2088); +#2088 = DEFINITIONAL_REPRESENTATION('',(#2089),#2092); +#2089 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2090,#2091),.UNSPECIFIED.,.F., + .F.,(2,2),(2.5,5.5),.PIECEWISE_BEZIER_KNOTS.); +#2090 = CARTESIAN_POINT('',(12.25,5.)); +#2091 = CARTESIAN_POINT('',(12.25,8.)); +#2092 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2093 = PCURVE('',#1245,#2094); +#2094 = DEFINITIONAL_REPRESENTATION('',(#2095),#2098); +#2095 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2096,#2097),.UNSPECIFIED.,.F., + .F.,(2,2),(2.5,5.5),.PIECEWISE_BEZIER_KNOTS.); +#2096 = CARTESIAN_POINT('',(0.,-3.)); +#2097 = CARTESIAN_POINT('',(3.,-3.)); +#2098 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2099 = ORIENTED_EDGE('',*,*,#2100,.T.); +#2100 = EDGE_CURVE('',#2080,#2031,#2101,.T.); +#2101 = SURFACE_CURVE('',#2102,(#2107,#2118),.PCURVE_S1.); +#2102 = CIRCLE('',#2103,2.25); +#2103 = AXIS2_PLACEMENT_3D('',#2104,#2105,#2106); +#2104 = CARTESIAN_POINT('',(10.,-15.5,3.)); +#2105 = DIRECTION('',(0.,0.,-1.)); +#2106 = DIRECTION('',(0.,1.,0.)); +#2107 = PCURVE('',#476,#2108); +#2108 = DEFINITIONAL_REPRESENTATION('',(#2109),#2117); +#2109 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2110,#2111,#2112,#2113, +#2114,#2115,#2116),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#2110 = CARTESIAN_POINT('',(10.,7.25)); +#2111 = CARTESIAN_POINT('',(13.89711431703,7.25)); +#2112 = CARTESIAN_POINT('',(11.948557158515,3.875)); +#2113 = CARTESIAN_POINT('',(10.,0.5)); +#2114 = CARTESIAN_POINT('',(8.051442841485,3.875)); +#2115 = CARTESIAN_POINT('',(6.10288568297,7.25)); +#2116 = CARTESIAN_POINT('',(10.,7.25)); +#2117 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2118 = PCURVE('',#1276,#2119); +#2119 = DEFINITIONAL_REPRESENTATION('',(#2120),#2124); +#2120 = LINE('',#2121,#2122); +#2121 = CARTESIAN_POINT('',(0.,-3.)); +#2122 = VECTOR('',#2123,1.); +#2123 = DIRECTION('',(1.,0.)); +#2124 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2125 = FACE_BOUND('',#2126,.T.); +#2126 = EDGE_LOOP('',(#2127,#2150,#2178,#2199)); +#2127 = ORIENTED_EDGE('',*,*,#2128,.F.); +#2128 = EDGE_CURVE('',#2129,#2131,#2133,.T.); +#2129 = VERTEX_POINT('',#2130); +#2130 = CARTESIAN_POINT('',(21.5,-13.25,3.)); +#2131 = VERTEX_POINT('',#2132); +#2132 = CARTESIAN_POINT('',(18.5,-13.25,3.)); +#2133 = SURFACE_CURVE('',#2134,(#2138,#2144),.PCURVE_S1.); +#2134 = LINE('',#2135,#2136); +#2135 = CARTESIAN_POINT('',(10.75,-13.25,3.)); +#2136 = VECTOR('',#2137,1.); +#2137 = DIRECTION('',(-1.,0.,0.)); +#2138 = PCURVE('',#476,#2139); +#2139 = DEFINITIONAL_REPRESENTATION('',(#2140),#2143); +#2140 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2141,#2142),.UNSPECIFIED.,.F., + .F.,(2,2),(-10.75,-7.75),.PIECEWISE_BEZIER_KNOTS.); +#2141 = CARTESIAN_POINT('',(21.5,7.25)); +#2142 = CARTESIAN_POINT('',(18.5,7.25)); +#2143 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2144 = PCURVE('',#1308,#2145); +#2145 = DEFINITIONAL_REPRESENTATION('',(#2146),#2149); +#2146 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2147,#2148),.UNSPECIFIED.,.F., + .F.,(2,2),(-10.75,-7.75),.PIECEWISE_BEZIER_KNOTS.); +#2147 = CARTESIAN_POINT('',(0.,-3.)); +#2148 = CARTESIAN_POINT('',(3.,-3.)); +#2149 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2150 = ORIENTED_EDGE('',*,*,#2151,.T.); +#2151 = EDGE_CURVE('',#2129,#2152,#2154,.T.); +#2152 = VERTEX_POINT('',#2153); +#2153 = CARTESIAN_POINT('',(21.5,-17.75,3.)); +#2154 = SURFACE_CURVE('',#2155,(#2160,#2171),.PCURVE_S1.); +#2155 = CIRCLE('',#2156,2.25); +#2156 = AXIS2_PLACEMENT_3D('',#2157,#2158,#2159); +#2157 = CARTESIAN_POINT('',(21.5,-15.5,3.)); +#2158 = DIRECTION('',(0.,0.,-1.)); +#2159 = DIRECTION('',(-1.,0.,0.)); +#2160 = PCURVE('',#476,#2161); +#2161 = DEFINITIONAL_REPRESENTATION('',(#2162),#2170); +#2162 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2163,#2164,#2165,#2166, +#2167,#2168,#2169),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#2163 = CARTESIAN_POINT('',(19.25,5.)); +#2164 = CARTESIAN_POINT('',(19.25,8.89711431703)); +#2165 = CARTESIAN_POINT('',(22.625,6.948557158515)); +#2166 = CARTESIAN_POINT('',(26.,5.)); +#2167 = CARTESIAN_POINT('',(22.625,3.051442841485)); +#2168 = CARTESIAN_POINT('',(19.25,1.10288568297)); +#2169 = CARTESIAN_POINT('',(19.25,5.)); +#2170 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2171 = PCURVE('',#1341,#2172); +#2172 = DEFINITIONAL_REPRESENTATION('',(#2173),#2177); +#2173 = LINE('',#2174,#2175); +#2174 = CARTESIAN_POINT('',(0.,-3.)); +#2175 = VECTOR('',#2176,1.); +#2176 = DIRECTION('',(1.,0.)); +#2177 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2178 = ORIENTED_EDGE('',*,*,#2179,.F.); +#2179 = EDGE_CURVE('',#2180,#2152,#2182,.T.); +#2180 = VERTEX_POINT('',#2181); +#2181 = CARTESIAN_POINT('',(18.5,-17.75,3.)); +#2182 = SURFACE_CURVE('',#2183,(#2187,#2193),.PCURVE_S1.); +#2183 = LINE('',#2184,#2185); +#2184 = CARTESIAN_POINT('',(9.25,-17.75,3.)); +#2185 = VECTOR('',#2186,1.); +#2186 = DIRECTION('',(1.,0.,0.)); +#2187 = PCURVE('',#476,#2188); +#2188 = DEFINITIONAL_REPRESENTATION('',(#2189),#2192); +#2189 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2190,#2191),.UNSPECIFIED.,.F., + .F.,(2,2),(9.25,12.25),.PIECEWISE_BEZIER_KNOTS.); +#2190 = CARTESIAN_POINT('',(18.5,2.75)); +#2191 = CARTESIAN_POINT('',(21.5,2.75)); +#2192 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2193 = PCURVE('',#1369,#2194); +#2194 = DEFINITIONAL_REPRESENTATION('',(#2195),#2198); +#2195 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2196,#2197),.UNSPECIFIED.,.F., + .F.,(2,2),(9.25,12.25),.PIECEWISE_BEZIER_KNOTS.); +#2196 = CARTESIAN_POINT('',(0.,-3.)); +#2197 = CARTESIAN_POINT('',(3.,-3.)); +#2198 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2199 = ORIENTED_EDGE('',*,*,#2200,.T.); +#2200 = EDGE_CURVE('',#2180,#2131,#2201,.T.); +#2201 = SURFACE_CURVE('',#2202,(#2207,#2218),.PCURVE_S1.); +#2202 = CIRCLE('',#2203,2.25); +#2203 = AXIS2_PLACEMENT_3D('',#2204,#2205,#2206); +#2204 = CARTESIAN_POINT('',(18.5,-15.5,3.)); +#2205 = DIRECTION('',(0.,0.,-1.)); +#2206 = DIRECTION('',(1.,0.,0.)); +#2207 = PCURVE('',#476,#2208); +#2208 = DEFINITIONAL_REPRESENTATION('',(#2209),#2217); +#2209 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2210,#2211,#2212,#2213, +#2214,#2215,#2216),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#2210 = CARTESIAN_POINT('',(20.75,5.)); +#2211 = CARTESIAN_POINT('',(20.75,1.10288568297)); +#2212 = CARTESIAN_POINT('',(17.375,3.051442841485)); +#2213 = CARTESIAN_POINT('',(14.,5.)); +#2214 = CARTESIAN_POINT('',(17.375,6.948557158515)); +#2215 = CARTESIAN_POINT('',(20.75,8.89711431703)); +#2216 = CARTESIAN_POINT('',(20.75,5.)); +#2217 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2218 = PCURVE('',#1400,#2219); +#2219 = DEFINITIONAL_REPRESENTATION('',(#2220),#2224); +#2220 = LINE('',#2221,#2222); +#2221 = CARTESIAN_POINT('',(0.,-3.)); +#2222 = VECTOR('',#2223,1.); +#2223 = DIRECTION('',(1.,0.)); +#2224 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2225 = FACE_BOUND('',#2226,.T.); +#2226 = EDGE_LOOP('',(#2227,#2250,#2278,#2299)); +#2227 = ORIENTED_EDGE('',*,*,#2228,.F.); +#2228 = EDGE_CURVE('',#2229,#2231,#2233,.T.); +#2229 = VERTEX_POINT('',#2230); +#2230 = CARTESIAN_POINT('',(27.75,-12.5,3.)); +#2231 = VERTEX_POINT('',#2232); +#2232 = CARTESIAN_POINT('',(27.75,-15.5,3.)); +#2233 = SURFACE_CURVE('',#2234,(#2238,#2244),.PCURVE_S1.); +#2234 = LINE('',#2235,#2236); +#2235 = CARTESIAN_POINT('',(27.75,-16.5,3.)); +#2236 = VECTOR('',#2237,1.); +#2237 = DIRECTION('',(0.,-1.,0.)); +#2238 = PCURVE('',#476,#2239); +#2239 = DEFINITIONAL_REPRESENTATION('',(#2240),#2243); +#2240 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2241,#2242),.UNSPECIFIED.,.F., + .F.,(2,2),(-4.,-1.),.PIECEWISE_BEZIER_KNOTS.); +#2241 = CARTESIAN_POINT('',(27.75,8.)); +#2242 = CARTESIAN_POINT('',(27.75,5.)); +#2243 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2244 = PCURVE('',#1432,#2245); +#2245 = DEFINITIONAL_REPRESENTATION('',(#2246),#2249); +#2246 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2247,#2248),.UNSPECIFIED.,.F., + .F.,(2,2),(-4.,-1.),.PIECEWISE_BEZIER_KNOTS.); +#2247 = CARTESIAN_POINT('',(0.,-3.)); +#2248 = CARTESIAN_POINT('',(3.,-3.)); +#2249 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2250 = ORIENTED_EDGE('',*,*,#2251,.T.); +#2251 = EDGE_CURVE('',#2229,#2252,#2254,.T.); +#2252 = VERTEX_POINT('',#2253); +#2253 = CARTESIAN_POINT('',(32.25,-12.5,3.)); +#2254 = SURFACE_CURVE('',#2255,(#2260,#2271),.PCURVE_S1.); +#2255 = CIRCLE('',#2256,2.25); +#2256 = AXIS2_PLACEMENT_3D('',#2257,#2258,#2259); +#2257 = CARTESIAN_POINT('',(30.,-12.5,3.)); +#2258 = DIRECTION('',(-0.,-0.,-1.)); +#2259 = DIRECTION('',(0.,-1.,0.)); +#2260 = PCURVE('',#476,#2261); +#2261 = DEFINITIONAL_REPRESENTATION('',(#2262),#2270); +#2262 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2263,#2264,#2265,#2266, +#2267,#2268,#2269),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#2263 = CARTESIAN_POINT('',(30.,5.75)); +#2264 = CARTESIAN_POINT('',(26.10288568297,5.75)); +#2265 = CARTESIAN_POINT('',(28.051442841485,9.125)); +#2266 = CARTESIAN_POINT('',(30.,12.5)); +#2267 = CARTESIAN_POINT('',(31.948557158515,9.125)); +#2268 = CARTESIAN_POINT('',(33.89711431703,5.75)); +#2269 = CARTESIAN_POINT('',(30.,5.75)); +#2270 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2271 = PCURVE('',#1465,#2272); +#2272 = DEFINITIONAL_REPRESENTATION('',(#2273),#2277); +#2273 = LINE('',#2274,#2275); +#2274 = CARTESIAN_POINT('',(0.,-3.)); +#2275 = VECTOR('',#2276,1.); +#2276 = DIRECTION('',(1.,0.)); +#2277 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2278 = ORIENTED_EDGE('',*,*,#2279,.F.); +#2279 = EDGE_CURVE('',#2280,#2252,#2282,.T.); +#2280 = VERTEX_POINT('',#2281); +#2281 = CARTESIAN_POINT('',(32.25,-15.5,3.)); +#2282 = SURFACE_CURVE('',#2283,(#2287,#2293),.PCURVE_S1.); +#2283 = LINE('',#2284,#2285); +#2284 = CARTESIAN_POINT('',(32.25,-18.,3.)); +#2285 = VECTOR('',#2286,1.); +#2286 = DIRECTION('',(0.,1.,-0.)); +#2287 = PCURVE('',#476,#2288); +#2288 = DEFINITIONAL_REPRESENTATION('',(#2289),#2292); +#2289 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2290,#2291),.UNSPECIFIED.,.F., + .F.,(2,2),(2.5,5.5),.PIECEWISE_BEZIER_KNOTS.); +#2290 = CARTESIAN_POINT('',(32.25,5.)); +#2291 = CARTESIAN_POINT('',(32.25,8.)); +#2292 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2293 = PCURVE('',#1493,#2294); +#2294 = DEFINITIONAL_REPRESENTATION('',(#2295),#2298); +#2295 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2296,#2297),.UNSPECIFIED.,.F., + .F.,(2,2),(2.5,5.5),.PIECEWISE_BEZIER_KNOTS.); +#2296 = CARTESIAN_POINT('',(0.,-3.)); +#2297 = CARTESIAN_POINT('',(3.,-3.)); +#2298 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2299 = ORIENTED_EDGE('',*,*,#2300,.T.); +#2300 = EDGE_CURVE('',#2280,#2231,#2301,.T.); +#2301 = SURFACE_CURVE('',#2302,(#2307,#2318),.PCURVE_S1.); +#2302 = CIRCLE('',#2303,2.25); +#2303 = AXIS2_PLACEMENT_3D('',#2304,#2305,#2306); +#2304 = CARTESIAN_POINT('',(30.,-15.5,3.)); +#2305 = DIRECTION('',(0.,0.,-1.)); +#2306 = DIRECTION('',(0.,1.,0.)); +#2307 = PCURVE('',#476,#2308); +#2308 = DEFINITIONAL_REPRESENTATION('',(#2309),#2317); +#2309 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2310,#2311,#2312,#2313, +#2314,#2315,#2316),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#2310 = CARTESIAN_POINT('',(30.,7.25)); +#2311 = CARTESIAN_POINT('',(33.89711431703,7.25)); +#2312 = CARTESIAN_POINT('',(31.948557158515,3.875)); +#2313 = CARTESIAN_POINT('',(30.,0.5)); +#2314 = CARTESIAN_POINT('',(28.051442841485,3.875)); +#2315 = CARTESIAN_POINT('',(26.10288568297,7.25)); +#2316 = CARTESIAN_POINT('',(30.,7.25)); +#2317 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2318 = PCURVE('',#1524,#2319); +#2319 = DEFINITIONAL_REPRESENTATION('',(#2320),#2324); +#2320 = LINE('',#2321,#2322); +#2321 = CARTESIAN_POINT('',(0.,-3.)); +#2322 = VECTOR('',#2323,1.); +#2323 = DIRECTION('',(1.,0.)); +#2324 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2325 = FACE_BOUND('',#2326,.T.); +#2326 = EDGE_LOOP('',(#2327,#2350,#2378,#2399)); +#2327 = ORIENTED_EDGE('',*,*,#2328,.F.); +#2328 = EDGE_CURVE('',#2329,#2331,#2333,.T.); +#2329 = VERTEX_POINT('',#2330); +#2330 = CARTESIAN_POINT('',(7.75,15.5,3.)); +#2331 = VERTEX_POINT('',#2332); +#2332 = CARTESIAN_POINT('',(7.75,12.5,3.)); +#2333 = SURFACE_CURVE('',#2334,(#2338,#2344),.PCURVE_S1.); +#2334 = LINE('',#2335,#2336); +#2335 = CARTESIAN_POINT('',(7.75,-2.5,3.)); +#2336 = VECTOR('',#2337,1.); +#2337 = DIRECTION('',(0.,-1.,0.)); +#2338 = PCURVE('',#476,#2339); +#2339 = DEFINITIONAL_REPRESENTATION('',(#2340),#2343); +#2340 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2341,#2342),.UNSPECIFIED.,.F., + .F.,(2,2),(-18.,-15.),.PIECEWISE_BEZIER_KNOTS.); +#2341 = CARTESIAN_POINT('',(7.75,36.)); +#2342 = CARTESIAN_POINT('',(7.75,33.)); +#2343 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2344 = PCURVE('',#1556,#2345); +#2345 = DEFINITIONAL_REPRESENTATION('',(#2346),#2349); +#2346 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2347,#2348),.UNSPECIFIED.,.F., + .F.,(2,2),(-18.,-15.),.PIECEWISE_BEZIER_KNOTS.); +#2347 = CARTESIAN_POINT('',(0.,-3.)); +#2348 = CARTESIAN_POINT('',(3.,-3.)); +#2349 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2350 = ORIENTED_EDGE('',*,*,#2351,.T.); +#2351 = EDGE_CURVE('',#2329,#2352,#2354,.T.); +#2352 = VERTEX_POINT('',#2353); +#2353 = CARTESIAN_POINT('',(12.25,15.5,3.)); +#2354 = SURFACE_CURVE('',#2355,(#2360,#2371),.PCURVE_S1.); +#2355 = CIRCLE('',#2356,2.25); +#2356 = AXIS2_PLACEMENT_3D('',#2357,#2358,#2359); +#2357 = CARTESIAN_POINT('',(10.,15.5,3.)); +#2358 = DIRECTION('',(-0.,-0.,-1.)); +#2359 = DIRECTION('',(0.,-1.,0.)); +#2360 = PCURVE('',#476,#2361); +#2361 = DEFINITIONAL_REPRESENTATION('',(#2362),#2370); +#2362 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2363,#2364,#2365,#2366, +#2367,#2368,#2369),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#2363 = CARTESIAN_POINT('',(10.,33.75)); +#2364 = CARTESIAN_POINT('',(6.10288568297,33.75)); +#2365 = CARTESIAN_POINT('',(8.051442841485,37.125)); +#2366 = CARTESIAN_POINT('',(10.,40.5)); +#2367 = CARTESIAN_POINT('',(11.948557158515,37.125)); +#2368 = CARTESIAN_POINT('',(13.89711431703,33.75)); +#2369 = CARTESIAN_POINT('',(10.,33.75)); +#2370 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2371 = PCURVE('',#1589,#2372); +#2372 = DEFINITIONAL_REPRESENTATION('',(#2373),#2377); +#2373 = LINE('',#2374,#2375); +#2374 = CARTESIAN_POINT('',(0.,-3.)); +#2375 = VECTOR('',#2376,1.); +#2376 = DIRECTION('',(1.,0.)); +#2377 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2378 = ORIENTED_EDGE('',*,*,#2379,.F.); +#2379 = EDGE_CURVE('',#2380,#2352,#2382,.T.); +#2380 = VERTEX_POINT('',#2381); +#2381 = CARTESIAN_POINT('',(12.25,12.5,3.)); +#2382 = SURFACE_CURVE('',#2383,(#2387,#2393),.PCURVE_S1.); +#2383 = LINE('',#2384,#2385); +#2384 = CARTESIAN_POINT('',(12.25,-4.,3.)); +#2385 = VECTOR('',#2386,1.); +#2386 = DIRECTION('',(0.,1.,-0.)); +#2387 = PCURVE('',#476,#2388); +#2388 = DEFINITIONAL_REPRESENTATION('',(#2389),#2392); +#2389 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2390,#2391),.UNSPECIFIED.,.F., + .F.,(2,2),(16.5,19.5),.PIECEWISE_BEZIER_KNOTS.); +#2390 = CARTESIAN_POINT('',(12.25,33.)); +#2391 = CARTESIAN_POINT('',(12.25,36.)); +#2392 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2393 = PCURVE('',#1617,#2394); +#2394 = DEFINITIONAL_REPRESENTATION('',(#2395),#2398); +#2395 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2396,#2397),.UNSPECIFIED.,.F., + .F.,(2,2),(16.5,19.5),.PIECEWISE_BEZIER_KNOTS.); +#2396 = CARTESIAN_POINT('',(0.,-3.)); +#2397 = CARTESIAN_POINT('',(3.,-3.)); +#2398 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2399 = ORIENTED_EDGE('',*,*,#2400,.T.); +#2400 = EDGE_CURVE('',#2380,#2331,#2401,.T.); +#2401 = SURFACE_CURVE('',#2402,(#2407,#2418),.PCURVE_S1.); +#2402 = CIRCLE('',#2403,2.25); +#2403 = AXIS2_PLACEMENT_3D('',#2404,#2405,#2406); +#2404 = CARTESIAN_POINT('',(10.,12.5,3.)); +#2405 = DIRECTION('',(0.,0.,-1.)); +#2406 = DIRECTION('',(0.,1.,0.)); +#2407 = PCURVE('',#476,#2408); +#2408 = DEFINITIONAL_REPRESENTATION('',(#2409),#2417); +#2409 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2410,#2411,#2412,#2413, +#2414,#2415,#2416),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#2410 = CARTESIAN_POINT('',(10.,35.25)); +#2411 = CARTESIAN_POINT('',(13.89711431703,35.25)); +#2412 = CARTESIAN_POINT('',(11.948557158515,31.875)); +#2413 = CARTESIAN_POINT('',(10.,28.5)); +#2414 = CARTESIAN_POINT('',(8.051442841485,31.875)); +#2415 = CARTESIAN_POINT('',(6.10288568297,35.25)); +#2416 = CARTESIAN_POINT('',(10.,35.25)); +#2417 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2418 = PCURVE('',#1648,#2419); +#2419 = DEFINITIONAL_REPRESENTATION('',(#2420),#2424); +#2420 = LINE('',#2421,#2422); +#2421 = CARTESIAN_POINT('',(0.,-3.)); +#2422 = VECTOR('',#2423,1.); +#2423 = DIRECTION('',(1.,0.)); +#2424 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2425 = FACE_BOUND('',#2426,.T.); +#2426 = EDGE_LOOP('',(#2427,#2450,#2478,#2499)); +#2427 = ORIENTED_EDGE('',*,*,#2428,.F.); +#2428 = EDGE_CURVE('',#2429,#2431,#2433,.T.); +#2429 = VERTEX_POINT('',#2430); +#2430 = CARTESIAN_POINT('',(21.5,17.75,3.)); +#2431 = VERTEX_POINT('',#2432); +#2432 = CARTESIAN_POINT('',(18.5,17.75,3.)); +#2433 = SURFACE_CURVE('',#2434,(#2438,#2444),.PCURVE_S1.); +#2434 = LINE('',#2435,#2436); +#2435 = CARTESIAN_POINT('',(10.75,17.75,3.)); +#2436 = VECTOR('',#2437,1.); +#2437 = DIRECTION('',(-1.,0.,0.)); +#2438 = PCURVE('',#476,#2439); +#2439 = DEFINITIONAL_REPRESENTATION('',(#2440),#2443); +#2440 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2441,#2442),.UNSPECIFIED.,.F., + .F.,(2,2),(-10.75,-7.75),.PIECEWISE_BEZIER_KNOTS.); +#2441 = CARTESIAN_POINT('',(21.5,38.25)); +#2442 = CARTESIAN_POINT('',(18.5,38.25)); +#2443 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2444 = PCURVE('',#1680,#2445); +#2445 = DEFINITIONAL_REPRESENTATION('',(#2446),#2449); +#2446 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2447,#2448),.UNSPECIFIED.,.F., + .F.,(2,2),(-10.75,-7.75),.PIECEWISE_BEZIER_KNOTS.); +#2447 = CARTESIAN_POINT('',(0.,-3.)); +#2448 = CARTESIAN_POINT('',(3.,-3.)); +#2449 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2450 = ORIENTED_EDGE('',*,*,#2451,.T.); +#2451 = EDGE_CURVE('',#2429,#2452,#2454,.T.); +#2452 = VERTEX_POINT('',#2453); +#2453 = CARTESIAN_POINT('',(21.5,13.25,3.)); +#2454 = SURFACE_CURVE('',#2455,(#2460,#2471),.PCURVE_S1.); +#2455 = CIRCLE('',#2456,2.25); +#2456 = AXIS2_PLACEMENT_3D('',#2457,#2458,#2459); +#2457 = CARTESIAN_POINT('',(21.5,15.5,3.)); +#2458 = DIRECTION('',(0.,0.,-1.)); +#2459 = DIRECTION('',(-1.,0.,0.)); +#2460 = PCURVE('',#476,#2461); +#2461 = DEFINITIONAL_REPRESENTATION('',(#2462),#2470); +#2462 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2463,#2464,#2465,#2466, +#2467,#2468,#2469),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#2463 = CARTESIAN_POINT('',(19.25,36.)); +#2464 = CARTESIAN_POINT('',(19.25,39.89711431703)); +#2465 = CARTESIAN_POINT('',(22.625,37.948557158515)); +#2466 = CARTESIAN_POINT('',(26.,36.)); +#2467 = CARTESIAN_POINT('',(22.625,34.051442841485)); +#2468 = CARTESIAN_POINT('',(19.25,32.10288568297)); +#2469 = CARTESIAN_POINT('',(19.25,36.)); +#2470 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2471 = PCURVE('',#1713,#2472); +#2472 = DEFINITIONAL_REPRESENTATION('',(#2473),#2477); +#2473 = LINE('',#2474,#2475); +#2474 = CARTESIAN_POINT('',(0.,-3.)); +#2475 = VECTOR('',#2476,1.); +#2476 = DIRECTION('',(1.,0.)); +#2477 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2478 = ORIENTED_EDGE('',*,*,#2479,.F.); +#2479 = EDGE_CURVE('',#2480,#2452,#2482,.T.); +#2480 = VERTEX_POINT('',#2481); +#2481 = CARTESIAN_POINT('',(18.5,13.25,3.)); +#2482 = SURFACE_CURVE('',#2483,(#2487,#2493),.PCURVE_S1.); +#2483 = LINE('',#2484,#2485); +#2484 = CARTESIAN_POINT('',(9.25,13.25,3.)); +#2485 = VECTOR('',#2486,1.); +#2486 = DIRECTION('',(1.,0.,0.)); +#2487 = PCURVE('',#476,#2488); +#2488 = DEFINITIONAL_REPRESENTATION('',(#2489),#2492); +#2489 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2490,#2491),.UNSPECIFIED.,.F., + .F.,(2,2),(9.25,12.25),.PIECEWISE_BEZIER_KNOTS.); +#2490 = CARTESIAN_POINT('',(18.5,33.75)); +#2491 = CARTESIAN_POINT('',(21.5,33.75)); +#2492 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2493 = PCURVE('',#1741,#2494); +#2494 = DEFINITIONAL_REPRESENTATION('',(#2495),#2498); +#2495 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2496,#2497),.UNSPECIFIED.,.F., + .F.,(2,2),(9.25,12.25),.PIECEWISE_BEZIER_KNOTS.); +#2496 = CARTESIAN_POINT('',(0.,-3.)); +#2497 = CARTESIAN_POINT('',(3.,-3.)); +#2498 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2499 = ORIENTED_EDGE('',*,*,#2500,.T.); +#2500 = EDGE_CURVE('',#2480,#2431,#2501,.T.); +#2501 = SURFACE_CURVE('',#2502,(#2507,#2518),.PCURVE_S1.); +#2502 = CIRCLE('',#2503,2.25); +#2503 = AXIS2_PLACEMENT_3D('',#2504,#2505,#2506); +#2504 = CARTESIAN_POINT('',(18.5,15.5,3.)); +#2505 = DIRECTION('',(0.,0.,-1.)); +#2506 = DIRECTION('',(1.,0.,0.)); +#2507 = PCURVE('',#476,#2508); +#2508 = DEFINITIONAL_REPRESENTATION('',(#2509),#2517); +#2509 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2510,#2511,#2512,#2513, +#2514,#2515,#2516),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#2510 = CARTESIAN_POINT('',(20.75,36.)); +#2511 = CARTESIAN_POINT('',(20.75,32.10288568297)); +#2512 = CARTESIAN_POINT('',(17.375,34.051442841485)); +#2513 = CARTESIAN_POINT('',(14.,36.)); +#2514 = CARTESIAN_POINT('',(17.375,37.948557158515)); +#2515 = CARTESIAN_POINT('',(20.75,39.89711431703)); +#2516 = CARTESIAN_POINT('',(20.75,36.)); +#2517 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2518 = PCURVE('',#1772,#2519); +#2519 = DEFINITIONAL_REPRESENTATION('',(#2520),#2524); +#2520 = LINE('',#2521,#2522); +#2521 = CARTESIAN_POINT('',(0.,-3.)); +#2522 = VECTOR('',#2523,1.); +#2523 = DIRECTION('',(1.,0.)); +#2524 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2525 = FACE_BOUND('',#2526,.T.); +#2526 = EDGE_LOOP('',(#2527,#2550,#2578,#2599)); +#2527 = ORIENTED_EDGE('',*,*,#2528,.F.); +#2528 = EDGE_CURVE('',#2529,#2531,#2533,.T.); +#2529 = VERTEX_POINT('',#2530); +#2530 = CARTESIAN_POINT('',(27.75,15.5,3.)); +#2531 = VERTEX_POINT('',#2532); +#2532 = CARTESIAN_POINT('',(27.75,12.5,3.)); +#2533 = SURFACE_CURVE('',#2534,(#2538,#2544),.PCURVE_S1.); +#2534 = LINE('',#2535,#2536); +#2535 = CARTESIAN_POINT('',(27.75,-2.5,3.)); +#2536 = VECTOR('',#2537,1.); +#2537 = DIRECTION('',(0.,-1.,0.)); +#2538 = PCURVE('',#476,#2539); +#2539 = DEFINITIONAL_REPRESENTATION('',(#2540),#2543); +#2540 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2541,#2542),.UNSPECIFIED.,.F., + .F.,(2,2),(-18.,-15.),.PIECEWISE_BEZIER_KNOTS.); +#2541 = CARTESIAN_POINT('',(27.75,36.)); +#2542 = CARTESIAN_POINT('',(27.75,33.)); +#2543 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2544 = PCURVE('',#1804,#2545); +#2545 = DEFINITIONAL_REPRESENTATION('',(#2546),#2549); +#2546 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2547,#2548),.UNSPECIFIED.,.F., + .F.,(2,2),(-18.,-15.),.PIECEWISE_BEZIER_KNOTS.); +#2547 = CARTESIAN_POINT('',(0.,-3.)); +#2548 = CARTESIAN_POINT('',(3.,-3.)); +#2549 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2550 = ORIENTED_EDGE('',*,*,#2551,.T.); +#2551 = EDGE_CURVE('',#2529,#2552,#2554,.T.); +#2552 = VERTEX_POINT('',#2553); +#2553 = CARTESIAN_POINT('',(32.25,15.5,3.)); +#2554 = SURFACE_CURVE('',#2555,(#2560,#2571),.PCURVE_S1.); +#2555 = CIRCLE('',#2556,2.25); +#2556 = AXIS2_PLACEMENT_3D('',#2557,#2558,#2559); +#2557 = CARTESIAN_POINT('',(30.,15.5,3.)); +#2558 = DIRECTION('',(-0.,-0.,-1.)); +#2559 = DIRECTION('',(0.,-1.,0.)); +#2560 = PCURVE('',#476,#2561); +#2561 = DEFINITIONAL_REPRESENTATION('',(#2562),#2570); +#2562 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2563,#2564,#2565,#2566, +#2567,#2568,#2569),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#2563 = CARTESIAN_POINT('',(30.,33.75)); +#2564 = CARTESIAN_POINT('',(26.10288568297,33.75)); +#2565 = CARTESIAN_POINT('',(28.051442841485,37.125)); +#2566 = CARTESIAN_POINT('',(30.,40.5)); +#2567 = CARTESIAN_POINT('',(31.948557158515,37.125)); +#2568 = CARTESIAN_POINT('',(33.89711431703,33.75)); +#2569 = CARTESIAN_POINT('',(30.,33.75)); +#2570 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2571 = PCURVE('',#1837,#2572); +#2572 = DEFINITIONAL_REPRESENTATION('',(#2573),#2577); +#2573 = LINE('',#2574,#2575); +#2574 = CARTESIAN_POINT('',(0.,-3.)); +#2575 = VECTOR('',#2576,1.); +#2576 = DIRECTION('',(1.,0.)); +#2577 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2578 = ORIENTED_EDGE('',*,*,#2579,.F.); +#2579 = EDGE_CURVE('',#2580,#2552,#2582,.T.); +#2580 = VERTEX_POINT('',#2581); +#2581 = CARTESIAN_POINT('',(32.25,12.5,3.)); +#2582 = SURFACE_CURVE('',#2583,(#2587,#2593),.PCURVE_S1.); +#2583 = LINE('',#2584,#2585); +#2584 = CARTESIAN_POINT('',(32.25,-4.,3.)); +#2585 = VECTOR('',#2586,1.); +#2586 = DIRECTION('',(0.,1.,-0.)); +#2587 = PCURVE('',#476,#2588); +#2588 = DEFINITIONAL_REPRESENTATION('',(#2589),#2592); +#2589 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2590,#2591),.UNSPECIFIED.,.F., + .F.,(2,2),(16.5,19.5),.PIECEWISE_BEZIER_KNOTS.); +#2590 = CARTESIAN_POINT('',(32.25,33.)); +#2591 = CARTESIAN_POINT('',(32.25,36.)); +#2592 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2593 = PCURVE('',#1865,#2594); +#2594 = DEFINITIONAL_REPRESENTATION('',(#2595),#2598); +#2595 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#2596,#2597),.UNSPECIFIED.,.F., + .F.,(2,2),(16.5,19.5),.PIECEWISE_BEZIER_KNOTS.); +#2596 = CARTESIAN_POINT('',(0.,-3.)); +#2597 = CARTESIAN_POINT('',(3.,-3.)); +#2598 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2599 = ORIENTED_EDGE('',*,*,#2600,.T.); +#2600 = EDGE_CURVE('',#2580,#2531,#2601,.T.); +#2601 = SURFACE_CURVE('',#2602,(#2607,#2618),.PCURVE_S1.); +#2602 = CIRCLE('',#2603,2.25); +#2603 = AXIS2_PLACEMENT_3D('',#2604,#2605,#2606); +#2604 = CARTESIAN_POINT('',(30.,12.5,3.)); +#2605 = DIRECTION('',(0.,0.,-1.)); +#2606 = DIRECTION('',(0.,1.,0.)); +#2607 = PCURVE('',#476,#2608); +#2608 = DEFINITIONAL_REPRESENTATION('',(#2609),#2617); +#2609 = ( BOUNDED_CURVE() B_SPLINE_CURVE(2,(#2610,#2611,#2612,#2613, +#2614,#2615,#2616),.UNSPECIFIED.,.T.,.F.) B_SPLINE_CURVE_WITH_KNOTS((1,2 + ,2,2,2,1),(-2.094395102393,0.,2.094395102393,4.188790204786, +6.28318530718,8.377580409573),.UNSPECIFIED.) CURVE() +GEOMETRIC_REPRESENTATION_ITEM() RATIONAL_B_SPLINE_CURVE((1.,0.5,1.,0.5, +1.,0.5,1.)) REPRESENTATION_ITEM('') ); +#2610 = CARTESIAN_POINT('',(30.,35.25)); +#2611 = CARTESIAN_POINT('',(33.89711431703,35.25)); +#2612 = CARTESIAN_POINT('',(31.948557158515,31.875)); +#2613 = CARTESIAN_POINT('',(30.,28.5)); +#2614 = CARTESIAN_POINT('',(28.051442841485,31.875)); +#2615 = CARTESIAN_POINT('',(26.10288568297,35.25)); +#2616 = CARTESIAN_POINT('',(30.,35.25)); +#2617 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2618 = PCURVE('',#1896,#2619); +#2619 = DEFINITIONAL_REPRESENTATION('',(#2620),#2624); +#2620 = LINE('',#2621,#2622); +#2621 = CARTESIAN_POINT('',(0.,-3.)); +#2622 = VECTOR('',#2623,1.); +#2623 = DIRECTION('',(1.,0.)); +#2624 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2625 = ADVANCED_FACE('',(#2626,#2634,#2637,#2640,#2643,#2646),#448,.T. + ); +#2626 = FACE_BOUND('',#2627,.T.); +#2627 = EDGE_LOOP('',(#2628,#2629,#2630,#2631,#2632,#2633)); +#2628 = ORIENTED_EDGE('',*,*,#432,.F.); +#2629 = ORIENTED_EDGE('',*,*,#1961,.T.); +#2630 = ORIENTED_EDGE('',*,*,#644,.T.); +#2631 = ORIENTED_EDGE('',*,*,#794,.T.); +#2632 = ORIENTED_EDGE('',*,*,#745,.F.); +#2633 = ORIENTED_EDGE('',*,*,#573,.F.); +#2634 = FACE_BOUND('',#2635,.T.); +#2635 = EDGE_LOOP('',(#2636)); +#2636 = ORIENTED_EDGE('',*,*,#844,.T.); +#2637 = FACE_BOUND('',#2638,.T.); +#2638 = EDGE_LOOP('',(#2639)); +#2639 = ORIENTED_EDGE('',*,*,#898,.T.); +#2640 = FACE_BOUND('',#2641,.T.); +#2641 = EDGE_LOOP('',(#2642)); +#2642 = ORIENTED_EDGE('',*,*,#952,.T.); +#2643 = FACE_BOUND('',#2644,.T.); +#2644 = EDGE_LOOP('',(#2645)); +#2645 = ORIENTED_EDGE('',*,*,#1006,.T.); +#2646 = FACE_BOUND('',#2647,.T.); +#2647 = EDGE_LOOP('',(#2648)); +#2648 = ORIENTED_EDGE('',*,*,#1060,.T.); +#2649 = ADVANCED_FACE('',(#2650),#706,.T.); +#2650 = FACE_BOUND('',#2651,.T.); +#2651 = EDGE_LOOP('',(#2652,#2653,#2654,#2655)); +#2652 = ORIENTED_EDGE('',*,*,#1141,.F.); +#2653 = ORIENTED_EDGE('',*,*,#690,.T.); +#2654 = ORIENTED_EDGE('',*,*,#2005,.T.); +#2655 = ORIENTED_EDGE('',*,*,#2656,.F.); +#2656 = EDGE_CURVE('',#1114,#1983,#2657,.T.); +#2657 = SURFACE_CURVE('',#2658,(#2662,#2669),.PCURVE_S1.); +#2658 = LINE('',#2659,#2660); +#2659 = CARTESIAN_POINT('',(35.,18.5,0.)); +#2660 = VECTOR('',#2661,1.); +#2661 = DIRECTION('',(0.,0.,1.)); +#2662 = PCURVE('',#706,#2663); +#2663 = DEFINITIONAL_REPRESENTATION('',(#2664),#2668); +#2664 = LINE('',#2665,#2666); +#2665 = CARTESIAN_POINT('',(0.,1.414213562373)); +#2666 = VECTOR('',#2667,1.); +#2667 = DIRECTION('',(1.,0.)); +#2668 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2669 = PCURVE('',#1129,#2670); +#2670 = DEFINITIONAL_REPRESENTATION('',(#2671),#2675); +#2671 = LINE('',#2672,#2673); +#2672 = CARTESIAN_POINT('',(0.,-39.)); +#2673 = VECTOR('',#2674,1.); +#2674 = DIRECTION('',(1.,0.)); +#2675 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2676 = ADVANCED_FACE('',(#2677),#1129,.T.); +#2677 = FACE_BOUND('',#2678,.T.); +#2678 = EDGE_LOOP('',(#2679,#2680,#2681,#2682)); +#2679 = ORIENTED_EDGE('',*,*,#1982,.F.); +#2680 = ORIENTED_EDGE('',*,*,#1936,.F.); +#2681 = ORIENTED_EDGE('',*,*,#1113,.T.); +#2682 = ORIENTED_EDGE('',*,*,#2656,.T.); +#2683 = ADVANCED_FACE('',(#2684),#1184,.T.); +#2684 = FACE_BOUND('',#2685,.T.); +#2685 = EDGE_LOOP('',(#2686,#2687,#2708,#2709)); +#2686 = ORIENTED_EDGE('',*,*,#1166,.F.); +#2687 = ORIENTED_EDGE('',*,*,#2688,.T.); +#2688 = EDGE_CURVE('',#1167,#2029,#2689,.T.); +#2689 = SURFACE_CURVE('',#2690,(#2694,#2701),.PCURVE_S1.); +#2690 = LINE('',#2691,#2692); +#2691 = CARTESIAN_POINT('',(7.75,-12.5,0.)); +#2692 = VECTOR('',#2693,1.); +#2693 = DIRECTION('',(0.,0.,1.)); +#2694 = PCURVE('',#1184,#2695); +#2695 = DEFINITIONAL_REPRESENTATION('',(#2696),#2700); +#2696 = LINE('',#2697,#2698); +#2697 = CARTESIAN_POINT('',(0.,0.)); +#2698 = VECTOR('',#2699,1.); +#2699 = DIRECTION('',(0.,-1.)); +#2700 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2701 = PCURVE('',#1217,#2702); +#2702 = DEFINITIONAL_REPRESENTATION('',(#2703),#2707); +#2703 = LINE('',#2704,#2705); +#2704 = CARTESIAN_POINT('',(1.570796326795,0.)); +#2705 = VECTOR('',#2706,1.); +#2706 = DIRECTION('',(0.,-1.)); +#2707 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2708 = ORIENTED_EDGE('',*,*,#2028,.T.); +#2709 = ORIENTED_EDGE('',*,*,#2710,.F.); +#2710 = EDGE_CURVE('',#1169,#2031,#2711,.T.); +#2711 = SURFACE_CURVE('',#2712,(#2716,#2723),.PCURVE_S1.); +#2712 = LINE('',#2713,#2714); +#2713 = CARTESIAN_POINT('',(7.75,-15.5,0.)); +#2714 = VECTOR('',#2715,1.); +#2715 = DIRECTION('',(0.,0.,1.)); +#2716 = PCURVE('',#1184,#2717); +#2717 = DEFINITIONAL_REPRESENTATION('',(#2718),#2722); +#2718 = LINE('',#2719,#2720); +#2719 = CARTESIAN_POINT('',(3.,0.)); +#2720 = VECTOR('',#2721,1.); +#2721 = DIRECTION('',(0.,-1.)); +#2722 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2723 = PCURVE('',#1276,#2724); +#2724 = DEFINITIONAL_REPRESENTATION('',(#2725),#2729); +#2725 = LINE('',#2726,#2727); +#2726 = CARTESIAN_POINT('',(4.712388980385,0.)); +#2727 = VECTOR('',#2728,1.); +#2728 = DIRECTION('',(0.,-1.)); +#2729 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2730 = ADVANCED_FACE('',(#2731),#1276,.F.); +#2731 = FACE_BOUND('',#2732,.F.); +#2732 = EDGE_LOOP('',(#2733,#2734,#2755,#2756)); +#2733 = ORIENTED_EDGE('',*,*,#1257,.F.); +#2734 = ORIENTED_EDGE('',*,*,#2735,.T.); +#2735 = EDGE_CURVE('',#1230,#2080,#2736,.T.); +#2736 = SURFACE_CURVE('',#2737,(#2741,#2748),.PCURVE_S1.); +#2737 = LINE('',#2738,#2739); +#2738 = CARTESIAN_POINT('',(12.25,-15.5,0.)); +#2739 = VECTOR('',#2740,1.); +#2740 = DIRECTION('',(0.,0.,1.)); +#2741 = PCURVE('',#1276,#2742); +#2742 = DEFINITIONAL_REPRESENTATION('',(#2743),#2747); +#2743 = LINE('',#2744,#2745); +#2744 = CARTESIAN_POINT('',(1.570796326795,0.)); +#2745 = VECTOR('',#2746,1.); +#2746 = DIRECTION('',(0.,-1.)); +#2747 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2748 = PCURVE('',#1245,#2749); +#2749 = DEFINITIONAL_REPRESENTATION('',(#2750),#2754); +#2750 = LINE('',#2751,#2752); +#2751 = CARTESIAN_POINT('',(0.,0.)); +#2752 = VECTOR('',#2753,1.); +#2753 = DIRECTION('',(0.,-1.)); +#2754 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2755 = ORIENTED_EDGE('',*,*,#2100,.T.); +#2756 = ORIENTED_EDGE('',*,*,#2710,.F.); +#2757 = ADVANCED_FACE('',(#2758),#1245,.T.); +#2758 = FACE_BOUND('',#2759,.T.); +#2759 = EDGE_LOOP('',(#2760,#2761,#2762,#2763)); +#2760 = ORIENTED_EDGE('',*,*,#1229,.F.); +#2761 = ORIENTED_EDGE('',*,*,#2735,.T.); +#2762 = ORIENTED_EDGE('',*,*,#2079,.T.); +#2763 = ORIENTED_EDGE('',*,*,#2764,.F.); +#2764 = EDGE_CURVE('',#1197,#2052,#2765,.T.); +#2765 = SURFACE_CURVE('',#2766,(#2770,#2777),.PCURVE_S1.); +#2766 = LINE('',#2767,#2768); +#2767 = CARTESIAN_POINT('',(12.25,-12.5,0.)); +#2768 = VECTOR('',#2769,1.); +#2769 = DIRECTION('',(0.,0.,1.)); +#2770 = PCURVE('',#1245,#2771); +#2771 = DEFINITIONAL_REPRESENTATION('',(#2772),#2776); +#2772 = LINE('',#2773,#2774); +#2773 = CARTESIAN_POINT('',(3.,0.)); +#2774 = VECTOR('',#2775,1.); +#2775 = DIRECTION('',(0.,-1.)); +#2776 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2777 = PCURVE('',#1217,#2778); +#2778 = DEFINITIONAL_REPRESENTATION('',(#2779),#2783); +#2779 = LINE('',#2780,#2781); +#2780 = CARTESIAN_POINT('',(4.712388980385,0.)); +#2781 = VECTOR('',#2782,1.); +#2782 = DIRECTION('',(0.,-1.)); +#2783 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2784 = ADVANCED_FACE('',(#2785),#1217,.F.); +#2785 = FACE_BOUND('',#2786,.F.); +#2786 = EDGE_LOOP('',(#2787,#2788,#2789,#2790)); +#2787 = ORIENTED_EDGE('',*,*,#1196,.F.); +#2788 = ORIENTED_EDGE('',*,*,#2688,.T.); +#2789 = ORIENTED_EDGE('',*,*,#2051,.T.); +#2790 = ORIENTED_EDGE('',*,*,#2764,.F.); +#2791 = ADVANCED_FACE('',(#2792),#1308,.T.); +#2792 = FACE_BOUND('',#2793,.T.); +#2793 = EDGE_LOOP('',(#2794,#2795,#2816,#2817)); +#2794 = ORIENTED_EDGE('',*,*,#1290,.F.); +#2795 = ORIENTED_EDGE('',*,*,#2796,.T.); +#2796 = EDGE_CURVE('',#1291,#2129,#2797,.T.); +#2797 = SURFACE_CURVE('',#2798,(#2802,#2809),.PCURVE_S1.); +#2798 = LINE('',#2799,#2800); +#2799 = CARTESIAN_POINT('',(21.5,-13.25,0.)); +#2800 = VECTOR('',#2801,1.); +#2801 = DIRECTION('',(0.,0.,1.)); +#2802 = PCURVE('',#1308,#2803); +#2803 = DEFINITIONAL_REPRESENTATION('',(#2804),#2808); +#2804 = LINE('',#2805,#2806); +#2805 = CARTESIAN_POINT('',(0.,-0.)); +#2806 = VECTOR('',#2807,1.); +#2807 = DIRECTION('',(0.,-1.)); +#2808 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2809 = PCURVE('',#1341,#2810); +#2810 = DEFINITIONAL_REPRESENTATION('',(#2811),#2815); +#2811 = LINE('',#2812,#2813); +#2812 = CARTESIAN_POINT('',(1.570796326795,0.)); +#2813 = VECTOR('',#2814,1.); +#2814 = DIRECTION('',(0.,-1.)); +#2815 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2816 = ORIENTED_EDGE('',*,*,#2128,.T.); +#2817 = ORIENTED_EDGE('',*,*,#2818,.F.); +#2818 = EDGE_CURVE('',#1293,#2131,#2819,.T.); +#2819 = SURFACE_CURVE('',#2820,(#2824,#2831),.PCURVE_S1.); +#2820 = LINE('',#2821,#2822); +#2821 = CARTESIAN_POINT('',(18.5,-13.25,0.)); +#2822 = VECTOR('',#2823,1.); +#2823 = DIRECTION('',(0.,0.,1.)); +#2824 = PCURVE('',#1308,#2825); +#2825 = DEFINITIONAL_REPRESENTATION('',(#2826),#2830); +#2826 = LINE('',#2827,#2828); +#2827 = CARTESIAN_POINT('',(3.,0.)); +#2828 = VECTOR('',#2829,1.); +#2829 = DIRECTION('',(0.,-1.)); +#2830 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2831 = PCURVE('',#1400,#2832); +#2832 = DEFINITIONAL_REPRESENTATION('',(#2833),#2837); +#2833 = LINE('',#2834,#2835); +#2834 = CARTESIAN_POINT('',(4.712388980385,0.)); +#2835 = VECTOR('',#2836,1.); +#2836 = DIRECTION('',(0.,-1.)); +#2837 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2838 = ADVANCED_FACE('',(#2839),#1400,.F.); +#2839 = FACE_BOUND('',#2840,.F.); +#2840 = EDGE_LOOP('',(#2841,#2842,#2863,#2864)); +#2841 = ORIENTED_EDGE('',*,*,#1381,.F.); +#2842 = ORIENTED_EDGE('',*,*,#2843,.T.); +#2843 = EDGE_CURVE('',#1354,#2180,#2844,.T.); +#2844 = SURFACE_CURVE('',#2845,(#2849,#2856),.PCURVE_S1.); +#2845 = LINE('',#2846,#2847); +#2846 = CARTESIAN_POINT('',(18.5,-17.75,0.)); +#2847 = VECTOR('',#2848,1.); +#2848 = DIRECTION('',(0.,0.,1.)); +#2849 = PCURVE('',#1400,#2850); +#2850 = DEFINITIONAL_REPRESENTATION('',(#2851),#2855); +#2851 = LINE('',#2852,#2853); +#2852 = CARTESIAN_POINT('',(1.570796326795,0.)); +#2853 = VECTOR('',#2854,1.); +#2854 = DIRECTION('',(0.,-1.)); +#2855 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2856 = PCURVE('',#1369,#2857); +#2857 = DEFINITIONAL_REPRESENTATION('',(#2858),#2862); +#2858 = LINE('',#2859,#2860); +#2859 = CARTESIAN_POINT('',(0.,0.)); +#2860 = VECTOR('',#2861,1.); +#2861 = DIRECTION('',(0.,-1.)); +#2862 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2863 = ORIENTED_EDGE('',*,*,#2200,.T.); +#2864 = ORIENTED_EDGE('',*,*,#2818,.F.); +#2865 = ADVANCED_FACE('',(#2866),#1369,.T.); +#2866 = FACE_BOUND('',#2867,.T.); +#2867 = EDGE_LOOP('',(#2868,#2869,#2870,#2871)); +#2868 = ORIENTED_EDGE('',*,*,#1353,.F.); +#2869 = ORIENTED_EDGE('',*,*,#2843,.T.); +#2870 = ORIENTED_EDGE('',*,*,#2179,.T.); +#2871 = ORIENTED_EDGE('',*,*,#2872,.F.); +#2872 = EDGE_CURVE('',#1321,#2152,#2873,.T.); +#2873 = SURFACE_CURVE('',#2874,(#2878,#2885),.PCURVE_S1.); +#2874 = LINE('',#2875,#2876); +#2875 = CARTESIAN_POINT('',(21.5,-17.75,0.)); +#2876 = VECTOR('',#2877,1.); +#2877 = DIRECTION('',(0.,0.,1.)); +#2878 = PCURVE('',#1369,#2879); +#2879 = DEFINITIONAL_REPRESENTATION('',(#2880),#2884); +#2880 = LINE('',#2881,#2882); +#2881 = CARTESIAN_POINT('',(3.,0.)); +#2882 = VECTOR('',#2883,1.); +#2883 = DIRECTION('',(0.,-1.)); +#2884 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2885 = PCURVE('',#1341,#2886); +#2886 = DEFINITIONAL_REPRESENTATION('',(#2887),#2891); +#2887 = LINE('',#2888,#2889); +#2888 = CARTESIAN_POINT('',(4.712388980385,0.)); +#2889 = VECTOR('',#2890,1.); +#2890 = DIRECTION('',(0.,-1.)); +#2891 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2892 = ADVANCED_FACE('',(#2893),#1341,.F.); +#2893 = FACE_BOUND('',#2894,.F.); +#2894 = EDGE_LOOP('',(#2895,#2896,#2897,#2898)); +#2895 = ORIENTED_EDGE('',*,*,#1320,.F.); +#2896 = ORIENTED_EDGE('',*,*,#2796,.T.); +#2897 = ORIENTED_EDGE('',*,*,#2151,.T.); +#2898 = ORIENTED_EDGE('',*,*,#2872,.F.); +#2899 = ADVANCED_FACE('',(#2900),#1432,.T.); +#2900 = FACE_BOUND('',#2901,.T.); +#2901 = EDGE_LOOP('',(#2902,#2903,#2924,#2925)); +#2902 = ORIENTED_EDGE('',*,*,#1414,.F.); +#2903 = ORIENTED_EDGE('',*,*,#2904,.T.); +#2904 = EDGE_CURVE('',#1415,#2229,#2905,.T.); +#2905 = SURFACE_CURVE('',#2906,(#2910,#2917),.PCURVE_S1.); +#2906 = LINE('',#2907,#2908); +#2907 = CARTESIAN_POINT('',(27.75,-12.5,0.)); +#2908 = VECTOR('',#2909,1.); +#2909 = DIRECTION('',(0.,0.,1.)); +#2910 = PCURVE('',#1432,#2911); +#2911 = DEFINITIONAL_REPRESENTATION('',(#2912),#2916); +#2912 = LINE('',#2913,#2914); +#2913 = CARTESIAN_POINT('',(0.,0.)); +#2914 = VECTOR('',#2915,1.); +#2915 = DIRECTION('',(0.,-1.)); +#2916 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2917 = PCURVE('',#1465,#2918); +#2918 = DEFINITIONAL_REPRESENTATION('',(#2919),#2923); +#2919 = LINE('',#2920,#2921); +#2920 = CARTESIAN_POINT('',(1.570796326795,0.)); +#2921 = VECTOR('',#2922,1.); +#2922 = DIRECTION('',(0.,-1.)); +#2923 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2924 = ORIENTED_EDGE('',*,*,#2228,.T.); +#2925 = ORIENTED_EDGE('',*,*,#2926,.F.); +#2926 = EDGE_CURVE('',#1417,#2231,#2927,.T.); +#2927 = SURFACE_CURVE('',#2928,(#2932,#2939),.PCURVE_S1.); +#2928 = LINE('',#2929,#2930); +#2929 = CARTESIAN_POINT('',(27.75,-15.5,0.)); +#2930 = VECTOR('',#2931,1.); +#2931 = DIRECTION('',(0.,0.,1.)); +#2932 = PCURVE('',#1432,#2933); +#2933 = DEFINITIONAL_REPRESENTATION('',(#2934),#2938); +#2934 = LINE('',#2935,#2936); +#2935 = CARTESIAN_POINT('',(3.,0.)); +#2936 = VECTOR('',#2937,1.); +#2937 = DIRECTION('',(0.,-1.)); +#2938 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2939 = PCURVE('',#1524,#2940); +#2940 = DEFINITIONAL_REPRESENTATION('',(#2941),#2945); +#2941 = LINE('',#2942,#2943); +#2942 = CARTESIAN_POINT('',(4.712388980385,0.)); +#2943 = VECTOR('',#2944,1.); +#2944 = DIRECTION('',(0.,-1.)); +#2945 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2946 = ADVANCED_FACE('',(#2947),#1524,.F.); +#2947 = FACE_BOUND('',#2948,.F.); +#2948 = EDGE_LOOP('',(#2949,#2950,#2971,#2972)); +#2949 = ORIENTED_EDGE('',*,*,#1505,.F.); +#2950 = ORIENTED_EDGE('',*,*,#2951,.T.); +#2951 = EDGE_CURVE('',#1478,#2280,#2952,.T.); +#2952 = SURFACE_CURVE('',#2953,(#2957,#2964),.PCURVE_S1.); +#2953 = LINE('',#2954,#2955); +#2954 = CARTESIAN_POINT('',(32.25,-15.5,0.)); +#2955 = VECTOR('',#2956,1.); +#2956 = DIRECTION('',(0.,0.,1.)); +#2957 = PCURVE('',#1524,#2958); +#2958 = DEFINITIONAL_REPRESENTATION('',(#2959),#2963); +#2959 = LINE('',#2960,#2961); +#2960 = CARTESIAN_POINT('',(1.570796326795,0.)); +#2961 = VECTOR('',#2962,1.); +#2962 = DIRECTION('',(0.,-1.)); +#2963 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2964 = PCURVE('',#1493,#2965); +#2965 = DEFINITIONAL_REPRESENTATION('',(#2966),#2970); +#2966 = LINE('',#2967,#2968); +#2967 = CARTESIAN_POINT('',(0.,0.)); +#2968 = VECTOR('',#2969,1.); +#2969 = DIRECTION('',(0.,-1.)); +#2970 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2971 = ORIENTED_EDGE('',*,*,#2300,.T.); +#2972 = ORIENTED_EDGE('',*,*,#2926,.F.); +#2973 = ADVANCED_FACE('',(#2974),#1493,.T.); +#2974 = FACE_BOUND('',#2975,.T.); +#2975 = EDGE_LOOP('',(#2976,#2977,#2978,#2979)); +#2976 = ORIENTED_EDGE('',*,*,#1477,.F.); +#2977 = ORIENTED_EDGE('',*,*,#2951,.T.); +#2978 = ORIENTED_EDGE('',*,*,#2279,.T.); +#2979 = ORIENTED_EDGE('',*,*,#2980,.F.); +#2980 = EDGE_CURVE('',#1445,#2252,#2981,.T.); +#2981 = SURFACE_CURVE('',#2982,(#2986,#2993),.PCURVE_S1.); +#2982 = LINE('',#2983,#2984); +#2983 = CARTESIAN_POINT('',(32.25,-12.5,0.)); +#2984 = VECTOR('',#2985,1.); +#2985 = DIRECTION('',(0.,0.,1.)); +#2986 = PCURVE('',#1493,#2987); +#2987 = DEFINITIONAL_REPRESENTATION('',(#2988),#2992); +#2988 = LINE('',#2989,#2990); +#2989 = CARTESIAN_POINT('',(3.,0.)); +#2990 = VECTOR('',#2991,1.); +#2991 = DIRECTION('',(0.,-1.)); +#2992 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#2993 = PCURVE('',#1465,#2994); +#2994 = DEFINITIONAL_REPRESENTATION('',(#2995),#2999); +#2995 = LINE('',#2996,#2997); +#2996 = CARTESIAN_POINT('',(4.712388980385,0.)); +#2997 = VECTOR('',#2998,1.); +#2998 = DIRECTION('',(0.,-1.)); +#2999 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3000 = ADVANCED_FACE('',(#3001),#1465,.F.); +#3001 = FACE_BOUND('',#3002,.F.); +#3002 = EDGE_LOOP('',(#3003,#3004,#3005,#3006)); +#3003 = ORIENTED_EDGE('',*,*,#1444,.F.); +#3004 = ORIENTED_EDGE('',*,*,#2904,.T.); +#3005 = ORIENTED_EDGE('',*,*,#2251,.T.); +#3006 = ORIENTED_EDGE('',*,*,#2980,.F.); +#3007 = ADVANCED_FACE('',(#3008),#1556,.T.); +#3008 = FACE_BOUND('',#3009,.T.); +#3009 = EDGE_LOOP('',(#3010,#3011,#3032,#3033)); +#3010 = ORIENTED_EDGE('',*,*,#1538,.F.); +#3011 = ORIENTED_EDGE('',*,*,#3012,.T.); +#3012 = EDGE_CURVE('',#1539,#2329,#3013,.T.); +#3013 = SURFACE_CURVE('',#3014,(#3018,#3025),.PCURVE_S1.); +#3014 = LINE('',#3015,#3016); +#3015 = CARTESIAN_POINT('',(7.75,15.5,0.)); +#3016 = VECTOR('',#3017,1.); +#3017 = DIRECTION('',(0.,0.,1.)); +#3018 = PCURVE('',#1556,#3019); +#3019 = DEFINITIONAL_REPRESENTATION('',(#3020),#3024); +#3020 = LINE('',#3021,#3022); +#3021 = CARTESIAN_POINT('',(0.,0.)); +#3022 = VECTOR('',#3023,1.); +#3023 = DIRECTION('',(0.,-1.)); +#3024 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3025 = PCURVE('',#1589,#3026); +#3026 = DEFINITIONAL_REPRESENTATION('',(#3027),#3031); +#3027 = LINE('',#3028,#3029); +#3028 = CARTESIAN_POINT('',(1.570796326795,0.)); +#3029 = VECTOR('',#3030,1.); +#3030 = DIRECTION('',(0.,-1.)); +#3031 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3032 = ORIENTED_EDGE('',*,*,#2328,.T.); +#3033 = ORIENTED_EDGE('',*,*,#3034,.F.); +#3034 = EDGE_CURVE('',#1541,#2331,#3035,.T.); +#3035 = SURFACE_CURVE('',#3036,(#3040,#3047),.PCURVE_S1.); +#3036 = LINE('',#3037,#3038); +#3037 = CARTESIAN_POINT('',(7.75,12.5,0.)); +#3038 = VECTOR('',#3039,1.); +#3039 = DIRECTION('',(0.,0.,1.)); +#3040 = PCURVE('',#1556,#3041); +#3041 = DEFINITIONAL_REPRESENTATION('',(#3042),#3046); +#3042 = LINE('',#3043,#3044); +#3043 = CARTESIAN_POINT('',(3.,0.)); +#3044 = VECTOR('',#3045,1.); +#3045 = DIRECTION('',(0.,-1.)); +#3046 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3047 = PCURVE('',#1648,#3048); +#3048 = DEFINITIONAL_REPRESENTATION('',(#3049),#3053); +#3049 = LINE('',#3050,#3051); +#3050 = CARTESIAN_POINT('',(4.712388980385,0.)); +#3051 = VECTOR('',#3052,1.); +#3052 = DIRECTION('',(0.,-1.)); +#3053 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3054 = ADVANCED_FACE('',(#3055),#1648,.F.); +#3055 = FACE_BOUND('',#3056,.F.); +#3056 = EDGE_LOOP('',(#3057,#3058,#3079,#3080)); +#3057 = ORIENTED_EDGE('',*,*,#1629,.F.); +#3058 = ORIENTED_EDGE('',*,*,#3059,.T.); +#3059 = EDGE_CURVE('',#1602,#2380,#3060,.T.); +#3060 = SURFACE_CURVE('',#3061,(#3065,#3072),.PCURVE_S1.); +#3061 = LINE('',#3062,#3063); +#3062 = CARTESIAN_POINT('',(12.25,12.5,0.)); +#3063 = VECTOR('',#3064,1.); +#3064 = DIRECTION('',(0.,0.,1.)); +#3065 = PCURVE('',#1648,#3066); +#3066 = DEFINITIONAL_REPRESENTATION('',(#3067),#3071); +#3067 = LINE('',#3068,#3069); +#3068 = CARTESIAN_POINT('',(1.570796326795,0.)); +#3069 = VECTOR('',#3070,1.); +#3070 = DIRECTION('',(0.,-1.)); +#3071 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3072 = PCURVE('',#1617,#3073); +#3073 = DEFINITIONAL_REPRESENTATION('',(#3074),#3078); +#3074 = LINE('',#3075,#3076); +#3075 = CARTESIAN_POINT('',(0.,0.)); +#3076 = VECTOR('',#3077,1.); +#3077 = DIRECTION('',(0.,-1.)); +#3078 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3079 = ORIENTED_EDGE('',*,*,#2400,.T.); +#3080 = ORIENTED_EDGE('',*,*,#3034,.F.); +#3081 = ADVANCED_FACE('',(#3082),#1617,.T.); +#3082 = FACE_BOUND('',#3083,.T.); +#3083 = EDGE_LOOP('',(#3084,#3085,#3086,#3087)); +#3084 = ORIENTED_EDGE('',*,*,#1601,.F.); +#3085 = ORIENTED_EDGE('',*,*,#3059,.T.); +#3086 = ORIENTED_EDGE('',*,*,#2379,.T.); +#3087 = ORIENTED_EDGE('',*,*,#3088,.F.); +#3088 = EDGE_CURVE('',#1569,#2352,#3089,.T.); +#3089 = SURFACE_CURVE('',#3090,(#3094,#3101),.PCURVE_S1.); +#3090 = LINE('',#3091,#3092); +#3091 = CARTESIAN_POINT('',(12.25,15.5,0.)); +#3092 = VECTOR('',#3093,1.); +#3093 = DIRECTION('',(0.,0.,1.)); +#3094 = PCURVE('',#1617,#3095); +#3095 = DEFINITIONAL_REPRESENTATION('',(#3096),#3100); +#3096 = LINE('',#3097,#3098); +#3097 = CARTESIAN_POINT('',(3.,0.)); +#3098 = VECTOR('',#3099,1.); +#3099 = DIRECTION('',(0.,-1.)); +#3100 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3101 = PCURVE('',#1589,#3102); +#3102 = DEFINITIONAL_REPRESENTATION('',(#3103),#3107); +#3103 = LINE('',#3104,#3105); +#3104 = CARTESIAN_POINT('',(4.712388980385,0.)); +#3105 = VECTOR('',#3106,1.); +#3106 = DIRECTION('',(0.,-1.)); +#3107 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3108 = ADVANCED_FACE('',(#3109),#1589,.F.); +#3109 = FACE_BOUND('',#3110,.F.); +#3110 = EDGE_LOOP('',(#3111,#3112,#3113,#3114)); +#3111 = ORIENTED_EDGE('',*,*,#1568,.F.); +#3112 = ORIENTED_EDGE('',*,*,#3012,.T.); +#3113 = ORIENTED_EDGE('',*,*,#2351,.T.); +#3114 = ORIENTED_EDGE('',*,*,#3088,.F.); +#3115 = ADVANCED_FACE('',(#3116),#1680,.T.); +#3116 = FACE_BOUND('',#3117,.T.); +#3117 = EDGE_LOOP('',(#3118,#3119,#3140,#3141)); +#3118 = ORIENTED_EDGE('',*,*,#1662,.F.); +#3119 = ORIENTED_EDGE('',*,*,#3120,.T.); +#3120 = EDGE_CURVE('',#1663,#2429,#3121,.T.); +#3121 = SURFACE_CURVE('',#3122,(#3126,#3133),.PCURVE_S1.); +#3122 = LINE('',#3123,#3124); +#3123 = CARTESIAN_POINT('',(21.5,17.75,0.)); +#3124 = VECTOR('',#3125,1.); +#3125 = DIRECTION('',(0.,0.,1.)); +#3126 = PCURVE('',#1680,#3127); +#3127 = DEFINITIONAL_REPRESENTATION('',(#3128),#3132); +#3128 = LINE('',#3129,#3130); +#3129 = CARTESIAN_POINT('',(0.,-0.)); +#3130 = VECTOR('',#3131,1.); +#3131 = DIRECTION('',(0.,-1.)); +#3132 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3133 = PCURVE('',#1713,#3134); +#3134 = DEFINITIONAL_REPRESENTATION('',(#3135),#3139); +#3135 = LINE('',#3136,#3137); +#3136 = CARTESIAN_POINT('',(1.570796326795,0.)); +#3137 = VECTOR('',#3138,1.); +#3138 = DIRECTION('',(0.,-1.)); +#3139 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3140 = ORIENTED_EDGE('',*,*,#2428,.T.); +#3141 = ORIENTED_EDGE('',*,*,#3142,.F.); +#3142 = EDGE_CURVE('',#1665,#2431,#3143,.T.); +#3143 = SURFACE_CURVE('',#3144,(#3148,#3155),.PCURVE_S1.); +#3144 = LINE('',#3145,#3146); +#3145 = CARTESIAN_POINT('',(18.5,17.75,0.)); +#3146 = VECTOR('',#3147,1.); +#3147 = DIRECTION('',(0.,0.,1.)); +#3148 = PCURVE('',#1680,#3149); +#3149 = DEFINITIONAL_REPRESENTATION('',(#3150),#3154); +#3150 = LINE('',#3151,#3152); +#3151 = CARTESIAN_POINT('',(3.,0.)); +#3152 = VECTOR('',#3153,1.); +#3153 = DIRECTION('',(0.,-1.)); +#3154 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3155 = PCURVE('',#1772,#3156); +#3156 = DEFINITIONAL_REPRESENTATION('',(#3157),#3161); +#3157 = LINE('',#3158,#3159); +#3158 = CARTESIAN_POINT('',(4.712388980385,0.)); +#3159 = VECTOR('',#3160,1.); +#3160 = DIRECTION('',(0.,-1.)); +#3161 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3162 = ADVANCED_FACE('',(#3163),#1772,.F.); +#3163 = FACE_BOUND('',#3164,.F.); +#3164 = EDGE_LOOP('',(#3165,#3166,#3187,#3188)); +#3165 = ORIENTED_EDGE('',*,*,#1753,.F.); +#3166 = ORIENTED_EDGE('',*,*,#3167,.T.); +#3167 = EDGE_CURVE('',#1726,#2480,#3168,.T.); +#3168 = SURFACE_CURVE('',#3169,(#3173,#3180),.PCURVE_S1.); +#3169 = LINE('',#3170,#3171); +#3170 = CARTESIAN_POINT('',(18.5,13.25,0.)); +#3171 = VECTOR('',#3172,1.); +#3172 = DIRECTION('',(0.,0.,1.)); +#3173 = PCURVE('',#1772,#3174); +#3174 = DEFINITIONAL_REPRESENTATION('',(#3175),#3179); +#3175 = LINE('',#3176,#3177); +#3176 = CARTESIAN_POINT('',(1.570796326795,0.)); +#3177 = VECTOR('',#3178,1.); +#3178 = DIRECTION('',(0.,-1.)); +#3179 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3180 = PCURVE('',#1741,#3181); +#3181 = DEFINITIONAL_REPRESENTATION('',(#3182),#3186); +#3182 = LINE('',#3183,#3184); +#3183 = CARTESIAN_POINT('',(0.,0.)); +#3184 = VECTOR('',#3185,1.); +#3185 = DIRECTION('',(0.,-1.)); +#3186 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3187 = ORIENTED_EDGE('',*,*,#2500,.T.); +#3188 = ORIENTED_EDGE('',*,*,#3142,.F.); +#3189 = ADVANCED_FACE('',(#3190),#1741,.T.); +#3190 = FACE_BOUND('',#3191,.T.); +#3191 = EDGE_LOOP('',(#3192,#3193,#3194,#3195)); +#3192 = ORIENTED_EDGE('',*,*,#1725,.F.); +#3193 = ORIENTED_EDGE('',*,*,#3167,.T.); +#3194 = ORIENTED_EDGE('',*,*,#2479,.T.); +#3195 = ORIENTED_EDGE('',*,*,#3196,.F.); +#3196 = EDGE_CURVE('',#1693,#2452,#3197,.T.); +#3197 = SURFACE_CURVE('',#3198,(#3202,#3209),.PCURVE_S1.); +#3198 = LINE('',#3199,#3200); +#3199 = CARTESIAN_POINT('',(21.5,13.25,0.)); +#3200 = VECTOR('',#3201,1.); +#3201 = DIRECTION('',(0.,0.,1.)); +#3202 = PCURVE('',#1741,#3203); +#3203 = DEFINITIONAL_REPRESENTATION('',(#3204),#3208); +#3204 = LINE('',#3205,#3206); +#3205 = CARTESIAN_POINT('',(3.,0.)); +#3206 = VECTOR('',#3207,1.); +#3207 = DIRECTION('',(0.,-1.)); +#3208 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3209 = PCURVE('',#1713,#3210); +#3210 = DEFINITIONAL_REPRESENTATION('',(#3211),#3215); +#3211 = LINE('',#3212,#3213); +#3212 = CARTESIAN_POINT('',(4.712388980385,0.)); +#3213 = VECTOR('',#3214,1.); +#3214 = DIRECTION('',(0.,-1.)); +#3215 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3216 = ADVANCED_FACE('',(#3217),#1713,.F.); +#3217 = FACE_BOUND('',#3218,.F.); +#3218 = EDGE_LOOP('',(#3219,#3220,#3221,#3222)); +#3219 = ORIENTED_EDGE('',*,*,#1692,.F.); +#3220 = ORIENTED_EDGE('',*,*,#3120,.T.); +#3221 = ORIENTED_EDGE('',*,*,#2451,.T.); +#3222 = ORIENTED_EDGE('',*,*,#3196,.F.); +#3223 = ADVANCED_FACE('',(#3224),#1804,.T.); +#3224 = FACE_BOUND('',#3225,.T.); +#3225 = EDGE_LOOP('',(#3226,#3227,#3248,#3249)); +#3226 = ORIENTED_EDGE('',*,*,#1786,.F.); +#3227 = ORIENTED_EDGE('',*,*,#3228,.T.); +#3228 = EDGE_CURVE('',#1787,#2529,#3229,.T.); +#3229 = SURFACE_CURVE('',#3230,(#3234,#3241),.PCURVE_S1.); +#3230 = LINE('',#3231,#3232); +#3231 = CARTESIAN_POINT('',(27.75,15.5,0.)); +#3232 = VECTOR('',#3233,1.); +#3233 = DIRECTION('',(0.,0.,1.)); +#3234 = PCURVE('',#1804,#3235); +#3235 = DEFINITIONAL_REPRESENTATION('',(#3236),#3240); +#3236 = LINE('',#3237,#3238); +#3237 = CARTESIAN_POINT('',(0.,0.)); +#3238 = VECTOR('',#3239,1.); +#3239 = DIRECTION('',(0.,-1.)); +#3240 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3241 = PCURVE('',#1837,#3242); +#3242 = DEFINITIONAL_REPRESENTATION('',(#3243),#3247); +#3243 = LINE('',#3244,#3245); +#3244 = CARTESIAN_POINT('',(1.570796326795,0.)); +#3245 = VECTOR('',#3246,1.); +#3246 = DIRECTION('',(0.,-1.)); +#3247 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3248 = ORIENTED_EDGE('',*,*,#2528,.T.); +#3249 = ORIENTED_EDGE('',*,*,#3250,.F.); +#3250 = EDGE_CURVE('',#1789,#2531,#3251,.T.); +#3251 = SURFACE_CURVE('',#3252,(#3256,#3263),.PCURVE_S1.); +#3252 = LINE('',#3253,#3254); +#3253 = CARTESIAN_POINT('',(27.75,12.5,0.)); +#3254 = VECTOR('',#3255,1.); +#3255 = DIRECTION('',(0.,0.,1.)); +#3256 = PCURVE('',#1804,#3257); +#3257 = DEFINITIONAL_REPRESENTATION('',(#3258),#3262); +#3258 = LINE('',#3259,#3260); +#3259 = CARTESIAN_POINT('',(3.,0.)); +#3260 = VECTOR('',#3261,1.); +#3261 = DIRECTION('',(0.,-1.)); +#3262 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3263 = PCURVE('',#1896,#3264); +#3264 = DEFINITIONAL_REPRESENTATION('',(#3265),#3269); +#3265 = LINE('',#3266,#3267); +#3266 = CARTESIAN_POINT('',(4.712388980385,0.)); +#3267 = VECTOR('',#3268,1.); +#3268 = DIRECTION('',(0.,-1.)); +#3269 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3270 = ADVANCED_FACE('',(#3271),#1896,.F.); +#3271 = FACE_BOUND('',#3272,.F.); +#3272 = EDGE_LOOP('',(#3273,#3274,#3295,#3296)); +#3273 = ORIENTED_EDGE('',*,*,#1877,.F.); +#3274 = ORIENTED_EDGE('',*,*,#3275,.T.); +#3275 = EDGE_CURVE('',#1850,#2580,#3276,.T.); +#3276 = SURFACE_CURVE('',#3277,(#3281,#3288),.PCURVE_S1.); +#3277 = LINE('',#3278,#3279); +#3278 = CARTESIAN_POINT('',(32.25,12.5,0.)); +#3279 = VECTOR('',#3280,1.); +#3280 = DIRECTION('',(0.,0.,1.)); +#3281 = PCURVE('',#1896,#3282); +#3282 = DEFINITIONAL_REPRESENTATION('',(#3283),#3287); +#3283 = LINE('',#3284,#3285); +#3284 = CARTESIAN_POINT('',(1.570796326795,0.)); +#3285 = VECTOR('',#3286,1.); +#3286 = DIRECTION('',(0.,-1.)); +#3287 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3288 = PCURVE('',#1865,#3289); +#3289 = DEFINITIONAL_REPRESENTATION('',(#3290),#3294); +#3290 = LINE('',#3291,#3292); +#3291 = CARTESIAN_POINT('',(0.,0.)); +#3292 = VECTOR('',#3293,1.); +#3293 = DIRECTION('',(0.,-1.)); +#3294 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3295 = ORIENTED_EDGE('',*,*,#2600,.T.); +#3296 = ORIENTED_EDGE('',*,*,#3250,.F.); +#3297 = ADVANCED_FACE('',(#3298),#1865,.T.); +#3298 = FACE_BOUND('',#3299,.T.); +#3299 = EDGE_LOOP('',(#3300,#3301,#3302,#3303)); +#3300 = ORIENTED_EDGE('',*,*,#1849,.F.); +#3301 = ORIENTED_EDGE('',*,*,#3275,.T.); +#3302 = ORIENTED_EDGE('',*,*,#2579,.T.); +#3303 = ORIENTED_EDGE('',*,*,#3304,.F.); +#3304 = EDGE_CURVE('',#1817,#2552,#3305,.T.); +#3305 = SURFACE_CURVE('',#3306,(#3310,#3317),.PCURVE_S1.); +#3306 = LINE('',#3307,#3308); +#3307 = CARTESIAN_POINT('',(32.25,15.5,0.)); +#3308 = VECTOR('',#3309,1.); +#3309 = DIRECTION('',(0.,0.,1.)); +#3310 = PCURVE('',#1865,#3311); +#3311 = DEFINITIONAL_REPRESENTATION('',(#3312),#3316); +#3312 = LINE('',#3313,#3314); +#3313 = CARTESIAN_POINT('',(3.,0.)); +#3314 = VECTOR('',#3315,1.); +#3315 = DIRECTION('',(0.,-1.)); +#3316 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3317 = PCURVE('',#1837,#3318); +#3318 = DEFINITIONAL_REPRESENTATION('',(#3319),#3323); +#3319 = LINE('',#3320,#3321); +#3320 = CARTESIAN_POINT('',(4.712388980385,0.)); +#3321 = VECTOR('',#3322,1.); +#3322 = DIRECTION('',(0.,-1.)); +#3323 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) +PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' + ) ); +#3324 = ADVANCED_FACE('',(#3325),#1837,.F.); +#3325 = FACE_BOUND('',#3326,.F.); +#3326 = EDGE_LOOP('',(#3327,#3328,#3329,#3330)); +#3327 = ORIENTED_EDGE('',*,*,#1816,.F.); +#3328 = ORIENTED_EDGE('',*,*,#3228,.T.); +#3329 = ORIENTED_EDGE('',*,*,#2551,.T.); +#3330 = ORIENTED_EDGE('',*,*,#3304,.F.); +#3331 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#3335)) +GLOBAL_UNIT_ASSIGNED_CONTEXT((#3332,#3333,#3334)) REPRESENTATION_CONTEXT +('Context #1','3D Context with UNIT and UNCERTAINTY') ); +#3332 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#3333 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#3334 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#3335 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#3332, + 'distance_accuracy_value','confusion accuracy'); +#3336 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7)); +#3337 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',( + #3338),#3331); +#3338 = STYLED_ITEM('color',(#3339),#15); +#3339 = PRESENTATION_STYLE_ASSIGNMENT((#3340)); +#3340 = SURFACE_STYLE_USAGE(.BOTH.,#3341); +#3341 = SURFACE_SIDE_STYLE('',(#3342)); +#3342 = SURFACE_STYLE_FILL_AREA(#3343); +#3343 = FILL_AREA_STYLE('',(#3344)); +#3344 = FILL_AREA_STYLE_COLOUR('',#3345); +#3345 = DRAUGHTING_PRE_DEFINED_COLOUR('black'); +ENDSEC; +END-ISO-10303-21; From 82d0af35e7f7ea8cee11e9a3ce6086609d9746d2 Mon Sep 17 00:00:00 2001 From: Jonathan Wagenet Date: Mon, 30 Jun 2025 23:11:39 -0400 Subject: [PATCH 53/56] Resolve #1019 and other spelling --- docs/examples_1.rst | 14 +++++++------- docs/joints.rst | 30 +++++++++++++++--------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/examples_1.rst b/docs/examples_1.rst index 364c2fb..7da07de 100644 --- a/docs/examples_1.rst +++ b/docs/examples_1.rst @@ -549,7 +549,7 @@ Stud Wall .. image:: assets/examples/stud_wall.png :align: center -This example demonstrates creatings custom `Part` objects and putting them into +This example demonstrates creating custom `Part` objects and putting them into assemblies. The custom object is a `Stud` used in the building industry while the assembly is a `StudWall` created from copies of `Stud` objects for efficiency. Both the `Stud` and `StudWall` objects use `RigidJoints` to define snap points which @@ -603,7 +603,7 @@ Toy Truck --------- .. image:: assets/examples/toy_truck.png :align: center - + .. image:: assets/examples/toy_truck_picture.jpg :align: center @@ -613,11 +613,11 @@ Toy Truck :start-after: [Code] :end-before: [End] -This example demonstrates how to design a toy truck using BuildPart and -BuildSketch in Builder mode. The model includes a detailed body, cab, grill, -and bumper, showcasing techniques like sketch reuse, symmetry, tapered -extrusions, selective filleting, and the use of joints for part assembly. -Ideal for learning complex part construction and hierarchical modeling in +This example demonstrates how to design a toy truck using BuildPart and +BuildSketch in Builder mode. The model includes a detailed body, cab, grill, +and bumper, showcasing techniques like sketch reuse, symmetry, tapered +extrusions, selective filleting, and the use of joints for part assembly. +Ideal for learning complex part construction and hierarchical modeling in build123d. .. _vase: diff --git a/docs/joints.rst b/docs/joints.rst index e6a7e7c..07cc623 100644 --- a/docs/joints.rst +++ b/docs/joints.rst @@ -25,7 +25,7 @@ in pairs - a :class:`~topology.Joint` can only be connected to another :class:`~ Objects may have many joints bound to them each with an identifying label. All :class:`~topology.Joint` objects have a ``symbol`` property that can be displayed to help visualize -their position and orientation (the `ocp-vscode `_ viewer +their position and orientation (the `ocp-vscode `_ viewer has built-in support for displaying joints). .. note:: @@ -41,16 +41,16 @@ The following sections provide more detail on the available joints and describes Rigid Joint *********** -A rigid joint positions two components relative to each another with no freedom of movement. When a +A rigid joint positions two components relative to each another with no freedom of movement. When a :class:`~joints.RigidJoint` is instantiated it's assigned a ``label``, a part to bind to (``to_part``), -and a ``joint_location`` which defines both the position and orientation of the joint (see +and a ``joint_location`` which defines both the position and orientation of the joint (see :class:`~geometry.Location`) - as follows: .. code-block:: python RigidJoint(label="outlet", to_part=pipe, joint_location=path.location_at(1)) -Once a joint is bound to a part this way, the :meth:`~topology.Joint.connect_to` method can be used to +Once a joint is bound to a part this way, the :meth:`~topology.Joint.connect_to` method can be used to repositioning another part relative to ``self`` which stay fixed - as follows: .. code-block:: python @@ -74,7 +74,7 @@ flanges are attached to the ends of a curved pipe: Note how the locations of the joints are determined by the :meth:`~topology.Mixin1D.location_at` method and how the ``-`` negate operator is used to reverse the direction of the location without changing its -poosition. Also note that the ``WeldNeckFlange`` class predefines two joints, one at the pipe end and +position. Also note that the ``WeldNeckFlange`` class predefines two joints, one at the pipe end and one at the face end - both of which are shown in the above image (generated by ocp-vscode with the ``render_joints=True`` flag set in the ``show`` function). @@ -105,7 +105,7 @@ Revolute Joint Component rotates around axis like a hinge. The :ref:`joint_tutorial` covers Revolute Joints in detail. -During instantiation of a :class:`~joints.RevoluteJoint` there are three parameters not present with +During instantiation of a :class:`~joints.RevoluteJoint` there are three parameters not present with Rigid Joints: ``axis``, ``angle_reference``, and ``range`` that allow the circular motion to be fully defined. @@ -114,7 +114,7 @@ which allows one to change the relative position of joined parts by changing a s .. autoclass:: RevoluteJoint -.. +.. :exclude-members: connect_to .. method:: connect_to(other: RigidJoint, *, angle: float = None) @@ -151,7 +151,7 @@ of the limits will raise an exception. .. autoclass:: LinearJoint -.. +.. :exclude-members: connect_to .. method:: connect_to(other: RevoluteJoint, *, position: float = None, angle: float = None) @@ -164,10 +164,10 @@ of the limits will raise an exception. Cylindrical Joint ***************** -A :class:`~joints.CylindricalJoint` allows a component to rotate around and moves along a single axis -like a screw combining the functionality of a :class:`~joints.LinearJoint` and a -:class:`~joints.RevoluteJoint` joint. The ``connect_to`` for these joints have both ``position`` and -``angle`` parameters as shown below extracted from the joint tutorial. +A :class:`~joints.CylindricalJoint` allows a component to rotate around and moves along a single axis +like a screw combining the functionality of a :class:`~joints.LinearJoint` and a +:class:`~joints.RevoluteJoint` joint. The ``connect_to`` for these joints have both ``position`` and +``angle`` parameters as shown below extracted from the joint tutorial. .. code-block::python @@ -176,7 +176,7 @@ like a screw combining the functionality of a :class:`~joints.LinearJoint` and a .. autoclass:: CylindricalJoint -.. +.. :exclude-members: connect_to .. method:: connect_to(other: RigidJoint, *, position: float = None, angle: float = None) @@ -195,13 +195,13 @@ is found within a rod end as shown here: .. literalinclude:: rod_end.py :emphasize-lines: 40-44,51,53 -Note how limits are defined during the instantiation of the ball joint when ensures that the pin or bolt +Note how limits are defined during the instantiation of the ball joint when ensures that the pin or bolt within the rod end does not interfere with the rod end itself. The ``connect_to`` sets the three angles (only two are significant in this example). .. autoclass:: BallJoint -.. +.. :exclude-members: connect_to .. method:: connect_to(other: RigidJoint, *, angles: RotationLike = None) From 7dcee5225b447c91c4daedc70650fbbdb40c869d Mon Sep 17 00:00:00 2001 From: Jonathan Wagenet Date: Mon, 30 Jun 2025 23:40:30 -0400 Subject: [PATCH 54/56] Add tangent objects to Resolve #974 --- docs/cheat_sheet.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/cheat_sheet.rst b/docs/cheat_sheet.rst index ebec505..4b88edb 100644 --- a/docs/cheat_sheet.rst +++ b/docs/cheat_sheet.rst @@ -15,6 +15,8 @@ Cheat Sheet .. grid-item-card:: 1D - BuildLine + | :class:`~objects_curve.ArcArcTangentArc` + | :class:`~objects_curve.ArcArcTangentLine` | :class:`~objects_curve.Bezier` | :class:`~objects_curve.CenterArc` | :class:`~objects_curve.DoubleTangentArc` @@ -24,6 +26,8 @@ Cheat Sheet | :class:`~objects_curve.IntersectingLine` | :class:`~objects_curve.JernArc` | :class:`~objects_curve.Line` + | :class:`~objects_curve.PointArcTangentArc` + | :class:`~objects_curve.PointArcTangentLine` | :class:`~objects_curve.PolarLine` | :class:`~objects_curve.Polyline` | :class:`~objects_curve.RadiusArc` From 4f2649f0af45bfdbec40f5fd38023b53b8fa15c2 Mon Sep 17 00:00:00 2001 From: gumyr Date: Tue, 1 Jul 2025 10:23:57 -0400 Subject: [PATCH 55/56] Reducing thread size to avoid OCCT fuse issue --- docs/rod_end.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/rod_end.py b/docs/rod_end.py index e0a4364..335743f 100644 --- a/docs/rod_end.py +++ b/docs/rod_end.py @@ -3,9 +3,7 @@ from bd_warehouse.thread import IsoThread from ocp_vscode import * # Create the thread so the min radius is available below -thread = IsoThread( - major_diameter=8, pitch=1.25, length=20, end_finishes=("fade", "raw") -) +thread = IsoThread(major_diameter=6, pitch=1, length=20, end_finishes=("fade", "raw")) inner_radius = 15.89 / 2 inner_gap = 0.2 @@ -52,4 +50,4 @@ with BuildPart() as ball: rod_end.part.joints["socket"].connect_to(ball.part.joints["ball"], angles=(5, 10, 0)) -show(rod_end.part, ball.part) +show(rod_end.part, ball.part, s2) From 228769005a2b3575a488203c99b53ed8c1ee1790 Mon Sep 17 00:00:00 2001 From: gumyr Date: Thu, 3 Jul 2025 09:29:51 -0400 Subject: [PATCH 56/56] Ensuring Polygon takes an iterable --- src/build123d/objects_sketch.py | 2 +- tests/test_build_sketch.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/build123d/objects_sketch.py b/src/build123d/objects_sketch.py index a630e29..eed5b59 100644 --- a/src/build123d/objects_sketch.py +++ b/src/build123d/objects_sketch.py @@ -206,7 +206,7 @@ class Polygon(BaseSketchObject): self.pts = flattened_pts self.align = tuplify(align, 2) - poly_pts = [Vector(p) for p in pts] + poly_pts = [Vector(p) for p in self.pts] face = Face(Wire.make_polygon(poly_pts)) super().__init__(face, rotation, self.align, mode) diff --git a/tests/test_build_sketch.py b/tests/test_build_sketch.py index 443d441..c00a504 100644 --- a/tests/test_build_sketch.py +++ b/tests/test_build_sketch.py @@ -222,6 +222,11 @@ class TestBuildSketchObjects(unittest.TestCase): self.assertAlmostEqual(test.sketch.area, 0.5, 5) self.assertEqual(p.faces()[0].normal_at(), Vector(0, 0, 1)) + # test iterable input + points_nervure = [(0.0, 0.0), (10.0, 0.0), (0.0, 5.0)] + riri = Polygon(points_nervure, align=Align.NONE) + self.assertEqual(len(riri.vertices()), 3) + def test_rectangle(self): with BuildSketch() as test: r = Rectangle(20, 10)