Salome HOME
Issue #1659 New widget for supporting optional inputs : correction for enclosed cases.
[modules/shaper.git] / src / ConnectorPlugin / ConnectorPlugin_ExportFeature.py
index ee7dafeb75a59090c40e0220310541c30e945fb1..a67c736339ba18e1d8b8fddc18e41aebb8c972a8 100644 (file)
@@ -4,6 +4,7 @@
 
 import EventsAPI
 import ModelAPI
+import GeomAPI
 import GeomAlgoAPI
 
 import salome
@@ -26,6 +27,10 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
     ## The constructor.
     def __init__(self):
         ModelAPI.ModelAPI_Feature.__init__(self)
+        ## Shape that will be exported (the compound if there are several exported bodies)
+        self.shape = None
+        ## BRep representation of the exported shape (a stream that will be sent to GEOM and converted to GEOM object)
+        self.brep = None
 
     @staticmethod
     ## Export kind. Static.
@@ -50,10 +55,10 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
         kResultBodyType = "Bodies"
         aPartSize = self.Part.size(kResultBodyType)
         if aPartSize == 0:
-            EventsAPI.Events_Error_send("No results in the active document")
+            EventsAPI.Events_InfoMessage("ExportFeature","No results in the active document").send()
             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 +83,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 +107,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 +127,34 @@ 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)
+            # issue 1326: bodies that are already concealed did not exported, so groups should not be invalid
+            aContext =  ModelAPI.modelAPI_Result(aSelection.context())
+            if aContext is None or aContext.isConcealed() or aContext.isDisabled():
+                continue
+
             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())
+
+        if len(Ids) <> 0:
+          aGroup = self.geompy.CreateGroup(self.brep, self.geompy.ShapeType[groupType])
+          self.geompy.UnionIDs(aGroup,Ids)
+          self.geompy.addToStudyInFather(self.brep, 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):
         aSession = ModelAPI.ModelAPI_Session.get()
@@ -136,8 +163,9 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
         ## List of objects created in the old geom for later use
         self.geomObjects = []
         ## geomBuilder tool
+        salome.salome_init(0,1)
         self.geompy = geomBuilder.New(salome.myStudy)
-       
+
         # Export bodies and groups
         self.exportBodies()
         self.exportGroups()