Salome HOME
Issue #18398(Tuleap): Restore visual properties change functionality
[modules/shaper.git] / src / Model / Model_Data.cpp
index 01315a892353102cef25427fddd2034533854c51..e5641930e1b1253ab05e0a83f5afbd1ab8c34137 100644 (file)
 #include <Model_AttributeTables.h>
 #include <Model_Events.h>
 #include <Model_Expression.h>
+#include <Model_Tools.h>
+#include <Model_Validator.h>
+
 #include <ModelAPI_Feature.h>
 #include <ModelAPI_Result.h>
 #include <ModelAPI_ResultParameter.h>
+#include <ModelAPI_ResultConstruction.h>
 #include <ModelAPI_Validator.h>
 #include <ModelAPI_Session.h>
 #include <ModelAPI_ResultPart.h>
 #include <ModelAPI_Tools.h>
-#include <Model_Validator.h>
 
 #include <GeomDataAPI_Point.h>
 #include <GeomDataAPI_Point2D.h>
 
 #include <TDataStd_Name.hxx>
 #include <TDataStd_AsciiString.hxx>
-#include <TDataStd_IntegerArray.hxx>
 #include <TDataStd_UAttribute.hxx>
-#include <TDF_AttributeIterator.hxx>
-#include <TDF_ChildIterator.hxx>
-#include <TDF_RelocationTable.hxx>
 #include <TDF_ChildIDIterator.hxx>
-#include <TColStd_HArray1OfByte.hxx>
 
 #include <string>
 
@@ -239,7 +237,22 @@ AttributePtr Model_Data::addFloatingAttribute(
   int anIndex;
   TDF_Label aLab;
   if (myLab.IsAttribute(TDF_TagSource::GetID())) {
-    TDF_Label aLab = myLab.NewChild(); // already exists a floating attribute, create the next
+    // check this is re-init of attributes, so, check attribute with this name already there
+    TDF_ChildIDIterator anIter(myLab, kGroupAttributeID, false);
+    for(; anIter.More(); anIter.Next()) {
+      TCollection_AsciiString aThisName(Handle(TDataStd_Name)::DownCast(anIter.Value())->Get());
+      if (theID == aThisName.ToCString()) {
+        TDF_Label aLab = anIter.Value()->Label();
+        Handle(TDataStd_Name) aGName;
+        if (aLab.FindAttribute(kGroupAttributeGroupID, aGName)) {
+          TCollection_AsciiString aGroupName(aGName->Get());
+          if (theGroup == aGroupName.ToCString()) {
+            return addAttribute(theGroup + "__" + theID, theAttrType, aLab.Tag());
+          }
+        }
+      }
+    }
+    aLab = myLab.NewChild(); // already exists a floating attribute, create the next
     anIndex = aLab.Tag();
   } else { // put the first floating attribute, quite far from other standard attributes
     anIndex = int(myAttrs.size()) + 1000;
@@ -288,11 +301,12 @@ void Model_Data::removeAttributes(const std::string& theGroup)
     Handle(TDataStd_Name) aGroupID = Handle(TDataStd_Name)::DownCast(aGroup.Value());
     if (aGroupID->Get().IsEqual(theGroup.c_str())) {
       Handle(TDataStd_Name) anID;
-      if (aGroup.Value()->Label().FindAttribute(kGroupAttributeID, anID)) {
-        TCollection_AsciiString anAsciiID(aGroupID->Get() + "__" + anID->Get());
-        myAttrs.erase(anAsciiID.ToCString());
+      if (!aGroup.Value()->Label().IsNull() &&
+          aGroup.Value()->Label().FindAttribute(kGroupAttributeID, anID)) {
         aLabsToRemove.Append(aGroup.Value()->Label());
       }
+      TCollection_AsciiString anAsciiID(aGroupID->Get() + "__" + anID->Get());
+      myAttrs.erase(anAsciiID.ToCString());
     }
   }
   for(TDF_LabelList::Iterator aLab(aLabsToRemove); aLab.More(); aLab.Next()) {
@@ -300,6 +314,12 @@ void Model_Data::removeAttributes(const std::string& theGroup)
   }
 }
 
+void Model_Data::clearAttributes()
+{
+  myAttrs.clear();
+}
+
+
 
 // macro for the generic returning of the attribute by the ID
 #define GET_ATTRIBUTE_BY_ID(ATTR_TYPE, METHOD_NAME) \
@@ -411,7 +431,8 @@ void Model_Data::sendAttributeUpdated(ModelAPI_Attribute* theAttr)
     }
   } else {
     // trim: need to redisplay or set color in the python script
-    if (myObject && (theAttr->attributeType() == "Point2D" || theAttr->id() == "Color")) {
+    if (myObject && (theAttr->attributeType() == "Point2D" || theAttr->id() == "Color" ||
+      theAttr->id() == "Transparency" || theAttr->id() == "Deflection")) {
       static const Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY);
       ModelAPI_EventCreator::get()->sendUpdated(myObject, anEvent);
     }
@@ -579,7 +600,7 @@ void Model_Data::addBackReference(FeaturePtr theFeature, std::string theAttrID,
     // be displayed and previewed; also for avoiding of quick show/hide on history
     // moving deep down
     if (aRes && !theFeature->isDisabled()) {
-      aRes->setIsConcealed(true);
+      aRes->setIsConcealed(true, theFeature->getKind() == "RemoveResults");
     }
   }
 }
@@ -604,8 +625,13 @@ void Model_Data::updateConcealmentFlag()
           std::shared_ptr<ModelAPI_Result> aRes =
             std::dynamic_pointer_cast<ModelAPI_Result>(myObject);
           if (aRes.get()) {
-            aRes->setIsConcealed(true); // set concealed
-            return;
+            if (aRes->groupName() != ModelAPI_ResultConstruction::group()) {
+              aRes->setIsConcealed(true); // set concealed
+              return;
+            } else if (aFeature->getKind() == "RemoveResults") {
+              aRes->setIsConcealed(true, true);
+              return;
+            }
           }
         }
       }
@@ -769,31 +795,10 @@ void Model_Data::referencesToObjects(
   }
 }
 
-/// 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);
+  Model_Tools::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();