]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix for the issue #1146 : ability to export groups that has been created on the previ...
authormpv <mpv@opencascade.com>
Mon, 21 Dec 2015 13:57:33 +0000 (16:57 +0300)
committermpv <mpv@opencascade.com>
Mon, 21 Dec 2015 13:57:33 +0000 (16:57 +0300)
src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py
src/GeomAPI/GeomAPI_ShapeExplorer.cpp

index ee7dafeb75a59090c40e0220310541c30e945fb1..46cc4daa0d621b83974e605681bf991341d9b6c0 100644 (file)
@@ -4,6 +4,7 @@
 
 import EventsAPI
 import ModelAPI
+import GeomAPI
 import GeomAlgoAPI
 
 import salome
@@ -52,8 +53,8 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
         if aPartSize == 0:
             EventsAPI.Events_Error_send("No results in the active document")
             return
-          
-        anObjList = [self.Part.object(kResultBodyType, idx) for idx in xrange(aPartSize)]     
+
+        anObjList = [self.Part.object(kResultBodyType, idx) for idx in xrange(aPartSize)]
         aShapesList = GeomAlgoAPI.ShapeList()
         aName = ""
         for idx, anObject in enumerate(anObjList):
@@ -78,12 +79,12 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
         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)
-            
+
         self.geompy.addToStudy(aBrep, aName)
         self.brep = aBrep
 
@@ -102,7 +103,18 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
                   aName = aFeature.firstResult().data().name()
                 groupIndex = groupIndex + 1
                 self.createGroupFromList(aSelectionList, aName)
-                     
+
+    ## Returns a type of the shape in the old GEOM representation
+    def shapeType(self, shape):
+        if shape.isVertex():
+            return "VERTEX"
+        elif shape.isEdge():
+            return "EDGE"
+        elif shape.isFace():
+            return "FACE"
+        
+        return "SOLID"
+
     ## Creates a group by given list of selected objects and the name
     #  @param theSelectionList: list of selected objects
     #  @param theGroupName: name of the group to create
@@ -111,23 +123,29 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
         # and get the corresponding ID
         aSelectionNum = theSelectionList.size()
         Ids = []
+        groupType = ""
         for aSelIndex in range(0, aSelectionNum):
             aSelection = theSelectionList.value(aSelIndex)
             anID = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.id(self.shape, aSelection.value())
-            Ids.append(anID)
-            if aSelection.value().isVertex():
-                groupType = "VERTEX"
-            elif aSelection.value().isEdge():
-                groupType = "EDGE" 
-            elif aSelection.value().isFace():
-                groupType = "FACE"
+            if anID == 0:
+                #it may be a compound of objects if movement of the group to the end
+                # splits the original element to several (issue 1146)
+                anExp = GeomAPI.GeomAPI_ShapeExplorer(aSelection.value(), GeomAPI.GeomAPI_Shape.SHAPE)
+                while anExp.more():
+                    anID = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.id(self.shape, anExp.current())
+                    if anID != 0:
+                        Ids.append(anID)
+                        groupType = self.shapeType(anExp.current())
+                    anExp.next()
             else:
-                groupType = "SOLID"
+                Ids.append(anID)
+                groupType = self.shapeType(aSelection.value())
+
 
         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):
         aSession = ModelAPI.ModelAPI_Session.get()
@@ -137,7 +155,7 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
         self.geomObjects = []
         ## geomBuilder tool
         self.geompy = geomBuilder.New(salome.myStudy)
-       
+
         # Export bodies and groups
         self.exportBodies()
         self.exportGroups()
index 6b94439c0053e1c62516fa3ba07e4886e4387b5e..bf6ca1727251314d944796c4da0a6b2bdf31c9b3 100644 (file)
@@ -17,12 +17,29 @@ GeomAPI_ShapeExplorer::GeomAPI_ShapeExplorer()
 {
 }
 
+// returns a type of shape to expolode, but if toFind==SHAPE, it will return the type
+// of the first sub-element of compoud if theSHape is compound
+static TopAbs_ShapeEnum ShapeType(const std::shared_ptr<GeomAPI_Shape>& theShape,
+                                  const GeomAPI_Shape::ShapeType toFind)
+{
+  if (toFind == GeomAPI_Shape::SHAPE) {
+    TopoDS_Shape aShape = theShape->impl<TopoDS_Shape>();
+    if (!aShape.IsNull() && aShape.ShapeType() == TopAbs_COMPOUND) {
+      TopoDS_Iterator anIter(aShape);
+      if (anIter.More()) {
+        return anIter.Value().ShapeType();
+      }
+    }
+  }
+  return (TopAbs_ShapeEnum)toFind;
+}
+
 //=================================================================================================
 GeomAPI_ShapeExplorer::GeomAPI_ShapeExplorer(const std::shared_ptr<GeomAPI_Shape>& theShape,
                                              const GeomAPI_Shape::ShapeType toFind,
                                              const GeomAPI_Shape::ShapeType toAvoid)
 : GeomAPI_Interface(new TopExp_Explorer(theShape->impl<TopoDS_Shape>(),
-                                       (TopAbs_ShapeEnum)toFind,
+                                       ShapeType(theShape, toFind),
                                        (TopAbs_ShapeEnum)toAvoid))
 {
 }
@@ -33,7 +50,7 @@ void GeomAPI_ShapeExplorer::init(const std::shared_ptr<GeomAPI_Shape>& theShape,
                                  const GeomAPI_Shape::ShapeType toAvoid)
 {
   MY_EXPLORER->Init(theShape->impl<TopoDS_Shape>(),
-                   (TopAbs_ShapeEnum)toFind,
+                   ShapeType(theShape, toFind),
                    (TopAbs_ShapeEnum)toAvoid);
 }