Salome HOME
Fix for the issue #3116 : Create Edge, Wire all-in is missed for feature in Partset
authormpv <mpv@opencascade.com>
Thu, 12 Dec 2019 14:27:40 +0000 (17:27 +0300)
committermpv <mpv@opencascade.com>
Thu, 12 Dec 2019 14:27:53 +0000 (17:27 +0300)
src/Model/Model_AttributeSelection.cpp
src/ModelAPI/CMakeLists.txt
src/ModelAPI/Test/Test3116.py [new file with mode: 0644]

index e8f99e8942a9cf058305d773d32171ed11559be3..9d1e6cb65311873de13c46cde27684fe2a2bdcc5 100644 (file)
@@ -185,10 +185,11 @@ bool Model_AttributeSelection::setValue(const ObjectPtr& theContext,
   } else if (theContext->groupName() == ModelAPI_ResultGroup::group()) {
     aSelLab.ForgetAllAttributes(true);
     TDataStd_UAttribute::Set(aSelLab, kSIMPLE_REF_ID);
-  } else { // check the feature context: parent-Part of this feature should not be used
+  } else { // check the feature context: only construction features of PartSet could be selected
     FeaturePtr aFeatureContext = std::dynamic_pointer_cast<ModelAPI_Feature>(theContext);
-    if (aFeatureContext.get()) {
-      if (owner()->document() != aFeatureContext->document()) {
+    if (aFeatureContext.get() && owner()->document() != aFeatureContext->document()) {
+      if (aFeatureContext->results().empty() ||
+          aFeatureContext->firstResult()->groupName() != ModelAPI_ResultConstruction::group()) {
         aSelLab.ForgetAllAttributes(true);
         myRef.setValue(ObjectPtr());
         if (aToUnblock)
@@ -773,19 +774,22 @@ std::string Model_AttributeSelection::namingName(const std::string& theDefaultNa
 
   CenterType aCenterType = NOT_CENTER;
   std::shared_ptr<GeomAPI_Shape> aSubSh = internalValue(aCenterType);
-  ResultPtr aCont = context();
 
-  if (!aCont.get() ||
-      (aCont->groupName() == ModelAPI_ResultConstruction::group() && contextFeature().get())) {
+  FeaturePtr aContFeature = contextFeature();
+  if (aContFeature.get()) {
+    std::string aResName;
+    // checking part-owner
+    if (aContFeature->document() != owner()->document())
+        aResName += aContFeature->document()->kind() + "/";
     // selection of a full feature
-    FeaturePtr aFeatureCont = contextFeature();
-    if (aFeatureCont.get()) {
-      return kWHOLE_FEATURE + aFeatureCont->name();
+    if (aContFeature.get()) {
+      return aResName + kWHOLE_FEATURE + aContFeature->name();
     }
     // in case of selection of removed result
     return "";
   }
 
+  ResultPtr aCont = context();
   TDF_Label aSelLab = selectionLabel();
   if (aSelLab.IsAttribute(kSIMPLE_REF_ID)) { // whole context, no value
     return contextName(aCont);
index a1894001e694def50b1455874b06ddf7c73ec1db..6df21ce5b1399a6c2d51103efd22ffe54de47511 100644 (file)
@@ -254,4 +254,5 @@ ADD_UNIT_TESTS(TestConstants.py
                Test2901.py
                Test2903.py
                Test3020.py
+               Test3116.py
 )
diff --git a/src/ModelAPI/Test/Test3116.py b/src/ModelAPI/Test/Test3116.py
new file mode 100644 (file)
index 0000000..2540307
--- /dev/null
@@ -0,0 +1,39 @@
+# Copyright (C) 2014-2019  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
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+# Cheching for selection of the whole feature (Sketch) in PartSet from the Part
+
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Sketch_1 = model.addSketch(partSet, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_1.addCircle(16, 15, 3)
+model.do()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Edge_1 = model.addEdge(Part_1_doc, [model.selection("COMPOUND", "PartSet/all-in-Sketch_1")], False)
+model.end()
+
+# check the result validity
+from ModelAPI import *
+aFactory = ModelAPI_Session.get().validators()
+assert(aFactory.validate(Edge_1.feature()))
+
+assert(model.checkPythonDump())