]> SALOME platform Git repositories - modules/shaper.git/blobdiff - src/Model/Model_AttributeSelection.cpp
Salome HOME
updated copyright message
[modules/shaper.git] / src / Model / Model_AttributeSelection.cpp
index 9219aca4b622c160400eeff90f99a628f7d03eda..9ee407686c351f148d2d3c3668dd348fee298c8d 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2020  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023  CEA, EDF
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -454,10 +454,11 @@ bool Model_AttributeSelection::isInitialized()
 
 Model_AttributeSelection::Model_AttributeSelection(TDF_Label& theLabel)
 : myRef(theLabel),
+  myTmpCenterType(NOT_CENTER),
+  myParent(NULL),
   myIsGeometricalSelection(false)
 {
   myIsInitialized = myRef.isInitialized();
-  myParent = NULL;
 }
 
 void Model_AttributeSelection::setID(const std::string theID)
@@ -604,11 +605,37 @@ bool Model_AttributeSelection::update()
     aResult = aSelector.restore(aContextShape);
     bool aWasInvalid = aSelLab.IsAttribute(kINVALID_SELECTION);
     setInvalidIfFalse(aSelLab, aResult);
+    if (!aResult)
+      aWasInvalid = false;
 
     TopoDS_Shape aNewShape;
     if (aSelLab.FindAttribute(TNaming_NamedShape::GetID(), aNS))
       aNewShape = aNS->Get();
 
