X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Data.cpp;h=b384b49d77846c29b47a856eeca3280fe9cc5bac;hb=7b76b534d04e5d50f1ad319e58e0e22c6bb742a3;hp=a9ac29bf05dc6d9303df6c33972a99b63a89fb58;hpb=912b947536177180af5bd6d620d84e9ebc05be66;p=modules%2Fshaper.git diff --git a/src/Model/Model_Data.cpp b/src/Model/Model_Data.cpp index a9ac29bf0..b384b49d7 100644 --- a/src/Model/Model_Data.cpp +++ b/src/Model/Model_Data.cpp @@ -4,74 +4,282 @@ #include #include +#include #include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + #include -using namespace std; +#include Model_Data::Model_Data() { } -void Model_Data::setLabel(TDF_Label& theLab) +void Model_Data::setLabel(TDF_Label theLab) { myLab = theLab; } -string Model_Data::getName() +std::string Model_Data::name() { Handle(TDataStd_Name) aName; if (myLab.FindAttribute(TDataStd_Name::GetID(), aName)) - return string(TCollection_AsciiString(aName->Get()).ToCString()); - return ""; // not defined + return std::string(TCollection_AsciiString(aName->Get()).ToCString()); + return ""; // not defined } -void Model_Data::setName(string theName) +void Model_Data::setName(const std::string& theName) { - TDataStd_Name::Set(myLab, theName.c_str()); + bool isModified = false; + Handle(TDataStd_Name) aName; + if (!myLab.FindAttribute(TDataStd_Name::GetID(), aName)) { + TDataStd_Name::Set(myLab, theName.c_str()); + isModified = true; + } else { + isModified = !aName->Get().IsEqual(theName.c_str()); + if (isModified) + aName->Set(theName.c_str()); + } } -void Model_Data::addAttribute(string theID, string theAttrType) +void Model_Data::addAttribute(const std::string& theID, const std::string theAttrType) { TDF_Label anAttrLab = myLab.FindChild(myAttrs.size() + 1); ModelAPI_Attribute* anAttr = 0; - if (theAttrType == ModelAPI_AttributeDocRef::type()) + if (theAttrType == ModelAPI_AttributeDocRef::type()) { anAttr = new Model_AttributeDocRef(anAttrLab); - else if (theAttrType == ModelAPI_AttributeDouble::type()) + } else if (theAttrType == Model_AttributeInteger::type()) { + anAttr = new Model_AttributeInteger(anAttrLab); + } else if (theAttrType == ModelAPI_AttributeDouble::type()) { anAttr = new Model_AttributeDouble(anAttrLab); + } else if (theAttrType == Model_AttributeBoolean::type()) { + anAttr = new Model_AttributeBoolean(anAttrLab); + } else if (theAttrType == Model_AttributeString::type()) { + anAttr = new Model_AttributeString(anAttrLab); + } else if (theAttrType == ModelAPI_AttributeReference::type()) { + anAttr = new Model_AttributeReference(anAttrLab); + } else if (theAttrType == ModelAPI_AttributeRefAttr::type()) { + anAttr = new Model_AttributeRefAttr(anAttrLab); + } else if (theAttrType == ModelAPI_AttributeRefList::type()) { + anAttr = new Model_AttributeRefList(anAttrLab); + } else if (theAttrType == GeomData_Point::type()) { + anAttr = new GeomData_Point(anAttrLab); + } else if (theAttrType == GeomData_Dir::type()) { + anAttr = new GeomData_Dir(anAttrLab); + } else if (theAttrType == GeomData_Point2D::type()) { + anAttr = new GeomData_Point2D(anAttrLab); + } + if (anAttr) { + myAttrs[theID] = boost::shared_ptr(anAttr); + anAttr->setObject(myObject); + } else { + Events_Error::send("Can not create unknown type of attribute " + theAttrType); + } +} + +boost::shared_ptr Model_Data::docRef(const std::string& theID) +{ + std::map >::iterator aFound = myAttrs.find(theID); + if (aFound == myAttrs.end()) { + // TODO: generate error on unknown attribute request and/or add mechanism for customization + return boost::shared_ptr(); + } + boost::shared_ptr aRes = boost::dynamic_pointer_cast< + ModelAPI_AttributeDocRef>(aFound->second); + if (!aRes) { + // TODO: generate error on invalid attribute type request + } + return aRes; +} + +boost::shared_ptr Model_Data::real(const std::string& theID) +{ + std::map >::iterator aFound = myAttrs.find(theID); + if (aFound == myAttrs.end()) { + // TODO: generate error on unknown attribute request and/or add mechanism for customization + return boost::shared_ptr(); + } + boost::shared_ptr aRes = boost::dynamic_pointer_cast< + ModelAPI_AttributeDouble>(aFound->second); + if (!aRes) { + // TODO: generate error on invalid attribute type request + } + return aRes; +} + +boost::shared_ptr Model_Data::integer(const std::string& theID) +{ + std::map >::iterator aFound = myAttrs.find(theID); + if (aFound == myAttrs.end()) { + // TODO: generate error on unknown attribute request and/or add mechanism for customization + return boost::shared_ptr(); + } + boost::shared_ptr aRes = boost::dynamic_pointer_cast< + ModelAPI_AttributeInteger>(aFound->second); + if (!aRes) { + // TODO: generate error on invalid attribute type request + } + return aRes; +} + +boost::shared_ptr Model_Data::boolean(const std::string& theID) +{ + std::map >::iterator aFound = myAttrs.find(theID); + if (aFound == myAttrs.end()) { + // TODO: generate error on unknown attribute request and/or add mechanism for customization + return boost::shared_ptr(); + } + boost::shared_ptr aRes = boost::dynamic_pointer_cast< + ModelAPI_AttributeBoolean>(aFound->second); + if (!aRes) { + // TODO: generate error on invalid attribute type request + } + return aRes; +} - if (anAttr) - myAttrs[theID] = std::shared_ptr(anAttr); - else - ; // TODO: generate error on unknown attribute request and/or add mechanism for customization +boost::shared_ptr Model_Data::string(const std::string& theID) +{ + std::map >::iterator aFound = myAttrs.find(theID); + if (aFound == myAttrs.end()) { + // TODO: generate error on unknown attribute request and/or add mechanism for customization + return boost::shared_ptr(); + } + boost::shared_ptr aRes = + boost::dynamic_pointer_cast(aFound->second); + if (!aRes) { + // TODO: generate error on invalid attribute type request + } + return aRes; + +} + +boost::shared_ptr Model_Data::reference(const std::string& theID) +{ + std::map >::iterator aFound = myAttrs.find(theID); + if (aFound == myAttrs.end()) { + // TODO: generate error on unknown attribute request and/or add mechanism for customization + return boost::shared_ptr(); + } + boost::shared_ptr aRes = boost::dynamic_pointer_cast< + ModelAPI_AttributeReference>(aFound->second); + if (!aRes) { + // TODO: generate error on invalid attribute type request + } + return aRes; } -shared_ptr Model_Data::docRef(const string theID) +boost::shared_ptr Model_Data::refattr(const std::string& theID) { - map >::iterator aFound = myAttrs.find(theID); + std::map >::iterator aFound = myAttrs.find(theID); if (aFound == myAttrs.end()) { // TODO: generate error on unknown attribute request and/or add mechanism for customization - return std::shared_ptr(); + return boost::shared_ptr(); } - shared_ptr aRes = - dynamic_pointer_cast(aFound->second); + boost::shared_ptr aRes = boost::dynamic_pointer_cast< + ModelAPI_AttributeRefAttr>(aFound->second); if (!aRes) { // TODO: generate error on invalid attribute type request } return aRes; } -shared_ptr Model_Data::real(const string theID) +boost::shared_ptr Model_Data::reflist(const std::string& theID) { - map >::iterator aFound = myAttrs.find(theID); + std::map >::iterator aFound = myAttrs.find(theID); if (aFound == myAttrs.end()) { // TODO: generate error on unknown attribute request and/or add mechanism for customization - return std::shared_ptr(); + return boost::shared_ptr(); } - shared_ptr aRes = - dynamic_pointer_cast(aFound->second); + boost::shared_ptr aRes = boost::dynamic_pointer_cast< + ModelAPI_AttributeRefList>(aFound->second); if (!aRes) { // TODO: generate error on invalid attribute type request } return aRes; } + +boost::shared_ptr Model_Data::attribute(const std::string& theID) +{ + boost::shared_ptr aResult; + if (myAttrs.find(theID) == myAttrs.end()) // no such attribute + return aResult; + return myAttrs[theID]; +} + +const std::string& Model_Data::id(const boost::shared_ptr& theAttr) +{ + std::map >::iterator anAttr = myAttrs.begin(); + for (; anAttr != myAttrs.end(); anAttr++) { + if (anAttr->second == theAttr) + return anAttr->first; + } + // not found + static std::string anEmpty; + return anEmpty; +} + +bool Model_Data::isEqual(const boost::shared_ptr& theData) +{ + boost::shared_ptr aData = boost::dynamic_pointer_cast(theData); + if (aData) + return myLab.IsEqual(aData->myLab) == Standard_True ; + return false; +} + +bool Model_Data::isValid() +{ + return !myLab.IsNull() && myLab.HasAttribute(); +} + +std::list > Model_Data::attributes(const std::string& theType) +{ + std::list > aResult; + std::map >::iterator anAttrsIter = + myAttrs.begin(); + for (; anAttrsIter != myAttrs.end(); anAttrsIter++) { + if (theType.empty() || anAttrsIter->second->attributeType() == theType) { + aResult.push_back(anAttrsIter->second); + } + } + return aResult; +} + +std::list Model_Data::attributesIDs(const std::string& theType) +{ + std::list aResult; + std::map >::iterator anAttrsIter = + myAttrs.begin(); + for (; anAttrsIter != myAttrs.end(); anAttrsIter++) { + if (theType.empty() || anAttrsIter->second->attributeType() == theType) { + aResult.push_back(anAttrsIter->first); + } + } + return aResult; +} + +void Model_Data::sendAttributeUpdated(ModelAPI_Attribute* theAttr) +{ + theAttr->setInitialized(); + if (theAttr->isArgument()) { + static const Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); + ModelAPI_EventCreator::get()->sendUpdated(myObject, anEvent); + } +} + +void Model_Data::erase() +{ + if (!myLab.IsNull()) + myLab.ForgetAllAttributes(); +}