]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Correct working with default values in fields: store all not-selected entities with...
authormpv <mpv@opencascade.com>
Mon, 12 Dec 2016 12:48:25 +0000 (15:48 +0300)
committermpv <mpv@opencascade.com>
Mon, 12 Dec 2016 12:48:41 +0000 (15:48 +0300)
src/ExchangePlugin/ExchangePlugin_ExportFeature.cpp
src/ExchangePlugin/ExchangePlugin_ImportFeature.cpp
src/Model/Model_AttributeSelectionList.cpp
src/Model/Model_AttributeTables.cpp
src/Model/Model_Data.cpp
src/Model/Model_Document.cpp
src/Model/Model_Session.cpp

index 95b47c8699e313513191cda0c552e0669dc217ce..5a75630be79aaca93bf0819ada9ed4adc8c021bc 100644 (file)
@@ -43,6 +43,7 @@
 #include <XAO_Group.hxx>
 #include <XAO_Field.hxx>
 #include <XAO_Xao.hxx>
+#include <XAO_Geometry.hxx>
 
 #include <ExchangePlugin_Tools.h>
 
@@ -175,6 +176,27 @@ void ExchangePlugin_ExportFeature::exportFile(const std::string& theFileName,
   }
 }
 
+/// Returns XAO string by the value from the table
+static std::string valToString(const ModelAPI_AttributeTables::Value& theVal,
+  const ModelAPI_AttributeTables::ValueType& theType) {
+  std::ostringstream aStr; // the resulting string value
+  switch(theType) {
+  case ModelAPI_AttributeTables::BOOLEAN:
+    aStr<<(theVal.myBool ? "true" : "false");
+    break;
+  case ModelAPI_AttributeTables::INTEGER:
+    aStr<<theVal.myInt;
+    break;
+  case ModelAPI_AttributeTables::DOUBLE:
+    aStr<<theVal.myDouble;
+    break;
+  case ModelAPI_AttributeTables::STRING:
+    aStr<<theVal.myStr;
+    break;
+  }
+  return aStr.str();
+}
+
 void ExchangePlugin_ExportFeature::exportXAO(const std::string& theFileName)
 {
   try {
@@ -289,6 +311,7 @@ void ExchangePlugin_ExportFeature::exportXAO(const std::string& theFileName)
       aStep->setStamp(aStampIndex);
       int aNumElements = isWholePart ? aXaoField->countElements() : aTables->rows();
       int aNumComps = aTables->columns();
+      std::set<int> aFilledIDs; // to fill the rest by defaults
       // omit default values first row
       for(int aRow = isWholePart ? 0 : 1; aRow < aNumElements; aRow++) {
         for(int aCol = 0; aCol < aNumComps; aCol++) {
@@ -300,37 +323,33 @@ void ExchangePlugin_ExportFeature::exportXAO(const std::string& theFileName)
             // complex conversion of reference id to element index
             int aReferenceID = aSelection->Id();
             std::string aReferenceString = XAO::XaoUtils::intToString(aReferenceID);
-            int anElementID =
+            anElementID =
               aXao.getGeometry()->getElementIndexByReference(aFieldDimension, aReferenceString);
           }
 
           ModelAPI_AttributeTables::Value aVal = aTables->value(
             isWholePart ? 0 : aRow, aCol, aStepIndex);
-          std::ostringstream aStr; // string value
-          switch(aTables->type()) {
-          case ModelAPI_AttributeTables::BOOLEAN:
-            aStr<<(aVal.myBool ? "True" : "False");
-            break;
-          case ModelAPI_AttributeTables::INTEGER:
-            aStr<<aVal.myInt;
-            break;
-          case ModelAPI_AttributeTables::DOUBLE:
-            aStr<<aVal.myDouble;
-            break;
-          case ModelAPI_AttributeTables::STRING:
-            aStr<<aVal.myStr;
-            break;
-          }
-          std::string aStrVal = aStr.str();
+          std::string aStrVal = valToString(aVal, aTables->type());
           aStep->setStringValue(isWholePart ? aRow : anElementID, aCol, aStrVal);
+          aFilledIDs.insert(anElementID);
+        }
+      }
+      if (!isWholePart) { // fill the rest values by default ones
+        XAO::GeometricElementList::iterator allElem = aXao.getGeometry()->begin(aFieldDimension);
+        for(; allElem != aXao.getGeometry()->end(aFieldDimension); allElem++) {
+          if (aFilledIDs.find(allElem->first) != aFilledIDs.end())
+            continue;
+          for(int aCol = 0; aCol < aNumComps; aCol++) {
+            ModelAPI_AttributeTables::Value aVal = aTables->value(0, aCol, aStepIndex); // default
+            std::string aStrVal = valToString(aVal, aTables->type());
+            aStep->setStringValue(allElem->first, aCol, aStrVal);
+          }
         }
       }
     }
   }
 
