From 5e337ede0d2247b347814366899cf09e71393dab Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 28 Mar 2019 18:22:44 +0300 Subject: [PATCH 1/2] #16755 [CEA 16749] Merge nodes generates fatal error if selection is disabled --- src/SMESHGUI/SMESHGUI_MergeDlg.cxx | 16 +++++++++++++++- src/SMESH_I/SMESH_PythonDump.cxx | 4 ++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/SMESHGUI/SMESHGUI_MergeDlg.cxx b/src/SMESHGUI/SMESHGUI_MergeDlg.cxx index f7977d196..b269e2a47 100644 --- a/src/SMESHGUI/SMESHGUI_MergeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MergeDlg.cxx @@ -1144,6 +1144,9 @@ void SMESHGUI_MergeDlg::SetEditCurrentArgument() //================================================================================= void SMESHGUI_MergeDlg::SelectionIntoArgument() { + if ( myIsBusy ) + return; + if (myEditCurrentArgument == (QWidget*)LineEditMesh) { QString aString = ""; @@ -1222,6 +1225,9 @@ void SMESHGUI_MergeDlg::SelectionIntoArgument() LineEditMesh->setText( aString ); + + myIsBusy = true; // here selection can change + if (myAction == MERGE_NODES) { SMESH::SetPointRepresentation(true); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) @@ -1231,6 +1237,8 @@ void SMESHGUI_MergeDlg::SelectionIntoArgument() if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode(CellSelection); + myIsBusy = false; + // process groups myGroups.clear(); ListExclude->clear(); @@ -1408,9 +1416,11 @@ void SMESHGUI_MergeDlg::onTypeChanged (int id) myIdPreview->SetPointsLabeled(false); SMESH::SetPointRepresentation(false); + myIsBusy = true; // keep currently selected mesh if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode(ActorSelection); mySelectionMgr->clearFilters(); + myIsBusy = false; GroupCoincident->hide(); GroupEdit->hide(); @@ -1424,6 +1434,7 @@ void SMESHGUI_MergeDlg::onTypeChanged (int id) myMeshOrSubMeshOrGroupFilter = new SMESH_TypeFilter (SMESH::IDSOURCE); + myIsBusy = true; // keep currently selected mesh if (myAction == MERGE_NODES) { SMESH::SetPointRepresentation(true); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) @@ -1435,11 +1446,14 @@ void SMESHGUI_MergeDlg::onTypeChanged (int id) if( mySelector->IsSelectionEnabled() ) aViewWindow->SetSelectionMode(CellSelection); } + myIsBusy = false; GroupCoincident->show(); GroupEdit->show(); break; } - SelectionIntoArgument(); + + if ( myMesh->_is_nil() ) + SelectionIntoArgument(); updateControls(); diff --git a/src/SMESH_I/SMESH_PythonDump.cxx b/src/SMESH_I/SMESH_PythonDump.cxx index aa35dc0a5..5c9163bf4 100644 --- a/src/SMESH_I/SMESH_PythonDump.cxx +++ b/src/SMESH_I/SMESH_PythonDump.cxx @@ -1009,9 +1009,9 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl lines.push_back( aSMESHGen + " = smeshBuilder.New()" ); if ( isPublished ) - optionalComment = helper + "#"; + optionalComment = "#"; lines.push_back( optionalComment + aSMESHGen + ".SetEnablePublish( False ) # Set to False to avoid publish in study if not needed or in some particular situations:" ); - lines.push_back( " # multiples meshes built in parallel, complex and numerous mesh edition (performance)" ); + lines.push_back( " # multiples meshes built in parallel, complex and numerous mesh edition (performance)\n" ); lines.push_back( helper + "aFilterManager = " + aSMESHGen + ".CreateFilterManager()" ); lines.push_back( helper + "aMeasurements = " + aSMESHGen + ".CreateMeasurements()" ); From e9abd0b9b59905cfdd09c5af5f92292fc8109f70 Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 29 Mar 2019 16:46:47 +0300 Subject: [PATCH 2/2] WIN: Dump Study fails Reason: decrement iterator on an empty list --- src/SMESH_I/SMESH_2smeshpy.cxx | 35 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index e49528aee..45540d510 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -5060,40 +5060,33 @@ bool _pyStringFamily::Add( const char* str ) const int minPrefixSize = 4; // count "smaller" strings with the same prefix - std::list< _AString >::iterator itLess = itStr; --itLess; int nbLess = 0; - for ( ; itLess != _strings.end(); --itLess ) + std::list< _AString >::iterator itLess = itStr; + while ( itLess != _strings.begin() ) + { + --itLess; if ( strncmp( str, itLess->ToCString(), minPrefixSize ) == 0 ) ++nbLess; else + { + ++itLess; break; - ++itLess; + } + } + // itLess points to the 1st string with same prefix + // count "greater" strings with the same prefix - std::list< _AString >::iterator itMore = itStr; int nbMore = 0; + std::list< _AString >::iterator itMore = itStr; for ( ; itMore != _strings.end(); ++itMore ) if ( strncmp( str, itMore->ToCString(), minPrefixSize ) == 0 ) ++nbMore; else break; - --itMore; + // itMore points to the 1st string with greater prefix + if ( nbLess + nbMore > 1 ) // ------- ADD a NEW CHILD FAMILY ------------- { - // look for a maximal prefix length - // int lessPrefSize = 3, morePrefSize = 3; - // if ( nbLess > 0 ) - // while( itLess->ToCString()[ lessPrefSize ] == str[ lessPrefSize ] ) - // ++lessPrefSize; - // if ( nbMore > 0 ) - // while ( itMore->ToCString()[ morePrefSize ] == str[ morePrefSize ] ) - // ++morePrefSize; - // int prefixSize = 3; - // if ( nbLess == 0 ) - // prefixSize = morePrefSize; - // else if ( nbMore == 0 ) - // prefixSize = lessPrefSize; - // else - // prefixSize = Min( lessPrefSize, morePrefSize ); int prefixSize = minPrefixSize; _AString newPrefix ( str, prefixSize ); @@ -5114,7 +5107,7 @@ bool _pyStringFamily::Add( const char* str ) for ( ; nbMore > 0; --nbMore, ++itStr ) newSubFam._strings.push_back( itStr->ToCString() + prefixSize ); - _strings.erase( itLess, ++itMore ); + _strings.erase( itLess, itMore ); } else // too few string to make a family for them {