void Model_BodyBuilder::loadDeletedShapes (GeomAlgoAPI_MakeShape* theMS,
std::shared_ptr<GeomAPI_Shape> theShapeIn,
const int theKindOfShape,
- const int theTag)
+ const int theTag,
+ const GeomShapePtr theShapes)
{
TopoDS_Shape aShapeIn = theShapeIn->impl<TopoDS_Shape>();
TopTools_MapOfShape aView;
if (!aView.Add(aRoot)) continue;
std::shared_ptr<GeomAPI_Shape> aRShape(new GeomAPI_Shape());
aRShape->setImpl((new TopoDS_Shape(aRoot)));
- if (theMS->isDeleted (aRShape)) {
- if (!aResultShape->isSubShape(aRShape, false)) {
- ListOfShape aHist;
- if (BRepTools_History::IsSupportedType(aRoot)) // to avoid crash in #2572
- theMS->modified(aRShape, aHist);
- if (aHist.size() == 0 || (aHist.size() == 1 && aHist.front()->isSame(aRShape)))
- builder(theTag)->Delete(aRoot);
- }
+ if (!theMS->isDeleted(aRShape)
+ || aResultShape->isSubShape(aRShape, false)
+ || (theShapes.get() && theShapes->isSubShape(aRShape, false))) {
+ continue;
}
+
+ ListOfShape aHist;
+ if (BRepTools_History::IsSupportedType(aRoot)) // to avoid crash in #2572
+ theMS->modified(aRShape, aHist);
+ if (aHist.size() == 0 || (aHist.size() == 1 && aHist.front()->isSame(aRShape)))
+ builder(theTag)->Delete(aRoot);
}
}
TopoDS_Shape aShapeIn = theShapeIn->impl<TopoDS_Shape>();
TopTools_MapOfShape aView;
std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(data());
- TopExp_Explorer aShapeExplorer (aShapeIn, (TopAbs_ShapeEnum)theKindOfShape);
+
+ TopoDS_Shape aShapeToIterate;
+ if (theMS->newShapesCollected(theShapeIn, theKindOfShape)) {
+ // use optimized set of old shapes for this
+ GeomShapePtr aCompound = theMS->oldShapesForNew(theShapeIn, aResultShape, theKindOfShape);
+ if (aCompound.get())
+ aShapeToIterate = aCompound->impl<TopoDS_Shape>();
+ } else {
+ aShapeToIterate = aShapeIn;
+ }
+
+ TopExp_Explorer aShapeExplorer (aShapeToIterate, (TopAbs_ShapeEnum)theKindOfShape);
for (; aShapeExplorer.More(); aShapeExplorer.Next ()) {
const TopoDS_Shape& aRoot = aShapeExplorer.Current ();
if (!aView.Add(aRoot)) continue;
std::shared_ptr<GeomAPI_Shape> aRShape(new GeomAPI_Shape());
aRShape->setImpl((new TopoDS_Shape(aRoot)));
theMS->modified(aRShape, aList);
+
if (!theIsStoreSeparate) {
//keepTopLevelShapes(aList, aRoot, aResultShape);
removeBadShapes(aList);