Salome HOME
Merge branch 'master' into Dev_1.1.0
[modules/shaper.git] / src / ConnectorPlugin / ConnectorPlugin_ExportFeature.py
index 8b3163426638cdb97464bfe6bb8115deb36036ee..9f2768e4c68f875ee6a74bfc80fa07615238529e 100644 (file)
@@ -1,6 +1,6 @@
-"""
-Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-"""
+## @package Plugins
+#  ExportFeature class definition
+#  Copyright (C) 2014-20xx CEA/DEN, EDF R&D
 
 import EventsAPI
 import ModelAPI
@@ -8,40 +8,55 @@ import ModelAPI
 import salome
 from salome.geom import geomBuilder
 
+def getObjectIndex(theName):
+    aStudy = salome.myStudy
+    aId = 0
+    aObj = aStudy.FindObjectByName(theName, "GEOM")
+    while len(aObj) != 0:
+        aId = aId + 1
+        aName = theName + '_' + str(aId)
+        aObj = aStudy.FindObjectByName(aName, "GEOM")
+    return aId
 
+## @ingroup Plugins
+#  Feature to export all shapes and groups into the GEOM module
 class ExportFeature(ModelAPI.ModelAPI_Feature):
 
-    "Feature to create a box by drawing a sketch and extruding it"
-
+    ## The constructor.
     def __init__(self):
         ModelAPI.ModelAPI_Feature.__init__(self)
 
     @staticmethod
+    ## Export kind. Static.
     def ID():
         return "ExportToGEOM"
 
+    ## Returns the kind of a feature.
     def getKind(self):
         return ExportFeature.ID()
 
-    # This feature is action: has no property pannel and executes immideately
-    def isAction(self):
-    #    return True
+    ## This feature is action: has no property pannel and executes immideately.
+    def isAction(self):
+        return True
 
-    def isInHistory(self):
-        return False
+    # 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):
-        # This feature has no attributes, but should perfore some actions on initialization
-        aSession = ModelAPI.ModelAPI_Session.get()
-        aPart = aSession.activeDocument()
-        # Get all bodies
+      pass
+
+    ## Exports all bodies
+    def exportBodies(self):
+        global ShapeIndex
         kResultBodyType = "Bodies"
-        aPartSize = aPart.size(kResultBodyType)
+        aPartSize = self.Part.size(kResultBodyType)
         if aPartSize == 0:
             EventsAPI.Events_Error_send("No results in the active document")
             return
-
-        anObjList = [aPart.object(kResultBodyType, idx) for idx in xrange(aPartSize)]
+          
+        anObjList = [self.Part.object(kResultBodyType, idx) for idx in xrange(aPartSize)]     
         for idx, anObject in enumerate(anObjList):
             aResult = ModelAPI.modelAPI_Result(anObject)
             aBodyResult = ModelAPI.modelAPI_ResultBody(aResult)
@@ -50,10 +65,71 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
             aShape = aBodyResult.shape()
             aDump = aShape.getShapeStream()
             # Load shape to SALOME Geom
-            geompy = geomBuilder.New(salome.myStudy)
-            aBrep = geompy.RestoreShape(aDump)
-            geompy.addToStudy(aBrep, "NewGeomShape_{0}".format(idx))
+            aBrep = self.geompy.RestoreShape(aDump)
+            aName = aBodyResult.data().name()
+            
+            # Make unique name
+            aId = getObjectIndex(aName)
+            if aId != 0:
+                aName = aName + '_' + str(aId)
+            
+            self.geompy.addToStudy(aBrep, aName)
+            self.geomObjects.append([aShape, aBrep])
+
+    ## Exports all groups
+    def exportGroups(self):
+        # iterate all features to find groups
+        aFeaturesNum = self.Part.size("Features")
+        groupIndex = 0
+        for anIndex in range(0, aFeaturesNum):
+            aFeature = self.Part.object("Features", anIndex)
+            aSelectionList = aFeature.data().selectionList("group_list")
+            # if a group has been found
+            if aSelectionList:
+                groupIndex = groupIndex + 1
+                self.createGroupFromList(aSelectionList, "NewGeomGroup_{0}".format(groupIndex))
+                     
+    ## 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
+    def createGroupFromList(self, theSelectionList, theGroupName):
+        # iterate on all selected entities of the group
+        # and get the corresponding ID
+        aSelectionNum = theSelectionList.size()
+        Ids = []
+        for aSelIndex in range(0, aSelectionNum):
+            aSelection = theSelectionList.value(aSelIndex)
+            aSelectionContext = aSelection.context()
+            anID = aSelection.Id()
+            Ids.append(anID)
+            if aSelection.value().isVertex():
+                groupType = "VERTEX"
+            elif aSelection.value().isEdge():
+                groupType = "EDGE" 
+            elif aSelection.value().isFace():
+                groupType = "FACE"
+            else:
+                groupType = "SOLID"
 
+        # iterate on exported objects and check if the current
+        # group refers to this object
+        for obj in self.geomObjects: 
+            if aSelectionContext.shape().isEqual(obj[0]):
+                aGroup = self.geompy.CreateGroup(obj[1], self.geompy.ShapeType[groupType])
+                self.geompy.UnionIDs(aGroup,Ids)
+                self.geompy.addToStudyInFather(obj[1], aGroup, theGroupName)
+          
+    ## Exports all shapes and groups into the GEOM module.
     def execute(self):
-        # Nothing to execute: all logic would be in the initAttributes
+        aSession = ModelAPI.ModelAPI_Session.get()
+        ## Get active document
+        self.Part = aSession.activeDocument()
+        ## List of objects created in the old geom for later use
+        self.geomObjects = []
+        ## geomBuilder tool
+        self.geompy = geomBuilder.New(salome.myStudy)
+       
+        # Export bodies and groups
+        self.exportBodies()
+        self.exportGroups()
         pass