void PropertyLinkSubList::setValues(const std::vector<DocumentObject*>& lValue,const std::vector<std::string>& lSubNames) { if (lValue.size() != lSubNames.size()) throw Base::ValueError("PropertyLinkSubList::setValues: size of subelements list != size of objects list"); #ifndef USE_OLD_DAG //maintain backlinks. if (getContainer() && getContainer()->isDerivedFrom(App::DocumentObject::getClassTypeId())) { App::DocumentObject* parent = static_cast<DocumentObject*>(getContainer()); // before accessing internals make sure the object is not about to be destroyed // otherwise the backlink contains dangling pointers if (!parent->testStatus(ObjectStatus::Destroy)) { //_lValueList can contain items multiple times, but we trust the document //object to ensure that this works for(auto *obj : _lValueList) obj->_removeBackLink(parent); //maintain backlinks. lValue can contain items multiple times, but we trust the document //object to ensure that the backlink is only added once for(auto *obj : lValue) obj->_addBackLink(parent); } } #endif aboutToSetValue(); _lValueList = lValue; _lSubList = lSubNames; hasSetValue(); }
void PropertyLinkSubList::setValue(DocumentObject* lValue,const char* SubName) { #ifndef USE_OLD_DAG //maintain backlinks if (getContainer() && getContainer()->isDerivedFrom(App::DocumentObject::getClassTypeId())) { App::DocumentObject* parent = static_cast<DocumentObject*>(getContainer()); // before accessing internals make sure the object is not about to be destroyed // otherwise the backlink contains dangling pointers if (!parent->testStatus(ObjectStatus::Destroy)) { for(auto *obj : _lValueList) obj->_removeBackLink(parent); if (lValue) lValue->_addBackLink(parent); } } #endif if (lValue) { aboutToSetValue(); _lValueList.resize(1); _lValueList[0]=lValue; _lSubList.resize(1); _lSubList[0]=SubName; hasSetValue(); } else { aboutToSetValue(); _lValueList.clear(); _lSubList.clear(); hasSetValue(); } }
PropertyLinkSub::~PropertyLinkSub() { //in case this property is dynamically removed #ifndef USE_OLD_DAG if (_pcLinkSub && getContainer() && getContainer()->isDerivedFrom(App::DocumentObject::getClassTypeId())) { App::DocumentObject* parent = static_cast<DocumentObject*>(getContainer()); // before accessing internals make sure the object is not about to be destroyed // otherwise the backlink contains dangling pointers if (!parent->testStatus(ObjectStatus::Destroy)) { if (_pcLinkSub) _pcLinkSub->_removeBackLink(parent); } } #endif }
PropertyLinkList::~PropertyLinkList() { //in case this property gety dynamically removed #ifndef USE_OLD_DAG //maintain the back link in the DocumentObject class if (!_lValueList.empty() && getContainer() && getContainer()->isDerivedFrom(App::DocumentObject::getClassTypeId())) { App::DocumentObject* parent = static_cast<DocumentObject*>(getContainer()); // before accessing internals make sure the object is not about to be destroyed // otherwise the backlink contains dangling pointers if (!parent->testStatus(ObjectStatus::Destroy)) { for(auto *obj : _lValueList) obj->_removeBackLink(parent); } } #endif }
void PropertyLink::setValue(App::DocumentObject * lValue) { aboutToSetValue(); #ifndef USE_OLD_DAG // maintain the back link in the DocumentObject class if it is from a document object if (getContainer() && getContainer()->isDerivedFrom(App::DocumentObject::getClassTypeId())) { App::DocumentObject* parent = static_cast<DocumentObject*>(getContainer()); // before accessing internals make sure the object is not about to be destroyed // otherwise the backlink contains dangling pointers if (!parent->testStatus(ObjectStatus::Destroy)) { if (_pcLink) _pcLink->_removeBackLink(parent); if (lValue) lValue->_addBackLink(parent); } } #endif _pcLink=lValue; hasSetValue(); }
void PropertyLinkSub::setValue(App::DocumentObject * lValue, const std::vector<std::string> &SubList) { aboutToSetValue(); #ifndef USE_OLD_DAG if (getContainer() && getContainer()->isDerivedFrom(App::DocumentObject::getClassTypeId())) { App::DocumentObject* parent = static_cast<DocumentObject*>(getContainer()); // before accessing internals make sure the object is not about to be destroyed // otherwise the backlink contains dangling pointers if (!parent->testStatus(ObjectStatus::Destroy)) { if (_pcLinkSub) _pcLinkSub->_removeBackLink(parent); if (lValue) lValue->_addBackLink(parent); } } #endif _pcLinkSub=lValue; _cSubList = SubList; hasSetValue(); }
void PropertyLinkList::setValues(const std::vector<DocumentObject*>& lValue) { aboutToSetValue(); #ifndef USE_OLD_DAG //maintain the back link in the DocumentObject class if (getContainer() && getContainer()->isDerivedFrom(App::DocumentObject::getClassTypeId())) { App::DocumentObject* parent = static_cast<DocumentObject*>(getContainer()); // before accessing internals make sure the object is not about to be destroyed // otherwise the backlink contains dangling pointers if (!parent->testStatus(ObjectStatus::Destroy)) { for(auto *obj : _lValueList) obj->_removeBackLink(parent); for(auto *obj : lValue) obj->_addBackLink(parent); } } #endif _lValueList = lValue; hasSetValue(); }
void PropertyLinkSubList::setValue(DocumentObject* lValue, const std::vector<string> &SubList) { #ifndef USE_OLD_DAG //maintain backlinks. if (getContainer() && getContainer()->isDerivedFrom(App::DocumentObject::getClassTypeId())) { App::DocumentObject* parent = static_cast<DocumentObject*>(getContainer()); // before accessing internals make sure the object is not about to be destroyed // otherwise the backlink contains dangling pointers if (!parent->testStatus(ObjectStatus::Destroy)) { //_lValueList can contain items multiple times, but we trust the document //object to ensure that this works for(auto *obj : _lValueList) obj->_removeBackLink(parent); //maintain backlinks. lValue can contain items multiple times, but we trust the document //object to ensure that the backlink is only added once if (lValue) lValue->_addBackLink(parent); } } #endif aboutToSetValue(); std::size_t size = SubList.size(); this->_lValueList.clear(); this->_lSubList.clear(); if (size == 0) { if (lValue) { this->_lValueList.push_back(lValue); this->_lSubList.push_back(std::string()); } } else { this->_lSubList = SubList; this->_lValueList.insert(this->_lValueList.begin(), size, lValue); } hasSetValue(); }