Salome HOME
Fix for #19754: EDF 21721 - Problems with a study
authormpv <mikhail.ponikarov@opencascade.com>
Mon, 20 Jul 2020 12:59:41 +0000 (15:59 +0300)
committermpv <mikhail.ponikarov@opencascade.com>
Mon, 20 Jul 2020 12:59:41 +0000 (15:59 +0300)
Fixed crashes on dumping to python if there are problems with features validity. Improved the error-status appearance when previous features are dramatically changed.

src/Model/Model_BodyBuilder.cpp
src/ModelAPI/ModelAPI_Tools.cpp
src/Selector/Selector_FilterByNeighbors.cpp

index cf817b65137bb2d67b5edcfdf0af9214801b0e5e..21e27c86918fb91874aa629c03b39a8fa2a517bf 100644 (file)
@@ -303,8 +303,8 @@ TNaming_Builder* Model_BodyBuilder::builder(const int theTag)
   std::map<int, TNaming_Builder*>::iterator aFind = myBuilders.find(theTag);
   if (aFind == myBuilders.end()) {
     std::shared_ptr<Model_Data> aData = std::dynamic_pointer_cast<Model_Data>(data());
-    myBuilders[theTag] = new TNaming_Builder(
-      theTag == 0 ? aData->shapeLab() : aData->shapeLab().FindChild(theTag));
+    TDF_Label aLab = theTag == 0 ? aData->shapeLab() : aData->shapeLab().FindChild(theTag);
+    myBuilders[theTag] = new TNaming_Builder(aLab);
     aFind = myBuilders.find(theTag);
   }
   return aFind->second;
@@ -431,6 +431,11 @@ void Model_BodyBuilder::clean()
   for(; anEntriesIter.More(); anEntriesIter.Next()) {
     anEntriesIter.Value()->Label().ForgetAttribute(kEXTERNAL_SHAPE_REF);
   }
+  // to clear old shapes in all sub-labels (they may be left without builders on Open)
+  TDF_ChildIDIterator aNSIter(aLab, TNaming_NamedShape::GetID(), true);
+  for(; aNSIter.More(); aNSIter.Next()) {
+    aNSIter.Value()->Label().ForgetAttribute(aNSIter.Value());
+  }
 }
 
 void Model_BodyBuilder::cleanCash()
index 2f87922c2c277aea736198a3391fbd4ec0a28d14..e3b007bb84872f735ce7459170f441e063aedb72 100644 (file)
@@ -698,7 +698,7 @@ std::pair<std::wstring, bool> getDefaultName(const std::shared_ptr<ModelAPI_Resu
       }
     }
     // check the result is a Body
-    if ((*anObjIt)->groupName() == ModelAPI_ResultBody::group()) {
+    if (anObjIt->get() && (*anObjIt)->groupName() == ModelAPI_ResultBody::group()) {
       // check the result is part of CompSolid
       ResultPtr anObjRes = std::dynamic_pointer_cast<ModelAPI_Result>(*anObjIt);
       ResultBodyPtr aParentBody = ModelAPI_Tools::bodyOwner(anObjRes);
index 49992956baf17b69272e20cdb32a5b6e949e68c5..57e38acad6f5ad0364f324bf424c73c022691321 100644 (file)
@@ -402,6 +402,8 @@ std::wstring Selector_FilterByNeighbors::name(Selector_NameGenerator* theNameGen
     if (!*aSubSel)
       continue;
     std::wstring aSubName = (*aSubSel)->name(theNameGenerator);
+    if (aSubName.empty())
+      return L"()";
     aResult += L"(" + aSubName + L")";
     if (*aLevel > 1) {
       std::wostringstream aLevelStr;