From 3216bba91f0f6820a77147ac84a35ebab6cf3e5b Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 14 Feb 2014 16:03:10 +0400 Subject: [PATCH] 0022364, 0022363: EDF SMESH: Create Mesh dialog box improvement --- .../gui/SMESH/images/createmesh-inv.png | Bin 22558 -> 24164 bytes .../gui/SMESH/input/constructing_meshes.doc | 28 ++- src/SMESHGUI/SMESHGUI_Hypotheses.cxx | 10 +- src/SMESHGUI/SMESHGUI_Hypotheses.h | 8 +- src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx | 15 +- src/SMESHGUI/SMESHGUI_HypothesesUtils.h | 3 +- src/SMESHGUI/SMESHGUI_MeshDlg.cxx | 47 +++-- src/SMESHGUI/SMESHGUI_MeshDlg.h | 2 +- src/SMESHGUI/SMESHGUI_MeshOp.cxx | 161 ++++++++++++------ src/SMESHGUI/SMESHGUI_MeshOp.h | 4 + src/SMESHGUI/SMESHGUI_XmlHandler.cxx | 15 +- 11 files changed, 202 insertions(+), 91 deletions(-) mode change 100755 => 100644 doc/salome/gui/SMESH/images/createmesh-inv.png diff --git a/doc/salome/gui/SMESH/images/createmesh-inv.png b/doc/salome/gui/SMESH/images/createmesh-inv.png old mode 100755 new mode 100644 index c7f7c31edf868e7847eaa837f9f1ab61884f1a42..2180d416a6d84a76954fcfe8b660b3990f4fc2de GIT binary patch literal 24164 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 Oy7Q;HauLcr_`d+e?3N7x literal 22558 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 F{{h-GxhDVs diff --git a/doc/salome/gui/SMESH/input/constructing_meshes.doc b/doc/salome/gui/SMESH/input/constructing_meshes.doc index 0671f8909..dcb55a785 100644 --- a/doc/salome/gui/SMESH/input/constructing_meshes.doc +++ b/doc/salome/gui/SMESH/input/constructing_meshes.doc @@ -33,14 +33,15 @@ written in Python.
  • Apply \subpage basic_meshing_algos_page "meshing algorithms" and - \subpage about_hypo_page "hypotheses" which will be used at computation of + \subpage about_hypo_page "hypotheses" which will be used to compute this mesh. "Create mesh" dialog box contains several tab pages titled \b 3D, \b 2D, \b 1D and \b 0D. The title of each page reflects the dimension of the CAD model (geometry) the algorithms listed on - this page affect. For example, \b 3D page lists the algorithms - that affect 3D geometrical objects (solids). + this page affect and the maximal dimension of elements the algorithms + generate. For example, \b 3D page lists the algorithms that affect + 3D geometrical objects (solids). \note - Some page(s) can be disabled if the source geometrical @@ -86,9 +87,24 @@ written in Python. "Edit Hypothesis" button - Most standard 2D and 3D algorithms can work without hypotheses - using some default parameters. The use of additional hypotheses - is optional (i.e. you may leave "None" in this box). + Most 2D and 3D algorithms can work without hypotheses using some + default meshing parameters. Some algorithms does not require any + hypothesis. After selection of an algorithm "Hypothesis" field of + the dialog can contain: +
      +
    • if the algorithm can work using default + parameters.
    • +
    • if the algorithm requires a hypothesis defining + its parameters.
    • +
    • Nothing if the algorithm has no parameters to tune.
    • +
    + After selection of an algorithm "Add. Hypothesis" field of + the dialog can contain: +
      +
    • if the algorithm can be additionally tuned + using an additional hypothesis.
    • +
    • Nothing if the algorithm has no additional parameters to tune.
    • +
    Proceed in the same way with 2D and 1D Algorithms and Hypotheses that will be used to mesh faces and edges of your geometry. (Note diff --git a/src/SMESHGUI/SMESHGUI_Hypotheses.cxx b/src/SMESHGUI/SMESHGUI_Hypotheses.cxx index e8ebeea25..9801cfd42 100644 --- a/src/SMESHGUI/SMESHGUI_Hypotheses.cxx +++ b/src/SMESHGUI/SMESHGUI_Hypotheses.cxx @@ -711,9 +711,10 @@ HypothesisData::HypothesisData( const QString& theTypeName, const QString& theClientLibName, const QString& theLabel, const QString& theIconId, + const QString& theContext, const QList& theDim, - const bool theIsAux, - const QStringList& theNeededHypos, + const bool theIsAuxOrNeedHyp, + const QStringList& theBasicHypos, const QStringList& theOptionalHypos, const QStringList& theInputTypes, const QStringList& theOutputTypes, @@ -725,9 +726,10 @@ HypothesisData::HypothesisData( const QString& theTypeName, ClientLibName( theClientLibName ), Label( theLabel ), IconId( theIconId ), + Context( theContext ), Dim( theDim ), - IsAux( theIsAux ), - NeededHypos( theNeededHypos ), + IsAuxOrNeedHyp( theIsAuxOrNeedHyp ), + BasicHypos( theBasicHypos ), OptionalHypos( theOptionalHypos ), InputTypes( theInputTypes ), OutputTypes( theOutputTypes ), diff --git a/src/SMESHGUI/SMESHGUI_Hypotheses.h b/src/SMESHGUI/SMESHGUI_Hypotheses.h index 83da609d3..b67a6dd71 100644 --- a/src/SMESHGUI/SMESHGUI_Hypotheses.h +++ b/src/SMESHGUI/SMESHGUI_Hypotheses.h @@ -173,7 +173,7 @@ class HypothesisData public: HypothesisData( const QString&, const QString&, const QString&, const QString&, const QString&, const QString&, - const QList&, const bool, + const QString&, const QList&, const bool, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const bool=true, const bool supportSub=false ); @@ -184,13 +184,15 @@ public: QString ClientLibName; //!< client library name QString Label; //!< label QString IconId; //!< icon identifier + QString Context; //!< ["GLOBAL","LOCAL","ANY"(default)] QList Dim; //!< list of supported dimensions (see SMESH::Dimension enumeration) - bool IsAux; //!< TRUE if given hypothesis is auxiliary one, FALSE otherwise + bool IsAuxOrNeedHyp; //!< TRUE if given hypothesis is auxiliary one, FALSE otherwise + //!< TRUE if given algorithm can't work w/o hypotheses bool IsNeedGeometry; //!< TRUE if the algorithm works with shapes only, FALSE otherwise bool IsSupportSubmeshes; //!< TRUE if the algo building all-dim elems supports submeshes // for algorithm only: dependencies algo <-> algo and algo -> hypos - QStringList NeededHypos; //!< list of obligatory hypotheses + QStringList BasicHypos; //!< list of basic hypotheses QStringList OptionalHypos;//!< list of optional hypotheses QStringList InputTypes; //!< list of element types required as a prerequisite QStringList OutputTypes; //!< list of types of generated elements diff --git a/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx b/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx index 58003954a..627570f4c 100644 --- a/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx @@ -266,23 +266,28 @@ namespace SMESH } - QStringList GetAvailableHypotheses( const bool isAlgo, - const int theDim, + QStringList GetAvailableHypotheses( const bool isAlgo, + const int theDim, const bool isAux, - const bool isNeedGeometry) + const bool isNeedGeometry, + const bool isSubMesh) { QStringList aHypList; // Init list of available hypotheses, if needed InitAvailableHypotheses(); bool checkGeometry = ( !isNeedGeometry && isAlgo ); + const char* context = isSubMesh ? "LOCAL" : "GLOBAL"; // fill list of hypotheses/algorithms THypothesisDataMap& pMap = isAlgo ? myAlgorithmsMap : myHypothesesMap; THypothesisDataMap::ConstIterator anIter; for ( anIter = pMap.begin(); anIter != pMap.end(); anIter++ ) { HypothesisData* aData = anIter.value(); if(!aData || aData->Label.isEmpty()) continue; - if ( ( theDim < 0 || aData->Dim.contains( theDim ) ) && aData->IsAux == isAux) { + if (( theDim < 0 || aData->Dim.contains( theDim )) && + ( isAlgo || aData->IsAuxOrNeedHyp == isAux ) && + ( aData->Context == "ANY" || aData->Context == context )) + { if (checkGeometry) { if (aData->IsNeedGeometry == isNeedGeometry) aHypList.append(anIter.key()); @@ -384,7 +389,7 @@ namespace SMESH isAuxiliary = false; if ( !algoData ) return false; - if ( algoData->NeededHypos.contains( hypType )) + if ( algoData->BasicHypos.contains( hypType )) return true; if ( algoData->OptionalHypos.contains( hypType)) { isAuxiliary = true; diff --git a/src/SMESHGUI/SMESHGUI_HypothesesUtils.h b/src/SMESHGUI/SMESHGUI_HypothesesUtils.h index 333418b31..1b2046f3e 100644 --- a/src/SMESHGUI/SMESHGUI_HypothesesUtils.h +++ b/src/SMESHGUI/SMESHGUI_HypothesesUtils.h @@ -69,7 +69,8 @@ namespace SMESH QStringList GetAvailableHypotheses( const bool, const int = -1, const bool = false, - const bool = true); + const bool = true, + const bool = false); SMESHGUI_EXPORT QStringList GetHypothesesSets( int, const QString& ); diff --git a/src/SMESHGUI/SMESHGUI_MeshDlg.cxx b/src/SMESHGUI/SMESHGUI_MeshDlg.cxx index 94d9ce681..13c6cf686 100644 --- a/src/SMESHGUI/SMESHGUI_MeshDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshDlg.cxx @@ -149,16 +149,20 @@ void SMESHGUI_MeshTab::setAvailableHyps( const int theId, const QStringList& the myAvailableHyps[ theId ] = theHyps; bool enable = ! theHyps.isEmpty(); - if ( theId == Algo ) + if ( theId == Algo ) // fill list of algos { myHyp[ Algo ]->clear(); - myHyp[ Algo ]->addItem( tr( "NONE" ) ); - myHyp[ Algo ]->addItems( theHyps ); - myHyp[ Algo ]->setCurrentIndex( 0 ); + if ( enable ) + { + myHyp[ Algo ]->addItem( tr( "NONE" ) ); + myHyp[ Algo ]->addItems( theHyps ); + myHyp[ Algo ]->setCurrentIndex( 0 ); + } } - else { + else // enable buttons + { myCreateHyp[ theId ]->setEnabled( enable ); - myEditHyp[ theId ]->setEnabled( false ); + myEditHyp [ theId ]->setEnabled( false ); } myHyp[ theId ]->setEnabled( enable ); } @@ -166,21 +170,30 @@ void SMESHGUI_MeshTab::setAvailableHyps( const int theId, const QStringList& the //================================================================================ /*! * \brief Sets existing hypothesis - * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) - * \param theHyps - list of available hypothesis names - * + * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) + * \param theHyps - list of available hypothesis names + * \param theDefaultAvlbl - \c true means that the algorithm can with w/o hypothesis + * with some default parameters + * * Sets existing main or additional hypothesis for this tab */ //================================================================================ -void SMESHGUI_MeshTab::setExistingHyps( const int theId, const QStringList& theHyps ) +void SMESHGUI_MeshTab::setExistingHyps( const int theId, + const QStringList& theHyps, + bool theDefaultAvlbl) { if ( theId != Algo ) { + bool enable = ! myAvailableHyps[ theId ].isEmpty(); myHyp[ theId ]->clear(); - myHyp[ theId ]->addItem( tr( "NONE" ) ); - myHyp[ theId ]->addItems( theHyps ); - myHyp[ theId ]->setCurrentIndex( 0 ); - myHyp[ theId ]->setEnabled( !theHyps.isEmpty() ); + if ( enable ) + { + QString none = tr( theDefaultAvlbl ? "DEFAULT" : ( theId == AddHyp ) ? "NONE" : "NONE" ); + myHyp[ theId ]->addItem( none ); + myHyp[ theId ]->addItems( theHyps ); + myHyp[ theId ]->setCurrentIndex( 0 ); + } + myHyp [ theId ]->setEnabled( enable ); myEditHyp[ theId ]->setEnabled( false ); } } @@ -188,9 +201,9 @@ void SMESHGUI_MeshTab::setExistingHyps( const int theId, const QStringList& theH //================================================================================ /*! * \brief Adds hypothesis in combo box of available ones - * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) - * \param theHyp - name of hypothesis to be added - * + * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) + * \param theHyp - name of hypothesis to be added + * * Adds hypothesis in combo box of available ones. This method is called by operation * after creation of new hypothesis. */ diff --git a/src/SMESHGUI/SMESHGUI_MeshDlg.h b/src/SMESHGUI/SMESHGUI_MeshDlg.h index 08f11ff6f..e8ea69f00 100644 --- a/src/SMESHGUI/SMESHGUI_MeshDlg.h +++ b/src/SMESHGUI/SMESHGUI_MeshDlg.h @@ -119,7 +119,7 @@ public: virtual ~SMESHGUI_MeshTab(); void setAvailableHyps( const int, const QStringList& ); - void setExistingHyps( const int, const QStringList& ); + void setExistingHyps( const int, const QStringList&, bool=false); void addHyp( const int, const QString& ); void renameHyp( const int, const int, const QString& ); void setCurrentHyp( const int, const int ); diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.cxx b/src/SMESHGUI/SMESHGUI_MeshOp.cxx index 4fe3a6580..f91dbca30 100644 --- a/src/SMESHGUI/SMESHGUI_MeshOp.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshOp.cxx @@ -63,6 +63,7 @@ // Qt includes #include #include +#include // OCCT includes #include @@ -213,10 +214,13 @@ void SMESHGUI_MeshOp::startOperation() connect( myDlg, SIGNAL( hypoSet( const QString& )), SLOT( onHypoSet( const QString& ))); connect( myDlg, SIGNAL( geomSelectionByMesh( bool )), SLOT( onGeomSelectionByMesh( bool ))); connect( myDlg, SIGNAL( selectMeshType( const int, const int ) ), SLOT( onAlgoSetByMeshType( const int, const int))); - if ( myToCreate ) + if ( myToCreate ) { if ( myIsMesh ) myHelpFileName = "constructing_meshes_page.html"; - else myHelpFileName = "constructing_submeshes_page.html"; - else myHelpFileName = "editing_meshes_page.html"; + else myHelpFileName = "constructing_submeshes_page.html"; + } + else { + myHelpFileName = "editing_meshes_page.html"; + } } SMESHGUI_SelectionOp::startOperation(); // iterate through dimensions and get available algoritms, set them to the dialog @@ -255,6 +259,7 @@ void SMESHGUI_MeshOp::startOperation() selectionDone(); myIgnoreAlgoSelection = false; + myHasConcurrentSubBefore = false; myObjectToSelect.clear(); } @@ -594,15 +599,16 @@ void SMESHGUI_MeshOp::selectionDone() { if (pObj != 0) { - SMESH::SMESH_subMesh_var aVar = + SMESH::SMESH_subMesh_var submeshVar = SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() ); - myDlg->setObjectShown( SMESHGUI_MeshDlg::Mesh, !aVar->_is_nil() ); + myDlg->setObjectShown( SMESHGUI_MeshDlg::Mesh, !submeshVar->_is_nil() ); myDlg->setObjectShown( SMESHGUI_MeshDlg::Geom, true ); myDlg->objectWg( SMESHGUI_MeshDlg::Mesh, SMESHGUI_MeshDlg::Btn )->hide(); myDlg->objectWg( SMESHGUI_MeshDlg::Geom, SMESHGUI_MeshDlg::Btn )->hide(); myDlg->updateGeometry(); myDlg->adjustSize(); readMesh(); + myIsMesh = submeshVar->_is_nil(); } else myDlg->reset(); @@ -676,7 +682,7 @@ void SMESHGUI_MeshOp::selectionDone() myDlg->disableTab(i); } myMaxShapeDim = -1; - //Hide labels and fields (Mesh ang Geometry) + //Hide labels and fields (Mesh and Geometry) myDlg->setObjectShown( SMESHGUI_MeshDlg::Mesh, false ); myDlg->setObjectShown( SMESHGUI_MeshDlg::Geom, false ); myDlg->adjustSize(); @@ -740,9 +746,13 @@ bool SMESHGUI_MeshOp::isValid( QString& theMess ) const if ( myToCreate ) { QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); - if ( aGeomEntry == "" ) + if ( aGeomEntry.isEmpty() ) { - theMess = tr( "GEOMETRY_OBJECT_IS_NOT_DEFINED" ); + theMess = tr( myIsMesh ? + "GEOMETRY_OBJECT_IS_NOT_DEFINED_MESH" : + "GEOMETRY_OBJECT_IS_NOT_DEFINED_SUBMESH"); + if ( !myIsMesh ) + return false; dlg()->show(); if ( SUIT_MessageBox::warning( myDlg, tr( "SMESH_WRN_WARNING" ), theMess, SUIT_MessageBox::Yes, SUIT_MessageBox::No ) == SUIT_MessageBox::No ) @@ -831,7 +841,7 @@ void SMESHGUI_MeshOp::availableHyps( const int theDim, theHyps.clear(); bool isAlgo = ( theHypType == Algo ); bool isAux = ( theHypType == AddHyp ); - QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses( isAlgo, theDim, isAux, myIsOnGeometry ); + QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses( isAlgo, theDim, isAux, myIsOnGeometry, !myIsMesh ); QStringList::const_iterator anIter; for ( anIter = aHypTypeNameList.begin(); anIter != aHypTypeNameList.end(); ++anIter ) @@ -847,23 +857,23 @@ void SMESHGUI_MeshOp::availableHyps( const int theDim, //================================================================================ /*! * \brief Gets existing hypotheses or algorithms - * \param theDim - specifies dimension of returned hypotheses/algorifms - * \param theHypType - specifies whether algorims or hypotheses or additional ones - * are retrieved (possible values are in HypType enumeration) - * \param theFather - start object for finding ( may be component, mesh, or sub-mesh ) - * \param theHyps - output list of names. - * \param theHypVars - output list of variables. - * \param theAlgoData - to select hypos able to be used by this algo (optional) + * \param theDim - specifies dimension of returned hypotheses/algorifms + * \param theHypType - specifies whether algorims or hypotheses or additional ones + * are retrieved (possible values are in HypType enumeration) + * \param theFather - start object for finding ( may be component, mesh, or sub-mesh ) + * \param theHyps - output list of names. + * \param theHypVars - output list of variables. + * \param theAlgoData - to select hypos able to be used by this algo (optional) * * Gets existing (i.e. already created) hypotheses or algorithm in accordance with * input parameters */ //================================================================================ -void SMESHGUI_MeshOp::existingHyps( const int theDim, - const int theHypType, - _PTR(SObject) theFather, - QStringList& theHyps, - THypList& theHypList, +void SMESHGUI_MeshOp::existingHyps( const int theDim, + const int theHypType, + _PTR(SObject) theFather, + QStringList& theHyps, + THypList& theHypList, HypothesisData* theAlgoData) { // Clear hypoheses list @@ -916,7 +926,7 @@ void SMESHGUI_MeshOp::existingHyps( const int theDim, if ( !aData) continue; if ( ( theDim == -1 || aData->Dim.contains( theDim ) ) && ( isCompatible ( theAlgoData, aData, theHypType )) && - ( isAux == aData->IsAux )) + ( theHypType == Algo || isAux == aData->IsAuxOrNeedHyp )) { std::string aHypName = aName->Value(); theHyps.append( aHypName.c_str() ); @@ -1494,6 +1504,7 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, } } // get hyps compatible with curAlgo + bool defaulHypAvlbl = false; if ( curAlgo ) { // check if a selected hyp is compatible with the curAlgo @@ -1504,10 +1515,11 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, } existingHyps( dim, type, pObj, anExisting, myExistingHyps[ dim ][ type ], curAlgo); availableHyps( dim, type, anAvailable, myAvailableHypData[ dim ][ type ], curAlgo); + defaulHypAvlbl = (type == MainHyp && !curAlgo->IsAuxOrNeedHyp ); } // set list of hypotheses myDlg->tab( dim )->setAvailableHyps( type, anAvailable ); - myDlg->tab( dim )->setExistingHyps( type, anExisting ); + myDlg->tab( dim )->setExistingHyps( type, anExisting, defaulHypAvlbl ); // set current existing hypothesis if ( !curHyp->_is_nil() && !anExisting.isEmpty() ) @@ -1826,6 +1838,8 @@ bool SMESHGUI_MeshOp::createSubMesh( QString& theMess, QStringList& theEntryList selectObject( _PTR(SObject)() ); selectionDone(); + checkSubMeshConcurrency( aMeshVar, aSubMeshVar, /*askUser=*/true ); + return true; } @@ -1991,7 +2005,7 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) //================================================================================ /*! - * \brief Reads parameters of an edited mesh and assigns them to the dialog + * \brief Reads parameters of an edited mesh/sub-mesh and assigns them to the dialog * * Called when mesh is edited only. */ @@ -2016,6 +2030,7 @@ void SMESHGUI_MeshOp::readMesh() QString aMeshName = name( aMeshSO ); myDlg->setObjectText( SMESHGUI_MeshDlg::Mesh, aMeshName ); } + myHasConcurrentSubBefore = checkSubMeshConcurrency( aMeshVar, aSubMeshVar ); } // Get name of geometry object @@ -2031,6 +2046,7 @@ void SMESHGUI_MeshOp::readMesh() // Get hypotheses and algorithms assigned to the mesh/sub-mesh QStringList anExisting; const int lastDim = ( myIsOnGeometry ) ? SMESH::DIM_0D : SMESH::DIM_3D; + bool algoFound = false; for ( int dim = SMESH::DIM_3D; dim >= lastDim; --dim ) { // get algorithm @@ -2047,10 +2063,12 @@ void SMESHGUI_MeshOp::readMesh() // myAvailableHypData[ dim ][ Algo ].push_back( algoData ); // aHypIndex = myAvailableHypData[ dim ][ hypType ].count() - 1; // } + algoFound = ( aHypIndex > -1 ); } setCurrentHyp( dim, Algo, aHypIndex ); // set existing and available hypothesis according to the selected algo - onAlgoSelected( aHypIndex, dim ); + if ( aHypIndex > -1 || !algoFound ) + onAlgoSelected( aHypIndex, dim ); } // get hypotheses @@ -2187,6 +2205,14 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess ) } } + SALOMEDS_SObject* aSObject = _CAST(SObject, pObj); + CORBA::Object_var anObject = aSObject->GetObject(); + SMESH::SMESH_Mesh_var aMeshVar = SMESH::SMESH_Mesh::_narrow( anObject ); + SMESH::SMESH_subMesh_var aSubMeshVar = SMESH::SMESH_subMesh::_narrow( anObject ); + bool isMesh = !aMeshVar->_is_nil(); + if ( !isMesh && !aSubMeshVar->_is_nil() ) + aMeshVar = aSubMeshVar->GetFather(); + // Assign new algorithms and hypotheses for ( int dim = aDim; dim <= SMESH::DIM_3D; dim++ ) { @@ -2199,18 +2225,11 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess ) if ( !anAlgoVar->_is_nil() && // some algo selected and myObjHyps[ dim ][ Algo ].count() == 0 ) // no algo assigned { - SALOMEDS_SObject* aSObject = _CAST(SObject, pObj); - CORBA::Object_var anObject = aSObject->GetObject(); - SMESH::SMESH_Mesh_var aMeshVar = SMESH::SMESH_Mesh::_narrow( anObject ); - bool isMesh = !aMeshVar->_is_nil(); - if ( isMesh ) { + if ( isMesh ) SMESH::AddHypothesisOnMesh( aMeshVar, anAlgoVar ); - } else { - SMESH::SMESH_subMesh_var aVar = - SMESH::SMESH_subMesh::_narrow( _CAST(SObject,pObj)->GetObject() ); - if ( !aVar->_is_nil() ) - SMESH::AddHypothesisOnSubMesh( aVar, anAlgoVar ); - } + else if ( !aSubMeshVar->_is_nil() ) + SMESH::AddHypothesisOnSubMesh( aSubMeshVar, anAlgoVar ); + myObjHyps[ dim ][ Algo ].append( THypItem( anAlgoVar, aName) ); } @@ -2235,24 +2254,14 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess ) } // assign new hypotheses - if ( aNewHypIndex != anOldHypIndex && aNewHypIndex != -1 ) + if ( aNewHypIndex != anOldHypIndex && aNewHypIndex > -1 ) { - SMESH::SMESH_Mesh_var aMeshVar = - SMESH::SMESH_Mesh::_narrow( _CAST(SObject,pObj)->GetObject() ); - bool isMesh = !aMeshVar->_is_nil(); if ( isMesh ) - { SMESH::AddHypothesisOnMesh (aMeshVar, myExistingHyps[ dim ][ hypType ][ aNewHypIndex ].first ); - } - else - { - SMESH::SMESH_subMesh_var aVar = - SMESH::SMESH_subMesh::_narrow( _CAST(SObject,pObj)->GetObject() ); - if ( !aVar->_is_nil() ) - SMESH::AddHypothesisOnSubMesh - ( aVar, myExistingHyps[ dim ][ hypType ][ aNewHypIndex ].first ); - } + else if ( !aSubMeshVar->_is_nil() ) + SMESH::AddHypothesisOnSubMesh + ( aSubMeshVar, myExistingHyps[ dim ][ hypType ][ aNewHypIndex ].first ); } // reread all hypotheses of mesh if necessary QStringList anExisting; @@ -2260,9 +2269,61 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess ) } } + myHasConcurrentSubBefore = + checkSubMeshConcurrency( aMeshVar, aSubMeshVar, /*askUser=*/!myHasConcurrentSubBefore ); + return true; } +//================================================================================ +/*! + * \brief Checks if a concurrent sub-meshes appear as result of sub-mesh + * creation/edition and, if (askUser) , proposes the uses to set up a desired + * order of sub-mesh computation. + * Returns \c true if a sub-mesh concurrency detected. + */ +//================================================================================ + +bool SMESHGUI_MeshOp::checkSubMeshConcurrency(SMESH::SMESH_Mesh_ptr mesh, + SMESH::SMESH_subMesh_ptr submesh, + bool askUser) +{ + if ( CORBA::is_nil( mesh ) || CORBA::is_nil( submesh )) + return false; + + bool isNewConcurrent = mesh->IsUnorderedSubMesh( submesh->GetId() ); + if ( isNewConcurrent && askUser ) + { + int butID = SUIT_MessageBox::warning( myDlg->parentWidget(), tr( "SMESH_WARNING" ), + tr("CONCURRENT_SUBMESH_APPEARS"), + tr("SMESH_BUT_YES"), tr("SMESH_BUT_NO")); + if ( butID == 0 ) + { + _PTR(SObject) meshSO = SMESH::FindSObject( mesh ); + LightApp_SelectionMgr* aSelectionMgr = selectionMgr(); + if ( meshSO && aSelectionMgr ) + { + myDlg->setEnabled( false ); // disactivate selection + selectionMgr()->clearFilters(); + selectObject( meshSO ); + SMESHGUI::GetSMESHGUI()->OnGUIEvent( 713 ); // MESH_ORDER + qApp->processEvents(); + + myDlg->setEnabled( true ); + int obj = myDlg->getActiveObject(); + onActivateObject( obj ); // restore filter + if ( !myToCreate ) + { + selectObject( SMESH::FindSObject( submesh )); + selectionDone(); + } + } + } + } + + return isNewConcurrent; +} + //================================================================================ /*! * \brief Verifies whether given operator is valid for this one diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.h b/src/SMESHGUI/SMESHGUI_MeshOp.h index 5f5688267..90d49e276 100644 --- a/src/SMESHGUI/SMESHGUI_MeshOp.h +++ b/src/SMESHGUI/SMESHGUI_MeshOp.h @@ -111,6 +111,9 @@ private: bool createMesh( QString&, QStringList& ); bool createSubMesh( QString&, QStringList& ); bool editMeshOrSubMesh( QString& ); + bool checkSubMeshConcurrency( SMESH::SMESH_Mesh_ptr mesh, + SMESH::SMESH_subMesh_ptr submesh, + bool askUser=false); int currentHyp( const int, const int ) const; bool isAccessibleDim( const int ) const; @@ -135,6 +138,7 @@ private: bool myToCreate; bool myIsMesh; bool myIsOnGeometry; //!< TRUE if edited mesh accotiated with geometrical object + bool myHasConcurrentSubBefore; TDim2Type2HypList myExistingHyps; //!< all hypothesis of SMESH module TDim2Type2HypList myObjHyps; //!< hypothesis assigned to the current diff --git a/src/SMESHGUI/SMESHGUI_XmlHandler.cxx b/src/SMESHGUI/SMESHGUI_XmlHandler.cxx index 0ca286bc9..74b42dadd 100644 --- a/src/SMESHGUI/SMESHGUI_XmlHandler.cxx +++ b/src/SMESHGUI/SMESHGUI_XmlHandler.cxx @@ -123,9 +123,11 @@ bool SMESHGUI_XmlHandler::startElement (const QString&, const QString&, if (atts.value("type") != "") { QString aHypAlType = atts.value("type"); - QString aLabel = atts.value("label-id"); - QString anIcon = atts.value("icon-id"); - bool isAux = atts.value("auxiliary") == "true"; + QString aLabel = atts.value("label-id"); + QString anIcon = atts.value("icon-id"); + bool isAuxOrNeedHyp = ( qName == "hypothesis" ? + atts.value("auxiliary") == "true" : + atts.value("need-hyp" ) == "true" ); bool isNeedGeom = true, isSupportSubmeshes = false; QString aNeedGeom = atts.value("need-geom"); if ( !aNeedGeom.isEmpty() ) @@ -133,6 +135,11 @@ bool SMESHGUI_XmlHandler::startElement (const QString&, const QString&, QString suppSub = atts.value("support-submeshes"); if ( !suppSub.isEmpty() ) isSupportSubmeshes = (suppSub == "true"); + QString context = atts.value("context"); + if ( context.isEmpty() ) + context = "ANY"; + else + context = context.toUpper(); QString aDimStr = atts.value("dim"); aDimStr = aDimStr.remove( ' ' ); @@ -162,7 +169,7 @@ bool SMESHGUI_XmlHandler::startElement (const QString&, const QString&, if ( !aHypAlType.contains( BAD_HYP_FLAG ) ) { HypothesisData* aHypData = new HypothesisData (aHypAlType, myPluginName, myServerLib, myClientLib, - aLabel, anIcon, aDim, isAux, + aLabel, anIcon, context, aDim, isAuxOrNeedHyp, attr[ HYPOS ], attr[ OPT_HYPOS ], attr[ INPUT ], attr[ OUTPUT ], isNeedGeom, isSupportSubmeshes ); -- 2.30.2