Salome HOME
[PythonAPI] Example Platine. Comlete version
[modules/shaper.git] / src / ConnectorPlugin / ConnectorPlugin_ExportFeature.py
index dc4f87de38720b2095d1bcb49b26a52d3d026d1d..ee7dafeb75a59090c40e0220310541c30e945fb1 100644 (file)
@@ -1,42 +1,52 @@
-"""
-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
+import GeomAlgoAPI
 
 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
+    ## This feature is action: has no property pannel and executes immideately.
     def isAction(self):
         return True
 
-    # The action is not placed into the histiry anyway
-    #def isInHistory(self):
-    #    return False
-
+    ## This feature has no attributes, as it is action.
     def initAttributes(self):
-      # This feature has no attributes, it is action
       pass
-        
+
+    ## Exports all bodies
     def exportBodies(self):
-        # Get all bodies
+        global ShapeIndex
         kResultBodyType = "Bodies"
         aPartSize = self.Part.size(kResultBodyType)
         if aPartSize == 0:
@@ -44,18 +54,40 @@ 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)
-            self.geompy.addToStudy(aBrep, "NewGeomShape_{0}".format(idx + 1))
-            self.geomObjects.append([aShape, aBrep])
+            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)
+            
+        self.geompy.addToStudy(aBrep, aName)
+        self.brep = aBrep
 
+    ## Exports all groups
     def exportGroups(self):
         # iterate all features to find groups
         aFeaturesNum = self.Part.size("Features")
@@ -65,18 +97,23 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
             aSelectionList = aFeature.data().selectionList("group_list")
             # if a group has been found
             if aSelectionList:
+                aFeature = ModelAPI.objectToFeature(aFeature)
+                if aFeature.firstResult() is not None:
+                  aName = aFeature.firstResult().data().name()
                 groupIndex = groupIndex + 1
-                self.createGroupFromList(aSelectionList, "NewGeomGroup_{0}".format(groupIndex))
+                self.createGroupFromList(aSelectionList, aName)
                      
-    def createGroupFromList(self, theSelectionList, theGroupName):     
+    ## 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()
+            anID = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.id(self.shape, aSelection.value())
             Ids.append(anID)
             if aSelection.value().isVertex():
                 groupType = "VERTEX"
@@ -87,21 +124,21 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
             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)
+        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()
+        ## 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()
+        self.exportGroups()
         pass