Salome HOME
Copyright update 2022
[modules/shaper.git] / src / ConnectorPlugin / ConnectorPlugin_ExportFeature.py
index c59d9e249ad83e13c585245001a514866d5917bb..30e01b86ef0b9315fee681b8f79f560fa2da68bd 100644 (file)
@@ -1,24 +1,35 @@
+# Copyright (C) 2014-2022  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
+#
+
 ## @package Plugins
 #  ExportFeature class definition
-#  Copyright (C) 2014-20xx CEA/DEN, EDF R&D
 
-import EventsAPI
 import ModelAPI
-import GeomAPI
-import GeomAlgoAPI
+import ExchangeAPI
+import EventsAPI
 
 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
 
 ## @ingroup Plugins
 #  Feature to export all shapes and groups into the GEOM module
@@ -27,10 +38,7 @@ 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
+        pass
 
     @staticmethod
     ## Export kind. Static.
@@ -41,7 +49,7 @@ 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 panel and executes immediately.
     def isAction(self):
         return True
 
@@ -49,219 +57,59 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
     def initAttributes(self):
       pass
 
-    ## Exports all bodies
-    def exportBodies(self):
-        global ShapeIndex
-        kResultBodyType = "Bodies"
-        aPartSize = self.Part.size(kResultBodyType)
-        if aPartSize == 0:
-            EventsAPI.Events_InfoMessage("ExportFeature","No results in the active document").send()
-            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()
-            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")
-        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:
-                aFeature = ModelAPI.objectToFeature(aFeature)
-                if aFeature.firstResult() is not None:
-                  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
-    def createGroupFromList(self, theSelectionList, theGroupName):
-        # iterate on all selected entities of the group
-        # 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():
+    ## Export the results, groups and fields via XAO
+    def exportViaXAO(self):
+        # if part-set is active, iterate also parts
+        for isPart in (True, False):
+          aResultType = model.ModelAPI_ResultBody_group()
+          if isPart:
+            aResultType = model.ModelAPI_ResultPart_group()
+          # iterate all results of Part, export one by one due to issue 2882
+          for aResIndex in range(self.Part.size(aResultType)):
+            anObject = self.Part.object(aResultType, aResIndex)
+            aResult = model.objectToResult(anObject)
+            # do not export picture
+            if aResult.hasTexture() is True:
+              continue
+            if not aResult is None:
+              if (not aResult.shape() or aResult.shape().isNull()) and isPart:
+                aPart = model.modelAPI_ResultPart(aResult)
+                aPartDoc = aPart.partDoc()
+                if not aPartDoc or not aPartDoc.isOpened():
+                  EventsAPI.Events_InfoMessage("ExportToGEOM", "For export to GEOM some Part is not activated", self).send()
+                  return
+
+              if  not aResult.shape() or aResult.shape().isNull():
                 continue
