]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fixed naming in Partition and in GeomAlgoAPI_MakeShapeList.
authordbv <dbv@opencascade.com>
Tue, 20 Sep 2016 08:40:49 +0000 (11:40 +0300)
committerdbv <dbv@opencascade.com>
Tue, 20 Sep 2016 08:40:49 +0000 (11:40 +0300)
src/FeaturesPlugin/FeaturesPlugin_Partition.cpp
src/GeomAlgoAPI/GeomAlgoAPI_MakeShapeList.cpp

index 4e84bef15a1df03452186b6c29365aaebd3dedde..c9869f12446e83acb31d659f7c5cf7ade3d5970b 100755 (executable)
 #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()
 {
@@ -126,14 +133,12 @@ void FeaturesPlugin_Partition::storeResult(const ListOfShape& theObjects,
   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;
@@ -160,17 +165,51 @@ void FeaturesPlugin_Partition::storeResult(const ListOfShape& theObjects,
   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;
+}
index 7be7d7c12571d913d033c8ed67d144dbbaad4f4d..3c00ea2051c5dec5380f6dfd86afdd430993d24e 100644 (file)
@@ -6,6 +6,8 @@
 
 #include "GeomAlgoAPI_MakeShapeList.h"
 
+
+#include <NCollection_List.hxx>
 #include <NCollection_Map.hxx>
 #include <TopoDS_Shape.hxx>
 
@@ -95,9 +97,11 @@ void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr<GeomAPI_Shape> theS
   }
 
   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;
@@ -109,25 +113,39 @@ void GeomAlgoAPI_MakeShapeList::result(const std::shared_ptr<GeomAPI_Shape> theS
       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);