Change to ProjectedOrigin (#532)
* Change to ProjectedOrigin * Fix most tests * Fix remaining tests * Fix example building * Update selector docs * Fix the bottle+formatting changes * Renamed centered to xycentered * Ignore utils for coverage calculation
This commit is contained in:
@ -1,5 +1,6 @@
|
|||||||
[run]
|
[run]
|
||||||
branch = True
|
branch = True
|
||||||
|
omit = cadquery/utils.py
|
||||||
|
|
||||||
[report]
|
[report]
|
||||||
exclude_lines =
|
exclude_lines =
|
||||||
|
|||||||
@ -413,14 +413,13 @@ class Workplane(object):
|
|||||||
|
|
||||||
return self.val().wrapped
|
return self.val().wrapped
|
||||||
|
|
||||||
@deprecate_kwarg("centerOption", "ProjectedOrigin")
|
|
||||||
def workplane(
|
def workplane(
|
||||||
self,
|
self,
|
||||||
offset: float = 0.0,
|
offset: float = 0.0,
|
||||||
invert: bool = False,
|
invert: bool = False,
|
||||||
centerOption: Literal[
|
centerOption: Literal[
|
||||||
"CenterOfMass", "ProjectedOrigin", "CenterOfBoundBox"
|
"CenterOfMass", "ProjectedOrigin", "CenterOfBoundBox"
|
||||||
] = "CenterOfMass",
|
] = "ProjectedOrigin",
|
||||||
origin: Optional[VectorLike] = None,
|
origin: Optional[VectorLike] = None,
|
||||||
) -> "Workplane":
|
) -> "Workplane":
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -436,7 +436,7 @@ how deep the part is
|
|||||||
.. cadquery::
|
.. cadquery::
|
||||||
|
|
||||||
result = cq.Workplane("front").box(3,2, 0.5) #make a basic prism
|
result = cq.Workplane("front").box(3,2, 0.5) #make a basic prism
|
||||||
result = result.faces(">Z").vertices("<XY").workplane() #select the lower left vertex and make a workplane
|
result = result.faces(">Z").vertices("<XY").workplane(centerOption="CenterOfMass") #select the lower left vertex and make a workplane
|
||||||
result = result.circle(1.0).cutThruAll() #cut the corner out
|
result = result.circle(1.0).cutThruAll() #cut the corner out
|
||||||
|
|
||||||
.. topic:: Api References
|
.. topic:: Api References
|
||||||
@ -776,7 +776,7 @@ ones at 13 lines, but that's very short compared to the pythonOCC version, which
|
|||||||
.mirrorX().extrude(30.0,True))
|
.mirrorX().extrude(30.0,True))
|
||||||
|
|
||||||
#make the neck
|
#make the neck
|
||||||
p = p.faces(">Z").workplane().circle(3.0).extrude(2.0,True)
|
p = p.faces(">Z").workplane(centerOption="CenterOfMass").circle(3.0).extrude(2.0,True)
|
||||||
|
|
||||||
#make a shell
|
#make a shell
|
||||||
result = p.faces(">Z").shell(0.3)
|
result = p.faces(">Z").shell(0.3)
|
||||||
@ -1160,35 +1160,35 @@ Panel With Various Connector Holes
|
|||||||
|
|
||||||
h_sep = 60
|
h_sep = 60
|
||||||
for idx in range(4):
|
for idx in range(4):
|
||||||
result = result.workplane(offset=1, centerOption='CenterOfBoundBox').center(157,210-idx*h_sep).moveTo(-23.5,0).circle(1.6).moveTo(23.5,0).circle(1.6).moveTo(-17.038896,-5.7).threePointArc((-19.44306,-4.70416),(-20.438896,-2.3)).lineTo(-21.25,2.3).threePointArc((-20.25416,4.70416),(-17.85,5.7)).lineTo(17.85,5.7).threePointArc((20.25416,4.70416),(21.25,2.3)).lineTo(20.438896,-2.3).threePointArc((19.44306,-4.70416),(17.038896,-5.7)).close().cutThruAll()
|
result = result.workplane(offset=1, centerOption="CenterOfBoundBox").center(157,210-idx*h_sep).moveTo(-23.5,0).circle(1.6).moveTo(23.5,0).circle(1.6).moveTo(-17.038896,-5.7).threePointArc((-19.44306,-4.70416),(-20.438896,-2.3)).lineTo(-21.25,2.3).threePointArc((-20.25416,4.70416),(-17.85,5.7)).lineTo(17.85,5.7).threePointArc((20.25416,4.70416),(21.25,2.3)).lineTo(20.438896,-2.3).threePointArc((19.44306,-4.70416),(17.038896,-5.7)).close().cutThruAll()
|
||||||
|
|
||||||
for idx in range(4):
|
for idx in range(4):
|
||||||
result = result.workplane(offset=1, centerOption='CenterOfBoundBox').center(157,-30-idx*h_sep).moveTo(-16.65,0).circle(1.6).moveTo(16.65,0).circle(1.6).moveTo(-10.1889,-5.7).threePointArc((-12.59306,-4.70416),(-13.5889,-2.3)).lineTo(-14.4,2.3).threePointArc((-13.40416,4.70416),(-11,5.7)).lineTo(11,5.7).threePointArc((13.40416,4.70416),(14.4,2.3)).lineTo(13.5889,-2.3).threePointArc((12.59306,-4.70416),(10.1889,-5.7)).close().cutThruAll()
|
result = result.workplane(offset=1, centerOption="CenterOfBoundBox").center(157,-30-idx*h_sep).moveTo(-16.65,0).circle(1.6).moveTo(16.65,0).circle(1.6).moveTo(-10.1889,-5.7).threePointArc((-12.59306,-4.70416),(-13.5889,-2.3)).lineTo(-14.4,2.3).threePointArc((-13.40416,4.70416),(-11,5.7)).lineTo(11,5.7).threePointArc((13.40416,4.70416),(14.4,2.3)).lineTo(13.5889,-2.3).threePointArc((12.59306,-4.70416),(10.1889,-5.7)).close().cutThruAll()
|
||||||
|
|
||||||
h_sep4DB9 = 30
|
h_sep4DB9 = 30
|
||||||
for idx in range(8):
|
for idx in range(8):
|
||||||
result = result.workplane(offset=1, centerOption='CenterOfBoundBox').center(91,225-idx*h_sep4DB9).moveTo(-12.5,0).circle(1.6).moveTo(12.5,0).circle(1.6).moveTo(-6.038896,-5.7).threePointArc((-8.44306,-4.70416),(-9.438896,-2.3)).lineTo(-10.25,2.3).threePointArc((-9.25416,4.70416),(-6.85,5.7)).lineTo(6.85,5.7).threePointArc((9.25416,4.70416),(10.25,2.3)).lineTo(9.438896,-2.3).threePointArc((8.44306,-4.70416),(6.038896,-5.7)).close().cutThruAll()
|
result = result.workplane(offset=1, centerOption="CenterOfBoundBox").center(91,225-idx*h_sep4DB9).moveTo(-12.5,0).circle(1.6).moveTo(12.5,0).circle(1.6).moveTo(-6.038896,-5.7).threePointArc((-8.44306,-4.70416),(-9.438896,-2.3)).lineTo(-10.25,2.3).threePointArc((-9.25416,4.70416),(-6.85,5.7)).lineTo(6.85,5.7).threePointArc((9.25416,4.70416),(10.25,2.3)).lineTo(9.438896,-2.3).threePointArc((8.44306,-4.70416),(6.038896,-5.7)).close().cutThruAll()
|
||||||
|
|
||||||
for idx in range(4):
|
for idx in range(4):
|
||||||
result = result.workplane(offset=1, centerOption='CenterOfBoundBox').center(25,210-idx*h_sep).moveTo(-23.5,0).circle(1.6).moveTo(23.5,0).circle(1.6).moveTo(-17.038896,-5.7).threePointArc((-19.44306,-4.70416),(-20.438896,-2.3)).lineTo(-21.25,2.3).threePointArc((-20.25416,4.70416),(-17.85,5.7)).lineTo(17.85,5.7).threePointArc((20.25416,4.70416),(21.25,2.3)).lineTo(20.438896,-2.3).threePointArc((19.44306,-4.70416),(17.038896,-5.7)).close().cutThruAll()
|
result = result.workplane(offset=1, centerOption="CenterOfBoundBox").center(25,210-idx*h_sep).moveTo(-23.5,0).circle(1.6).moveTo(23.5,0).circle(1.6).moveTo(-17.038896,-5.7).threePointArc((-19.44306,-4.70416),(-20.438896,-2.3)).lineTo(-21.25,2.3).threePointArc((-20.25416,4.70416),(-17.85,5.7)).lineTo(17.85,5.7).threePointArc((20.25416,4.70416),(21.25,2.3)).lineTo(20.438896,-2.3).threePointArc((19.44306,-4.70416),(17.038896,-5.7)).close().cutThruAll()
|
||||||
|
|
||||||
for idx in range(4):
|
for idx in range(4):
|
||||||
result = result.workplane(offset=1, centerOption='CenterOfBoundBox').center(25,-30-idx*h_sep).moveTo(-16.65,0).circle(1.6).moveTo(16.65,0).circle(1.6).moveTo(-10.1889,-5.7).threePointArc((-12.59306,-4.70416),(-13.5889,-2.3)).lineTo(-14.4,2.3).threePointArc((-13.40416,4.70416),(-11,5.7)).lineTo(11,5.7).threePointArc((13.40416,4.70416),(14.4,2.3)).lineTo(13.5889,-2.3).threePointArc((12.59306,-4.70416),(10.1889,-5.7)).close().cutThruAll()
|
result = result.workplane(offset=1, centerOption="CenterOfBoundBox").center(25,-30-idx*h_sep).moveTo(-16.65,0).circle(1.6).moveTo(16.65,0).circle(1.6).moveTo(-10.1889,-5.7).threePointArc((-12.59306,-4.70416),(-13.5889,-2.3)).lineTo(-14.4,2.3).threePointArc((-13.40416,4.70416),(-11,5.7)).lineTo(11,5.7).threePointArc((13.40416,4.70416),(14.4,2.3)).lineTo(13.5889,-2.3).threePointArc((12.59306,-4.70416),(10.1889,-5.7)).close().cutThruAll()
|
||||||
|
|
||||||
for idx in range(8):
|
for idx in range(8):
|
||||||
result = result.workplane(offset=1, centerOption='CenterOfBoundBox').center(-41,225-idx*h_sep4DB9).moveTo(-12.5,0).circle(1.6).moveTo(12.5,0).circle(1.6).moveTo(-6.038896,-5.7).threePointArc((-8.44306,-4.70416),(-9.438896,-2.3)).lineTo(-10.25,2.3).threePointArc((-9.25416,4.70416),(-6.85,5.7)).lineTo(6.85,5.7).threePointArc((9.25416,4.70416),(10.25,2.3)).lineTo(9.438896,-2.3).threePointArc((8.44306,-4.70416),(6.038896,-5.7)).close().cutThruAll()
|
result = result.workplane(offset=1, centerOption="CenterOfBoundBox").center(-41,225-idx*h_sep4DB9).moveTo(-12.5,0).circle(1.6).moveTo(12.5,0).circle(1.6).moveTo(-6.038896,-5.7).threePointArc((-8.44306,-4.70416),(-9.438896,-2.3)).lineTo(-10.25,2.3).threePointArc((-9.25416,4.70416),(-6.85,5.7)).lineTo(6.85,5.7).threePointArc((9.25416,4.70416),(10.25,2.3)).lineTo(9.438896,-2.3).threePointArc((8.44306,-4.70416),(6.038896,-5.7)).close().cutThruAll()
|
||||||
|
|
||||||
for idx in range(4):
|
for idx in range(4):
|
||||||
result = result.workplane(offset=1, centerOption='CenterOfBoundBox').center(-107,210-idx*h_sep).moveTo(-23.5,0).circle(1.6).moveTo(23.5,0).circle(1.6).moveTo(-17.038896,-5.7).threePointArc((-19.44306,-4.70416),(-20.438896,-2.3)).lineTo(-21.25,2.3).threePointArc((-20.25416,4.70416),(-17.85,5.7)).lineTo(17.85,5.7).threePointArc((20.25416,4.70416),(21.25,2.3)).lineTo(20.438896,-2.3).threePointArc((19.44306,-4.70416),(17.038896,-5.7)).close().cutThruAll()
|
result = result.workplane(offset=1, centerOption="CenterOfBoundBox").center(-107,210-idx*h_sep).moveTo(-23.5,0).circle(1.6).moveTo(23.5,0).circle(1.6).moveTo(-17.038896,-5.7).threePointArc((-19.44306,-4.70416),(-20.438896,-2.3)).lineTo(-21.25,2.3).threePointArc((-20.25416,4.70416),(-17.85,5.7)).lineTo(17.85,5.7).threePointArc((20.25416,4.70416),(21.25,2.3)).lineTo(20.438896,-2.3).threePointArc((19.44306,-4.70416),(17.038896,-5.7)).close().cutThruAll()
|
||||||
|
|
||||||
for idx in range(4):
|
for idx in range(4):
|
||||||
result = result.workplane(offset=1, centerOption='CenterOfBoundBox').center(-107,-30-idx*h_sep).circle(14).rect(24.7487,24.7487, forConstruction=True).vertices().hole(3.2).cutThruAll()
|
result = result.workplane(offset=1, centerOption="CenterOfBoundBox").center(-107,-30-idx*h_sep).circle(14).rect(24.7487,24.7487, forConstruction=True).vertices().hole(3.2).cutThruAll()
|
||||||
|
|
||||||
for idx in range(8):
|
for idx in range(8):
|
||||||
result = result.workplane(offset=1, centerOption='CenterOfBoundBox').center(-173,225-idx*h_sep4DB9).moveTo(-12.5,0).circle(1.6).moveTo(12.5,0).circle(1.6).moveTo(-6.038896,-5.7).threePointArc((-8.44306,-4.70416),(-9.438896,-2.3)).lineTo(-10.25,2.3).threePointArc((-9.25416,4.70416),(-6.85,5.7)).lineTo(6.85,5.7).threePointArc((9.25416,4.70416),(10.25,2.3)).lineTo(9.438896,-2.3).threePointArc((8.44306,-4.70416),(6.038896,-5.7)).close().cutThruAll()
|
result = result.workplane(offset=1, centerOption="CenterOfBoundBox").center(-173,225-idx*h_sep4DB9).moveTo(-12.5,0).circle(1.6).moveTo(12.5,0).circle(1.6).moveTo(-6.038896,-5.7).threePointArc((-8.44306,-4.70416),(-9.438896,-2.3)).lineTo(-10.25,2.3).threePointArc((-9.25416,4.70416),(-6.85,5.7)).lineTo(6.85,5.7).threePointArc((9.25416,4.70416),(10.25,2.3)).lineTo(9.438896,-2.3).threePointArc((8.44306,-4.70416),(6.038896,-5.7)).close().cutThruAll()
|
||||||
|
|
||||||
for idx in range(4):
|
for idx in range(4):
|
||||||
result = result.workplane(offset=1, centerOption='CenterOfBoundBox').center(-173,-30-idx*h_sep).moveTo(-2.9176,-5.3).threePointArc((-6.05,0),(-2.9176,5.3)).lineTo(2.9176,5.3).threePointArc((6.05,0),(2.9176,-5.3)).close().cutThruAll()
|
result = result.workplane(offset=1, centerOption="CenterOfBoundBox").center(-173,-30-idx*h_sep).moveTo(-2.9176,-5.3).threePointArc((-6.05,0),(-2.9176,5.3)).lineTo(2.9176,5.3).threePointArc((6.05,0),(2.9176,-5.3)).close().cutThruAll()
|
||||||
|
|
||||||
|
|
||||||
Cycloidal gear
|
Cycloidal gear
|
||||||
|
|||||||
@ -72,8 +72,8 @@ Selector Selects Selector Class
|
|||||||
%Plane Faces of type plane :py:class:`cadquery.TypeSelector` 0..many
|
%Plane Faces of type plane :py:class:`cadquery.TypeSelector` 0..many
|
||||||
>Y Face farthest in the positive y dir :py:class:`cadquery.DirectionMinMaxSelector` 0..many
|
>Y Face farthest in the positive y dir :py:class:`cadquery.DirectionMinMaxSelector` 0..many
|
||||||
<Y Face farthest in the negative y dir :py:class:`cadquery.DirectionMinMaxSelector` 0..many
|
<Y Face farthest in the negative y dir :py:class:`cadquery.DirectionMinMaxSelector` 0..many
|
||||||
>Y[-2] 2nd Face farthest in the positive y dir :py:class:`cadquery.DirectionMinMaxSelector` 0..many
|
>Y[-2] 2nd farthest Face normal to the y dir :py:class:`cadquery.DirectionNthSelector` 0..many
|
||||||
<Y[0] 1st closest Face in the negative y dir :py:class:`cadquery.DirectionMinMaxSelector` 0..many
|
<Y[0] 1st closest Face normal to the y dir :py:class:`cadquery.DirectionNthSelector` 0..many
|
||||||
========= ======================================= ======================================================= ==========================
|
========= ======================================= ======================================================= ==========================
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -25,11 +25,14 @@ def makeUnitSquareWire():
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def makeUnitCube():
|
def makeUnitCube(centered=True):
|
||||||
return makeCube(1.0)
|
return makeCube(1.0, centered)
|
||||||
|
|
||||||
|
|
||||||
def makeCube(size):
|
def makeCube(size, xycentered=True):
|
||||||
|
if xycentered:
|
||||||
|
return Workplane().rect(size, size).extrude(size).val()
|
||||||
|
else:
|
||||||
return Solid.makeBox(size, size, size)
|
return Solid.makeBox(size, size, size)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -941,11 +941,11 @@ class TestCadQuery(BaseTest):
|
|||||||
.workplane(offset=-5)
|
.workplane(offset=-5)
|
||||||
.moveTo(0, 4)
|
.moveTo(0, 4)
|
||||||
.circle(1.5)
|
.circle(1.5)
|
||||||
.workplane(offset=5)
|
.workplane(offset=5, centerOption="CenterOfMass")
|
||||||
.circle(1.5)
|
.circle(1.5)
|
||||||
.moveTo(0, -8)
|
.moveTo(0, -8)
|
||||||
.circle(1.0)
|
.circle(1.0)
|
||||||
.workplane(offset=-5)
|
.workplane(offset=-5, centerOption="CenterOfMass")
|
||||||
.circle(1.0)
|
.circle(1.0)
|
||||||
.sweep(path, multisection=True)
|
.sweep(path, multisection=True)
|
||||||
)
|
)
|
||||||
@ -1400,7 +1400,12 @@ class TestCadQuery(BaseTest):
|
|||||||
self.assertEqual(11, t.faces().size())
|
self.assertEqual(11, t.faces().size())
|
||||||
|
|
||||||
# side hole, thru all
|
# side hole, thru all
|
||||||
t = t.faces(">Y").workplane().circle(0.125).cutThruAll()
|
t = (
|
||||||
|
t.faces(">Y")
|
||||||
|
.workplane(centerOption="CenterOfMass")
|
||||||
|
.circle(0.125)
|
||||||
|
.cutThruAll()
|
||||||
|
)
|
||||||
self.saveModel(t)
|
self.saveModel(t)
|
||||||
self.assertEqual(13, t.faces().size())
|
self.assertEqual(13, t.faces().size())
|
||||||
|
|
||||||
@ -1473,12 +1478,22 @@ class TestCadQuery(BaseTest):
|
|||||||
self.assertEqual(5, r.faces().size())
|
self.assertEqual(5, r.faces().size())
|
||||||
|
|
||||||
# now add a circle through a side face
|
# now add a circle through a side face
|
||||||
r1 = r.faces("+XY").workplane().circle(0.08).cutThruAll()
|
r1 = (
|
||||||
|
r.faces("+XY")
|
||||||
|
.workplane(centerOption="CenterOfMass")
|
||||||
|
.circle(0.08)
|
||||||
|
.cutThruAll()
|
||||||
|
)
|
||||||
self.assertEqual(6, r1.faces().size())
|
self.assertEqual(6, r1.faces().size())
|
||||||
r1.val().exportStep(os.path.join(OUTDIR, "testBasicLinesXY.STEP"))
|
r1.val().exportStep(os.path.join(OUTDIR, "testBasicLinesXY.STEP"))
|
||||||
|
|
||||||
# now add a circle through a top
|
# now add a circle through a top
|
||||||
r2 = r1.faces("+Z").workplane().circle(0.08).cutThruAll()
|
r2 = (
|
||||||
|
r1.faces("+Z")
|
||||||
|
.workplane(centerOption="CenterOfMass")
|
||||||
|
.circle(0.08)
|
||||||
|
.cutThruAll()
|
||||||
|
)
|
||||||
self.assertEqual(9, r2.faces().size())
|
self.assertEqual(9, r2.faces().size())
|
||||||
r2.val().exportStep(os.path.join(OUTDIR, "testBasicLinesZ.STEP"))
|
r2.val().exportStep(os.path.join(OUTDIR, "testBasicLinesZ.STEP"))
|
||||||
|
|
||||||
@ -2246,7 +2261,7 @@ class TestCadQuery(BaseTest):
|
|||||||
.rect(10, 5)
|
.rect(10, 5)
|
||||||
.cutBlind(-5)
|
.cutBlind(-5)
|
||||||
.faces(">Z")
|
.faces(">Z")
|
||||||
.workplane()
|
.workplane(centerOption="CenterOfMass")
|
||||||
.center(0, 2.5)
|
.center(0, 2.5)
|
||||||
.rect(5, 5)
|
.rect(5, 5)
|
||||||
.cutThruAll()
|
.cutThruAll()
|
||||||
|
|||||||
@ -76,7 +76,7 @@ class TestCQSelectors(BaseTest):
|
|||||||
self.assertEqual(0, c.solids().size())
|
self.assertEqual(0, c.solids().size())
|
||||||
|
|
||||||
def testSolid(self):
|
def testSolid(self):
|
||||||
c = CQ(makeUnitCube())
|
c = CQ(makeUnitCube(False))
|
||||||
# make sure all the counts are right for a cube
|
# make sure all the counts are right for a cube
|
||||||
self.assertEqual(1, c.solids().size())
|
self.assertEqual(1, c.solids().size())
|
||||||
self.assertEqual(6, c.faces().size())
|
self.assertEqual(6, c.faces().size())
|
||||||
@ -267,7 +267,7 @@ class TestCQSelectors(BaseTest):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def testNearestTo(self):
|
def testNearestTo(self):
|
||||||
c = CQ(makeUnitCube())
|
c = CQ(makeUnitCube(centered=False))
|
||||||
|
|
||||||
# nearest vertex to origin is (0,0,0)
|
# nearest vertex to origin is (0,0,0)
|
||||||
t = (0.1, 0.1, 0.1)
|
t = (0.1, 0.1, 0.1)
|
||||||
@ -286,7 +286,7 @@ class TestCQSelectors(BaseTest):
|
|||||||
self.assertEqual(1, len(s))
|
self.assertEqual(1, len(s))
|
||||||
|
|
||||||
def testBox(self):
|
def testBox(self):
|
||||||
c = CQ(makeUnitCube())
|
c = CQ(makeUnitCube(centered=False))
|
||||||
|
|
||||||
# test vertice selection
|
# test vertice selection
|
||||||
test_data_vertices = [
|
test_data_vertices = [
|
||||||
@ -561,7 +561,7 @@ class TestCQSelectors(BaseTest):
|
|||||||
|
|
||||||
def testVertexFilter(self):
|
def testVertexFilter(self):
|
||||||
"test selecting vertices on a face"
|
"test selecting vertices on a face"
|
||||||
c = CQ(makeUnitCube())
|
c = CQ(makeUnitCube(centered=False))
|
||||||
|
|
||||||
# TODO: filters work ok, but they are in global coordinates which sux. it would be nice
|
# TODO: filters work ok, but they are in global coordinates which sux. it would be nice
|
||||||
# if they were available in coordinates local to the selected face
|
# if they were available in coordinates local to the selected face
|
||||||
|
|||||||
Reference in New Issue
Block a user