diff --git a/src/Mod/Part/TestPartApp.py b/src/Mod/Part/TestPartApp.py index 968864dc83..23cd794551 100644 --- a/src/Mod/Part/TestPartApp.py +++ b/src/Mod/Part/TestPartApp.py @@ -468,6 +468,64 @@ class PartTestRuledSurface(unittest.TestCase): self.assertEqual(len(same1), 2) self.assertEqual(len(same2), 2) + def testRuledSurfaceFromTwoObjectsWithSharedVertexs(self): + """Test reproducing issue #15539""" + + # Arrange + line = Part.makeLine(FreeCAD.Vector(0, 0, 50), FreeCAD.Vector(0, -50, 0)) + line1 = Part.makeLine(FreeCAD.Vector(0, 0, 50), FreeCAD.Vector(50, 0, 0)) + line2 = Part.makeLine(FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, -50, 0)) + line3 = Part.makeLine(FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(50, 0, 0)) + fea = self.Doc.addObject("Part::Feature") + fea1 = self.Doc.addObject("Part::Feature") + fea2 = self.Doc.addObject("Part::Feature") + fea3 = self.Doc.addObject("Part::Feature") + fea.Shape = line + fea1.Shape = line1 + fea2.Shape = line2 + fea3.Shape = line3 + + # Defining all the surfaces generated by 2 lines with one common vertex + ruled = self.Doc.addObject("Part::RuledSurface") + ruled.Curve1 = fea + ruled.Curve2 = fea1 + + ruled1 = self.Doc.addObject("Part::RuledSurface") + ruled1.Curve1 = fea1 + ruled1.Curve2 = fea3 + + ruled2 = self.Doc.addObject("Part::RuledSurface") + ruled2.Curve1 = fea2 + ruled2.Curve2 = fea3 + + ruled3 = self.Doc.addObject("Part::RuledSurface") + ruled3.Curve1 = fea + ruled3.Curve2 = fea2 + + # Act + self.Doc.recompute() + + # Assert + same00 = getCoincidentVertexes(fea.Shape.Vertexes, ruled.Shape.Vertexes) + same03 = getCoincidentVertexes(fea.Shape.Vertexes, ruled3.Shape.Vertexes) + same10 = getCoincidentVertexes(fea1.Shape.Vertexes, ruled.Shape.Vertexes) + same11 = getCoincidentVertexes(fea1.Shape.Vertexes, ruled1.Shape.Vertexes) + same22 = getCoincidentVertexes(fea2.Shape.Vertexes, ruled2.Shape.Vertexes) + same23 = getCoincidentVertexes(fea2.Shape.Vertexes, ruled3.Shape.Vertexes) + same31 = getCoincidentVertexes(fea3.Shape.Vertexes, ruled1.Shape.Vertexes) + same32 = getCoincidentVertexes(fea3.Shape.Vertexes, ruled2.Shape.Vertexes) + + # BRepFill::Face() seems creating faces with 4 vertexes + # Therefore, in this case, every face shares 3 vertexes (1 counted twice as coincident) with the lines that generate that face + self.assertEqual(len(same00), 3) + self.assertEqual(len(same03), 3) + self.assertEqual(len(same10), 3) + self.assertEqual(len(same11), 3) + self.assertEqual(len(same22), 3) + self.assertEqual(len(same23), 3) + self.assertEqual(len(same31), 3) + self.assertEqual(len(same32), 3) + def testRuledSurfaceFromOneObject(self): sketch = self.Doc.addObject('Sketcher::SketchObject', 'Sketch') sketch.Placement = FreeCAD.Placement(FreeCAD.Vector(0.000000, 0.000000, 0.000000), App.Rotation(0.707107, 0.000000, 0.000000, 0.707107))