Salome HOME
Issue #1648: Dump Python in the High Level Parameterized Geometry API. Debug of namin...
[modules/shaper.git] / src / Model / Model_Data.cpp
index 1e63282bb2690aebc2fb5c809bc7dc8c3c38574d..60714f8becb2a6d490c21542327ee6954207acbf 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>
@@ -151,7 +152,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();
@@ -187,7 +190,7 @@ AttributePtr Model_Data::addAttribute(const std::string& theID, const std::strin
   return aResult;
 }
 
-// macro for gthe generic returning of the attribute by the ID
+// macro for the generic returning of the attribute by the ID
 #define GET_ATTRIBUTE_BY_ID(ATTR_TYPE, METHOD_NAME) \
   std::shared_ptr<ATTR_TYPE> Model_Data::METHOD_NAME(const std::string& theID) { \
     std::shared_ptr<ATTR_TYPE> aRes; \
@@ -211,6 +214,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)
 {
@@ -283,19 +287,31 @@ void Model_Data::sendAttributeUpdated(ModelAPI_Attribute* theAttr)
         ModelAPI_EventCreator::get()->sendUpdated(myObject, anEvent);
       }
     } else {
-      myWasChangedButBlocked = true;
+      // to avoid too many duplications do not add the same like the last
+      if (myWasChangedButBlocked.empty() || *(myWasChangedButBlocked.rbegin()) != theAttr)
+        myWasChangedButBlocked.push_back(theAttr);
     }
   }
 }
 
-void Model_Data::blockSendAttributeUpdated(const bool theBlock)
+void Model_Data::blockSendAttributeUpdated(const bool theBlock, const bool theSendMessage)
 {
   if (mySendAttributeUpdated == theBlock) {
     mySendAttributeUpdated = !theBlock;
-    if (mySendAttributeUpdated && myWasChangedButBlocked) { // so, now it is ok to send the update signal
-      static const Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED);
-      ModelAPI_EventCreator::get()->sendUpdated(myObject, anEvent);
-      myWasChangedButBlocked = false;
+    if (mySendAttributeUpdated && !myWasChangedButBlocked.empty()) { // so, now it is ok to send the update signal
+      if (theSendMessage) {
+        // make a copy to avoid iteration on modified list (may be cleared by attribute changed call)
+        std::list<ModelAPI_Attribute*> aWasChangedButBlocked = myWasChangedButBlocked;
+        myWasChangedButBlocked.clear();
+        std::list<ModelAPI_Attribute*>::iterator aChangedIter = aWasChangedButBlocked.begin();
+        for(; aChangedIter != aWasChangedButBlocked.end(); aChangedIter++) {
+          myObject->attributeChanged((*aChangedIter)->id());
+        }
+        static const Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED);
+        ModelAPI_EventCreator::get()->sendUpdated(myObject, anEvent);
+      } else {
+        myWasChangedButBlocked.clear();
+      }
     }
   }
 }
@@ -439,7 +455,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);
     }
   }
@@ -457,9 +474,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;
         }
       }
     }