]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Fix for the placement issue: limit the scope of the naming selection by the current...
authormpv <mikhail.ponikarov@opencascade.com>
Thu, 18 Dec 2014 12:21:01 +0000 (15:21 +0300)
committermpv <mikhail.ponikarov@opencascade.com>
Thu, 18 Dec 2014 12:21:01 +0000 (15:21 +0300)
src/Model/Model_AttributeSelection.cpp
src/Model/Model_AttributeSelection.h

index d708eecd4a06eb545e61afdc6e19958aea0b1c1b..16c6a25bffe76b109cec2031176ad22d22bf4089 100644 (file)
@@ -33,6 +33,8 @@
 #include <TColStd_MapOfTransient.hxx>
 #include <gp_Pnt.hxx>
 #include <Precision.hxx>
+#include <TDF_ChildIterator.hxx>
+#include <TDF_ChildIDIterator.hxx>
 
 using namespace std;
 /// adeed to the index in the packed map to signalize that the vertex of edge is seleted
@@ -104,6 +106,29 @@ void Model_AttributeSelection::setObject(const std::shared_ptr<ModelAPI_Object>&
   myRef.setObject(theObject);
 }
 
+TDF_LabelMap& Model_AttributeSelection::scope()
+{
+  if (myScope.IsEmpty()) { // create a new scope if not yet done
+    // gets all labels with named shapes that are bofore this feature label (before in history)
+    TDF_Label aFeatureLab = std::dynamic_pointer_cast<Model_Data>(
+      owner()->data())->label().Father();
+    int aFeatureID = aFeatureLab.Tag();
+    TDF_ChildIterator aFeaturesIter(aFeatureLab.Father());
+    for(; aFeaturesIter.More(); aFeaturesIter.Next()) {
+      if (aFeaturesIter.Value().Tag() >= aFeatureID) // the left labels are created later
+        break;
+      TDF_ChildIDIterator aNSIter(aFeaturesIter.Value(), TNaming_NamedShape::GetID(), 1);
+      for(; aNSIter.More(); aNSIter.Next()) {
+        Handle(TNaming_NamedShape) aNS = Handle(TNaming_NamedShape)::DownCast(aNSIter.Value());
+        if (!aNS.IsNull() && aNS->Evolution() != TNaming_SELECTED) {
+          myScope.Add(aNS->Label());
+        }
+      }
+    }
+  }
+  return myScope;
+}
+
 bool Model_AttributeSelection::update()
 {
   ResultPtr aContext = context();
@@ -111,8 +136,7 @@ bool Model_AttributeSelection::update()
   if (aContext->groupName() == ModelAPI_ResultBody::group()) {
     // body: just a named shape, use selection mechanism from OCCT
     TNaming_Selector aSelector(selectionLabel());
-    TDF_LabelMap aScope; // empty means the whole document
-    bool aResult = aSelector.Solve(aScope) == Standard_True;
+    bool aResult = aSelector.Solve(scope()) == Standard_True;
     owner()->data()->sendAttributeUpdated(this);
     return aResult;
   } else if (aContext->groupName() == ModelAPI_ResultConstruction::group()) {
index 801a69e513903287d703c09465b5a884078da591..bc6933d39a3bdfc092d091db8568a1931def4b54 100644 (file)
@@ -10,6 +10,7 @@
 #include "Model.h"
 #include "Model_AttributeReference.h"
 #include <ModelAPI_AttributeSelection.h>
+#include <TDF_LabelMap.hxx>
 
 /**\class Model_AttributeSelection
  * \ingroup DataModel
@@ -19,6 +20,7 @@
 class Model_AttributeSelection : public ModelAPI_AttributeSelection
 {
   Model_AttributeReference myRef;  ///< The reference functionality reusage
+  TDF_LabelMap myScope; ///< the map of valid labels for naming selection solving
 public:
   /// Defines the result and its selected sub-shape
   MODEL_EXPORT virtual void setValue(
@@ -53,6 +55,9 @@ protected:
   /// Note: there must be no attributes stored at the same label because Selector clears this lab
   TDF_Label selectionLabel();
 
+  /// Returns the prepared map of valid labels for naming selection solving (creates if not exists)
+  TDF_LabelMap& scope();
+
   friend class Model_Data;
   friend class Model_AttributeSelectionList;
 };