]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #1648: Dump Python in the High Level Parameterized Geometry API. Debug of namin...
authormpv <mpv@opencascade.com>
Mon, 15 Aug 2016 13:29:51 +0000 (16:29 +0300)
committermpv <mpv@opencascade.com>
Mon, 15 Aug 2016 13:29:51 +0000 (16:29 +0300)
src/Model/Model_AttributeSelection.cpp
src/Model/Model_AttributeSelection.h
src/Model/Model_SelectionNaming.cpp

index ec6c691f8e8a2b0efcd83f8ec6084f6e3ebd2270..d35ea9cee6f24cfb6bf52730b097b95c56fcd824 100644 (file)
@@ -148,7 +148,8 @@ void Model_AttributeSelection::setValue(const ResultPtr& theContext,
         aBuilder.Generated(theContext->shape()->impl<TopoDS_Shape>());
         std::shared_ptr<Model_Document> aMyDoc = 
           std::dynamic_pointer_cast<Model_Document>(owner()->document());
-        std::string aName = theContext->data()->name();
+        std::string aName = contextName(theContext);
+        // for selection in different document, add the document name
         aMyDoc->addNamingName(aSelLab, aName);
         TDataStd_Name::Set(aSelLab, aName.c_str());
       } else {  // for sketch the naming is needed in DS
@@ -417,7 +418,7 @@ bool Model_AttributeSelection::update()
       aBuilder.Generated(aContext->shape()->impl<TopoDS_Shape>());
       std::shared_ptr<Model_Document> aMyDoc = 
         std::dynamic_pointer_cast<Model_Document>(owner()->document());
-      std::string aName = aContext->data()->name();
+      std::string aName = contextName(aContext);
       aMyDoc->addNamingName(aSelLab, aName);
       TDataStd_Name::Set(aSelLab, aName.c_str());
     }
@@ -714,8 +715,9 @@ void Model_AttributeSelection::selectConstruction(
     // saving of context is enough: result construction contains exactly the needed shape
     TNaming_Builder aBuilder(selectionLabel());
     aBuilder.Generated(aSubShape);
-    aMyDoc->addNamingName(selectionLabel(), theContext->data()->name());
-    TDataStd_Name::Set(selectionLabel(), theContext->data()->name().c_str());
+    std::string aName = contextName(theContext);
+    aMyDoc->addNamingName(selectionLabel(), aName);
+    TDataStd_Name::Set(selectionLabel(), aName.c_str());
     return;
   }
   std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(owner()->data());
@@ -990,3 +992,20 @@ void Model_AttributeSelection::setId(int theID)
   setValue(aContext, aSelection);
 }
 
+std::string Model_AttributeSelection::contextName(const ResultPtr& theContext) const
+{
+  std::string aResult;
+  if (owner()->document() != theContext->document()) {
+    if (theContext->document() == ModelAPI_Session::get()->moduleDocument()) {
+      aResult = theContext->document()->kind() + "/";
+    } else {
+      ResultPtr aDocRes = ModelAPI_Tools::findPartResult(
+        ModelAPI_Session::get()->moduleDocument(), theContext->document());
+      if (aDocRes.get()) {
+        aResult = aDocRes->data()->name() + "/";
+      }
+    }
+  }
+  aResult += theContext->data()->name();
+  return aResult;
+}
index 1f3c4594570754cab0c5af149c814f32f499c9d6..2f9250642d023a018a0c265aebf27f4521580010 100644 (file)
@@ -104,6 +104,9 @@ protected:
   /// Sets the ID of the attribute in Data (called from Data): here it is used for myRef ID setting
   MODEL_EXPORT virtual void setID(const std::string theID);
 
+  /// Returns the name by context. Adds the part name if the context is located in other document
+  std::string contextName(const ResultPtr& theContext) const;
+
   friend class Model_Data;
   friend class Model_AttributeSelectionList;
 };
index a9275e4d118451f331512ffae1da63a26feaa6bd..fe623ef2e009b2380a8f3f6c420f72f0d2d8ad8d 100644 (file)
@@ -12,6 +12,7 @@
 #include <ModelAPI_ResultPart.h>
 #include <ModelAPI_ResultConstruction.h>
 #include <ModelAPI_CompositeFeature.h>
+#include <ModelAPI_ResultBody.h>
 
 #include <TopoDS_Iterator.hxx>
 #include <TopoDS.hxx>
@@ -627,20 +628,24 @@ bool Model_SelectionNaming::selectSubShape(const std::string& theType,
   ResultPtr aCont = aDoc->findByName(aContName);
    // possible this is body where postfix is added to distinguish several shapes on the same label
   int aSubShapeId = -1; // -1 means sub shape not found
-  if (!aCont.get() && aContName == aSubShapeName) {
+  // for result body the name wihtout "_" has higher priority than with it: it is always added
+  if ((!aCont.get() || (aCont->groupName() == ModelAPI_ResultBody::group())) && 
+       aContName == aSubShapeName) {
     size_t aPostIndex = aContName.rfind('_');
     if (aPostIndex != std::string::npos) {
       std::string aSubContName = aContName.substr(0, aPostIndex);
-      aCont = aDoc->findByName(aSubContName);
-      if (aCont.get()) {
+      ResultPtr aSubCont = aDoc->findByName(aSubContName);
+      if (aSubCont.get()) {
         try {
           std::string aNum = aContName.substr(aPostIndex + 1);
           aSubShapeId = std::stoi(aNum);
         } catch (std::invalid_argument&) {
           aSubShapeId = -1;
         }
-        if (aSubShapeId > 0)
+        if (aSubShapeId > 0) {
           aContName = aSubContName;
+          aCont = aSubCont;
+        }
       }
     }
   }