X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModel%2FModel_Data.cpp;h=b384b49d77846c29b47a856eeca3280fe9cc5bac;hb=7b76b534d04e5d50f1ad319e58e0e22c6bb742a3;hp=ee81944226cff7f0e24914eb285d56973459cabc;hpb=50eee93b00efc7e0e2595937d9cba45e131ca8cb;p=modules%2Fshaper.git diff --git a/src/Model/Model_Data.cpp b/src/Model/Model_Data.cpp index ee8194422..b384b49d7 100644 --- a/src/Model/Model_Data.cpp +++ b/src/Model/Model_Data.cpp @@ -4,37 +4,43 @@ #include #include +#include #include #include #include #include +#include +#include +#include + #include #include #include -#include -#include "Model_Events.h" #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) { bool isModified = false; Handle(TDataStd_Name) aName; @@ -46,141 +52,189 @@ void Model_Data::setName(string theName) if (isModified) aName->Set(theName.c_str()); } - if (isModified) { - static Events_ID anEvent = Events_Loop::eventByName(EVENT_FEATURE_UPDATED); - Model_FeatureUpdatedMessage aMsg(myFeature, anEvent); - Events_Loop::loop()->send(aMsg, false); - } } -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 == ModelAPI_AttributeReference::type()) + } 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()) + } else if (theAttrType == ModelAPI_AttributeRefAttr::type()) { anAttr = new Model_AttributeRefAttr(anAttrLab); - else if (theAttrType == ModelAPI_AttributeRefList::type()) + } else if (theAttrType == ModelAPI_AttributeRefList::type()) { anAttr = new Model_AttributeRefList(anAttrLab); - else if (theAttrType == GeomData_Point::type()) + } else if (theAttrType == GeomData_Point::type()) { anAttr = new GeomData_Point(anAttrLab); - else if (theAttrType == GeomData_Dir::type()) + } else if (theAttrType == GeomData_Dir::type()) { anAttr = new GeomData_Dir(anAttrLab); - else if (theAttrType == GeomData_Point2D::type()) + } else if (theAttrType == GeomData_Point2D::type()) { anAttr = new GeomData_Point2D(anAttrLab); - + } if (anAttr) { myAttrs[theID] = boost::shared_ptr(anAttr); - anAttr->setFeature(myFeature); + anAttr->setObject(myObject); + } else { + Events_Error::send("Can not create unknown type of attribute " + theAttrType); } - else - ; // TODO: generate error on unknown attribute request and/or add mechanism for customization } -boost::shared_ptr Model_Data::docRef(const string theID) +boost::shared_ptr Model_Data::docRef(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 boost::shared_ptr(); } - boost::shared_ptr aRes = - boost::dynamic_pointer_cast(aFound->second); + 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 string theID) +boost::shared_ptr Model_Data::real(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 boost::shared_ptr(); } - boost::shared_ptr aRes = - boost::dynamic_pointer_cast(aFound->second); + 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; } -boost::shared_ptr Model_Data::reference(const string theID) +boost::shared_ptr Model_Data::string(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 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(aFound->second); + boost::shared_ptr aRes = boost::dynamic_pointer_cast< + ModelAPI_AttributeReference>(aFound->second); if (!aRes) { // TODO: generate error on invalid attribute type request } return aRes; } -boost::shared_ptr Model_Data::refattr(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 boost::shared_ptr(); } - boost::shared_ptr aRes = - boost::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; } -boost::shared_ptr Model_Data::reflist(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 boost::shared_ptr(); } - boost::shared_ptr aRes = - boost::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 Model_Data::attribute(const std::string& theID) { boost::shared_ptr aResult; - if (myAttrs.find(theID) == myAttrs.end()) // no such attribute + if (myAttrs.find(theID) == myAttrs.end()) // no such attribute return aResult; return myAttrs[theID]; } -const string& Model_Data::id(const boost::shared_ptr theAttr) +const std::string& Model_Data::id(const boost::shared_ptr& theAttr) { - map >::iterator anAttr = myAttrs.begin(); - for(; anAttr != myAttrs.end(); anAttr++) { - if (anAttr->second == theAttr) return anAttr->first; + std::map >::iterator anAttr = myAttrs.begin(); + for (; anAttr != myAttrs.end(); anAttr++) { + if (anAttr->second == theAttr) + return anAttr->first; } // not found - static string anEmpty; + static std::string anEmpty; return anEmpty; } -bool Model_Data::isEqual(const boost::shared_ptr theData) +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 myLab.IsEqual(aData->myLab) == Standard_True ; return false; } @@ -189,33 +243,43 @@ bool Model_Data::isValid() return !myLab.IsNull() && myLab.HasAttribute(); } -#include -#include -#include -#include - -void Model_Data::store(const boost::shared_ptr& theShape) +std::list > Model_Data::attributes(const std::string& theType) { - // the simplest way is to keep this attribute here, on Data - // TODO: add naming structure in separated document for shape storage - TNaming_Builder aBuilder(myLab); - if (!theShape) return; // bad shape - TopoDS_Shape aShape = theShape->impl(); - if (aShape.IsNull()) return; // null shape inside - - aBuilder.Generated(aShape); + 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; } -boost::shared_ptr Model_Data::shape() +std::list Model_Data::attributesIDs(const std::string& theType) { - Handle(TNaming_NamedShape) aName; - if (myLab.FindAttribute(TNaming_NamedShape::GetID(), aName)) { - TopoDS_Shape aShape = aName->Get(); - if (!aShape.IsNull()) { - boost::shared_ptr aRes(new GeomAPI_Shape); - aRes->setImpl(new TopoDS_Shape(aShape)); - return aRes; + 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 boost::shared_ptr(); + 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(); }