Salome HOME
fixed problem where only the first solid was imported from STEP
[modules/shaper.git] / src / Model / Model_AttributeSelectionList.cpp
index 170190ef66879e1e44f82e71e4be35340ea4f2ca..924d0b725a7f32f15007ba194df00bd3c2093957 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2022  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -65,9 +65,7 @@ void Model_AttributeSelectionList::append(
   }
 
   if (myIsCashed && !theTemporarily) {
-    ResultPtr aResContext = std::dynamic_pointer_cast<ModelAPI_Result>(theContext);
-    if (aResContext.get())
-      myCash[aResContext].push_back(theSubShape);
+    myCash[theContext].push_back(theSubShape);
   }
 
   int aNewTag = mySize->Get() + 1;
@@ -90,7 +88,7 @@ void Model_AttributeSelectionList::append(
 }
 
 void Model_AttributeSelectionList::append(
-  const std::string& theNamingName, const std::string& theType)
+  const std::wstring& theNamingName, const std::string& theType)
 {
   int aNewTag = mySize->Get() + 1;
   TDF_Label aNewLab = mySize->Label().FindChild(aNewTag);
@@ -125,7 +123,7 @@ void Model_AttributeSelectionList::append(const GeomPointPtr& thePoint, const st
 }
 
 void Model_AttributeSelectionList::append(const std::string& theType,
-  const std::string& theContextName, const int theIndex)
+  const std::wstring& theContextName, const int theIndex)
 {
   int aNewTag = mySize->Get() + 1;
   TDF_Label aNewLab = mySize->Label().FindChild(aNewTag);
@@ -219,6 +217,8 @@ static void copyAttrs(TDF_Label theSource, TDF_Label theDestination) {
     if (!theDestination.FindAttribute(anAttrIter.Value()->ID(), aTargetAttr)) {
       // create a new attribute if not yet exists in the destination
            aTargetAttr = anAttrIter.Value()->NewEmpty();
+      if (aTargetAttr->ID() != anAttrIter.Value()->ID())
+        aTargetAttr->SetID(anAttrIter.Value()->ID());
       theDestination.AddAttribute(aTargetAttr);
     }
     // for named shape copy exact shapes (in NamedShape Paste method the CopyTool is used)
@@ -269,6 +269,16 @@ void Model_AttributeSelectionList::remove(const std::set<int>& theIndices)
   }
 }
 
+void Model_AttributeSelectionList::copyTo(AttributeSelectionListPtr theTarget) const
+{
+  std::shared_ptr<Model_AttributeSelectionList> aTarget =
+    std::dynamic_pointer_cast<Model_AttributeSelectionList>(theTarget);
+  if (aTarget) {
+    copyAttrs(myLab, aTarget->myLab);
+    aTarget->reinit();
+  }
+}
+
 int Model_AttributeSelectionList::size()
 {
   return mySize->Get();
@@ -291,7 +301,7 @@ static bool isIn(GeomShapePtr theInList, GeomShapePtr theShape) {
 
 bool Model_AttributeSelectionList::isInList(const ObjectPtr& theContext,
                                             const std::shared_ptr<GeomAPI_Shape>& theSubShape,
-                                            const bool theTemporarily)
+                                            const bool /*theTemporarily*/)
 {
   if (myIsCashed) { // the cashing is active
     if (theContext.get()) {
@@ -305,7 +315,8 @@ bool Model_AttributeSelectionList::isInList(const ObjectPtr& theContext,
             if (!aShapes->get())
               return true;
             ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(aContext->first);
-            if (aRes.get() && (*aShapes)->isSame(aRes->shape()))
+            FeaturePtr aFeat = std::dynamic_pointer_cast<ModelAPI_Feature>(aContext->first);
+            if ((aRes.get() && (*aShapes)->isSame(aRes->shape())) || aFeat.get())
               return true;
           } else {
             // we need to call here isSame instead of isEqual to do not check shapes orientation
@@ -432,7 +443,7 @@ void Model_AttributeSelectionList::cashValues(const bool theEnabled)
     for(int anIndex = size() - 1; anIndex >= 0; anIndex--) {
       AttributeSelectionPtr anAttr = value(anIndex);
       if (anAttr.get()) {
-        myCash[anAttr->context()].push_back(anAttr->value());
+        myCash[anAttr->contextObject()].push_back(anAttr->value());
       }
     }
   }