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);
}
}
-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)
// 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
}
}
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
/**\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";}
{
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(
// 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;
// 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(