-
   // exporting
-
   XAOExport(theFileName, &aXao, anError);
 
   if (!anError.empty()) {
index 17a02d85e78b378fc753a46d90dea9007a6d3688..def3e6e6200b692d1d7e39a15cec0e56891cb8d3 100644 (file)
@@ -216,10 +216,9 @@ void ExchangePlugin_ImportFeature::importXAO(const std::string& theFileName)
     aSelectionList->setSelectionType(aSelectionType);
     // limitation: now in XAO fields are related to everything, so, iterate all sub-shapes to fill
     int aCountSelected = aXaoField->countElements();
-    int aResults = document()->size(ModelAPI_ResultBody::group());
-    for(int a = 0; a < aResults && aCountSelected; a++) {
-      ResultBodyPtr aBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(
-        document()->object(ModelAPI_ResultBody::group(), a));
+    std::list<ResultPtr>::const_iterator aResIter = results().begin();
+    for(; aResIter != results().end() && aCountSelected; aResIter++) {
+      ResultBodyPtr aBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(*aResIter);
       if (!aBody.get())
         continue;
       // check that only results that were created before this field are used
@@ -266,7 +265,7 @@ void ExchangePlugin_ImportFeature::importXAO(const std::string& theFileName)
           std::string aValStr = (*aStepIter)->getStringValue(aRow - 1, aCol);
           switch(aType) {
           case ModelAPI_AttributeTables::BOOLEAN:
-            aVal.myBool = aValStr == "True";
+            aVal.myBool = aValStr == "true";
             break;
           case ModelAPI_AttributeTables::INTEGER:
             aVal.myInt = atoi(aValStr.c_str());
@@ -282,6 +281,38 @@ void ExchangePlugin_ImportFeature::importXAO(const std::string& theFileName)
         }
       }
     }
+    // remove everything with zero-values: zeroes are treated as defaults
+    std::set<int> aRowsToRemove;
+    for(int aRow = 1; aRow < aTables->rows(); aRow++) {
+      bool isZero = true;
+      for(int aCol = 0; aCol < aTables->columns() && isZero; aCol++) {
+        for(int aStepIndex = 0; aStepIndex != aTables->tables() && isZero; aStepIndex++) {
+          if (aTables->valueStr(aRow, aCol, aStepIndex) != aTables->valueStr(0, aCol, aStepIndex))
+            isZero = false;
+        }
+      }
+      if (isZero)
+        aRowsToRemove.insert(aRow - 1); // -1 to make prepared for remove from SelectionList
+    }
+    if (!aRowsToRemove.empty()) { // move usefull rows on bottom to the up of the tables
+      // number of rows passed during going through: the current rows will
+      // be moved up for this value
+      int aRemovedPassed = 0;
+      for(int aRow = 1; aRow < aTables->rows(); aRow++) {
+        if (aRowsToRemove.find(aRow - 1) != aRowsToRemove.end()) {
+          aRemovedPassed++;
+        } else if (aRemovedPassed != 0) { // copy the line up
+          for(int aCol = 0; aCol < aTables->columns(); aCol++) {
+            for(int aTable = 0; aTable != aTables->tables(); aTable++) {
+              aTables->setValue(
+                aTables->value(aRow, aCol, aTable), aRow - aRemovedPassed, aCol, aTable);
+            }
+          }
+        }
+      }
+      aTables->setSize(aTables->rows() - aRemovedPassed, aTables->columns(), aTables->tables());
+      aSelectionList->remove(aRowsToRemove); // remove also selected elements
+    }
   }
   // Top avoid problems in Object Browser update: issue #1647.
   ModelAPI_EventCreator::get()->sendReordered(
index a6d25f7ad727fa7122b4ab756809b4c1e2d6a730..d8ea9da5c0c6c12616dace412a2947b6b1d53a89 100644 (file)
@@ -155,8 +155,8 @@ static void copyAttrs(TDF_Label theSource, TDF_Label theDestination) {
     // for named shape copy exact shapes (in NamedShape Paste method the CopyTool is used)
     Handle(TNaming_NamedShape) aNS = Handle(TNaming_NamedShape)::DownCast(anAttrIter.Value());
     if (aNS.IsNull()) {
-      // no relocation, empty map
-      Handle(TDF_RelocationTable) aRelocTable = new TDF_RelocationTable();
+      // no special relocation, empty map, but self-relocation is on: copy references w/o changes
+      Handle(TDF_RelocationTable) aRelocTable = new TDF_RelocationTable(Standard_True);
       anAttrIter.Value()->Paste(aTargetAttr, aRelocTable);
     } else {
       CopyNS(aNS, aTargetAttr);
index b89e7446d5b635788e9088ad7c5d47f56f5bac58..e7a5685b75e9efda8cea43e144f77410fd7ac057 100644 (file)
@@ -151,7 +151,7 @@ void Model_AttributeTables::setType(ModelAPI_AttributeTables::ValueType theType)
     // remove the old attr
     int aSize = myRows * myCols * myTables;
     if (aSize != 0) {
-      myLab.ForgetAttribute(MY_ARRAY_ID(theType));
+      myLab.ForgetAttribute(MY_ARRAY_ID(myType));
       myType = theType;
       int aTables = myTables;
       myTables = 0; // to let setSize know that there is no old array
index c60d07cd33bed1c9b7c1b7aec2726663db3f88fe..750b9103b7de3de0bbb1dcbd0c40e50b79b913b8 100644 (file)
@@ -629,7 +629,8 @@ static void copyAttrs(TDF_Label theSource, TDF_Label theDestination) {
            aTargetAttr = anAttrIter.Value()->NewEmpty();
       theDestination.AddAttribute(aTargetAttr);
     }
-    Handle(TDF_RelocationTable) aRelocTable = new TDF_RelocationTable(); // no relocation, empty map
+    // no special relocation, empty map, but self-relocation is on: copy references w/o changes
+    Handle(TDF_RelocationTable) aRelocTable = new TDF_RelocationTable(Standard_True);
     anAttrIter.Value()->Paste(aTargetAttr, aRelocTable);
   }
   // copy the sub-labels content
index d47d1ec0b41f7b6b8d7c2e2ddd243e7d6e7241f3..de77a7472c3908901d0b0031a0c10bbf9610cf9a 100755 (executable)
@@ -402,9 +402,13 @@ static bool isEqualContent(Handle(TDF_Attribute) theAttr1, Handle(TDF_Attribute)
     if (anArr1.IsNull() || anArr2.IsNull())
       return false;
     if (anArr1->Lower() == anArr2->Lower() && anArr1->Upper() == anArr2->Upper()) {
-      for(int a = anArr1->Lower(); a <= anArr1->Upper(); a++)
-        if (a != 1 && anArr1->Value(a) != anArr2->Value(a)) // second is for display
+      for(int a = anArr1->Lower(); a <= anArr1->Upper(); a++) {
+        if (a == 1 && // second is for display
+          anArr2->Label().Tag() == 1 && (anArr2->Label().Depth() == 4 || anArr2->Label().Depth() == 6))
+          continue;
+        if (anArr1->Value(a) != anArr2->Value(a))
           return false;
+      }
       return true;
     }
   } else if (Standard_GUID::IsEqual(theAttr1->ID(), TDataStd_IntegerArray::GetID())) {
index a68d98b0c847d6b6f8d45641e9db58d8093be330..4c98ca45008c8c01e0067c8276b54a6887102409 100644 (file)
@@ -324,7 +324,7 @@ std::shared_ptr<ModelAPI_Document> Model_Session::copy(
   Handle(TDF_DataSet) aDS = new TDF_DataSet;
   aDS->AddLabel(aSourceRoot);
   TDF_ClosureTool::Closure(aDS);
-  Handle(TDF_RelocationTable) aRT = new TDF_RelocationTable;
+  Handle(TDF_RelocationTable) aRT = new TDF_RelocationTable(Standard_True);
   aRT->SetRelocation(aSourceRoot, aTargetRoot);
   TDF_CopyTool::Copy(aDS, aRT);