Salome HOME
Updated copyright comment
[modules/shaper.git] / src / Selector / Selector_Algo.cpp
index 0c860c517d43115babf1ce00bb471376ed49740b..1caf2428bcb1d77108921b1077e9a5196d88f35b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2024  CEA, EDF
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -68,6 +68,8 @@ Selector_Algo::Selector_Algo()
 
 static TDF_Label findGoodLabelWithShape(const TDF_Label theAccess, const TopoDS_Shape& theShape) {
   TDF_Label aResult;
+  TDF_Label aMyOpLab;
+  bool aMyOpLabIsComputed = false;
   if (TNaming_Tool::HasLabel(theAccess, theShape)) { // selection and delete evolution are not used
     for(TNaming_SameShapeIterator aShapes(theShape, theAccess); aShapes.More(); aShapes.Next())
     {
@@ -75,6 +77,22 @@ static TDF_Label findGoodLabelWithShape(const TDF_Label theAccess, const TopoDS_
       if (aShapes.Label().FindAttribute(TNaming_NamedShape::GetID(), aNS)) {
         if (aNS->Evolution() == TNaming_MODIFY || aNS->Evolution() == TNaming_GENERATED ||
             aNS->Evolution() == TNaming_PRIMITIVE) {
+          // getting label of this operation to avoid usage of ready shapes of this
+          if (!aMyOpLabIsComputed) {
+            aMyOpLab = theAccess;
+            if (!aMyOpLab.IsNull()) {
+              int aDepth = aMyOpLab.Depth();
+              if (aDepth < 3)
+                aMyOpLab.Nullify();
+              else {
+                for(; aDepth != 3; aDepth--)
+                  aMyOpLab = aMyOpLab.Father();
+              }
+            }
+            aMyOpLabIsComputed = true;
+          }
+          if (!aMyOpLab.IsNull() && aNS->Label().IsDescendant(aMyOpLab))
+            continue;
           aResult = aNS->Label();
           break;
         }
@@ -158,6 +176,17 @@ Selector_Algo* Selector_Algo::select(const TopoDS_Shape theContext, const TopoDS
     }
     return NULL; // not found value in the tree, not found context shape in the tree also
   }
+  // getting label of this operation to avoid usage of ready shapes of this
+  TDF_Label aMyOpLab = theAccess;
+  if (!aMyOpLab.IsNull()) {
+    int aDepth = aMyOpLab.Depth();
+    if (aDepth < 3)
+      aMyOpLab.Nullify();
+    else {
+      for(; aDepth != 3; aDepth--)
+        aMyOpLab = aMyOpLab.Father();
+    }
+  }
   // searching for the base shapes of the value
   Handle(TNaming_NamedShape) aPrimitiveNS;
   NCollection_List<Handle(TNaming_NamedShape)> aModifList;
@@ -170,6 +199,10 @@ Selector_Algo* Selector_Algo::select(const TopoDS_Shape theContext, const TopoDS
       Handle(TNaming_NamedShape) aNS;
       if (aShapes.Label().FindAttribute(TNaming_NamedShape::GetID(), aNS)) {
         TNaming_Evolution anEvolution = aNS->Evolution();
+        if (anEvolution == TNaming_SELECTED || anEvolution == TNaming_DELETE)
+          continue;
+        if (!aMyOpLab.IsNull() && aNS->Label().IsDescendant(aMyOpLab))
+          continue;
         if (anEvolution == TNaming_PRIMITIVE) { // the value shape is declared as PRIMITIVE
           aPrimitiveNS = aNS;
           break;
@@ -377,11 +410,11 @@ Selector_Algo* Selector_Algo::restoreByLab(TDF_Label theLab, TDF_Label theBaseDo
 }
 
 Selector_Algo* Selector_Algo::restoreByName(TDF_Label theLab, TDF_Label theBaseDocLab,
-  std::string theName, const TopAbs_ShapeEnum theShapeType, const bool theGeomNaming,
+  std::wstring theName, const TopAbs_ShapeEnum theShapeType, const bool theGeomNaming,
   Selector_NameGenerator* theNameGenerator, TDF_Label& theContextLab)
 {
   Selector_Algo* aResult = NULL;
-  if (theName[0] == '[') { // intersection or container
+  if (theName[0] == L'[') { // intersection or container
     switch(theShapeType) {
     case TopAbs_COMPOUND:
     case TopAbs_COMPSOLID:
@@ -396,11 +429,12 @@ Selector_Algo* Selector_Algo::restoreByName(TDF_Label theLab, TDF_Label theBaseD
       break;
     default:;
     }
-  } else if (theName[0] == '(') { // filter by neighbors
+  } else if (theName[0] == L'(') { // filter by neighbors
     aResult = new Selector_FilterByNeighbors;
-  } else if (theName.find(pureWeakNameID()) == 0) { // weak naming identifier
+  } else if (theName.find(pureWeakNameID()) == 0 ||
+             theName.find(oldPureWeakNameID()) == 0) { // weak naming identifier
     aResult = new Selector_WeakName;
-  } else if (theName.find('&') != std::string::npos) { // modification
+  } else if (theName.find(L'&') != std::wstring::npos) { // modification
     aResult = new Selector_Modify;
   } else { // primitive
     aResult = new Selector_Primitive;
@@ -468,13 +502,15 @@ bool Selector_Algo::findNewVersion(const TopoDS_Shape& theContext, TopoDS_Shape&
         TopoDS_Shape aNextModification = aBaseIter.Shape();
         if (aNextModification.IsNull())
           continue;
-        if (isInContext(theContext, aNextModification))
+        if (isInContext(theContext, aNextModification)) {
           // don't add vertices generated from edges
           if (aNextModification.ShapeType() <= theResult.ShapeType())
             aResultShapes.Add(aNextModification);
-        else if (findNewVersion(theContext, aNextModification))
+        }
+        else if (findNewVersion(theContext, aNextModification)) {
           if (aNextModification.ShapeType() <= theResult.ShapeType())
             aResultShapes.Add(aNextModification);
+        }
       }
     }
     if (aResultShapes.IsEmpty())