+    // check the selected value is a part of the context
+    if (aResult && !aNewShape.IsNull() && !aContextShape.IsNull() &&
+        !aContextShape.IsSame(aNewShape)) {
+      TopoDS_Shape aNewS = aNewShape;
+      // take only sub-shape of composite for checking
+      if (aNewS.ShapeType() == TopAbs_WIRE || aNewS.ShapeType() == TopAbs_SHELL ||
+        aNewS.ShapeType() == TopAbs_COMPOUND || aNewS.ShapeType() == TopAbs_COMPSOLID) {
+        TopoDS_Iterator anIter(aNewS);
+        if (anIter.More())
+          aNewS = anIter.Value();
+      }
+      bool anIsInside = false;
+      TopExp_Explorer anExp(aContextShape, aNewS.ShapeType());
+      for (; anExp.More() && !anIsInside; anExp.Next()) {
+        if (anExp.Current().IsSame(aNewS))
+          anIsInside = true;
+      }
+      if (!anIsInside) {
+        aResult = false;
+        aNewShape.Nullify();
+        setInvalidIfFalse(aSelLab, aResult);
+      }
+    }
+
     if (anOldShape.IsNull() || aNewShape.IsNull() || !anOldShape.IsEqual(aNewShape) || aWasInvalid)
     {
       // shape type should not be changed: if shape becomes compound of such shapes, then split
@@ -758,23 +785,6 @@ std::wstring Model_AttributeSelection::namingName(const std::wstring& theDefault
   if(!this->isInitialized())
     return !theDefaultName.empty() ? theDefaultName : aName;
 
-  // not argument has not parametric name (filters)
-  if (!this->isArgument() || (myParent && !myParent->isArgument())) {
-    GeomShapePtr aShape = value();
-    if (!aShape.get() && context().get())
-      aShape = context()->shape();
-    std::wstring aName;
-    if (aShape.get()) {
-      aName = Locale::Convert::toWString(aShape->shapeTypeStr());
-      if (myParent) {
-        std::wostringstream aStream;
-        aStream << "_" << selectionLabel().Father().Tag();
-        aName += aStream.str();
-      }
-    }
-    return aName;
-  }
-
   CenterType aCenterType = NOT_CENTER;
   std::shared_ptr<GeomAPI_Shape> aSubSh = internalValue(aCenterType);
 
@@ -1031,7 +1041,22 @@ void Model_AttributeSelection::selectSubShape(const std::string& theType,
   // collect features from PartSet and the current part
   SessionPtr aSession = ModelAPI_Session::get();
   std::list<FeaturePtr> aFeatures = aSession->moduleDocument()->allFeatures();
-  if (aSession->moduleDocument() != owner()->document()) {
+  if (anOwner->getKind() == "ImportResult") {
+    // special case: feature "ImportResult" refers to the results from another parts,
+    // thus, it is necessary to go through the features of these parts too.
+    std::list<FeaturePtr> aPartSetFeatures = aFeatures;
+    aFeatures.clear();
+    for (std::list<FeaturePtr>::iterator it = aPartSetFeatures.begin();
+         it != aPartSetFeatures.end(); ++it) {
+      aFeatures.push_back(*it);
+      if ((*it)->firstResult()->groupName() == ModelAPI_ResultPart::group()) {
+        ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>((*it)->firstResult());
+        std::list<FeaturePtr> aPartFeatures = aPart->partDoc()->allFeatures();
+        aFeatures.insert(aFeatures.end(), aPartFeatures.begin(), aPartFeatures.end());
+      }
+    }
+  }
+  else if (aSession->moduleDocument() != owner()->document()) {
     std::list<FeaturePtr> aPartFeatures = owner()->document()->allFeatures();
     aFeatures.insert(aFeatures.end(), aPartFeatures.begin(), aPartFeatures.end());
   }
@@ -1970,6 +1995,23 @@ bool Model_AttributeSelection::restoreContext(std::wstring theName,
     }
   }
 
+  // Fix for opened study (aDoc->myNamingNames is empty)
+  if (theValue.IsNull() && aCont->groupName() != ModelAPI_ResultConstruction::group()) {
+    std::wstring::size_type aSlash = aSubShapeName.rfind(L'/');
+    if (aSlash != std::wstring::npos) {
+      std::wstring aCompName = aSubShapeName.substr(aSlash + 1);
+      TDF_Label aLab = std::dynamic_pointer_cast<Model_Data>(aCont->data())->shapeLab();
+      TDF_ChildIDIterator aSubNames (aLab, TDataStd_Name::GetID());
+      for (; aSubNames.More(); aSubNames.Next()) {
+        if (Handle(TDataStd_Name)::DownCast(aSubNames.Value())->Get().IsEqual(aCompName.c_str())) {
+          theValue = aSubNames.Value()->Label();
+          aDoc->addNamingName(theValue, aSubShapeName);
+          break;
+        }
+      }
+    }
+  }
+
   if (aCont.get()) {
     theContext = std::dynamic_pointer_cast<Model_Data>(aCont->data())->label();
   }
@@ -2028,24 +2070,28 @@ ResultPtr Model_AttributeSelection::newestContext(
     //if (aResult->groupName() == ModelAPI_ResultBody::group()) {
       // try to search newer context by the concealment references
       // take references to all results: root one, any sub
-    std::list<ResultPtr> allRes;
+    std::list<DataPtr> allRes;
     ResultPtr aCompContext;
     ResultBodyPtr aCompBody = ModelAPI_Tools::bodyOwner(aResult, true);
     if (aCompBody.get()) {
-      ModelAPI_Tools::allSubs(aCompBody, allRes);
-      allRes.push_back(aCompBody);
+      std::list<ResultPtr> allSub;
+      ModelAPI_Tools::allSubs(aCompBody, allSub);
+      for(std::list<ResultPtr>::iterator anIt = allSub.begin(); anIt != allSub.end(); anIt++)
+        allRes.push_back((*anIt)->data());
+      allRes.push_back(aCompBody->data());
       aCompContext = aCompBody;
     }
     if (allRes.empty())
-      allRes.push_back(aResult);
+      allRes.push_back(aResult->data());
+    allRes.push_back(aResult->document()->feature(aResult)->data());
 
     bool aFoundReferernce = false;
-    for (std::list<ResultPtr>::iterator aSub = allRes.begin(); aSub != allRes.end(); aSub++) {
-      ResultPtr aResCont = *aSub;
-      ResultBodyPtr aResBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(aResCont);
+    for (std::list<DataPtr>::iterator aSub = allRes.begin(); aSub != allRes.end(); aSub++) {
+      DataPtr aResCont = *aSub;
+      ResultBodyPtr aResBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(aResCont->owner());
       if (aResBody.get() && aResBody->numberOfSubs() > 0 && aResBody != aCompContext)
         continue; // only lower and higher level subs are counted
-      const std::set<AttributePtr>& aRefs = aResCont->data()->refsToMe();
+      const std::set<AttributePtr>& aRefs = aResCont->refsToMe();
       std::set<AttributePtr>::const_iterator aRef = aRefs.begin();
       for (; !aFindNewContext && aRef != aRefs.end(); aRef++) {
         if (!aRef->get() || !(*aRef)->owner().get())