diff --git a/docs/assets/ttt/ttt-ppp0101.py b/docs/assets/ttt/ttt-ppp0101.py index efd0a27..84d9a51 100644 --- a/docs/assets/ttt/ttt-ppp0101.py +++ b/docs/assets/ttt/ttt-ppp0101.py @@ -25,7 +25,7 @@ with BuildPart() as p: fillet(edgs, 9) with Locations(zz.faces().sort_by(Axis.Y)[0]): - with Locations((42 / 2 + 6, 0)): + with Locations((0, 42 / 2 + 6)): CounterBoreHole(24 / 2, 34 / 2, 4) mirror(about=Plane.XZ) diff --git a/src/build123d/geometry.py b/src/build123d/geometry.py index 3e3807f..246d7a7 100644 --- a/src/build123d/geometry.py +++ b/src/build123d/geometry.py @@ -2810,25 +2810,19 @@ class Plane(metaclass=PlaneMeta): if arg_plane: self.wrapped = arg_plane elif arg_face: - 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() - tangent_v = gp_Vec() - surface.D1(0.5, 0.5, point, face_x_dir, tangent_v) + face_normal = Plane.get_topods_face_normal(arg_face.wrapped) + face_z_dir = Vector(face_normal).normalized() + candidate = face_z_dir.cross(Vector(0, 0, -1)) + if candidate.length < TOLERANCE: + face_x_dir = Vector(1, 0, 0) else: - face_x_dir = surface.Position().XDirection() - + face_x_dir = candidate.normalized() + self._origin = arg_face.center() 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) - self.z_dir = Vector(round(i, 14) for i in self.z_dir) + self.z_dir = Vector(round(i, 14) for i in face_z_dir) elif arg_location: topo_face = BRepBuilderAPI_MakeFace( Plane.XY.wrapped, -1.0, 1.0, -1.0, 1.0 diff --git a/tests/test_direct_api/test_plane.py b/tests/test_direct_api/test_plane.py index e9e7faa..9bdbb20 100644 --- a/tests/test_direct_api/test_plane.py +++ b/tests/test_direct_api/test_plane.py @@ -156,11 +156,11 @@ class TestPlane(unittest.TestCase): p_deep_copy = copy.deepcopy(p_from_face) for p in [p_from_face, p_from_named_face, plane_from_gp_pln, p_deep_copy]: self.assertAlmostEqual(p.origin, (1, 2, 3), 6) - self.assertAlmostEqual(p.x_dir, (math.sqrt(2) / 2, 0.5, 0.5), 6) - self.assertAlmostEqual(p.y_dir, (-math.sqrt(2) / 2, 0.5, 0.5), 6) - self.assertAlmostEqual(p.z_dir, (0, -math.sqrt(2) / 2, math.sqrt(2) / 2), 6) + self.assertAlmostEqual(p.x_dir, (1, 0, 0), 6) + self.assertAlmostEqual(p.y_dir, (0, 0.7071067811865, 0.7071067811865), 6) + self.assertAlmostEqual(p.z_dir, (0, -0.7071067811865, 0.7071067811865), 6) self.assertAlmostEqual(f.location.position, p.location.position, 6) - self.assertAlmostEqual(f.location.orientation, p.location.orientation, 6) + self.assertAlmostEqual(Vector(45, 0, 0), p.location.orientation, 6) # from a face with x_dir f = Face.make_rect(1, 2) @@ -359,7 +359,7 @@ class TestPlane(unittest.TestCase): with BuildPart() as p: add(box) with BuildSketch(pln): - with Locations((-0.5, 0.5)): + with Locations((-0.5, -0.5)): Circle(0.5) extrude(amount=-1, mode=Mode.SUBTRACT) self.assertAlmostEqual(p.part.volume, 1**3 - math.pi * (0.5**2) * 1, 5)