Salome HOME
Issue #1865 : finalization of export of fields to GEOM
authormpv <mpv@opencascade.com>
Mon, 5 Dec 2016 13:41:57 +0000 (16:41 +0300)
committermpv <mpv@opencascade.com>
Mon, 5 Dec 2016 13:41:57 +0000 (16:41 +0300)
src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py
src/Model/Model_AttributeTables.cpp
src/Model/Model_AttributeTables.h
src/ModelAPI/ModelAPI_AttributeTables.h

index a67c736339ba18e1d8b8fddc18e41aebb8c972a8..5c9ec2bb4863d17f2c2111f1b6193c7ea9dd34e2 100644 (file)
@@ -155,6 +155,78 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
           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):
+        if theSelectionType == "vertex":
+            return 0
+        if theSelectionType == "edge":
+            return 1
+        if theSelectionType == "face":
+            return 2
+        if theSelectionType == "solid":
+            return 3
+        return -1
+
+    ## 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 steps
+        aStepsNum = aTables.tables()
+        for aStepIndex in range(0, aStepsNum):
+          aStamp = theField.intArray("stamps").value(aStepIndex)
+          aValues = []
+          aRows = aTables.rows()
+          aCols = aTables.columns()
+          for aRow in range(1, aRows): # no defaults
+            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)
+
     ## Exports all shapes and groups into the GEOM module.
     def execute(self):
         aSession = ModelAPI.ModelAPI_Session.get()
@@ -169,4 +241,5 @@ class ExportFeature(ModelAPI.ModelAPI_Feature):
         # Export bodies and groups
         self.exportBodies()
         self.exportGroups()
+        self.exportFields()
         pass
index 6bfe82d0709be39714b94ae2e7751edaedb78f05..b89e7446d5b635788e9088ad7c5d47f56f5bac58 100644 (file)
@@ -225,6 +225,26 @@ ModelAPI_AttributeTables::Value Model_AttributeTables::value(
   return aResult;
 }
 
+std::string Model_AttributeTables::valueStr(
+    const int theRow, const int theColumn, const int theTable)
+{
+  std::ostringstream aStr;
+  switch(myType) {
+  case ModelAPI_AttributeTables::DOUBLE:
+    aStr<<value(theRow, theColumn, theTable).myDouble;
+    break;
+  case ModelAPI_AttributeTables::BOOLEAN:
+    aStr<<(value(theRow, theColumn, theTable).myBool ? "True" :"False");
+    break;
+  case ModelAPI_AttributeTables::INTEGER:
+    aStr<<value(theRow, theColumn, theTable).myInt;
+    break;
+  case ModelAPI_AttributeTables::STRING:
+    aStr<<value(theRow, theColumn, theTable).myStr;
+    break;
+  }
+  return aStr.str();
+}
 
 //==================================================================================================
 Model_AttributeTables::Model_AttributeTables(TDF_Label& theLabel)
index 62ac72254dd5e04b16aed60b708a2f77b1332de1..3a036c6487cd19f19f58fca7d151b69c3a64e661 100644 (file)
@@ -52,6 +52,10 @@ public:
   MODEL_EXPORT virtual Value value(
     const int theRow, const int theColumn, const int theTable = 0);
 
+  /// Returns the value in the format of string (usefull for the python connection)
+  MODEL_EXPORT virtual std::string valueStr(
+    const int theRow, const int theColumn, const int theTable = 0);
+
 protected:
   /// Objects are created for features automatically
   MODEL_EXPORT Model_AttributeTables(TDF_Label& theLabel);
index 072dc2fd0ef5a3018e04a58e812ce971f0e2ff45..789e192b9b0a92aba57a73cdf269b5980b1db624 100644 (file)
@@ -63,6 +63,10 @@ public:
   MODELAPI_EXPORT virtual Value value(
     const int theRow, const int theColumn, const int theTable = 0) = 0;
 
+  /// Returns the value in the format of string (usefull for the python connection)
+  MODELAPI_EXPORT virtual std::string valueStr(
+    const int theRow, const int theColumn, const int theTable = 0) = 0;
+
   /// Returns the type of this class of attributes
   MODELAPI_EXPORT static std::string typeId()
   {