]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Make RefAttr able point to attribute or to feature
authormpv <mikhail.ponikarov@opencascade.com>
Tue, 13 May 2014 05:46:38 +0000 (09:46 +0400)
committermpv <mikhail.ponikarov@opencascade.com>
Tue, 13 May 2014 05:46:38 +0000 (09:46 +0400)
src/Model/Model_AttributeRefAttr.cpp
src/Model/Model_AttributeRefAttr.h
src/ModelAPI/ModelAPI_AttributeRefAttr.h
src/SketchPlugin/SketchPlugin_Constraint.cpp
src/SketchPlugin/SketchPlugin_ConstraintDistance.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
   }
 }
index 8422966720018c66a861df5a622ef8200e4f05a4..f9d2bc42e2ff34f001030855f18c4767ee3ccc6b 100644 (file)
 class Model_AttributeRefAttr : public ModelAPI_AttributeRefAttr
 {
   Handle_TDF_Reference myRef; ///< reference to the feature label
-  Handle_TDataStd_Comment myID; ///< ID of the referenced attirbute
+   ///< ID of the referenced attirbute (empty if this is a reference to a feature)
+  Handle_TDataStd_Comment myID;
 public:
-  /// Defines the attribute referenced from this attribute
-  MODEL_EXPORT virtual void setValue(boost::shared_ptr<ModelAPI_Attribute> theAttr);
+  /// Returns true if this attribute references to a feature (not to the attribute)
+  MODEL_EXPORT virtual bool isFeature();
+
+  /// Defines the reference to the attribute
+  MODEL_EXPORT virtual void setAttr(boost::shared_ptr<ModelAPI_Attribute> theAttr);
 
   /// Returns attribute referenced from this attribute
-  MODEL_EXPORT virtual boost::shared_ptr<ModelAPI_Attribute> value();
+  MODEL_EXPORT virtual boost::shared_ptr<ModelAPI_Attribute> attr();
+
+  /// Defines the reference to the feature
+  MODEL_EXPORT virtual void setFeature(boost::shared_ptr<ModelAPI_Feature> theFeature);
+
+  /// Returns feature referenced from this attribute
+  MODEL_EXPORT virtual boost::shared_ptr<ModelAPI_Feature> feature();
 
 protected:
   /// Objects are created for features automatically
index d9c5f3a6041044750589e7112dd4c6ce8b7c8484..4fd8834669118d033d802c416da5250ec6152965 100644 (file)
@@ -9,18 +9,27 @@
 
 /**\class ModelAPI_AttributeRefAttr
  * \ingroup DataModel
- * \brief Attribute that contains reference to an attribute of a feature 
- * (located in the same document).
+ * \brief Attribute that contains reference to an attribute of a feature or reference to 
+ * a feature (switchable)
  */
 
 class ModelAPI_AttributeRefAttr : public ModelAPI_Attribute
 {
 public:
-  /// Defines the attribute referenced from this attribute
-  MODELAPI_EXPORT virtual void setValue(boost::shared_ptr<ModelAPI_Attribute> theAttr) = 0;
+  /// Returns true if this attribute references to a feature (not to the attribute)
+  MODELAPI_EXPORT virtual bool isFeature() = 0;
+
+  /// Defines the reference to the attribute
+  MODELAPI_EXPORT virtual void setAttr(boost::shared_ptr<ModelAPI_Attribute> theAttr) = 0;
 
   /// Returns attribute referenced from this attribute
-  MODELAPI_EXPORT virtual boost::shared_ptr<ModelAPI_Attribute> value() = 0;
+  MODELAPI_EXPORT virtual boost::shared_ptr<ModelAPI_Attribute> attr() = 0;
+
+  /// Defines the reference to the feature
+  MODELAPI_EXPORT virtual void setFeature(boost::shared_ptr<ModelAPI_Feature> theFeature) = 0;
+
+  /// Returns feature referenced from this attribute
+  MODELAPI_EXPORT virtual boost::shared_ptr<ModelAPI_Feature> feature() = 0;
 
   /// Returns the type of this class of attributes
   MODELAPI_EXPORT static std::string type() {return "RefAttr";}
index 6269e321360a820bbc535036a8db942b849a8dc0..e6c9d09fda26d39ef06abb2c1a1d0db7fb03565c 100644 (file)
@@ -28,8 +28,8 @@ void SketchPlugin_Constraint::addConstrainedObject(
 {
   if (!data()->attribute(theAttrID).get())
     data()->addAttribute(theAttrID, theReference->type());
-  boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-    data()->attribute(theAttrID))->setValue(theReference->value());
+  //boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
+  //  data()->attribute(theAttrID))->setValue(theReference->value());
 }
 
 void SketchPlugin_Constraint::getSketchParameters(
index 13ef22dd86cf0f3d1e06d3420b0f01930b01ea1a..6dfa0d0bd008e203e93b4803ccbcc48e6991d051 100644 (file)
@@ -67,8 +67,8 @@ void SketchPlugin_ConstraintDistance::setAttributes(
   // Assign reference to the first point
   myAttrList.push_back(CONSTRAINT_ATTR_POINT_A);
   data()->addAttribute(CONSTRAINT_ATTR_POINT_A, ModelAPI_AttributeRefAttr::type());
-  boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-    data()->attribute(CONSTRAINT_ATTR_POINT_A))->setValue(thePoint);
+  //boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
+  //  data()->attribute(CONSTRAINT_ATTR_POINT_A))->setValue(thePoint);
 
   // Assign reference to the entity
   std::string aCurAttr;
@@ -95,14 +95,14 @@ void SketchPlugin_ConstraintDistance::setAttributes(
   // Assign reference to the first point
   myAttrList.push_back(CONSTRAINT_ATTR_POINT_A);
   data()->addAttribute(CONSTRAINT_ATTR_POINT_A, ModelAPI_AttributeRefAttr::type());
-  boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-    data()->attribute(CONSTRAINT_ATTR_POINT_A))->setValue(thePointA);
+  //boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
+  //  data()->attribute(CONSTRAINT_ATTR_POINT_A))->setValue(thePointA);
 
   // Assign reference to the second point
   myAttrList.push_back(CONSTRAINT_ATTR_POINT_B);
   data()->addAttribute(CONSTRAINT_ATTR_POINT_B, ModelAPI_AttributeRefAttr::type());
-  boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
-    data()->attribute(CONSTRAINT_ATTR_POINT_B))->setValue(thePointB);
+  //boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(
+  //  data()->attribute(CONSTRAINT_ATTR_POINT_B))->setValue(thePointB);
 }
 
 void SketchPlugin_ConstraintDistance::setAttributes(