| | |
| |
|
| | import FreeCAD as App |
| | import Part |
| |
|
| | import unittest |
| |
|
| |
|
| | class TopoShapeAssertions: |
| |
|
| | def assertAttrEqual(self, toposhape, attr_value_list, msg=None): |
| | for attr, value in attr_value_list: |
| | result = toposhape.__getattribute__(attr) |
| | if result.__str__() != value.__str__(): |
| | if msg == None: |
| | msg = (f"TopoShape {attr} is incorrect: {result} should be {value}",) |
| | raise AssertionError(msg) |
| |
|
| | def assertAttrAlmostEqual(self, toposhape, attr_value_list, places=5, msg=None): |
| | range = 1 / 10**places |
| | for attr, value in attr_value_list: |
| | result = toposhape.__getattribute__(attr) |
| | if abs(result - value) > range: |
| | if msg == None: |
| | msg = f"TopoShape {attr} is incorrect: {result} should be {value}" |
| | raise AssertionError(msg) |
| |
|
| | def assertAttrCount(self, toposhape, attr_value_list, msg=None): |
| | for attr, value in attr_value_list: |
| | result = toposhape.__getattribute__(attr) |
| | if len(result) != value: |
| | if msg == None: |
| | msg = f"TopoShape {attr} is incorrect: {result} should have {value} elements" |
| | raise AssertionError(msg) |
| |
|
| | def assertKeysInMap(self, map, keys, msg=None): |
| | for key in keys: |
| | if not key in map: |
| | if msg == None: |
| | msg = f"Key {key} not found in map: {map}" |
| | raise AssertionError(msg) |
| |
|
| | def assertBounds(self, shape, bounds, msg=None, precision=App.Base.Precision.confusion() * 100): |
| | shape_bounds = shape.BoundBox |
| | shape_bounds_max = App.BoundBox(shape_bounds) |
| | shape_bounds_max.enlarge(precision) |
| | bounds_max = App.BoundBox(bounds) |
| | bounds_max.enlarge(precision) |
| | if not (shape_bounds_max.isInside(bounds) and bounds_max.isInside(shape_bounds)): |
| | if msg == None: |
| | msg = f"Bounds {shape_bounds} doesn't match {bounds}" |
| | raise AssertionError(msg) |
| |
|
| |
|
| | class TopoShapeTest(unittest.TestCase, TopoShapeAssertions): |
| | def setUp(self): |
| | """Create a document and some TopoShapes of various types""" |
| | self.doc = App.newDocument("TopoShape") |
| | |
| | |
| | |
| | |
| | |
| | self.doc.addObject("Part::Box", "Box1") |
| | self.doc.Box1.Length = 1 |
| | self.doc.Box1.Width = 2 |
| | self.doc.Box1.Height = 2 |
| | self.doc.addObject("Part::Box", "Box2") |
| | self.doc.Box2.Length = 2 |
| | self.doc.Box2.Width = 1 |
| | self.doc.Box2.Height = 2 |
| | self.doc.addObject("Part::Cylinder", "Cylinder1") |
| | self.doc.Cylinder1.Radius = 0.5 |
| | self.doc.Cylinder1.Height = 2 |
| | self.doc.Cylinder1.Angle = 360 |
| | self.doc.addObject("Part::Compound", "Compound1") |
| | self.doc.Compound1.Links = [self.doc.Box1, self.doc.Box2] |
| |
|
| | self.doc.recompute() |
| | self.box = self.doc.Box1.Shape |
| | self.box2 = self.doc.Box2.Shape |
| |
|
| | def tearDown(self): |
| | App.closeDocument("TopoShape") |
| |
|
| | def testTopoShapeBox(self): |
| | |
| | box2_toposhape = self.doc.Box2.Shape |
| | |
| | attr_value_list = [ |
| | ["BoundBox", App.BoundBox(0, 0, 0, 2, 1, 2)], |
| | ["CenterOfGravity", App.Vector(1, 0.5, 1)], |
| | ["CenterOfMass", App.Vector(1, 0.5, 1)], |
| | ["CompSolids", []], |
| | ["Compounds", []], |
| | [ |
| | "Content", |
| | "<ElementMap/>\n", |
| | ], |
| | ["ElementMap", {}], |
| | ["ElementReverseMap", {}], |
| | ["Hasher", None], |
| | [ |
| | "MatrixOfInertia", |
| | App.Matrix(1.66667, 0, 0, 0, 0, 2.66667, 0, 0, 0, 0, 1.66667, 0, 0, 0, 0, 1), |
| | ], |
| | ["Module", "Part"], |
| | ["Orientation", "Forward"], |
| | |
| | ["Placement", App.Placement()], |
| | [ |
| | "PrincipalProperties", |
| | { |
| | "SymmetryAxis": True, |
| | "SymmetryPoint": False, |
| | "Moments": ( |
| | 2.666666666666666, |
| | 1.666666666666667, |
| | 1.666666666666667, |
| | ), |
| | "FirstAxisOfInertia": App.Vector(0.0, 1.0, 0.0), |
| | "SecondAxisOfInertia": App.Vector(0.0, 0.0, 1.0), |
| | "ThirdAxisOfInertia": App.Vector(1.0, 0.0, 0.0), |
| | "RadiusOfGyration": ( |
| | 0.816496580927726, |
| | 0.6454972243679029, |
| | 0.6454972243679029, |
| | ), |
| | }, |
| | ], |
| | ["ShapeType", "Solid"], |
| | [ |
| | "StaticMoments", |
| | (3.999999999999999, 1.9999999999999996, 3.999999999999999), |
| | ], |
| | |
| | ["TypeId", "Part::TopoShape"], |
| | ] |
| | |
| | self.assertAttrEqual(box2_toposhape, attr_value_list) |
| |
|
| | |
| | attr_value_list = [ |
| | ["Area", 16.0], |
| | ["ElementMapSize", 0], |
| | |
| | ["Length", 40.0], |
| | ["Mass", 4.0], |
| | |
| | ["Volume", 4.0], |
| | ] |
| | |
| | self.assertAttrAlmostEqual(box2_toposhape, attr_value_list, 5) |
| |
|
| | |
| | attr_value_list = [ |
| | ["Edges", 12], |
| | ["Faces", 6], |
| | ["Shells", 1], |
| | ["Solids", 1], |
| | ["SubShapes", 1], |
| | ["Vertexes", 8], |
| | ["Wires", 6], |
| | ] |
| | |
| | self.assertAttrCount(box2_toposhape, attr_value_list) |
| |
|
| | def testTopoShapeElementMap(self): |
| | """Tests TopoShape elementMap""" |
| | |
| | |
| | compound1 = Part.Compound([self.doc.Objects[-1].Shape, self.doc.Objects[-2].Shape]) |
| | self.doc.addObject("Part::Compound", "Compound") |
| | self.doc.Compound.Links = [ |
| | App.activeDocument().Box1, |
| | App.activeDocument().Box2, |
| | ] |
| | self.doc.recompute() |
| | compound2 = self.doc.Compound.Shape |
| | |
| | |
| | if compound1.ElementMapVersion != "": |
| | |
| | |
| | |
| | |
| | |
| | self.assertEqual( |
| | compound2.ElementMapSize, |
| | 52, |
| | "ElementMap is Incorrect: {0}".format(compound2.ElementMap), |
| | ) |
| | |
| | self.assertBounds(compound2, App.BoundBox(0, 0, 0, 2, 2, 2)) |
| |
|
| | def testPartCommon(self): |
| | |
| | self.doc.addObject("Part::MultiCommon", "Common") |
| | self.doc.Common.Shapes = [self.doc.Box1, self.doc.Box2] |
| | |
| | self.doc.recompute() |
| | common1 = self.doc.Common.Shape |
| | |
| | if common1.ElementMapVersion != "": |
| | self.assertKeysInMap( |
| | common1.ElementReverseMap, |
| | [ |
| | "Edge1", |
| | "Edge2", |
| | "Edge3", |
| | "Edge4", |
| | "Edge5", |
| | "Edge6", |
| | "Edge7", |
| | "Edge8", |
| | "Edge9", |
| | "Edge10", |
| | "Edge11", |
| | "Edge12", |
| | "Face1", |
| | "Face2", |
| | "Face3", |
| | "Face4", |
| | "Face5", |
| | "Face6", |
| | "Vertex1", |
| | "Vertex2", |
| | "Vertex3", |
| | "Vertex4", |
| | "Vertex5", |
| | "Vertex6", |
| | "Vertex7", |
| | "Vertex8", |
| | ], |
| | ) |
| | |
| | self.assertBounds(common1, App.BoundBox(0, 0, 0, 1, 1, 2)) |
| |
|
| | def testPartCut(self): |
| | |
| | self.doc.addObject("Part::Cut", "Cut") |
| | self.doc.Cut.Base = self.doc.Box1 |
| | self.doc.Cut.Tool = self.doc.Box2 |
| | |
| | self.doc.recompute() |
| | cut1 = self.doc.Cut.Shape |
| | |
| | if cut1.ElementMapVersion != "": |
| | self.assertKeysInMap( |
| | cut1.ElementReverseMap, |
| | [ |
| | "Edge1", |
| | "Edge2", |
| | "Edge3", |
| | "Edge4", |
| | "Edge5", |
| | "Edge6", |
| | "Edge7", |
| | "Edge8", |
| | "Edge9", |
| | "Edge10", |
| | "Edge11", |
| | "Edge12", |
| | "Face1", |
| | "Face2", |
| | "Face3", |
| | "Face4", |
| | "Face5", |
| | "Face6", |
| | "Vertex1", |
| | "Vertex2", |
| | "Vertex3", |
| | "Vertex4", |
| | "Vertex5", |
| | "Vertex6", |
| | "Vertex7", |
| | "Vertex8", |
| | ], |
| | ) |
| | |
| | self.assertBounds(cut1, App.BoundBox(0, 1, 0, 1, 2, 2)) |
| |
|
| | def testPartFuse(self): |
| | |
| | self.doc.addObject("Part::Fuse", "Fuse") |
| | self.doc.Fuse.Refine = False |
| | self.doc.Fuse.Base = self.doc.Box1 |
| | self.doc.Fuse.Tool = self.doc.Box2 |
| | |
| | self.doc.recompute() |
| | fuse1 = self.doc.Fuse.Shape |
| | |
| | if fuse1.ElementMapVersion != "": |
| | self.assertEqual(fuse1.ElementMapSize, 58) |
| | self.doc.Fuse.Refine = True |
| | self.doc.recompute() |
| | self.assertEqual(fuse1.ElementMapSize, 58) |
| | |
| | |
| | self.assertBounds(fuse1, App.BoundBox(0, 0, 0, 2, 2, 2)) |
| |
|
| | def testAppPartMakeCompound(self): |
| | |
| | |
| | |
| | compound1 = Part.makeCompound([self.doc.Box1.Shape, self.doc.Box2.Shape]) |
| | |
| | if compound1.ElementMapVersion != "": |
| | self.assertEqual(compound1.ElementMapSize, 52) |
| | |
| | self.assertBounds(compound1, App.BoundBox(0, 0, 0, 2, 2, 2)) |
| |
|
| | def testAppPartMakeShell(self): |
| | |
| | shell1 = Part.makeShell(self.doc.Box1.Shape.Faces) |
| | |
| | if shell1.ElementMapVersion != "": |
| | self.assertEqual(shell1.ElementMapSize, 26) |
| | |
| | self.assertBounds(shell1, App.BoundBox(0, 0, 0, 1, 2, 2)) |
| |
|
| | def testAppPartMakeFace(self): |
| | |
| | face1 = Part.makeFace(self.doc.Box1.Shape.Faces[0], "Part::FaceMakerCheese") |
| | |
| | if face1.ElementMapVersion != "": |
| | self.assertEqual(face1.ElementMapSize, 10) |
| | |
| | self.assertBounds(face1, App.BoundBox(0, 0, 0, 0, 2, 2)) |
| |
|
| | def testAppPartmakeFilledFace(self): |
| | face1 = Part.makeFilledFace(self.doc.Box1.Shape.Faces[3].Edges) |
| | |
| | if face1.ElementMapVersion != "": |
| | self.assertEqual(face1.ElementMapSize, 9) |
| | |
| | self.assertBounds(face1, App.BoundBox(-0.05, 2, -0.1, 1.05, 2, 2.1)) |
| |
|
| | def testAppPartMakeSolid(self): |
| | |
| | solid1 = Part.makeSolid(self.doc.Box1.Shape.Shells[0]) |
| | |
| | if solid1.ElementMapVersion != "": |
| | self.assertEqual(solid1.ElementMapSize, 26) |
| | |
| | self.assertBounds(solid1, App.BoundBox(0, 0, 0, 1, 2, 2)) |
| |
|
| | def testAppPartMakeRuled(self): |
| | |
| | surface1 = Part.makeRuledSurface(*self.doc.Box1.Shape.Edges[3:5]) |
| | |
| | if surface1.ElementMapVersion != "": |
| | self.assertEqual(surface1.ElementMapSize, 9) |
| | |
| | self.assertBounds(surface1, App.BoundBox(0, 0, 0, 1, 2, 2)) |
| |
|
| | def testAppPartMakeShellFromWires(self): |
| | |
| | wire1 = self.doc.Box1.Shape.Wires[0] |
| | wire2 = self.doc.Box1.Shape.Wires[1] |
| | |
| | shell1 = Part.makeShellFromWires([wire1, wire2]) |
| | |
| | if shell1.ElementMapVersion != "": |
| | self.assertEqual(shell1.ElementMapSize, 24) |
| | |
| | self.assertBounds(shell1, App.BoundBox(0, 0, 0, 1, 2, 2)) |
| |
|
| | def testAppPartMakeSweepSurface(self): |
| | |
| | circle = Part.makeCircle(5, App.Vector(0, 0, 0)) |
| | path = Part.makeLine(App.Vector(), App.Vector(0, 0, 10)) |
| | Part.show(circle, "Circle") |
| | Part.show(path, "Path") |
| | del circle |
| | |
| | surface1 = Part.makeSweepSurface(self.doc.Path.Shape, self.doc.Circle.Shape, 0.001, 0) |
| | Part.show(surface1, "Sweep") |
| | self.doc.recompute() |
| | |
| | if surface1.ElementMapVersion != "": |
| | self.assertEqual(surface1.ElementMapSize, 6) |
| | self.assertBounds(surface1, App.BoundBox(-5, -5, 0, 5, 5, 10), precision=2) |
| | else: |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | self.assertBounds(surface1, App.BoundBox(-5, -2.72011, 0, 5, 5, 6.28319), precision=2) |
| | del surface1 |
| |
|
| | def testAppPartMakeLoft(self): |
| | |
| | solid1 = Part.makeLoft(self.doc.Box1.Shape.Wires[0:2]) |
| | |
| | if solid1.ElementMapVersion != "": |
| | self.assertEqual(solid1.ElementMapSize, 24) |
| | |
| | self.assertBounds(solid1, App.BoundBox(0, 0, 0, 1, 2, 2)) |
| |
|
| | def testAppPartMakeSplitShape(self): |
| | |
| | |
| | edge1 = self.doc.Box1.Shape.Faces[0].Edges[0].translated(App.Vector(0, 0.5, 0)) |
| | face1 = self.doc.Box1.Shape.Faces[0] |
| | |
| | solids1 = Part.makeSplitShape(face1, [(edge1, face1)]) |
| | |
| | self.assertEqual(len(solids1), 2) |
| | self.assertEqual(len(solids1[0]), 1) |
| | if solids1[0][0].ElementMapVersion != "": |
| | self.assertEqual(solids1[0][0].ElementMapSize, 9) |
| | self.assertEqual(solids1[1][0].ElementMapSize, 9) |
| | |
| | self.assertBounds(solids1[0][0], App.BoundBox(0, 0.5, 0, 0, 2, 2)) |
| | self.assertBounds(solids1[1][0], App.BoundBox(0, 0.5, 0, 0, 2, 2)) |
| |
|
| | def testTopoShapePyInit(self): |
| | |
| | self.doc.addObject("Part::Compound", "Compound") |
| | self.doc.Compound.Links = [ |
| | App.activeDocument().Box1, |
| | App.activeDocument().Box2, |
| | ] |
| | self.doc.recompute() |
| | compound = self.doc.Compound.Shape |
| | |
| | new_toposhape = Part.Shape(compound) |
| | new_empty_toposhape = Part.Shape() |
| | |
| | if compound.ElementMapVersion != "": |
| | self.assertEqual(compound.ElementMapSize, 52) |
| | self.assertEqual(new_toposhape.ElementMapSize, 52) |
| |
|
| | def testTopoShapeCopy(self): |
| | |
| | self.doc.addObject("Part::Compound", "Compound") |
| | self.doc.Compound.Links = [ |
| | App.activeDocument().Box1, |
| | App.activeDocument().Box2, |
| | ] |
| | self.doc.recompute() |
| | compound = self.doc.Compound.Shape |
| | |
| | compound_copy = compound.copy() |
| | |
| | if compound.ElementMapVersion != "": |
| | self.assertEqual(compound.ElementMapSize, 52) |
| | self.assertEqual(compound_copy.ElementMapSize, 52) |
| |
|
| | def testTopoShapeCleaned(self): |
| | |
| | self.doc.addObject("Part::Compound", "Compound") |
| | self.doc.Compound.Links = [ |
| | App.activeDocument().Box1, |
| | App.activeDocument().Box2, |
| | ] |
| | self.doc.recompute() |
| | compound = self.doc.Compound.Shape |
| | |
| | compound_cleaned = compound.cleaned() |
| | |
| | if compound.ElementMapVersion != "": |
| | self.assertEqual(compound.ElementMapSize, 52) |
| | self.assertEqual(compound_cleaned.ElementMapSize, 52) |
| |
|
| | def testTopoShapeReplaceShape(self): |
| | |
| | self.doc.addObject("Part::Compound", "Compound") |
| | self.doc.Compound.Links = [ |
| | App.activeDocument().Box1, |
| | App.activeDocument().Box2, |
| | ] |
| | self.doc.recompute() |
| | compound = self.doc.Compound.Shape |
| | |
| | compound_replaced = compound.replaceShape( |
| | [(App.activeDocument().Box2.Shape, App.activeDocument().Box1.Shape)] |
| | ) |
| | |
| | if compound.ElementMapVersion != "": |
| | self.assertEqual(compound.ElementMapSize, 52) |
| | self.assertEqual(compound_replaced.ElementMapSize, 52) |
| |
|
| | def testTopoShapeRemoveShape(self): |
| | |
| | self.doc.addObject("Part::Compound", "Compound") |
| | self.doc.Compound.Links = [ |
| | App.activeDocument().Box1, |
| | App.activeDocument().Box2, |
| | ] |
| | self.doc.recompute() |
| | compound = self.doc.Compound.Shape |
| | |
| | compound_removed = compound.removeShape([App.ActiveDocument.Box2.Shape]) |
| | |
| | if compound.ElementMapVersion != "": |
| | self.assertEqual(compound.ElementMapSize, 52) |
| | self.assertEqual(compound_removed.ElementMapSize, 52) |
| |
|
| | def testTopoShapeExtrude(self): |
| | |
| | face = self.doc.Box1.Shape.Faces[0] |
| | |
| | extrude = face.extrude(App.Vector(2, 0, 0)) |
| | self.doc.recompute() |
| | |
| | if extrude.ElementMapVersion != "": |
| | self.assertEqual(extrude.ElementMapSize, 26) |
| |
|
| | def testTopoShapeRevolve(self): |
| | |
| | face = self.doc.Box1.Shape.Faces[0] |
| | |
| | face.revolve(App.Vector(), App.Vector(1, 0, 0), 45) |
| | self.doc.recompute() |
| | |
| | if face.ElementMapVersion != "": |
| | self.assertEqual(face.ElementMapSize, 9) |
| |
|
| | def testTopoShapeFuse(self): |
| | |
| | fused = self.doc.Box1.Shape.fuse(self.doc.Box2.Shape) |
| | self.doc.recompute() |
| | |
| | if fused.ElementMapVersion != "": |
| | self.assertEqual(fused.ElementMapSize, 58) |
| |
|
| | def testTopoShapeMultiFuse(self): |
| | |
| | fused = self.doc.Box1.Shape.multiFuse([self.doc.Box2.Shape]) |
| | self.doc.recompute() |
| | |
| | if fused.ElementMapVersion != "": |
| | self.assertEqual(fused.ElementMapSize, 58) |
| |
|
| | def testTopoShapeCommon(self): |
| | |
| | common = self.doc.Box1.Shape.common(self.doc.Box2.Shape) |
| | self.doc.recompute() |
| | |
| | if common.ElementMapVersion != "": |
| | self.assertEqual(common.ElementMapSize, 26) |
| |
|
| | def testTopoShapeSection(self): |
| | |
| | section = self.doc.Box1.Shape.Faces[0].section(self.doc.Box2.Shape.Faces[3]) |
| | self.doc.recompute() |
| | |
| | if section.ElementMapVersion != "": |
| | self.assertEqual(section.ElementMapSize, 3) |
| |
|
| | def testTopoShapeSlice(self): |
| | |
| | slice = self.doc.Box1.Shape.slice(App.Vector(10, 10, 0), 1) |
| | self.doc.recompute() |
| | |
| | self.assertEqual(len(slice), 1) |
| | if slice[0].ElementMapVersion != "": |
| | self.assertEqual(slice[0].ElementMapSize, 8) |
| |
|
| | def testTopoShapeSlices(self): |
| | |
| | slices = self.doc.Box1.Shape.Faces[0].slices(App.Vector(10, 10, 0), [1, 2]) |
| | self.doc.recompute() |
| | |
| | if slices.ElementMapVersion != "": |
| | self.assertEqual(slices.ElementMapSize, 6) |
| |
|
| | def testTopoShapeCut(self): |
| | |
| | cut = self.doc.Box1.Shape.cut(self.doc.Box2.Shape) |
| | self.doc.recompute() |
| | |
| | if cut.ElementMapVersion != "": |
| | self.assertEqual(cut.ElementMapSize, 26) |
| |
|
| | def testTopoShapeGeneralFuse(self): |
| | |
| | fuse = self.doc.Box1.Shape.generalFuse([self.doc.Box2.Shape]) |
| | self.doc.recompute() |
| | |
| | self.assertEqual(len(fuse), 2) |
| | if fuse[0].ElementMapVersion != "": |
| | self.assertEqual(fuse[0].ElementMapSize, 60) |
| |
|
| | def testTopoShapeChildShapes(self): |
| | |
| | childShapes = self.doc.Box1.Shape.childShapes() |
| | self.doc.recompute() |
| | |
| | self.assertEqual(len(childShapes), 1) |
| | if childShapes[0].ElementMapVersion != "": |
| | self.assertEqual(childShapes[0].ElementMapSize, 26) |
| |
|
| | def testTopoShapeMirror(self): |
| | |
| | mirror = self.doc.Box1.Shape.mirror(App.Vector(), App.Vector(1, 0, 0)) |
| | self.doc.recompute() |
| | |
| | if mirror.ElementMapVersion != "": |
| | self.assertEqual(mirror.ElementMapSize, 26) |
| |
|
| | def testTopoShapeScale(self): |
| | |
| | scale = self.doc.Box1.Shape.scaled(2) |
| | self.doc.recompute() |
| | |
| | if scale.ElementMapVersion != "": |
| | self.assertEqual(scale.ElementMapSize, 26) |
| |
|
| | def testTopoShapeMakeFillet(self): |
| | |
| | fillet = self.doc.Box1.Shape.makeFillet(0.1, self.doc.Box1.Shape.Faces[0].Edges) |
| | self.doc.recompute() |
| | |
| | if fillet.ElementMapVersion != "": |
| | self.assertEqual(fillet.ElementMapSize, 42) |
| |
|
| | def testTopoShapeMakeChamfer(self): |
| | |
| | chamfer = self.doc.Box1.Shape.makeChamfer(0.1, self.doc.Box1.Shape.Faces[0].Edges) |
| | self.doc.recompute() |
| | |
| | if chamfer.ElementMapVersion != "": |
| | self.assertEqual(chamfer.ElementMapSize, 42) |
| |
|
| | def testTopoShapeMakeThickness(self): |
| | |
| | thickness = self.doc.Box1.Shape.makeThickness(self.doc.Box1.Shape.Faces[0:2], 0.1, 0.0001) |
| | self.doc.recompute() |
| | |
| | if thickness.ElementMapVersion != "": |
| | self.assertEqual(thickness.ElementMapSize, 74) |
| |
|
| | def testTopoShapeMakeOffsetShape(self): |
| | |
| | offset = self.doc.Box1.Shape.Faces[0].makeOffset(1) |
| | self.doc.recompute() |
| | |
| | if offset.ElementMapVersion != "": |
| | self.assertEqual(offset.ElementMapSize, 17) |
| |
|
| | def testTopoShapeOffset2D(self): |
| | |
| | offset = self.doc.Box1.Shape.Faces[0].makeOffset2D(1) |
| | self.doc.recompute() |
| | |
| | if offset.ElementMapVersion != "": |
| | self.assertEqual(offset.ElementMapSize, 17) |
| |
|
| | def testTopoShapeRemoveSplitter(self): |
| | |
| | fused = self.doc.Box1.Shape.fuse(self.doc.Box2.Shape) |
| | removed = fused.removeSplitter() |
| | self.doc.recompute() |
| | |
| | if removed.ElementMapVersion != "": |
| | self.assertEqual(removed.ElementMapSize, 38) |
| |
|
| | def testTopoShapeCompSolid(self): |
| | |
| | compSolid = Part.CompSolid([self.doc.Box1.Shape, self.doc.Box2.Shape]) |
| | box1ts = self.doc.Box1.Shape |
| | compSolid.add(box1ts.Solids[0]) |
| | |
| | if compSolid.ElementMapVersion != "": |
| | self.assertEqual(compSolid.ElementMapSize, 78) |
| |
|
| | def testTopoShapeFaceOffset(self): |
| | |
| | box_toposhape = self.doc.Box1.Shape |
| | |
| | offset = box_toposhape.Faces[0].makeOffset(2.0) |
| | |
| | if box_toposhape.Faces[0].ElementMapVersion != "": |
| | self.assertEqual( |
| | box_toposhape.Faces[0].ElementMapSize, 9 |
| | ) |
| | self.assertEqual(offset.ElementMapSize, 17) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | def testTopoShapePart(self): |
| | |
| | box1ts = self.doc.Box1.Shape |
| | face1 = box1ts.Faces[0] |
| | box1ts2 = box1ts.copy() |
| | |
| | face2 = box1ts.getElement("Face2") |
| | indexed_name = box1ts.findSubShape(face1) |
| | faces1 = box1ts.findSubShapesWithSharedVertex(face2) |
| | subshapes1 = box1ts.getChildShapes("Solid1") |
| | |
| | |
| | self.assertTrue(face2.isSame(box1ts.Faces[1])) |
| | self.assertEqual(indexed_name[0], "Face") |
| | self.assertEqual(indexed_name[1], 1) |
| | self.assertEqual(len(faces1), 1) |
| | self.assertTrue(faces1[0].isSame(box1ts.Faces[1])) |
| | self.assertEqual(len(subshapes1), 1) |
| | self.assertTrue(subshapes1[0].isSame(box1ts.Solids[0])) |
| |
|
| | def testTopoShapeMapSubElement(self): |
| | |
| | box = Part.makeBox(1, 2, 3) |
| | |
| | |
| | self.assertEqual(box.ElementMapSize, 0) |
| | self.assertEqual(box.Faces[0].ElementMapSize, 0) |
| | |
| | box.mapSubElement(box.Faces[0]) |
| | |
| | if box.ElementMapVersion != "": |
| | self.assertEqual(box.ElementMapSize, 9) |
| | self.assertEqual(box.Faces[0].ElementMapSize, 9) |
| |
|
| | def testTopoShapeGetElementHistory(self): |
| | self.doc.addObject("Part::Fuse", "Fuse") |
| | self.doc.Fuse.Base = self.doc.Box1 |
| | self.doc.Fuse.Tool = self.doc.Box2 |
| | |
| | self.doc.recompute() |
| | fuse1 = self.doc.Fuse.Shape |
| | if fuse1.ElementMapVersion != "": |
| | history1 = fuse1.getElementHistory(fuse1.ElementReverseMap["Vertex1"]) |
| | |
| | self.assertEqual(len(history1), 3) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | def testPartCompoundCut1(self): |
| | |
| | self.doc.addObject("Part::Cut", "Cut") |
| | self.doc.Cut.Base = self.doc.Cylinder1 |
| | self.doc.Cut.Tool = self.doc.Compound1 |
| | |
| | self.doc.recompute() |
| | cut1 = self.doc.Cut.Shape |
| | |
| | refkeys = [ |
| | "Vertex6", |
| | "Vertex5", |
| | "Edge7", |
| | "Edge8", |
| | "Edge9", |
| | "Edge5", |
| | "Edge6", |
| | "Face4", |
| | "Face2", |
| | "Edge1", |
| | "Vertex4", |
| | "Edge4", |
| | "Vertex3", |
| | "Edge2", |
| | "Edge3", |
| | "Face1", |
| | "Face5", |
| | "Face3", |
| | "Vertex1", |
| | "Vertex2", |
| | ] |
| | if cut1.ElementMapVersion != "": |
| | self.assertKeysInMap(cut1.ElementReverseMap, refkeys) |
| | self.assertEqual(len(cut1.ElementReverseMap.keys()), len(refkeys)) |
| | |
| | self.assertAlmostEqual(cut1.Volume, self.doc.Cylinder1.Shape.Volume * (3 / 4)) |
| |
|
| | def testPartCompoundCut2(self): |
| | |
| | self.doc.addObject("Part::Cut", "Cut") |
| | self.doc.Cut.Base = self.doc.Compound1 |
| | self.doc.Cut.Tool = self.doc.Cylinder1 |
| | self.doc.Cut.Refine = False |
| | |
| | self.doc.recompute() |
| | cut1 = self.doc.Cut.Shape |
| | |
| | refkeys = [ |
| | "Vertex3", |
| | "Vertex4", |
| | "Vertex8", |
| | "Vertex10", |
| | "Vertex7", |
| | "Vertex9", |
| | "Vertex13", |
| | "Vertex14", |
| | "Vertex18", |
| | "Vertex20", |
| | "Vertex17", |
| | "Vertex19", |
| | "Edge3", |
| | "Edge15", |
| | "Edge9", |
| | "Edge12", |
| | "Edge13", |
| | "Edge11", |
| | "Edge8", |
| | "Edge17", |
| | "Edge18", |
| | "Edge19", |
| | "Edge30", |
| | "Edge24", |
| | "Edge27", |
| | "Edge28", |
| | "Edge29", |
| | "Edge25", |
| | "Edge26", |
| | "Edge23", |
| | "Face7", |
| | "Face4", |
| | "Face8", |
| | "Face14", |
| | "Face13", |
| | "Face11", |
| | "Face12", |
| | "Face10", |
| | "Edge22", |
| | "Vertex12", |
| | "Edge20", |
| | "Vertex11", |
| | "Edge21", |
| | "Edge16", |
| | "Face9", |
| | "Vertex15", |
| | "Vertex16", |
| | ] |
| | if cut1.ElementMapVersion != "": |
| | self.assertKeysInMap(cut1.ElementReverseMap, refkeys) |
| | self.assertEqual(len(cut1.ElementReverseMap.keys()), len(refkeys)) |
| |
|