Salome HOME
Implement ExportToGEOM via exportToXAO. Fix the issue #2198.
[modules/shaper.git] / src / ConnectorPlugin / ConnectorPlugin_ExportFeature.py
index 9f2768e4c68f875ee6a74bfc80fa07615238529e..b5d42602bdee9680dcb9dabfbe213faf69c10096 100644 (file)
@@ -1,22 +1,42 @@
+## Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+##
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Lesser General Public
+## License as published by the Free Software Foundation; either
+## version 2.1 of the License, or (at your option) any later version.
+##
+## This library is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public
+## License along with this library; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+## See http:##www.salome-platform.org/ or
+## email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+##
+
 ## @package Plugins
 #  ExportFeature class definition
-#  Copyright (C) 2014-20xx CEA/DEN, EDF R&D
 
-import EventsAPI
 import ModelAPI
+import ExchangeAPI
 
 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
+from salome.shaper import model
+
+import os
+
+def getTmpFileName(ext):
+    import tempfile
+    tempdir = tempfile.gettempdir()
+    tmp_file = tempfile.NamedTemporaryFile(suffix=".%s"%ext, prefix='shaper_', dir=tempdir, delete=False)
+    tmp_filename = tmp_file.name
+    return tmp_filename
 
 ## @ingroup Plugins
 #  Feature to export all shapes and groups into the GEOM module
@@ -25,6 +45,7 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
     ## The constructor.
     def __init__(self):
         ModelAPI.ModelAPI_Feature.__init__(self)
+        pass
 
     @staticmethod
     ## Export kind. Static.
@@ -35,90 +56,44 @@ class ExportFeature(ModelAPI.ModelAPI_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 immediately.
     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
 
-    ## Exports all bodies
-    def exportBodies(self):
-        global ShapeIndex
-        kResultBodyType = "Bodies"
-        aPartSize = self.Part.size(kResultBodyType)
-        if aPartSize == 0:
-            EventsAPI.Events_Error_send("No results in the active document")
+    ## Export the results, groups and fields via XAO
+    def exportViaXAO(self):
+        tmpXAOFile = getTmpFileName("xao")
+        self.tmpXAOFile = tmpXAOFile
+        #print "Export to %s"%tmpXAOFile
+        exportXAO = ExchangeAPI.exportToXAO(self.Part, tmpXAOFile, "automatic_shaper_export_to_XAO")
+        if not os.path.exists(tmpXAOFile) or os.stat(tmpXAOFile).st_size == 0:
+            exportXAO.feature().setError("Error in exportToXAO. No XAO file has been created.")
             return
-          
-        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)
-            if not aBodyResult:
-                continue
-            aShape = aBodyResult.shape()
-            aDump = aShape.getShapeStream()
-            # Load shape to SALOME Geom
-            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)
-          
+        imported, shape, subShapes, groups, fields = self.geompy.ImportXAO(tmpXAOFile)
+        self.geompy.addToStudy( shape, shape.GetName() )
+        # add sub-shapes and groups to the object browser
+        for obj in subShapes + groups:
+            name = obj.GetName()
+            self.geompy.addToStudyInFather(shape, obj, name)
+        # add fields to the object browser
+        for field in fields:
+            name = field.GetName()
+            self.geompy.addToStudyInFather(shape, field, name)
+            # add steps to the object browser
+            steps = field.getSteps()
+            for i_step in steps:
+                step = field.getStep(i_step)
+                i_stamp = step.GetStamp()
+                step_name = "Step %i %i"%(i_step, i_stamp)
+                self.geompy.addToStudyInFather( field, step, step_name )
+        # Remove the temporary file
+        os.remove(tmpXAOFile)
+        pass
+
     ## Exports all shapes and groups into the GEOM module.
     def execute(self):
         aSession = ModelAPI.ModelAPI_Session.get()
@@ -127,9 +102,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()
+
+        self.exportViaXAO()
+
         pass