TAttrID2FunMap::const_iterator anEnd = __AttrID2FunMap__.end();
for(; anIter != anEnd; anIter++){
const TAttrID2FunMap::key_type& aKey = anIter->first;
- const TAttrID2FunMap::data_type& aValue = anIter->second;
+ const TAttrID2FunMap::mapped_type& aValue = anIter->second;
__GUID2AttrIDMap__[aValue.myGetGUID()] = aKey;
};
{
TAttrID2FunMap::const_iterator anIter = __AttrID2FunMap__.find(theType);
if(anIter != __AttrID2FunMap__.end()){
- const TAttrID2FunMap::data_type& aValue = anIter->second;
+ const TAttrID2FunMap::mapped_type& aValue = anIter->second;
return aValue.myGetGUID();
}
// create tree node GUID by name
}
//============================================================================
-SALOMEDS_SObject_i* SALOMEDS_SObject_i::New(SALOMEDS_Study_i* theStudy,
- const TDF_Label& theLabel)
+SALOMEDS_Study_i::TSObjectHolder
+SALOMEDS_SObject_i::New(SALOMEDS_Study_i* theStudy,
+ const TDF_Label& theLabel)
{
- SALOMEDS_SObject_i* aSObject = NULL;
+ SALOMEDS_Study_i::TSObjectHolder aSObjectHolder;
SALOMEDS_Study_i::TSObjectMap& anSObjectMap = theStudy->GetSObjectMap();
SALOMEDS_Study_i::TSObjectMap::const_iterator anIter = anSObjectMap.find(theLabel);
if(anIter != anSObjectMap.end())
- aSObject = anIter->second;
+ aSObjectHolder = anIter->second;
else{
- TCollection_AsciiString anEntry;
- TDF_Tool::Entry(theLabel,anEntry);
- //cout<<"SALOMEDS_SObject_i::New - "<<anEntry.ToCString()<<endl;
- aSObject = new SALOMEDS_SObject_i(theStudy,theLabel);
- anSObjectMap[theLabel] = aSObject;
+ SALOMEDS_SObject_i* aSObject = new SALOMEDS_SObject_i(theStudy,theLabel);
+ aSObjectHolder.first = aSObject;
+ aSObjectHolder.second = aSObject->_this();
+ anSObjectMap[theLabel] = aSObjectHolder;
+
+ //TCollection_AsciiString anEntry;
+ //TDF_Tool::Entry(theLabel,anEntry);
+ //cout<<"APO - SALOMEDS_SObject_i::New - anEntry = "<<anEntry.ToCString()<<endl;
}
- return aSObject;
+ return aSObjectHolder;
+}
+
+SALOMEDS_SObject_i*
+SALOMEDS_SObject_i::NewPtr(SALOMEDS_Study_i* theStudy,
+ const TDF_Label& theLabel)
+{
+ return New(theStudy,theLabel).first;
+}
+
+SALOMEDS::SObject_var
+SALOMEDS_SObject_i::NewRef(SALOMEDS_Study_i* theStudy,
+ const TDF_Label& theLabel)
+{
+ return New(theStudy,theLabel).second;
}
//============================================================================
* Purpose :
*/
//============================================================================
+TDF_Label SALOMEDS_SObject_i::GetFatherComponentLabel()
+{
+ TDF_Label aLabel = _lab;
+ while(!SALOMEDS_SComponent_i::IsA(aLabel) && !aLabel.IsRoot())
+ aLabel = aLabel.Father();
+
+ return aLabel;
+}
+
SALOMEDS::SComponent_ptr SALOMEDS_SObject_i::GetFatherComponent()
{
- TDF_Label aSCompLabel = _lab;
- while(!SALOMEDS_SComponent_i::IsA(aSCompLabel) && !aSCompLabel.IsRoot()){
- aSCompLabel = aSCompLabel.Father();
- }
- return SALOMEDS_SComponent_i::New(_study,aSCompLabel)->_this();
+ TDF_Label aSCompLabel = GetFatherComponentLabel();
+
+ return SALOMEDS_SComponent_i::NewRef(_study,aSCompLabel)._retn();
}
//============================================================================
//============================================================================
SALOMEDS::SObject_ptr SALOMEDS_SObject_i::GetFather()
{
- return SALOMEDS_SObject_i::New(_study,_lab.Father())->_this();
+ return SALOMEDS_SObject_i::NewRef(_study,_lab.Father())._retn();
}
//============================================================================
if (!_lab.FindAttribute(TDF_Reference::GetID(),aRef))
return false;
- theSObject = SALOMEDS_SObject_i::New(_study,aRef->Get())->_this();
+ theSObject = SALOMEDS_SObject_i::NewRef(_study,aRef->Get())._retn();
return true;
}
if(aLabel.IsNull())
return false;
- theSObject = SALOMEDS_SObject_i::New(_study,aLabel)->_this();
+ theSObject = SALOMEDS_SObject_i::NewRef(_study,aLabel)._retn();
return true;
}
* Purpose : Returns list of all attributes for this sobject
*/
//============================================================================
-SALOMEDS_GenericAttribute_i*
+SALOMEDS_SObject_i::TAttrHolder
SALOMEDS_SObject_i::_FindGenAttribute(const Handle(TDF_Attribute)& theAttr)
{
- SALOMEDS_GenericAttribute_i* anGenAttr = NULL;
-
- Standard_GUID aGUID = theAttr->ID();
-
- TGUID2AttrIDMap::const_iterator anIter = __GUID2AttrIDMap__.find(aGUID);
- if(anIter != __GUID2AttrIDMap__.end())
- {
- const ::TAttributeID& anAttributeID = anIter->second;
- TAttrMap::const_iterator anIter = myAttrMap.find(anAttributeID);
- if(anIter != myAttrMap.end())
- anGenAttr = anIter->second;
-
- if(anGenAttr != NULL){
- if(anGenAttr->GetAttribute() != theAttr)
- anGenAttr->SetAttribute(theAttr);
- }else{
- anGenAttr = _CreateGenAttribute(theAttr,anAttributeID.c_str());
- }
- }
-
- return anGenAttr;
+ std::string aType = GetType(theAttr);
+ return _FindGenAttribute(aType.c_str());
}
Standard_Integer i = 0;
for(TDF_AttributeIterator iter(_lab); iter.More(); iter.Next()) {
Handle(TDF_Attribute) anAttr = iter.Value();
- if(SALOMEDS_GenericAttribute_i* anGenAttr = _FindGenAttribute(anAttr))
+ TAttrHolder anAttrHolder = _FindGenAttribute(anAttr);
+ SALOMEDS::GenericAttribute_var anGenAttr = anAttrHolder.second;
+ if(!anGenAttr->_is_nil())
{
aSeqOfAttr->length(++i);
- aSeqOfAttr[i-1] = anGenAttr->_this();
+ aSeqOfAttr[i-1] = anGenAttr._retn();
}
}
}
* Purpose : Find attribute of given type on this SObject
*/
//============================================================================
-SALOMEDS_GenericAttribute_i*
+SALOMEDS_SObject_i::TAttrHolder
SALOMEDS_SObject_i::_CreateGenAttribute(const Handle(TDF_Attribute)& theAttr,
const char* theType)
{
-
+ SALOMEDS_GenericAttribute_i* anAttr;
TAttrID2FunMap::const_iterator anIter = __AttrID2FunMap__.find(theType);
if(anIter != __AttrID2FunMap__.end()){
- const TAttrID2FunMap::data_type& aValue = anIter->second;
+ const TAttrID2FunMap::mapped_type& aValue = anIter->second;
- if(aValue.myIsCheckLockedStudy())
- _study->CheckLocked();
+ //if(aValue.myIsCheckLockedStudy()) // mpv 03.02.05: creation of CORBA objects does not modify the study
+ // _study->CheckLocked();
- return aValue.myNewInstance(theAttr,this);
+ anAttr = aValue.myNewInstance(theAttr,this);
+ return TAttrHolder(anAttr,anAttr->_this());
}
if(strncmp(theType,"AttributeTreeNode",17) == 0){
- return new SALOMEDS_AttributeTreeNode_i(theAttr,this);
+ anAttr = new SALOMEDS_AttributeTreeNode_i(theAttr,this);
+ return TAttrHolder(anAttr,anAttr->_this());
}
if(strncmp(theType,"AttributeUserID",15) == 0){
- return new SALOMEDS_AttributeUserID_i(theAttr,this);
+ anAttr = new SALOMEDS_AttributeUserID_i(theAttr,this);
+ return TAttrHolder(anAttr,anAttr->_this());
}
- return NULL;
+ return TAttrHolder();
}
-SALOMEDS_GenericAttribute_i*
+SALOMEDS_SObject_i::TAttrHolder
SALOMEDS_SObject_i::_FindGenAttribute(const char* theType)
{
- SALOMEDS_GenericAttribute_i* anGenAttr = NULL;
+ TAttrHolder anAttrHolder;
TAttrMap::const_iterator anIter = myAttrMap.find(theType);
if(anIter != myAttrMap.end())
- anGenAttr = anIter->second;
+ anAttrHolder = anIter->second;
Standard_GUID aGUID = ::GetGUID(theType);
Handle(TDF_Attribute) anAttr;
if(_lab.FindAttribute(aGUID,anAttr)){
- if(anGenAttr != NULL){
- if(anGenAttr->GetAttribute() != anAttr)
- anGenAttr->SetAttribute(anAttr);
+ SALOMEDS_GenericAttribute_i* aGenAttr = anAttrHolder.first;
+ if(aGenAttr != NULL){
+ if(aGenAttr->GetAttribute() != anAttr)
+ aGenAttr->SetAttribute(anAttr);
}else{
- anGenAttr = _CreateGenAttribute(anAttr,theType);
+ anAttrHolder = _CreateGenAttribute(anAttr,theType);
}
- if(anGenAttr != NULL)
- myAttrMap[theType] = anGenAttr;
+ aGenAttr = anAttrHolder.first;
+ if(aGenAttr != NULL)
+ myAttrMap[theType] = anAttrHolder;
}else{
- myAttrMap.erase(theType);
+ //myAttrMap.erase(theType);
//if(anGenAttr != NULL)
// anGenAttr->Destroy();
+ return TAttrHolder();
}
- return anGenAttr;
-}
-
-
-SALOMEDS::GenericAttribute_ptr
-SALOMEDS_SObject_i::_FindCORBAAttribute(const char* theType)
-{
- if(SALOMEDS_GenericAttribute_i* anGenAttr = _FindGenAttribute(theType))
- return anGenAttr->_this();
- return SALOMEDS::GenericAttribute::_nil();
+ return anAttrHolder;
}
SALOMEDS_SObject_i::FindAttribute(SALOMEDS::GenericAttribute_out theAttribute,
const char* theType)
{
- theAttribute = _FindCORBAAttribute(theType);
- return !CORBA::is_nil(theAttribute);
+ TAttrHolder anAttr = _FindGenAttribute(theType);
+ SALOMEDS::GenericAttribute_var anGenAttr = anAttr.second;
+ if(!CORBA::is_nil(anGenAttr)){
+ theAttribute = SALOMEDS::GenericAttribute::_duplicate(anGenAttr);
+ return true;
+ }
+ return false;
}
Handle(TDF_Attribute) anAttr;
TAttrID2FunMap::const_iterator anIter = __AttrID2FunMap__.find(theType);
if(anIter != __AttrID2FunMap__.end()){
- const TAttrID2FunMap::data_type& aValue = anIter->second;
+ const TAttrID2FunMap::mapped_type& aValue = anIter->second;
if(aValue.myIsCheckLockedStudy())
_study->CheckLocked();
if(!_lab.FindAttribute(aGUID,anAttr)){
_study->CheckLocked();
anAttr = TDataStd_TreeNode::Set(_lab,aGUID);
- _lab.AddAttribute(anAttr);
return anAttr;
}
}
if(!_lab.FindAttribute(aGUID,anAttr)){
_study->CheckLocked();
anAttr = TDataStd_UAttribute::Set(_lab,aGUID);
- _lab.AddAttribute(anAttr);
return anAttr;
}
}
SALOMEDS::GenericAttribute_ptr
SALOMEDS_SObject_i::FindOrCreateAttribute(const char* theType)
{
- if(SALOMEDS_GenericAttribute_i* anGenAttr = _FindGenAttribute(theType))
- return anGenAttr->_this();
+ TAttrHolder anAttrHolder = _FindGenAttribute(theType);
+ SALOMEDS::GenericAttribute_var anGenAttr = anAttrHolder.second;
+ if(!anGenAttr->_is_nil())
+ return anGenAttr._retn();
+
Handle(TDF_Attribute) anAttr = _AddAttribute(theType);
if(!anAttr.IsNull()){
- if(SALOMEDS_GenericAttribute_i* anGenAttr = _CreateGenAttribute(anAttr,theType)){
- return anGenAttr->_this();
- }
+ anAttrHolder = _CreateGenAttribute(anAttr,theType);
+ anGenAttr = anAttrHolder.second;
+ if(!anGenAttr->_is_nil())
+ return anGenAttr._retn();
}
+
return SALOMEDS::GenericAttribute::_nil();
}
}
TAttrMap::iterator anIter = myAttrMap.find(theType);
if(anIter != myAttrMap.end()){
- myAttrMap.erase(anIter);
+ //myAttrMap.erase(anIter);
}
_lab.ForgetAttribute(::GetGUID(theType));
}
+
+void SALOMEDS_SObject_i::OnRemove()
+{
+ Handle(TDF_Reference) aReference;
+ if(_lab.FindAttribute(TDF_Reference::GetID(),aReference)){
+ Handle(SALOMEDS_TargetAttribute) aTarget;
+ if(aReference->Get().FindAttribute(SALOMEDS_TargetAttribute::GetID(),aTarget))
+ aTarget->Remove(_lab);
+ }
+
+ Handle(SALOMEDS_IORAttribute) anAttr; // postponed removing of CORBA objects
+ if(_lab.FindAttribute(SALOMEDS_IORAttribute::GetID(),anAttr)){
+ _study->AddPostponed(TCollection_AsciiString(anAttr->Get()).ToCString());
+ }
+
+ //myAttrMap.clear();
+
+ //SALOMEDS_Study_i::TSObjectMap& anSObjectMap = _study->GetSObjectMap();
+ //anSObjectMap.erase(_lab);
+}