]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix for the issue #1045
authormpv <mpv@opencascade.com>
Thu, 17 Dec 2015 09:30:17 +0000 (12:30 +0300)
committermpv <mpv@opencascade.com>
Thu, 17 Dec 2015 09:30:17 +0000 (12:30 +0300)
src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py
src/GeomAlgoAPI/GeomAlgoAPI_CompoundBuilder.cpp
src/GeomAlgoAPI/GeomAlgoAPI_CompoundBuilder.h

index 30844b6744a29fb0c941fb4d783fe027fd5d6bb5..ee7dafeb75a59090c40e0220310541c30e945fb1 100644 (file)
@@ -4,6 +4,7 @@
 
 import EventsAPI
 import ModelAPI
+import GeomAlgoAPI
 
 import salome
 from salome.geom import geomBuilder
@@ -39,10 +40,6 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
     def isAction(self):
         return True
 
-    # The action is not placed into the history anyway
-    #def isInHistory(self):
-    #    return False
-
     ## This feature has no attributes, as it is action.
     def initAttributes(self):
       pass
@@ -57,24 +54,38 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
             return
           
         anObjList = [self.Part.object(kResultBodyType, idx) for idx in xrange(aPartSize)]     
+        aShapesList = GeomAlgoAPI.ShapeList()
+        aName = ""
         for idx, anObject in enumerate(anObjList):
             aResult = ModelAPI.modelAPI_Result(anObject)
             aBodyResult = ModelAPI.modelAPI_ResultBody(aResult)
             if not aBodyResult:
                 continue
             aShape = aBodyResult.shape()
-            aDump = aShape.getShapeStream()
-            # Load shape to SALOME Geom
-            aBrep = self.geompy.RestoreShape(aDump)
-            aName = aBodyResult.data().name()
+            if aShape is not None and not aShape.isNull():
+              aShapesList.append(aShape)
+              if len(aShapesList) == 1:
+                aName = aBodyResult.data().name()
+
+        # issue 1045: create compound if there are more than one shape
+        if len(aShapesList) > 1:
+          self.shape = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.compound(aShapesList)
+          aName = "ShaperResults"
+        elif len(aShapesList) == 1:
+          self.shape = aShapesList[0]
+
+        # so, only one shape is always in the result
+        aDump = self.shape.getShapeStream()
+        # Load shape to SALOME Geom
+        aBrep = self.geompy.RestoreShape(aDump)
             
-            # Make unique name
-            aId = getObjectIndex(aName)
-            if aId != 0:
-                aName = aName + '_' + str(aId)
+        # Make unique name
+        aId = getObjectIndex(aName)
+        if aId != 0:
+            aName = aName + '_' + str(aId)
             
-            self.geompy.addToStudy(aBrep, aName)
-            self.geomObjects.append([aShape, aBrep])
+        self.geompy.addToStudy(aBrep, aName)
+        self.brep = aBrep
 
     ## Exports all groups
     def exportGroups(self):
@@ -102,8 +113,7 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
         Ids = []
         for aSelIndex in range(0, aSelectionNum):
             aSelection = theSelectionList.value(aSelIndex)
-            aSelectionContext = aSelection.context()
-            anID = aSelection.Id()
+            anID = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.id(self.shape, aSelection.value())
             Ids.append(anID)
             if aSelection.value().isVertex():
                 groupType = "VERTEX"
@@ -114,15 +124,9 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
             else:
                 groupType = "SOLID"
 
-        aContextBody = ModelAPI.modelAPI_ResultBody(aSelectionContext)
-        if aContextBody is not None:
-          # iterate on exported objects and check if the current
-          # group refers to this object
-          for obj in self.geomObjects: 
-              if aContextBody.isLatestEqual(obj[0]):
-                  aGroup = self.geompy.CreateGroup(obj[1], self.geompy.ShapeType[groupType])
-                  self.geompy.UnionIDs(aGroup,Ids)
-                  self.geompy.addToStudyInFather(obj[1], aGroup, theGroupName)
+        aGroup = self.geompy.CreateGroup(self.brep, self.geompy.ShapeType[groupType])
+        self.geompy.UnionIDs(aGroup,Ids)
+        self.geompy.addToStudyInFather(self.brep, aGroup, theGroupName)
           
     ## Exports all shapes and groups into the GEOM module.
     def execute(self):
index a988d3bb2a8dfd798efdc027e0619347032b34e6..48d430fad38db7a0d5c34357a9170651f6f348a6 100644 (file)
@@ -5,11 +5,10 @@
 // Author:      Natalia ERMOLAEVA
 
 #include <GeomAlgoAPI_CompoundBuilder.h>
-//#include <gp_Pln.hxx>
-//#include <BRepBuilderAPI_MakeFace.hxx>
-//#include <TopoDS_Face.hxx>
 #include <BRep_Builder.hxx>
 #include <TopoDS_Compound.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+#include <TopExp.hxx>
 
 std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_CompoundBuilder::compound(
     std::list<std::shared_ptr<GeomAPI_Shape> > theShapes)
@@ -28,3 +27,18 @@ std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_CompoundBuilder::compound(
   aRes->setImpl(new TopoDS_Shape(aComp));
   return aRes;
 }
+
+int GeomAlgoAPI_CompoundBuilder::id(
+      std::shared_ptr<GeomAPI_Shape> theContext, std::shared_ptr<GeomAPI_Shape> theSub)
+{
+  int anID = 0;
+  TopoDS_Shape aMainShape = theContext->impl<TopoDS_Shape>();
+  const TopoDS_Shape& aSubShape = theSub->impl<TopoDS_Shape>();
+  if (!aMainShape.IsNull() && !aSubShape.IsNull()) {
+    TopTools_IndexedMapOfShape aSubShapesMap;
+    TopExp::MapShapes(aMainShape, aSubShapesMap);
+    anID = aSubShapesMap.FindIndex(aSubShape);
+  }
+
+  return anID;
+}
index 5e863f34c92b1a1646ae70df2fc09c0292bfac93..36caf87794da032c67ffc031e8565bc367081ac1 100644 (file)
@@ -27,6 +27,12 @@ class GEOMALGOAPI_EXPORT GeomAlgoAPI_CompoundBuilder
   /// \param theShapes a list of shapes
   static std::shared_ptr<GeomAPI_Shape> compound(
       std::list<std::shared_ptr<GeomAPI_Shape> > theShapes);
+
+  /// Produces the integerr identifier of the shape theSub in theContext (needed for 
+  /// groups export to old GEOM)
+  /// \returns zero if theSub not found in theContext
+  static int id(
+      std::shared_ptr<GeomAPI_Shape> theContext, std::shared_ptr<GeomAPI_Shape> theSub);
 };
 
 #endif