Salome HOME
Added the system of reinitialization of attributes instead of re-creation of them...
[modules/shaper.git] / src / Model / Model_Data.cpp
index 402dbd67982d5353a6d92e69e8175e62bf15cdd1..75c9732427a00276a7014e35ac74630fd246e0a9 100644 (file)
@@ -8,6 +8,7 @@
 #include <Model_AttributeDocRef.h>
 #include <Model_AttributeInteger.h>
 #include <Model_AttributeDouble.h>
+#include <Model_AttributeDoubleArray.h>
 #include <Model_AttributeReference.h>
 #include <Model_AttributeRefAttr.h>
 #include <Model_AttributeRefList.h>
@@ -111,6 +112,10 @@ void Model_Data::setName(const std::string& theName)
   }
   if (mySendAttributeUpdated && isModified)
     ModelAPI_ObjectRenamedMessage::send(myObject, anOldName, theName, this);
+  if (isModified && myObject && myObject->document()) {
+    std::dynamic_pointer_cast<Model_Document>(myObject->document())->
+      changeNamingName(anOldName, theName);
+  }
 }
 
 AttributePtr Model_Data::addAttribute(const std::string& theID, const std::string theAttrType)
@@ -121,18 +126,9 @@ AttributePtr Model_Data::addAttribute(const std::string& theID, const std::strin
   if (theAttrType == ModelAPI_AttributeDocRef::typeId()) {
     anAttr = new Model_AttributeDocRef(anAttrLab);
   } else if (theAttrType == Model_AttributeInteger::typeId()) {
-    Model_AttributeInteger* anAttribute = new Model_AttributeInteger();
-    // Expression should use the same label to support backward compatibility
-    TDF_Label anExpressionLab = anAttrLab;
-    anAttribute->myExpression.reset(new Model_ExpressionInteger(anExpressionLab));
-    anAttribute->myIsInitialized = anAttribute->myExpression->isInitialized();
-    anAttr = anAttribute;
+    anAttr = new Model_AttributeInteger(anAttrLab);
   } else if (theAttrType == ModelAPI_AttributeDouble::typeId()) {
-    Model_AttributeDouble* anAttribute = new Model_AttributeDouble();
-    TDF_Label anExpressionLab = anAttrLab.FindChild(1);
-    anAttribute->myExpression.reset(new Model_ExpressionDouble(anExpressionLab));
-    anAttribute->myIsInitialized = anAttribute->myExpression->isInitialized();
-    anAttr = anAttribute;
+    anAttr = new Model_AttributeDouble(anAttrLab);
   } else if (theAttrType == Model_AttributeBoolean::typeId()) {
     anAttr = new Model_AttributeBoolean(anAttrLab);
   } else if (theAttrType == Model_AttributeString::typeId()) {
@@ -151,7 +147,9 @@ AttributePtr Model_Data::addAttribute(const std::string& theID, const std::strin
     anAttr = new Model_AttributeRefAttrList(anAttrLab);
   } else if (theAttrType == ModelAPI_AttributeIntArray::typeId()) {
     anAttr = new Model_AttributeIntArray(anAttrLab);
-  } 
+  } else if (theAttrType == ModelAPI_AttributeDoubleArray::typeId()) {
+    anAttr = new Model_AttributeDoubleArray(anAttrLab);
+  }
   // create also GeomData attributes here because only here the OCAF structure is known
   else if (theAttrType == GeomData_Point::typeId()) {
     GeomData_Point* anAttribute = new GeomData_Point();
@@ -211,6 +209,7 @@ GET_ATTRIBUTE_BY_ID(ModelAPI_AttributeRefAttr, refattr);
 GET_ATTRIBUTE_BY_ID(ModelAPI_AttributeRefList, reflist);
 GET_ATTRIBUTE_BY_ID(ModelAPI_AttributeRefAttrList, refattrlist);
 GET_ATTRIBUTE_BY_ID(ModelAPI_AttributeIntArray, intArray);
+GET_ATTRIBUTE_BY_ID(ModelAPI_AttributeDoubleArray, realArray);
 
 std::shared_ptr<ModelAPI_Attribute> Model_Data::attribute(const std::string& theID)
 {
@@ -451,7 +450,8 @@ void Model_Data::addBackReference(FeaturePtr theFeature, std::string theAttrID,
     // the second condition is for history upper than concealment causer, so the feature result may
     // be displayed and previewed; also for avoiding of quick show/hide on history
     // moving deep down
-    if (aRes && !theFeature->isDisabled()) {
+    if (aRes && !theFeature->isDisabled() && 
+        !ModelAPI_Session::get()->validators()->isUnconcealed(aRes, theFeature)) {
       aRes->setIsConcealed(true);
     }
   }
@@ -469,9 +469,11 @@ void Model_Data::updateConcealmentFlag()
           std::shared_ptr<ModelAPI_Result> aRes = 
             std::dynamic_pointer_cast<ModelAPI_Result>(myObject);
           if (aRes.get()) {
-            aRes->setIsConcealed(true); // set concealed
+            if (!ModelAPI_Session::get()->validators()->isUnconcealed(aRes, aFeature)) {
+              aRes->setIsConcealed(true); // set concealed
+              return;
+            }
           }
-          return;
         }
       }
     }
@@ -631,15 +633,10 @@ void Model_Data::copyTo(std::shared_ptr<ModelAPI_Data> theTarget)
 {
   TDF_Label aTargetRoot = std::dynamic_pointer_cast<Model_Data>(theTarget)->label();
   copyAttrs(myLab, aTargetRoot);
-  // make initialized the initialized attributes
-  std::map<std::string, std::shared_ptr<ModelAPI_Attribute> >::iterator aMyIter = myAttrs.begin();
-  for(; aMyIter != myAttrs.end(); aMyIter++) {
-    if (aMyIter->second->isInitialized()) {
-      AttributePtr aTargetAttr = theTarget->attribute(aMyIter->first);
-      if (aTargetAttr)
-        aTargetAttr->setInitialized();
-    }
-  }
+  // reinitialize Model_Attributes by TDF_Attributes set
+  std::shared_ptr<Model_Data> aTData = std::dynamic_pointer_cast<Model_Data>(theTarget);
+  aTData->myAttrs.clear();
+  theTarget->owner()->initAttributes(); // reinit feature attributes
 }
 
 bool Model_Data::isInHistory()