-
-            anID = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.id(self.shape, aSelection.value())
-            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:
-                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)
-
-    ## Exports all fields
-    def exportFields(self):
-        # iterate all features to find fields
-        aFeaturesNum = self.Part.size("Features")
-        fieldIndex = 0
-        for anIndex in range(0, aFeaturesNum):
-            aFeature = self.Part.object("Features", anIndex)
-            aSelectionList = aFeature.data().selectionList("selected")
-            # if a field has been found
-            if aSelectionList:
-                aFeature = ModelAPI.objectToFeature(aFeature)
-                if aFeature.firstResult() is not None:
-                  aName = aFeature.firstResult().data().name()
-                fieldIndex = fieldIndex + 1
-                self.createFieldFromFeature(aFeature, aName)
-
-    ## Returns a type of the shape type in the old GEOM representation
-    def selectionDim(self, theSelectionType):
-        selType=theSelectionType.lower() # more or less independed approach
-        if selType== "vertex":
-            return 0
-        if selType== "edge":
-            return 1
-        if selType== "face":
-            return 2
-        if selType== "solid":
-            return 3
-        return -1
-
-    ## Returns a type of the shape type in the GeomAPI_Shape representation
-    def geomAPISelectionDim(self, theSelectionType):
-        selType=theSelectionType.lower() # more or less independed approach
-        if selType== "vertex":
-            return GeomAPI.GeomAPI_Shape.VERTEX
-        if selType== "edge":
-            return GeomAPI.GeomAPI_Shape.EDGE
-        if selType== "face":
-            return GeomAPI.GeomAPI_Shape.FACE
-        if selType== "solid":
-            return GeomAPI.GeomAPI_Shape.SOLID
-        return GeomAPI.GeomAPI_Shape.SHAPE
-
-    ## Creates a field by the field feature and the name
-    #  @param theField: the field feature
-    #  @param theFieldName: name of the field to create
-    def createFieldFromFeature(self, theField, theFieldName):
-        # iterate on all selected entities of the field
-        # and get the corresponding ID
-        aTables = theField.tables("values")
-        aSelection = theField.selectionList("selected")
-
-        # set component names
-        aComps = theField.stringArray("components_names")
-        aCompNames = []
-        aCompNum = aComps.size()
-        for aCompIndex in range(0, aCompNum):
-          aCompNames.append(aComps.value(aCompIndex))
-
-        #if len(Ids) <> 0:
-        aDim = self.selectionDim(aSelection.selectionType())
-        aResField = self.geompy.CreateField(self.brep, theFieldName, aTables.type(), aDim, aCompNames)
-        #self.geompy.UnionIDs(theField,Ids)
-        self.geompy.addToStudyInFather(self.brep, aResField, theFieldName)
-
-        # set default values to all not filled sub-shapes (fields in GEOM support only full set of subs)
-        Ids={}
-        anExp = GeomAPI.GeomAPI_ShapeExplorer(self.shape, self.geomAPISelectionDim(aSelection.selectionType()))
-        while anExp.more():
-          anID = GeomAlgoAPI.GeomAlgoAPI_CompoundBuilder.id(self.shape, anExp.current())
-          if anID != 0:
-            Ids[anID]=anExp.current()
-          anExp.next()
-
-        SelectedIds={}
-        for aSelIndex in range(aSelection.size()):
-          selShape = aSelection.value(aSelIndex).value()
-          # searching for this shape in Ids
-          for a in Ids.items():
-            if (a[1].isSame(selShape)):
-              SelectedIds[a[0]] = aSelIndex
-
-        # values here are in the same order as in field
-        listOfValues = Ids.items()
-        listOfValues.sort()
-        # set steps
-        aStepsNum = aTables.tables()
-        for aStepIndex in range(0, aStepsNum):
-          aStamp = theField.intArray("stamps").value(aStepIndex)
-          aValues = []
-          for aValId in listOfValues:
-            aRow = 0 # default value if not from selection
-            if SelectedIds.has_key(aValId[0]): # take the value from the table
-              aRow = SelectedIds[aValId[0]] + 1 # plus one to avoid default string
-            aCols = aTables.columns()
-            for aCol in range(0, aCols):
-              aVal = aTables.valueStr(aRow, aCol, aStepIndex)
-              if aTables.type() == 0: # bool
-                if aVal == "True":
-                  aVal = True
-                else:
-                  aVal = False
-              elif aTables.type() == 1: # int
-                aVal = int(aVal)
-              elif aTables.type() == 2: # double
-                aVal = float(aVal)
-              aValues.append(aVal)
-          aResField.addStep(aStepIndex + 1, aStamp, aValues)
+              tmpXAOFile = model.getTmpFileName("shaper_", ".xao")
+              self.tmpXAOFile = tmpXAOFile
+              #print "Export to %s"%tmpXAOFile
+              exportXAO = ExchangeAPI.exportToXAO(self.Part, tmpXAOFile, model.selection(aResult), "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
+              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
+          pass
+        pass
 
     ## Exports all shapes and groups into the GEOM module.
     def execute(self):
@@ -271,11 +119,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)
+        salome.salome_init(1)
+        self.geompy = geomBuilder.New()
+
+        self.exportViaXAO()
 
-        # Export bodies and groups
-        self.exportBodies()
-        self.exportGroups()
-        self.exportFields()
         pass