Salome HOME
Make RefAttr able point to attribute or to feature
[modules/shaper.git] / src / Model / Model_AttributeRefAttr.cpp
index bedda92d5d92a704c0465cd42609a00dd1e52018..a74bb11ba2e24a22b0b0044357ee0fe3b7c307cd 100644 (file)
 
 using namespace std;
 
-void Model_AttributeRefAttr::setValue(boost::shared_ptr<ModelAPI_Attribute> theAttr)
+bool Model_AttributeRefAttr::isFeature()
 {
-  if (value() != theAttr) {
+  return myID->Get().Length() == 0;
+}
+
+void Model_AttributeRefAttr::setAttr(boost::shared_ptr<ModelAPI_Attribute> theAttr)
+{
+  boost::shared_ptr<Model_Data> aData = 
+    boost::dynamic_pointer_cast<Model_Data>(theAttr->feature()->data());
+  string anID = aData->id(theAttr);
+  if (feature() == theAttr->feature() && myID->Get().IsEqual(anID.c_str()))
+    return; // nothing is changed
+
+  myRef->Set(aData->label());
+  myID->Set(aData->id(theAttr).c_str());
+
+  static Events_ID anEvent = Events_Loop::eventByName(EVENT_FEATURE_UPDATED);
+  Model_FeatureUpdatedMessage aMsg(feature(), anEvent);
+  Events_Loop::loop()->send(aMsg);
+}
+
+boost::shared_ptr<ModelAPI_Attribute> Model_AttributeRefAttr::attr()
+{
+  boost::shared_ptr<ModelAPI_Feature> aFeature = feature();
+  if (aFeature) {
     boost::shared_ptr<Model_Data> aData = 
-      boost::dynamic_pointer_cast<Model_Data>(theAttr->feature()->data());
-    if (myRef.IsNull()) {
-      boost::shared_ptr<Model_Data> aMyData = 
-        boost::dynamic_pointer_cast<Model_Data>(feature()->data());
-      TDF_Reference::Set(aMyData->label(), aData->label());
-    } else {
-      myRef->Set(aData->label());
-    }
-    myID->Set(aData->id(theAttr).c_str());
+      boost::dynamic_pointer_cast<Model_Data>(aFeature->data());
+    return aData->attribute(TCollection_AsciiString(myID->Get()).ToCString());
+  }
+  // not initialized
+  return boost::shared_ptr<ModelAPI_Attribute>();
+}
+
+void Model_AttributeRefAttr::setFeature(boost::shared_ptr<ModelAPI_Feature> theFeature)
+{
+  if (myID->Get().Length() != 0 || feature() != theFeature) {
+    boost::shared_ptr<Model_Data> aData = 
+      boost::dynamic_pointer_cast<Model_Data>(theFeature->data());
+    myRef->Set(aData->label());
+    myID->Set(""); // feature is identified by the empty ID
 
     static Events_ID anEvent = Events_Loop::eventByName(EVENT_FEATURE_UPDATED);
     Model_FeatureUpdatedMessage aMsg(feature(), anEvent);
@@ -31,21 +58,19 @@ void Model_AttributeRefAttr::setValue(boost::shared_ptr<ModelAPI_Attribute> theA
   }
 }
 
-boost::shared_ptr<ModelAPI_Attribute> Model_AttributeRefAttr::value()
+boost::shared_ptr<ModelAPI_Feature> Model_AttributeRefAttr::feature()
 {
-  if (!myRef.IsNull()) {
+  if (myRef->Get() != myRef->Label()) { // initialized
     boost::shared_ptr<Model_Document> aDoc = 
       boost::dynamic_pointer_cast<Model_Document>(feature()->document());
     if (aDoc) {
       TDF_Label aRefLab = myRef->Get();
       TDF_Label aFeatureLab = aRefLab.Father();
-      boost::shared_ptr<Model_Data> aData = 
-        boost::dynamic_pointer_cast<Model_Data>(aDoc->feature(aRefLab)->data());
-      return aData->attribute(TCollection_AsciiString(myID->Get()).ToCString());
+      return aDoc->feature(aRefLab);
     }
   }
   // not initialized
-  return boost::shared_ptr<ModelAPI_Attribute>();
+  return boost::shared_ptr<ModelAPI_Feature>();
 }
 
 Model_AttributeRefAttr::Model_AttributeRefAttr(TDF_Label& theLabel)
@@ -53,7 +78,7 @@ Model_AttributeRefAttr::Model_AttributeRefAttr(TDF_Label& theLabel)
   // check the attribute could be already presented in this doc (after load document)
   if (!theLabel.FindAttribute(TDataStd_Comment::GetID(), myID)) {
     // create attribute: not initialized by value yet
-    TDataStd_Comment::Set(theLabel, "");
-    // reference attribute is not set to the label!
+    myID = TDataStd_Comment::Set(theLabel, "");
+    myRef = TDF_Reference::Set(theLabel, theLabel); // not initialized: reference to itself
   }
 }