Salome HOME
Added unit-test that checks the issue #1379 is fixed
[modules/shaper.git] / src / Model / Model_AttributeSelection.cpp
index ad18492ced6ec1c636d94e3b72a24c00aa7a5a02..d2456c85e199fa4bb5f7838cf14d78549250d2a8 100644 (file)
@@ -111,9 +111,11 @@ bool Model_AttributeSelection::setValue(const ResultPtr& theContext,
   bool isOldShape = isOldContext &&
     (theSubShape == anOldShape || (theSubShape && anOldShape && theSubShape->isEqual(anOldShape)));
   if (isOldShape) return false; // shape is the same, so context is also unchanged
+  bool aToUnblock = false;
   // update the referenced object if needed
   if (!isOldContext) {
-      myRef.setValue(theContext);
+    aToUnblock = !owner()->data()->blockSendAttributeUpdated(true);
+    myRef.setValue(theContext);
   }
 
   // do noth use naming if selected shape is result shape itself, but not sub-shape
@@ -136,6 +138,8 @@ bool Model_AttributeSelection::setValue(const ResultPtr& theContext,
     TDF_Label aRefLab = myRef.myRef->Label();
     aSelLab.ForgetAllAttributes(true);
     myRef.myRef = TDF_Reference::Set(aSelLab.Father(), aSelLab.Father());
+    if (aToUnblock)
+      owner()->data()->blockSendAttributeUpdated(false);
     return false;
   }
   if (theContext->groupName() == ModelAPI_ResultBody::group()) {
@@ -170,6 +174,10 @@ bool Model_AttributeSelection::setValue(const ResultPtr& theContext,
   }
 
   owner()->data()->sendAttributeUpdated(this);
+
+  if (aToUnblock)
+    owner()->data()->blockSendAttributeUpdated(false);
+
   return true;
 }
 
@@ -265,6 +273,8 @@ GeomShapePtr centerByEdge(GeomShapePtr theEdge, ModelAPI_AttributeSelection::Cen
 
 std::shared_ptr<GeomAPI_Shape> Model_AttributeSelection::value()
 {
+  if (!ModelAPI_AttributeSelection::isInitialized() && !myTmpContext.get() && !myTmpSubShape.get())
+    return std::shared_ptr<GeomAPI_Shape>();
   CenterType aType = NOT_CENTER;
   std::shared_ptr<GeomAPI_Shape> aResult = internalValue(aType);
   return centerByEdge(aResult, aType);
@@ -399,6 +409,11 @@ void Model_AttributeSelection::setID(const std::string theID)
 }
 
 ResultPtr Model_AttributeSelection::context() {
+  /*
+  if (!ModelAPI_AttributeSelection::isInitialized() && !myTmpContext.get() && !myTmpSubShape.get())
+    return ResultPtr();
+  */
+
   if (myTmpContext.get() || myTmpSubShape.get()) {
     return myTmpContext;
   }
@@ -448,13 +463,14 @@ TDF_LabelMap& Model_AttributeSelection::scope()
       }
     }
     // for group Scope is not limitet: this is always up to date objects
-    bool isGroup = aFeature.get() && aFeature->getKind() == "Group";
+    // this causes problem in galeries.py
+    //bool isGroup = aFeature.get() && aFeature->getKind() == "Group";
     for(; aFIter != allFeatures.end(); aFIter++) {
       if (*aFIter == owner()) {  // the left features are created later (except subs of composite)
         aMePassed = true;
         continue;
       }
-      if (isGroup) aMePassed = false;
+      //if (isGroup) aMePassed = false;
       bool isInScope = !aMePassed;
       if (!isInScope && aComposite.get()) {
         // try to add sub-elements of composite if this is composite
@@ -887,8 +903,11 @@ void Model_AttributeSelection::selectSubShape(
         ResultCompSolidPtr aCompContext = ModelAPI_Tools::compSolidOwner(aCont);
         int aSubsSize = (aCompContext.get() ? aCompContext->numberOfSubs() : 0) + 1;
         for(int aResultNum = 0; aResultNum < aSubsSize; aResultNum++) {
-          ResultPtr aResCont = aCompContext.get() ? (aResultNum == aSubsSize - 1 ?
-                  aCompContext : aCompContext->subResult(aResultNum)) : aCont;
+          ResultPtr aResCont = aCont;
+          if (aCompContext.get())
+            if (aResultNum == aSubsSize - 1)
+              aResCont = aCompContext;
+            else aResCont = aCompContext->subResult(aResultNum);
           const std::set<AttributePtr>& aRefs = aResCont->data()->refsToMe();
           std::set<AttributePtr>::const_iterator aRef = aRefs.begin();
           for(; !aFindNewContext && aRef != aRefs.end(); aRef++) {