From 5f2c412cfa067561744bb45a4de79ee33ead5f75 Mon Sep 17 00:00:00 2001 From: bgbsww Date: Thu, 11 Apr 2024 10:22:27 -0400 Subject: [PATCH] Toponaming/Part: Clean and add tests --- src/Mod/PartDesign/App/FeatureTransformed.cpp | 8 ++ .../TestTopologicalNamingProblem.py | 99 ++++++++++++++++++- 2 files changed, 105 insertions(+), 2 deletions(-) diff --git a/src/Mod/PartDesign/App/FeatureTransformed.cpp b/src/Mod/PartDesign/App/FeatureTransformed.cpp index 17856bd8df..5f3dbcce7f 100644 --- a/src/Mod/PartDesign/App/FeatureTransformed.cpp +++ b/src/Mod/PartDesign/App/FeatureTransformed.cpp @@ -273,10 +273,18 @@ App::DocumentObjectExecReturn *Transformed::execute() if (fuseShape.isNull() && cutShape.isNull()) return new App::DocumentObjectExecReturn(QT_TRANSLATE_NOOP("Exception", "Shape of additive/subtractive feature is empty")); gp_Trsf trsf = feature->getLocation().Transformation().Multiplied(trsfInv); +#ifdef FC_USE_TNP_FIX + if (!fuseShape.isNull()) + fuseShape = fuseShape.makeElementTransform(trsf); + if (!cutShape.isNull()) + cutShape = cutShape.makeElementTransform(trsf); +#else if (!fuseShape.isNull()) fuseShape = fuseShape.makeTransform(trsf); if (!cutShape.isNull()) cutShape = cutShape.makeTransform(trsf); + +#endif } else { return new App::DocumentObjectExecReturn(QT_TRANSLATE_NOOP("Exception", "Only additive and subtractive features can be transformed")); diff --git a/src/Mod/PartDesign/PartDesignTests/TestTopologicalNamingProblem.py b/src/Mod/PartDesign/PartDesignTests/TestTopologicalNamingProblem.py index 22ed6d4f98..f31232d5bc 100644 --- a/src/Mod/PartDesign/PartDesignTests/TestTopologicalNamingProblem.py +++ b/src/Mod/PartDesign/PartDesignTests/TestTopologicalNamingProblem.py @@ -532,6 +532,101 @@ class TestTopologicalNamingProblem(unittest.TestCase): def testPartDesignElementMapSubHelix(self): pass # TODO + def testPartDesignElementMapChamfer(self): + """ Test Chamfer ( and FeatureDressup )""" + # Arrange + body = self.Doc.addObject('PartDesign::Body', 'Body') + box = self.Doc.addObject('PartDesign::AdditiveBox', 'Box') + if body.Shape.ElementMapVersion == "": # Skip without element maps. + return + chamfer = self.Doc.addObject('PartDesign::Chamfer', 'Chamfer') + chamfer.Base = (box, ['Edge1', + 'Edge2', + 'Edge3', + 'Edge4', + 'Edge5', + 'Edge6', + 'Edge7', + 'Edge8', + 'Edge9', + 'Edge10', + 'Edge11', + 'Edge12', + ]) + chamfer.Size = 1 + chamfer.UseAllEdges = True + # Act / Assert + body.addObject(box) + body.addObject(chamfer) + self.Doc.recompute() + reverseMap = body.Shape.childShapes()[0].ElementReverseMap + faces = [name for name in reverseMap.keys() if name.startswith("Face")] + edges = [name for name in reverseMap.keys() if name.startswith("Edge")] + vertexes = [name for name in reverseMap.keys() if name.startswith("Vertex")] + self.assertEqual(len(body.Shape.childShapes()), 1) + self.assertEqual(body.Shape.childShapes()[0].ElementMapSize, 98) + self.assertEqual(len(reverseMap),98) + self.assertEqual(len(faces),26) # 6 Faces become 26 ( +8 + 2*6 ) + self.assertEqual(len(edges),48) # 12 Edges become 48 + self.assertEqual(len(vertexes),24) # 8 Vertices become 24 + def testPartDesignElementMapFillet(self): + """ Test Fillet ( and FeatureDressup )""" + # Arrange + body = self.Doc.addObject('PartDesign::Body', 'Body') + box = self.Doc.addObject('PartDesign::AdditiveBox', 'Box') + if body.Shape.ElementMapVersion == "": # Skip without element maps. + return + fillet = self.Doc.addObject('PartDesign::Fillet', 'Fillet') + fillet.Base = (box, ['Edge1', + 'Edge2', + 'Edge3', + 'Edge4', + 'Edge5', + 'Edge6', + 'Edge7', + 'Edge8', + 'Edge9', + 'Edge10', + 'Edge11', + 'Edge12', + ]) + # Act / Assert + body.addObject(box) + body.addObject(fillet) + self.Doc.recompute() + reverseMap = body.Shape.childShapes()[0].ElementReverseMap + faces = [name for name in reverseMap.keys() if name.startswith("Face")] + edges = [name for name in reverseMap.keys() if name.startswith("Edge")] + vertexes = [name for name in reverseMap.keys() if name.startswith("Vertex")] + self.assertEqual(len(body.Shape.childShapes()), 1) + self.assertEqual(body.Shape.childShapes()[0].ElementMapSize, 106) + self.assertEqual(len(reverseMap),106) + self.assertEqual(len(faces),26) # 6 Faces become 26 ( +8 + 2*6 ) + self.assertEqual(len(edges),56) # 12 Edges become 56 Why? + self.assertEqual(len(vertexes),24) # 8 Vertices become 24 + + def testPartDesignElementMapTransform(self): + # Arrange + body = self.Doc.addObject('PartDesign::Body', 'Body') + box = self.Doc.addObject('PartDesign::AdditiveBox', 'Box') + if body.Shape.ElementMapVersion == "": # Skip without element maps. + return + multitransform = self.Doc.addObject('PartDesign::MultiTransform', 'MultiTransform') + scaled = self.Doc.addObject('PartDesign::Scaled', 'Scaled') + scaled.Factor = 2 + scaled.Occurrences = 2 + multitransform.Transformations = scaled + multitransform.Shape = box.Shape + + # Act / Assert + self.Doc.recompute() + body.addObject(box) + body.addObject(multitransform) + self.assertEqual(len(body.Shape.childShapes()), 0) + self.Doc.recompute() + self.assertEqual(len(body.Shape.childShapes()), 1) + self.assertEqual(body.Shape.childShapes()[0].ElementMapSize, 26) + def testSketchElementMap(self): body = self.Doc.addObject('PartDesign::Body', 'Body') sketch = self.Doc.addObject('Sketcher::SketchObject', 'Sketch') @@ -543,7 +638,7 @@ class TestTopologicalNamingProblem(unittest.TestCase): pad.Profile = sketch body.addObject(pad) self.Doc.recompute() - if not hasattr(body,"ElementMapVersion"): # Skip without element maps. + if body.Shape.ElementMapVersion == "": # Skip without element maps. return # Assert self.assertEqual(sketch.Shape.ElementMapSize, 12) @@ -562,7 +657,7 @@ class TestTopologicalNamingProblem(unittest.TestCase): pad = self.Doc.addObject('PartDesign::Pad', 'Pad') pad.Profile = plane self.Doc.recompute() - if not hasattr(pad,"ElementMapVersion"): # Skip without element maps. + if pad.Shape.ElementMapVersion == "": # Skip without element maps. return # Assert self.assertEqual(plane.Shape.ElementMapSize, 0)