// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-// File: GeomAlgoAPI_MakeShapeListList.h
+// File: GeomAlgoAPI_MakeShapeListList.cpp
// Created: 27 May 2015
// Author: Dmitry Bobylev
//=================================================================================================
void GeomAlgoAPI_MakeShapeList::init(const ListOfMakeShape& theMakeShapeList)
{
- myMakeShapeList = theMakeShapeList;
+ myListOfMakeShape = theMakeShapeList;
+}
+
+//=================================================================================================
+void GeomAlgoAPI_MakeShapeList::append(const std::shared_ptr<GeomAlgoAPI_MakeShape> theMakeShape)
+{
+ myListOfMakeShape.push_back(theMakeShape);
+}
+
+//=================================================================================================
+void GeomAlgoAPI_MakeShapeList::append(const GeomAlgoAPI_MakeShapeList& theMakeShapeList)
+{
+ for(ListOfMakeShape::const_iterator anIt = theMakeShapeList.myListOfMakeShape.cbegin();
+ anIt != theMakeShapeList.myListOfMakeShape.cend(); anIt++) {
+ myListOfMakeShape.push_back(*anIt);
+ }
}
//=================================================================================================
const std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_MakeShapeList::shape() const
{
- if(myMakeShapeList.empty()) {
+ if(myListOfMakeShape.empty()) {
return std::shared_ptr<GeomAPI_Shape>();
} else {
- return myMakeShapeList.back()->shape();
+ return myListOfMakeShape.back()->shape();
}
}
result(theShape, theHistory, GeomAlgoAPI_MakeShapeList::Modified);
}
+bool GeomAlgoAPI_MakeShapeList::isDeleted(const std::shared_ptr<GeomAPI_Shape> theShape)
+{
+ for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) {
+ std::shared_ptr<GeomAlgoAPI_MakeShape> aMakeShape = *aBuilderIt;
+ if(aMakeShape->isDeleted(theShape)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr<GeomAPI_Shape> theShape,
ListOfShape& theHistory,
OperationType theOperationType)
{
- if(myMakeShapeList.empty()) {
+ if(myListOfMakeShape.empty()) {
return;
}
- NCollection_Map<TopoDS_Shape> aTempShapes;
+ NCollection_Map<TopoDS_Shape> anAlgoShapes;
NCollection_Map<TopoDS_Shape> aResultShapes;
- aTempShapes.Add(theShape->impl<TopoDS_Shape>());
-
- for(ListOfMakeShape::iterator aBuilderIt = myMakeShapeList.begin(); aBuilderIt != myMakeShapeList.end(); aBuilderIt++) {
- BRepBuilderAPI_MakeShape* aBuilder = (*aBuilderIt)->implPtr<BRepBuilderAPI_MakeShape>();
- for(NCollection_Map<TopoDS_Shape>::Iterator aShapeIt(aTempShapes); aShapeIt.More(); aShapeIt.Next()) {
- const TopoDS_Shape& aShape = aShapeIt.Value();
- const TopTools_ListOfShape& aList = theOperationType == GeomAlgoAPI_MakeShapeList::Generated ?
- aBuilder->Generated(aShape) : aBuilder->Modified(aShape);
- bool prevResRemoved = false;
- for(TopTools_ListIteratorOfListOfShape anIt(aList); anIt.More(); anIt.Next()) {
- aTempShapes.Add(anIt.Value());
- aResultShapes.Add(anIt.Value());
- if(!prevResRemoved) {
- aResultShapes.Remove(aShape);
- prevResRemoved = true;
- }
+ anAlgoShapes.Add(theShape->impl<TopoDS_Shape>());
+ aResultShapes.Add(theShape->impl<TopoDS_Shape>());
+
+ for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) {
+ std::shared_ptr<GeomAlgoAPI_MakeShape> aMakeShape = *aBuilderIt;
+ NCollection_Map<TopoDS_Shape> aTempShapes;
+ bool hasResults = false;
+ for(NCollection_Map<TopoDS_Shape>::Iterator aShapeIt(anAlgoShapes); aShapeIt.More(); aShapeIt.Next()) {
+ std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape);
+ aShape->setImpl(new TopoDS_Shape(aShapeIt.Value()));
+ ListOfShape aGeneratedShapes;
+ const TopoDS_Shape& aSh = aShape->impl<TopoDS_Shape>();
+ aMakeShape->generated(aShape, aGeneratedShapes);
+ for(ListOfShape::const_iterator anIt = aGeneratedShapes.cbegin(); anIt != aGeneratedShapes.cend(); anIt++) {
+ aTempShapes.Add((*anIt)->impl<TopoDS_Shape>());
+ aResultShapes.Add((*anIt)->impl<TopoDS_Shape>());
+ hasResults = true;
+ }
+ ListOfShape aModifiedShapes;
+ aMakeShape->modified(aShape, aModifiedShapes);
+ for(ListOfShape::const_iterator anIt = aModifiedShapes.cbegin(); anIt != aModifiedShapes.cend(); anIt++) {
+ aTempShapes.Add((*anIt)->impl<TopoDS_Shape>());
+ aResultShapes.Add((*anIt)->impl<TopoDS_Shape>());
+ hasResults = true;
+ }
+ if(hasResults) {
+ aResultShapes.Remove(aShape->impl<TopoDS_Shape>());
}
}
+ anAlgoShapes.Unite(aTempShapes);
}
for(NCollection_Map<TopoDS_Shape>::Iterator aShapeIt(aResultShapes); aShapeIt.More(); aShapeIt.Next()) {
theHistory.push_back(aShape);
}
}
-