#include <GeomAlgoAPI_ShapeTools.h>
#include <GeomAPI_Face.h>
+#include <GeomAPI_ShapeExplorer.h>
#include <GeomAPI_ShapeIterator.h>
+#include <iostream>
#include <sstream>
+static GeomShapePtr findBase(const GeomShapePtr theObjectShape,
+ const GeomShapePtr theResultShape,
+ const GeomAPI_Shape::ShapeType theShapeType,
+ const std::shared_ptr<GeomAlgoAPI_MakeShape> theMakeShape);
+
//=================================================================================================
FeaturesPlugin_Partition::FeaturesPlugin_Partition()
{
GeomShapePtr aBaseShape;
for(ListOfShape::const_iterator anIt = theObjects.cbegin(); anIt != theObjects.cend(); ++anIt) {
GeomShapePtr anObjectShape = *anIt;
- ListOfShape aModifiedShapes;
- theMakeShape->modified(anObjectShape, aModifiedShapes);
- for(ListOfShape::const_iterator aModIt = aModifiedShapes.cbegin(); aModIt != aModifiedShapes.cend(); ++aModIt) {
- GeomShapePtr aModShape = *aModIt;
- if(theResultShape->isSubShape(aModShape)) {
- aBaseShape = anObjectShape;
- break;
- }
+ aBaseShape = findBase(anObjectShape, theResultShape, GeomAPI_Shape::VERTEX, theMakeShape);
+ if(!aBaseShape.get()) {
+ aBaseShape = findBase(anObjectShape, theResultShape, GeomAPI_Shape::EDGE, theMakeShape);
+ }
+ if(!aBaseShape.get()) {
+ aBaseShape = findBase(anObjectShape, theResultShape, GeomAPI_Shape::FACE, theMakeShape);
}
if(aBaseShape.get()) {
break;
std::shared_ptr<GeomAPI_DataMapOfShapeShape> aMapOfSubShapes = theMakeShape->mapOfSubShapes();
int anIndex = 1;
for(ListOfShape::const_iterator anIt = theObjects.cbegin(); anIt != theObjects.cend(); ++anIt) {
+ GeomShapePtr aShape = *anIt;
std::string aModEdgeName = aModName + "_Edge_" + std::to_string((long long)anIndex);
std::string aModFaceName = aModName + "_Face_" + std::to_string((long long)anIndex++);
- aResultBody->loadAndOrientModifiedShapes(theMakeShape.get(), *anIt, GeomAPI_Shape::EDGE,
+ aResultBody->loadAndOrientModifiedShapes(theMakeShape.get(), aShape, GeomAPI_Shape::EDGE,
aModTag, aModEdgeName, *aMapOfSubShapes.get(), true);
- aModTag += 1000;
- aResultBody->loadAndOrientModifiedShapes(theMakeShape.get(), *anIt, GeomAPI_Shape::FACE,
+ aModTag += 10000;
+ aResultBody->loadAndOrientModifiedShapes(theMakeShape.get(), aShape, GeomAPI_Shape::FACE,
aModTag, aModFaceName, *aMapOfSubShapes.get(), true);
- aModTag += 1000;
- aResultBody->loadDeletedShapes(theMakeShape.get(), *anIt, GeomAPI_Shape::EDGE, aDelTag);
- aResultBody->loadDeletedShapes(theMakeShape.get(), *anIt, GeomAPI_Shape::FACE, aDelTag);
+ aModTag += 10000;
+ aResultBody->loadDeletedShapes(theMakeShape.get(), aShape, GeomAPI_Shape::EDGE, aDelTag);
+ aResultBody->loadDeletedShapes(theMakeShape.get(), aShape, GeomAPI_Shape::FACE, aDelTag);
}
setResult(aResultBody, theIndex);
}
+
+
+//=================================================================================================
+GeomShapePtr findBase(const GeomShapePtr theObjectShape,
+ const GeomShapePtr theResultShape,
+ const GeomAPI_Shape::ShapeType theShapeType,
+ const std::shared_ptr<GeomAlgoAPI_MakeShape> theMakeShape)
+{
+ GeomShapePtr aBaseShape;
+ std::shared_ptr<GeomAPI_DataMapOfShapeShape> aMapOfSubShapes = theMakeShape->mapOfSubShapes();
+ for(GeomAPI_ShapeExplorer anObjectSubShapesExp(theObjectShape, theShapeType);
+ anObjectSubShapesExp.more();
+ anObjectSubShapesExp.next()) {
+ GeomShapePtr anObjectSubShape = anObjectSubShapesExp.current();
+ ListOfShape aModifiedShapes;
+ theMakeShape->modified(anObjectSubShape, aModifiedShapes);
+ for(ListOfShape::const_iterator aModIt = aModifiedShapes.cbegin(); aModIt != aModifiedShapes.cend(); ++aModIt) {
+ GeomShapePtr aModShape = *aModIt;
+ if(aMapOfSubShapes->isBound(aModShape)) {
+ aModShape = aMapOfSubShapes->find(aModShape);
+ }
+ if(theResultShape->isSubShape(aModShape)) {
+ aBaseShape = theObjectShape;
+ break;
+ }
+ }
+ if(aBaseShape.get()) {
+ break;
+ }
+ }
+
+ return aBaseShape;
+}
#include "GeomAlgoAPI_MakeShapeList.h"
+
+#include <NCollection_List.hxx>
#include <NCollection_Map.hxx>
#include <TopoDS_Shape.hxx>
}
NCollection_Map<TopoDS_Shape> anAlgoShapes;
- NCollection_Map<TopoDS_Shape> aResultShapes;
+ NCollection_Map<TopoDS_Shape> aResultShapesMap;
+ NCollection_List<TopoDS_Shape> aResultShapesList;
anAlgoShapes.Add(theShape->impl<TopoDS_Shape>());
- aResultShapes.Add(theShape->impl<TopoDS_Shape>());
+ aResultShapesMap.Add(theShape->impl<TopoDS_Shape>());
+ aResultShapesList.Append(theShape->impl<TopoDS_Shape>());
for(ListOfMakeShape::iterator aBuilderIt = myListOfMakeShape.begin(); aBuilderIt != myListOfMakeShape.end(); aBuilderIt++) {
std::shared_ptr<GeomAlgoAPI_MakeShape> aMakeShape = *aBuilderIt;
ListOfShape aGeneratedShapes;
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>());
+ const TopoDS_Shape& anItShape = (*anIt)->impl<TopoDS_Shape>();
+ aTempShapes.Add(anItShape);
+ if(aResultShapesMap.Add(anItShape) == Standard_True) {
+ aResultShapesList.Append(anItShape);
+ }
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>());
+ const TopoDS_Shape& anItShape = (*anIt)->impl<TopoDS_Shape>();
+ aTempShapes.Add(anItShape);
+ if(aResultShapesMap.Add(anItShape) == Standard_True) {
+ aResultShapesList.Append(anItShape);
+ }
hasResults = true;
}
if(hasResults) {
- aResultShapes.Remove(aShape->impl<TopoDS_Shape>());
+ const TopoDS_Shape& aTopoDSShape = aShapeIt.Value();
+ if(aResultShapesMap.Remove(aTopoDSShape) == Standard_True) {
+ for(NCollection_List<TopoDS_Shape>::Iterator aResIt(aResultShapesList); aResIt.More(); aResIt.Next()) {
+ if(aTopoDSShape.IsEqual(aResIt.Value())) {
+ aResultShapesList.Remove(aResIt);
+ break;
+ }
+ }
+ }
}
}
anAlgoShapes.Unite(aTempShapes);
}
- for(NCollection_Map<TopoDS_Shape>::Iterator aShapeIt(aResultShapes); aShapeIt.More(); aShapeIt.Next()) {
+ for(NCollection_List<TopoDS_Shape>::Iterator aShapeIt(aResultShapesList); aShapeIt.More(); aShapeIt.Next()) {
std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
aShape->setImpl(new TopoDS_Shape(aShapeIt.Value()));
theHistory.push_back(aShape);