Create a child workplane on a vertex (#480)

* add parent face detection to workplane()

* Update cq.py

* add nonetype check and tests

* fixed test formatting

* mypy fix attempt

Co-authored-by: Adam Urbańczyk <adam-urbanczyk@users.noreply.github.com>
This commit is contained in:
Aaron Peterson
2020-10-15 14:10:49 -05:00
committed by GitHub
parent de2da03a97
commit cac5cf92f1
2 changed files with 24 additions and 2 deletions

View File

@ -543,8 +543,14 @@ class Workplane(object):
if isinstance(obj, Shape)
else obj.Center()
)
normal = self.plane.zDir
xDir = self.plane.xDir
val = self.parent.val() if self.parent else None
if isinstance(val, Face):
normal = val.normalAt(center)
xDir = _computeXdir(normal)
else:
normal = self.plane.zDir
xDir = self.plane.xDir
else:
raise ValueError("Needs a face or a vertex or point on a work plane")

View File

@ -3157,6 +3157,22 @@ class TestCadQuery(BaseTest):
result.faces(">Z").val().Center().toTuple(), (-3, 0, 12), 9
)
def testWorkplaneOrientationOnVertex(self):
# create a 10 unit sized cube on the XY plane
parent = Workplane("XY").rect(10.0, 10.0).extrude(10)
# assert that the direction tuples reflect accordingly
assert parent.plane.xDir.toTuple() == approx((1.0, 0.0, 0.0))
assert parent.plane.zDir.toTuple() == approx((0.0, 0.0, 1.0))
# select the <XZ vertex on the <Y face and create a new workplane.
child = parent.faces("<Y").vertices("<XZ").workplane()
# assert that the direction tuples reflect the new workplane on the <Y face
assert child.plane.xDir.toTuple() == approx((1.0, 0.0, -0.0))
assert child.plane.zDir.toTuple() == approx((0.0, -1.0, -0.0))
def testTagSelectors(self):
result0 = Workplane("XY").box(1, 1, 1).tag("box").sphere(1)