Test2617.py
Test2729.py
Test2751.py
+ Test2854.py
)
// Searching faces with common edges.
if(theIsMakeShells && aBaseFacesList.size() > 1) {
- ListOfShape aShells;
- ListOfShape aFreeFaces;
GeomShapePtr aFacesCompound = GeomAlgoAPI_CompoundBuilder::compound(aBaseFacesList);
- GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL,
- aShells, aFreeFaces);
- theBaseShapesList.insert(theBaseShapesList.end(), aFreeFaces.begin(), aFreeFaces.end());
- theBaseShapesList.insert(theBaseShapesList.end(), aShells.begin(), aShells.end());
+ GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL, theBaseShapesList);
} else {
theBaseShapesList.insert(theBaseShapesList.end(), aBaseFacesList.begin(),
aBaseFacesList.end());
// Searching faces with common edges.
if(aCreationMethod == CREATION_METHOD_SIMPLE()) {
- ListOfShape aShells;
- ListOfShape aFreeFaces;
std::shared_ptr<GeomAPI_Shape> aFacesCompound =
GeomAlgoAPI_CompoundBuilder::compound(aBaseFacesList);
- GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL,
- aShells, aFreeFaces);
- aBaseShapesList.insert(aBaseShapesList.end(), aFreeFaces.begin(), aFreeFaces.end());
- aBaseShapesList.insert(aBaseShapesList.end(), aShells.begin(), aShells.end());
+ GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL, aBaseShapesList);
} else {
aBaseShapesList.insert(aBaseShapesList.end(), aBaseFacesList.begin(), aBaseFacesList.end());
}
std::shared_ptr<GeomAPI_Shape> aPathShape =
std::dynamic_pointer_cast<GeomAPI_Shape>(aPathSelection->value());
if(!aPathShape.get() && aPathSelection->context().get()) {
- // Probaply it is a construction.
+ // Probably it is a construction.
aPathShape = aPathSelection->context()->shape();
}
if(!aPathShape.get() || aPathShape->isNull()) {
// Make compound and find connected.
GeomShapePtr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aBaseShapesList);
- ListOfShape aCombined, aFree;
- GeomAlgoAPI_ShapeTools::combineShapes(
- aCompound,
- aType,
- aCombined,
- aFree);
-
- if(aFree.size() > 0 || aCombined.size() > 1) {
+ ListOfShape aResults;
+ GeomAlgoAPI_ShapeTools::combineShapes(aCompound, aType, aResults);
+
+ if(aResults.size() > 1 || (aResults.size() == 1 && aResults.front()->shapeType() > aType)) {
theError = "Error: Not all shapes have shared topology.";
return false;
}
SketchCircle_2 = Sketch_2.addCircle(-111.0503834053735, -148.4878232655183, 89.21253106334201)
model.do()
Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "Sketch_1"), model.selection("COMPOUND", "Sketch_2")], model.selection(), 10, 0)
-Cut_1 = model.addCut(Part_1_doc, [model.selection("SOLID", "Extrusion_1_2_2"), model.selection("SOLID", "Extrusion_1_2_1")], [model.selection("SOLID", "Extrusion_1_1")])
+Cut_1 = model.addCut(Part_1_doc, [model.selection("SOLID", "Extrusion_1_1_2"), model.selection("SOLID", "Extrusion_1_1_1")], [model.selection("SOLID", "Extrusion_1_2")])
model.do()
model.end()
--- /dev/null
+## Copyright (C) 2014-2017 CEA/DEN, EDF R&D
+##
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Lesser General Public
+## License as published by the Free Software Foundation; either
+## version 2.1 of the License, or (at your option) any later version.
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public
+## License along with this library; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+## See http:##www.salome-platform.org/ or
+## email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+##
+
+# Test for the order of extrusion results: even compsolids or solids, they depend on the order
+# of created sketch entities
+
+from salome.shaper import model
+from GeomAPI import *
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(20.52339901477833, 44.52955665024631, -23.88177339901478, 44.52955665024631)
+SketchLine_2 = Sketch_1.addLine(-23.88177339901478, 44.52955665024631, -23.88177339901478, 15.29926108374386)
+SketchLine_3 = Sketch_1.addLine(-23.88177339901478, 15.29926108374386, 20.52339901477833, 15.29926108374386)
+SketchLine_4 = Sketch_1.addLine(20.52339901477833, 15.29926108374386, 20.52339901477833, 44.52955665024631)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_4.endPoint(), SketchLine_1.startPoint())
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchConstraintCoincidence_3 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+SketchConstraintCoincidence_4 = Sketch_1.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint())
+SketchConstraintHorizontal_1 = Sketch_1.setHorizontal(SketchLine_1.result())
+SketchConstraintVertical_1 = Sketch_1.setVertical(SketchLine_2.result())
+SketchConstraintHorizontal_2 = Sketch_1.setHorizontal(SketchLine_3.result())
+SketchConstraintVertical_2 = Sketch_1.setVertical(SketchLine_4.result())
+SketchLine_5 = Sketch_1.addLine(29.23029556650247, 27.36453201970445, -5.970443349753695, 27.36453201970445)
+SketchLine_6 = Sketch_1.addLine(-5.970443349753695, 27.36453201970445, -5.970443349753695, -13.80665024630542)
+SketchLine_7 = Sketch_1.addLine(-5.970443349753695, -13.80665024630542, 29.23029556650247, -13.80665024630542)
+SketchLine_8 = Sketch_1.addLine(29.23029556650247, -13.80665024630542, 29.23029556650247, 27.36453201970445)
+SketchConstraintCoincidence_5 = Sketch_1.setCoincident(SketchLine_8.endPoint(), SketchLine_5.startPoint())
+SketchConstraintCoincidence_6 = Sketch_1.setCoincident(SketchLine_5.endPoint(), SketchLine_6.startPoint())
+SketchConstraintCoincidence_7 = Sketch_1.setCoincident(SketchLine_6.endPoint(), SketchLine_7.startPoint())
+SketchConstraintCoincidence_8 = Sketch_1.setCoincident(SketchLine_7.endPoint(), SketchLine_8.startPoint())
+SketchConstraintHorizontal_3 = Sketch_1.setHorizontal(SketchLine_5.result())
+SketchConstraintVertical_3 = Sketch_1.setVertical(SketchLine_6.result())
+SketchConstraintHorizontal_4 = Sketch_1.setHorizontal(SketchLine_7.result())
+SketchConstraintVertical_4 = Sketch_1.setVertical(SketchLine_8.result())
+model.do()
+Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "all-in-Sketch_1")], model.selection(), 10, 0)
+Group_1_objects = [model.selection("FACE", "Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_7"), model.selection("FACE", "Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_8"), model.selection("FACE", "Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_3"), model.selection("FACE", "Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_6"), model.selection("FACE", "Extrusion_1_1_3/From_Face"), model.selection("FACE", "Extrusion_1_1_3/To_Face"), model.selection("FACE", "Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_4"), model.selection("FACE", "Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_5"), model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_3"), model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_2"), model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_6"), model.selection("FACE", "Extrusion_1_1_1/To_Face"), model.selection("FACE", "Extrusion_1_1_1/From_Face"), model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_5"), model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_1"), model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_4"), model.selection("FACE", "Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_6"), model.selection("FACE", "Extrusion_1_1_2/From_Face"), model.selection("FACE", "Extrusion_1_1_2/To_Face"), model.selection("FACE", "Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_5"), model.selection("FACE", "Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_3"), model.selection("FACE", "Extrusion_1_1_2/Generated_Face&Sketch_1/SketchLine_4")]
+Group_1 = model.addGroup(Part_1_doc, Group_1_objects)
+model.do()
+# add a circle to the sketch
+SketchCircle_1 = Sketch_1.addCircle(-26.84625185927467, -13.07763963304469, 9.031583682868897)
+model.end()
+
+# check group is valid
+from ModelAPI import *
+aFactory = ModelAPI_Session.get().validators()
+assert(aFactory.validate(Group_1.feature()))
+
+selectionList = Group_1.feature().selectionList("group_list")
+assert(selectionList.size() == 22)
+for i in range(22):
+ assert(Group_1.groupList().value(i).value().shapeType() == GeomAPI_Shape.FACE)
if(aResult.ShapeType() == TopAbs_COMPOUND) {
std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
aGeomShape->setImpl(new TopoDS_Shape(aResult));
- ListOfShape aCompSolids, aFreeSolids;
+ ListOfShape aResults;
aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape,
GeomAPI_Shape::COMPSOLID,
- aCompSolids,
- aFreeSolids);
+ aResults);
aResult = aGeomShape->impl<TopoDS_Shape>();
}
if(theIsMakeCompSolids && aResult.ShapeType() == TopAbs_COMPOUND) {
std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
aGeomShape->setImpl(new TopoDS_Shape(aResult));
- ListOfShape aCompSolids, aFreeSolids;
+ ListOfShape aResults;
aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape,
GeomAPI_Shape::COMPSOLID,
- aCompSolids,
- aFreeSolids);
+ aResults);
aResult = aGeomShape->impl<TopoDS_Shape>();
}
if(aResult.ShapeType() == TopAbs_COMPOUND) {
std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
aGeomShape->setImpl(new TopoDS_Shape(aResult));
- ListOfShape aCompSolids, aFreeSolids;
+ ListOfShape aResults;
aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape,
GeomAPI_Shape::COMPSOLID,
- aCompSolids,
- aFreeSolids);
+ aResults);
aResult = aGeomShape->impl<TopoDS_Shape>();
}
}
if(aResult.ShapeType() == TopAbs_COMPOUND) {
std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
aGeomShape->setImpl(new TopoDS_Shape(aResult));
- ListOfShape aCompSolids, aFreeSolids;
+ ListOfShape aResults;
aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape,
GeomAPI_Shape::COMPSOLID,
- aCompSolids,
- aFreeSolids);
+ aResults);
aResult = aGeomShape->impl<TopoDS_Shape>();
}
if(aResult.ShapeType() == TopAbs_COMPOUND) {
std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
aGeomShape->setImpl(new TopoDS_Shape(aResult));
- ListOfShape aCompSolids, aFreeSolids;
+ ListOfShape aResults;
aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape,
GeomAPI_Shape::COMPSOLID,
- aCompSolids,
- aFreeSolids);
+ aResults);
aResult = aGeomShape->impl<TopoDS_Shape>();
}
std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_ShapeTools::combineShapes(
const std::shared_ptr<GeomAPI_Shape> theCompound,
const GeomAPI_Shape::ShapeType theType,
- ListOfShape& theCombinedShapes,
- ListOfShape& theFreeShapes)
+ ListOfShape& theResuts)
{
+
+ ListOfShape aResCombinedShapes;
+ ListOfShape aResFreeShapes;
+
GeomShapePtr aResult = theCompound;
if(!theCompound.get()) {
aTA = TopAbs_SOLID;
}
- theCombinedShapes.clear();
- theFreeShapes.clear();
+ // map from the resulting shapes to minimal index of the used shape from theCompound list
+ std::map<GeomShapePtr, int> anInputOrder;
+ // map from ancestors-shapes to the index of shapes in theCompound
+ NCollection_DataMap<TopoDS_Shape, int> anAncestorsOrder;
// Get free shapes.
+ int anOrder = 0;
const TopoDS_Shape& aShapesComp = theCompound->impl<TopoDS_Shape>();
- for(TopoDS_Iterator anIter(aShapesComp); anIter.More(); anIter.Next() ) {
+ for(TopoDS_Iterator anIter(aShapesComp); anIter.More(); anIter.Next(), anOrder++) {
const TopoDS_Shape& aShape = anIter.Value();
if(aShape.ShapeType() > aTA) {
std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
aGeomShape->setImpl<TopoDS_Shape>(new TopoDS_Shape(aShape));
- theFreeShapes.push_back(aGeomShape);
+ aResFreeShapes.push_back(aGeomShape);
+ anInputOrder[aGeomShape] = anOrder;
+ } else {
+ for(TopExp_Explorer anExp(aShape, aTA); anExp.More(); anExp.Next()) {
+ anAncestorsOrder.Bind(anExp.Current(), anOrder);
+ }
}
}
if(aMapSA.IsEmpty()) {
return aResult;
}
+ theResuts.clear();
// Get all shapes with common sub-shapes and free shapes.
NCollection_Map<TopoDS_Shape> aFreeShapes;
TopoDS_Shell aShell;
TopoDS_CompSolid aCSolid;
TopoDS_Builder aBuilder;
+ anOrder = -1;
theType ==
GeomAPI_Shape::COMPSOLID ? aBuilder.MakeCompSolid(aCSolid) : aBuilder.MakeShell(aShell);
NCollection_Map<TopoDS_Shape>& aShapesMap = anIter.ChangeValue();
theType ==
GeomAPI_Shape::COMPSOLID ? aBuilder.Add(aCSolid, aShape) : aBuilder.Add(aShell, aShape);
aShapesMap.Remove(aShape);
+ int aThisOrder = anAncestorsOrder.Find(aShape);
+ if (anOrder == -1 || aThisOrder < anOrder)
+ anOrder = aThisOrder; // take the minimum order position
}
}
std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
TopoDS_Shape* aSh = theType == GeomAPI_Shape::COMPSOLID ? new TopoDS_Shape(aCSolid) :
new TopoDS_Shape(aShell);
aGeomShape->setImpl<TopoDS_Shape>(aSh);
- theCombinedShapes.push_back(aGeomShape);
- }
-
- // Adding free shapes in the same order as they are in the initial compound
- NCollection_Map<TopoDS_Shape> aFreeSimple;
- for(ListOfShape::iterator aFree = theFreeShapes.begin(); aFree != theFreeShapes.end(); aFree++) {
- aFreeSimple.Add((*aFree)->impl<TopoDS_Shape>());
+ aResCombinedShapes.push_back(aGeomShape);
+ anInputOrder[aGeomShape] = anOrder;
}
- theFreeShapes.clear();
- for(TopoDS_Iterator anIter(aShapesComp); anIter.More(); anIter.Next() ) {
- const TopoDS_Shape& aShape = anIter.Value();
- if((aShape.ShapeType() > aTA && aFreeSimple.Contains(aShape)) ||
- (aShape.ShapeType() == aTA && aFreeShapes.Contains(aShape))) {
+ // Adding free shapes.
+ for(TopExp_Explorer anExp(aShapesComp, aTA); anExp.More(); anExp.Next()) {
+ const TopoDS_Shape& aShape = anExp.Current();
+ if(aFreeShapes.Contains(aShape)) {
std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
aGeomShape->setImpl<TopoDS_Shape>(new TopoDS_Shape(aShape));
- theFreeShapes.push_back(aGeomShape);
- } else if (aShape.ShapeType() < aTA) {
- for(TopExp_Explorer anExp(aShape, aTA); anExp.More(); anExp.Next()) {
- const TopoDS_Shape& aSubShape = anExp.Current();
- if (aFreeShapes.Contains(aSubShape)) {
- std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
- aGeomShape->setImpl<TopoDS_Shape>(new TopoDS_Shape(aSubShape));
- theFreeShapes.push_back(aGeomShape);
- }
- }
+ aResFreeShapes.push_back(aGeomShape);
+ anInputOrder[aGeomShape] = anAncestorsOrder.Find(aShape);
}
}
- if(theCombinedShapes.size() == 1 && theFreeShapes.size() == 0) {
- aResult = theCombinedShapes.front();
- } else if(theCombinedShapes.size() == 0 && theFreeShapes.size() == 1) {
- aResult = theFreeShapes.front();
+ if(aResCombinedShapes.size() == 1 && aResFreeShapes.size() == 0) {
+ aResult = aResCombinedShapes.front();
+ theResuts.push_back(aResult);
+ } else if(aResCombinedShapes.size() == 0 && aResFreeShapes.size() == 1) {
+ aResult = aResFreeShapes.front();
+ theResuts.push_back(aResult);
} else {
TopoDS_Compound aResultComp;
TopoDS_Builder aBuilder;
aBuilder.MakeCompound(aResultComp);
- for(ListOfShape::const_iterator anIter = theCombinedShapes.cbegin();
- anIter != theCombinedShapes.cend(); anIter++) {
- aBuilder.Add(aResultComp, (*anIter)->impl<TopoDS_Shape>());
- }
- for(ListOfShape::const_iterator anIter = theFreeShapes.cbegin();
- anIter != theFreeShapes.cend(); anIter++) {
- aBuilder.Add(aResultComp, (*anIter)->impl<TopoDS_Shape>());
+ // put to result compound and result list in accordance to the order numbers
+ std::map<GeomShapePtr, int>::iterator anInputIter = anInputOrder.begin();
+ std::map<int, GeomShapePtr> aNums;
+ for(; anInputIter != anInputOrder.end(); anInputIter++)
+ aNums[anInputIter->second] = anInputIter->first;
+ std::map<int, GeomShapePtr>::iterator aNumsIter = aNums.begin();
+ for(; aNumsIter != aNums.end(); aNumsIter++) {
+ aBuilder.Add(aResultComp, (aNumsIter->second)->impl<TopoDS_Shape>());
+ theResuts.push_back(aNumsIter->second);
}
aResult->setImpl(new TopoDS_Shape(aResultComp));
}
TopoDS_Compound aCompound;
BRep_Builder aBuilder;
aBuilder.MakeCompound(aCompound);
- ListOfShape aCompSolids, aFreeSolids;
+ ListOfShape aSolids;
for (NCollection_Vector<TopTools_MapOfShape>::Iterator anIt(aGroups); anIt.More(); anIt.Next()) {
const TopTools_MapOfShape& aGroup = anIt.ChangeValue();
GeomShapePtr aGeomShape(new GeomAPI_Shape());
aGeomShape->setImpl(new TopoDS_Shape(makeCompound(anOrderedGoup)));
aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape,
GeomAPI_Shape::COMPSOLID,
- aCompSolids,
- aFreeSolids);
+ aSolids);
}
aBuilder.Add(aCompound, aGeomShape->impl<TopoDS_Shape>());
}
/// \brief Combines faces with common edges to shells, or solids to compsolids.
/// \param[in] theCompound compound of shapes.
/// \param[in] theType type of combine.
- /// \param[out] theCombinedShapes resulting shapes.
- /// \param[out] theFreeShapes shapes that does not have common subshapes.
+ /// \param[out] theResults resulting shapes.
GEOMALGOAPI_EXPORT static std::shared_ptr<GeomAPI_Shape> combineShapes(
const std::shared_ptr<GeomAPI_Shape> theCompound,
- const GeomAPI_Shape::ShapeType theType,
- ListOfShape& theCombinedShapes,
- ListOfShape& theFreeShapes);
+ const GeomAPI_Shape::ShapeType theType, ListOfShape& theResults);
/// \brief Groups shapes with shared topology to compounds.
/// \param[in] theCompound compound of shapes.
// Make compound.
GeomShapePtr aCompound = GeomAlgoAPI_CompoundBuilder::compound(theShapes);
- ListOfShape aCombined, aFree;
+ ListOfShape aResults;
GeomAlgoAPI_ShapeTools::combineShapes(
aCompound,
GeomAPI_Shape::SHELL,
- aCombined,
- aFree);
+ aResults);
- if(aFree.size() > 0 || aCombined.size() > 1) {
+ if(aResults.size() > 1 ||
+ (aResults.size() == 1 && aResults.front()->shapeType() > GeomAPI_Shape::SHELL)) {
return;
}
- const TopoDS_Shape& aShell = aCombined.front()->impl<TopoDS_Shape>();
+ const TopoDS_Shape& aShell = aResults.front()->impl<TopoDS_Shape>();
std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
aShape->setImpl(new TopoDS_Shape(aShell));