+
+/// makes copy of all attributes on the given label and all sub-labels
+static void copyAttrs(TDF_Label theSource, TDF_Label theDestination) {
+ TDF_AttributeIterator anAttrIter(theSource);
+ for(; anAttrIter.More(); anAttrIter.Next()) {
+ Handle(TDF_Attribute) aTargetAttr;
+ if (!theDestination.FindAttribute(anAttrIter.Value()->ID(), aTargetAttr)) {
+ // create a new attribute if not yet exists in the destination
+ aTargetAttr = anAttrIter.Value()->NewEmpty();
+ theDestination.AddAttribute(aTargetAttr);
+ }
+ // no special relocation, empty map, but self-relocation is on: copy references w/o changes
+ Handle(TDF_RelocationTable) aRelocTable = new TDF_RelocationTable(Standard_True);
+ anAttrIter.Value()->Paste(aTargetAttr, aRelocTable);
+ }
+ // copy the sub-labels content
+ TDF_ChildIterator aSubLabsIter(theSource);
+ for(; aSubLabsIter.More(); aSubLabsIter.Next()) {
+ copyAttrs(aSubLabsIter.Value(), theDestination.FindChild(aSubLabsIter.Value().Tag()));
+ }
+}
+
+void Model_Data::copyTo(std::shared_ptr<ModelAPI_Data> theTarget)
+{
+ TDF_Label aTargetRoot = std::dynamic_pointer_cast<Model_Data>(theTarget)->label();
+ copyAttrs(myLab, aTargetRoot);
+ // reinitialize Model_Attributes by TDF_Attributes set
+ std::shared_ptr<Model_Data> aTData = std::dynamic_pointer_cast<Model_Data>(theTarget);
+ aTData->myAttrs.clear();
+ theTarget->owner()->initAttributes(); // reinit feature attributes
+}
+
+bool Model_Data::isInHistory()
+{
+ return myFlags->Value(kFlagInHistory) == Standard_True;
+}
+
+void Model_Data::setIsInHistory(const bool theFlag)
+{
+ return myFlags->SetValue(kFlagInHistory, theFlag);
+}
+
+bool Model_Data::isDeleted()
+{
+ return myFlags->Value(kFlagDeleted) == Standard_True;
+}
+
+void Model_Data::setIsDeleted(const bool theFlag)
+{
+ return myFlags->SetValue(kFlagDeleted, theFlag);
+}
+
+bool Model_Data::isDisplayed()
+{
+ if (!myObject.get() || !myObject->document().get() || // object is in valid
+ myFlags->Value(kFlagDisplayed) != Standard_True) // or it was not displayed before
+ return false;
+ if (myObject->document()->isActive()) // for active documents it must be ok anyway
+ return true;
+ // any object from the root document except part result may be displayed
+ if (myObject->document() == ModelAPI_Session::get()->moduleDocument() &&
+ myObject->groupName() != ModelAPI_ResultPart::group())
+ return true;
+ return false;
+}
+
+void Model_Data::setDisplayed(const bool theDisplay)
+{
+ if (theDisplay != isDisplayed()) {
+ myFlags->SetValue(kFlagDisplayed, theDisplay);
+ static Events_Loop* aLoop = Events_Loop::loop();
+ static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+ static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get();
+ aECreator->sendUpdated(myObject, EVENT_DISP);
+ }
+}
+
+std::shared_ptr<ModelAPI_Data> Model_Data::invalidPtr()
+{
+ return kInvalid;
+}
+
+std::shared_ptr<ModelAPI_Data> Model_Data::invalidData()
+{
+ return kInvalid;
+}
+
+std::shared_ptr<ModelAPI_Object> Model_Data::owner()
+{
+ return myObject;
+}