Skip to content

Commit 9097fe0

Browse files
committed
Face.makeFromWires - check that wires are closed
1 parent 9ef08d6 commit 9097fe0

File tree

4 files changed

+64
-2
lines changed

4 files changed

+64
-2
lines changed

cadquery/occ_impl/shapes.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2260,6 +2260,9 @@ def makeFromWires(cls, outerWire: Wire, innerWires: List[Wire] = []) -> "Face":
22602260
Makes a planar face from one or more wires
22612261
"""
22622262

2263+
if innerWires and not outerWire.IsClosed():
2264+
raise ValueError("Cannot build face(s): outer wire is not closed")
2265+
22632266
# check if wires are coplanar
22642267
ws = Compound.makeCompound([outerWire] + innerWires)
22652268
if not BRepLib_FindSurface(ws.wrapped, OnlyPlane=True).Found():
@@ -2273,6 +2276,8 @@ def makeFromWires(cls, outerWire: Wire, innerWires: List[Wire] = []) -> "Face":
22732276
face_builder = BRepBuilderAPI_MakeFace(wo, True)
22742277

22752278
for w in innerWires:
2279+
if not w.IsClosed():
2280+
raise ValueError("Cannot build face(s): inner wire is not closed")
22762281
face_builder.Add(w.wrapped)
22772282

22782283
face_builder.Build()

tests/test_cadquery.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4782,6 +4782,56 @@ def test2Dchamfer(self):
47824782
with raises(ValueError):
47834783
r.chamfer2D(0.25, [vs[0]])
47844784

4785+
def test_Face_makeFromWires(self):
4786+
4787+
w0 = Wire.assembleEdges(
4788+
[
4789+
Edge.makeLine(Vector(), Vector(0, 1)),
4790+
Edge.makeLine(Vector(0, 1), Vector(1, 1)),
4791+
Edge.makeLine(Vector(1, 1), Vector(1, 0)),
4792+
Edge.makeLine(Vector(1, 0), Vector(0, 0)),
4793+
]
4794+
)
4795+
w1 = Wire.assembleEdges(
4796+
[
4797+
Edge.makeLine(Vector(0.25, 0.25), Vector(0.25, 0.75)),
4798+
Edge.makeLine(Vector(0.25, 0.75), Vector(0.75, 0.75)),
4799+
Edge.makeLine(Vector(0.75, 0.75), Vector(0.75, 0.25)),
4800+
Edge.makeLine(Vector(0.75, 0.25), Vector(0.25, 0.25)),
4801+
]
4802+
)
4803+
f = Face.makeFromWires(w0, [w1])
4804+
assert f.isValid()
4805+
4806+
with raises(ValueError):
4807+
w0 = Wire.assembleEdges([Edge.makeLine(Vector(), Vector(0, 1)),])
4808+
w1 = Wire.assembleEdges([Edge.makeLine(Vector(0, 1), Vector(1, 1)),])
4809+
f = Face.makeFromWires(w0, [w1])
4810+
4811+
with raises(ValueError):
4812+
w0 = Wire.assembleEdges([Edge.makeLine(Vector(), Vector(0, 1)),])
4813+
w1 = Wire.assembleEdges(
4814+
[
4815+
Edge.makeLine(Vector(), Vector(1, 1)),
4816+
Edge.makeLine(Vector(1, 1), Vector(2, 0)),
4817+
Edge.makeLine(Vector(2, 0), Vector(0, 0)),
4818+
]
4819+
)
4820+
f = Face.makeFromWires(w0, [w1])
4821+
4822+
with raises(ValueError):
4823+
w0 = Wire.assembleEdges(
4824+
[
4825+
Edge.makeLine(Vector(), Vector(1, 1)),
4826+
Edge.makeLine(Vector(1, 1), Vector(2, 0)),
4827+
Edge.makeLine(Vector(2, 0), Vector(0, 0)),
4828+
]
4829+
)
4830+
w1 = Wire.assembleEdges(
4831+
[Edge.makeLine(Vector(0.1, 0.1), Vector(0.2, 0.2)),]
4832+
)
4833+
f = Face.makeFromWires(w0, [w1])
4834+
47854835
def testSplineApprox(self):
47864836

47874837
from .naca import naca5305

tests/test_importers.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,9 @@ def testImportDXF(self):
8484

8585
filename = os.path.join(testdataDir, "gear.dxf")
8686

87-
obj = importers.importDXF(filename)
88-
self.assertFalse(obj.val().isValid())
87+
with self.assertRaises(ValueError):
88+
# tol >~ 2e-4 required for closed wires
89+
obj = importers.importDXF(filename)
8990

9091
obj = importers.importDXF(filename, tol=1e-3)
9192
self.assertTrue(obj.val().isValid())

tests/test_sketch.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,12 @@ def test_assemble():
344344
s1.segment((0.0, 0), (0.0, 2.0))
345345
s1.segment(Vector(4.0, -1)).close().arc((0.7, 0.6), 0.4, 0.0, 360.0).assemble()
346346

347+
s2 = Sketch()
348+
s2.segment((0, 0), (1, 0))
349+
s2.segment((2, 0), (3, 0))
350+
with raises(ValueError):
351+
s2.assemble()
352+
347353

348354
def test_finalize():
349355

0 commit comments

Comments
 (0)