X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_MeshOp.cxx;h=4ceb159ee0d3ea39527e71b1c5002feb230bdcca;hp=35dcb43bab4e2b490942d53eb175ccab031ac676;hb=3a401076892f2f372c58a07199e36486a6c5c9af;hpb=f02c3a1b9eca50c641a58b401496bc5385bed0e0 diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.cxx b/src/SMESHGUI/SMESHGUI_MeshOp.cxx index 35dcb43ba..4ceb159ee 100644 --- a/src/SMESHGUI/SMESHGUI_MeshOp.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshOp.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -19,11 +19,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + // SMESH SMESHGUI : GUI for SMESH component // File : SMESHGUI_MeshOp.cxx // Author : Sergey LITONIN, Open CASCADE S.A.S. - // SMESH includes +// #include "SMESHGUI_MeshOp.h" #include "SMESHGUI.h" @@ -85,7 +86,8 @@ SMESHGUI_MeshOp::SMESHGUI_MeshOp( const bool theToCreate, const bool theIsMesh ) myToCreate( theToCreate ), myIsMesh( theIsMesh ), myDlg( 0 ), - myShapeByMeshOp( 0 ) + myShapeByMeshOp( 0 ), + myHypoSet( 0 ) { if ( GeometryGUI::GetGeomGen()->_is_nil() )// check that GEOM_Gen exists GeometryGUI::InitGeomGen(); @@ -148,7 +150,10 @@ bool SMESHGUI_MeshOp::onApply() else if ( !myToCreate ) aResult = editMeshOrSubMesh( aMess ); if ( aResult ) + { + SMESHGUI::Modified(); update( UF_ObjBrowser | UF_Model ); + } } catch ( const SALOME::SALOME_Exception& S_ex ) { @@ -575,11 +580,11 @@ void SMESHGUI_MeshOp::selectionDone() SMESH::SObjectToInterface( pSubmesh ); bool editSubmesh = ( !sm->_is_nil() && SUIT_MessageBox::question( myDlg, tr( "SMESH_WARNING" ), - tr( "EDIT_SUBMESH_QUESTION"), - SUIT_MessageBox::Yes | - SUIT_MessageBox::No, - SUIT_MessageBox::No ) - == SUIT_MessageBox::Yes ); + tr( "EDIT_SUBMESH_QUESTION"), + SUIT_MessageBox::Yes | + SUIT_MessageBox::No, + SUIT_MessageBox::No ) + == SUIT_MessageBox::Yes ); if ( editSubmesh ) { selectionMgr()->clearFilters(); @@ -944,12 +949,19 @@ SMESHGUI_MeshOp::getInitParamsHypothesis( const QString& aHypType, } } - return SMESHGUI::GetSMESHGen()->GetHypothesisParameterValues( aHypType.toLatin1().data(), - aServerLib.toLatin1().data(), - aMeshVar, - aGeomVar, - /*byMesh = */isSubMesh); - + SMESH::SMESH_Hypothesis_var hyp = + SMESHGUI::GetSMESHGen()->GetHypothesisParameterValues( aHypType.toLatin1().data(), + aServerLib.toLatin1().data(), + aMeshVar, + aGeomVar, + /*byMesh = */isSubMesh); + if ( hyp->_is_nil() && isSubMesh ) + hyp = SMESHGUI::GetSMESHGen()->GetHypothesisParameterValues( aHypType.toLatin1().data(), + aServerLib.toLatin1().data(), + aMeshVar, + aGeomVar, + /*byMesh = */false); + return hyp; } //================================================================================ @@ -1019,7 +1031,7 @@ namespace */ //================================================================================ -void SMESHGUI_MeshOp::createHypothesis (const int theDim, +void SMESHGUI_MeshOp::createHypothesis(const int theDim, const int theType, const QString& theTypeName) { @@ -1027,6 +1039,8 @@ void SMESHGUI_MeshOp::createHypothesis (const int theDim, if (!aData) return; + myDim = theDim; + myType = theType; QStringList aHypNames; TDim2Type2HypList::const_iterator aDimIter = myExistingHyps.begin(); for ( ; aDimIter != myExistingHyps.end(); aDimIter++) { @@ -1045,7 +1059,7 @@ void SMESHGUI_MeshOp::createHypothesis (const int theDim, QString aHypName = GetUniqueName( aHypNames, aData->Label); // existing hypos - int nbHyp = myExistingHyps[theDim][theType].count(); + bool dialog = false; QString aClientLibName = aData->ClientLibName; if (aClientLibName == "") { @@ -1055,7 +1069,7 @@ void SMESHGUI_MeshOp::createHypothesis (const int theDim, // Get hypotheses creator client (GUI) // BUG 0020378 //SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(theTypeName); - SMESH::HypothesisCreatorPtr aCreator = SMESH::GetHypothesisCreator(theTypeName); + SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(theTypeName); // Create hypothesis if (aCreator) { @@ -1063,38 +1077,94 @@ void SMESHGUI_MeshOp::createHypothesis (const int theDim, SMESH::SMESH_Hypothesis_var initParamHyp = getInitParamsHypothesis(theTypeName, aData->ServerLibName); - int obj = myDlg->getActiveObject(); removeCustomFilters(); // Issue 0020170 // Get Entry of the Geom object + QString aGeomEntry = ""; + QString aMeshEntry = ""; QString anObjEntry = ""; - anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); - if ( anObjEntry == "" ) { - anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); + aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); + aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh ); + anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); + + if ( aMeshEntry != "" ) { // Get Geom object from Mesh + _PTR(SObject) pObj = studyDS()->FindObjectID( aMeshEntry.toLatin1().data() ); + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); + aMeshEntry = ( aGeomVar->_is_nil() ) ? "" : aMeshEntry = aGeomVar->GetStudyEntry(); + } + + if ( aMeshEntry == "" && aGeomEntry == "" ) { _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); - anObjEntry = aGeomVar->GetStudyEntry(); + if ( !aGeomVar->_is_nil() ) + aGeomEntry = aGeomVar->GetStudyEntry(); } - aCreator->setShapeEntry( anObjEntry ); + if ( anObjEntry != "" && aGeomEntry != "" && aMeshEntry == "" ) { // take geometry from submesh + _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); + if ( pObj ) { + // if current object is sub-mesh + SMESH::SMESH_subMesh_var aSubMeshVar = + SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() ); + if ( !aSubMeshVar->_is_nil() ) { + SMESH::SMESH_Mesh_var aMeshVar = aSubMeshVar->GetFather(); + if ( !aMeshVar->_is_nil() ) { + _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar ); + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( aMeshSO ); + if ( !aGeomVar->_is_nil() ) + aMeshEntry = aGeomVar->GetStudyEntry(); + } + } + } + } + + aCreator->setShapeEntry( aGeomEntry ); + if ( aMeshEntry != "" ) + aCreator->setMainShapeEntry( aMeshEntry ); myDlg->setEnabled( false ); - aCreator->create(initParamHyp, aHypName, myDlg); - onActivateObject( obj ); // Issue 0020170. Restore filters - myDlg->setEnabled( true ); - } else { - SMESH::CreateHypothesis(theTypeName, aHypName, false); + aCreator->create(initParamHyp, aHypName, myDlg, this, SLOT( onHypoCreated( int ) ) ); + dialog = true; } + else + SMESH::CreateHypothesis(theTypeName, aHypName, false); + } + + if( !dialog ) + onHypoCreated(2); +} + +//================================================================================ +/*! + * Necessary steps after hypothesis creation + * \param result - creation result: + * 0 = rejected + * 1 = accepted + * 2 = additional value meaning that slot is called not from dialog box + */ +//================================================================================ +void SMESHGUI_MeshOp::onHypoCreated( int result ) +{ + if( result != 2 ) + { + int obj = myDlg->getActiveObject(); + onActivateObject( obj ); // Issue 0020170. Restore filters + myDlg->setEnabled( true ); } _PTR(SComponent) aFather = SMESH::GetActiveStudyDocument()->FindComponent("SMESH"); - HypothesisData* algoData = hypData( theDim, Algo, currentHyp( theDim, Algo )); + int nbHyp = myExistingHyps[myDim][myType].count(); + HypothesisData* algoData = hypData( myDim, Algo, currentHyp( myDim, Algo )); QStringList aNewHyps; - existingHyps(theDim, theType, aFather, aNewHyps, myExistingHyps[theDim][theType], algoData); - if (aNewHyps.count() > nbHyp) { + existingHyps(myDim, myType, aFather, aNewHyps, myExistingHyps[myDim][myType], algoData); + if (aNewHyps.count() > nbHyp) + { for (int i = nbHyp; i < aNewHyps.count(); i++) - myDlg->tab(theDim)->addHyp(theType, aNewHyps[i]); + myDlg->tab(myDim)->addHyp(myType, aNewHyps[i]); } + + if( result!=2 && myHypoSet ) + processSet(); } //================================================================================ @@ -1124,7 +1194,7 @@ void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex ) // BUG 0020378 //SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHyp->GetName()); - SMESH::HypothesisCreatorPtr aCreator = SMESH::GetHypothesisCreator(aHyp->GetName()); + SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHyp->GetName()); if ( aCreator ) { // Get initial parameters @@ -1133,25 +1203,68 @@ void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex ) aCreator->setInitParamsHypothesis( initParamHyp ); // Get Entry of the Geom object + QString aGeomEntry = ""; + QString aMeshEntry = ""; QString anObjEntry = ""; - anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); - if ( anObjEntry == "" ) { - anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); + aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); + aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh ); + anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); + + if ( aMeshEntry != "" ) { // Get Geom object from Mesh + _PTR(SObject) pObj = studyDS()->FindObjectID( aMeshEntry.toLatin1().data() ); + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); + aMeshEntry = ( aGeomVar->_is_nil() ) ? "" : aMeshEntry = aGeomVar->GetStudyEntry(); + } + + if ( aMeshEntry == "" && aGeomEntry == "" ) { _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); - anObjEntry = aGeomVar->GetStudyEntry(); + if ( !aGeomVar->_is_nil() ) + aGeomEntry = aGeomVar->GetStudyEntry(); } - aCreator->setShapeEntry( anObjEntry ); - int obj = myDlg->getActiveObject(); + if ( anObjEntry != "" && aGeomEntry != "" && aMeshEntry == "" ) { // take geometry from submesh + _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); + if ( pObj ) { + // if current object is sub-mesh + SMESH::SMESH_subMesh_var aSubMeshVar = + SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() ); + if ( !aSubMeshVar->_is_nil() ) { + SMESH::SMESH_Mesh_var aMeshVar = aSubMeshVar->GetFather(); + if ( !aMeshVar->_is_nil() ) { + _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar ); + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( aMeshSO ); + if ( !aGeomVar->_is_nil() ) + aMeshEntry = aGeomVar->GetStudyEntry(); + } + } + } + } + + aCreator->setShapeEntry( aGeomEntry ); + if ( aMeshEntry != "" ) + aCreator->setMainShapeEntry( aMeshEntry ); removeCustomFilters(); // Issue 0020170 myDlg->setEnabled( false ); - aCreator->edit( aHyp.in(), aHypItem.second, dlg() ); - onActivateObject( obj ); // Issue 0020170. Restore filters - myDlg->setEnabled( true ); + aCreator->edit( aHyp.in(), aHypItem.second, dlg(), this, SLOT( onHypoEdited( int ) ) ); } } +//================================================================================ +/*! + * Necessary steps after hypothesis edition + * \param result - creation result: + * 0 = rejected + * 1 = accepted + */ +//================================================================================ +void SMESHGUI_MeshOp::onHypoEdited( int result ) +{ + int obj = myDlg->getActiveObject(); + onActivateObject( obj ); // Issue 0020170. Restore filters + myDlg->setEnabled( true ); +} + //================================================================================ /*! * \brief access to hypothesis data @@ -1288,7 +1401,7 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, CORBA::String_var curHypType = curHyp->GetName(); if ( !algoDeselectedByUser && myObjHyps[ dim ][ type ].count() > 0 && - curHypType == myObjHyps[ dim ][ type ].first().first->GetName()) + !strcmp( curHypType, myObjHyps[ dim ][ type ].first().first->GetName()) ) { HypothesisData* hypData = SMESH::GetHypothesisData( curHyp->GetName() ); for (int i = 0; i < myAvailableHypData[ dim ][ Algo ].count(); ++i) { @@ -1343,8 +1456,9 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, //================================================================================ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName ) { - HypothesesSet* aHypoSet = SMESH::GetHypothesesSet(theSetName); - if (!aHypoSet) return; + myHypoSet = SMESH::GetHypothesesSet(theSetName); + if (!myHypoSet) + return; // clear all hyps for (int dim = SMESH::DIM_0D; dim <= SMESH::DIM_3D; dim++) { @@ -1353,45 +1467,68 @@ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName ) setCurrentHyp(dim, MainHyp, -1); } - for (int aHypType = Algo; aHypType < AddHyp; aHypType++) { - bool isAlgo = (aHypType == Algo); + myHypoSet->init(true); //algorithms + processSet(); + myHypoSet->init(false); //hypotheses + processSet(); + myHypoSet = 0; +} - // set hyps from the set - QStringList* aHypoList = isAlgo ? &aHypoSet->AlgoList : &aHypoSet->HypoList; - for (int i = 0, n = aHypoList->count(); i < n; i++) { - const QString& aHypoTypeName = (*aHypoList)[ i ]; - HypothesisData* aHypData = SMESH::GetHypothesisData(aHypoTypeName); - if (!aHypData) - continue; +//================================================================================ +/*! + * \brief One step of hypothesis/algorithm list creation + * + * Creates a hypothesis or an algorithm for current item of internal list of names myHypoSet + */ +//================================================================================ +void SMESHGUI_MeshOp::processSet() +{ + myHypoSet->next(); + if( !myHypoSet->more() ) + return; - int aDim = aHypData->Dim[0]; - // create or/and set - if (isAlgo) { - int index = myAvailableHypData[aDim][Algo].indexOf( aHypData ); - if ( index < 0 ) { - QStringList anAvailable; - availableHyps( aDim, Algo, anAvailable, myAvailableHypData[aDim][Algo] ); - myDlg->tab( aDim )->setAvailableHyps( Algo, anAvailable ); - index = myAvailableHypData[aDim][Algo].indexOf( aHypData ); - } - setCurrentHyp( aDim, Algo, index ); - onAlgoSelected( index, aDim ); - } - else { - bool mainHyp = true; - QStringList anAvailable; - availableHyps( aDim, MainHyp, anAvailable, myAvailableHypData[aDim][MainHyp] ); - myDlg->tab( aDim )->setAvailableHyps( MainHyp, anAvailable ); - int index = myAvailableHypData[aDim][MainHyp].indexOf( aHypData ); - if ( index < 0 ) { - mainHyp = false; - index = myAvailableHypData[aDim][AddHyp].indexOf( aHypData ); - } - if (index >= 0) - createHypothesis(aDim, mainHyp ? MainHyp : AddHyp, aHypoTypeName); - } - } // loop on hypos in the set - } // loop on algo/hypo + bool isAlgo = myHypoSet->isAlgo(); + QString aHypoTypeName = myHypoSet->current(); + HypothesisData* aHypData = SMESH::GetHypothesisData(aHypoTypeName); + if (!aHypData) + { + processSet(); + return; + } + + int aDim = aHypData->Dim[0]; + // create or/and set + if (isAlgo) + { + int index = myAvailableHypData[aDim][Algo].indexOf( aHypData ); + if ( index < 0 ) + { + QStringList anAvailable; + availableHyps( aDim, Algo, anAvailable, myAvailableHypData[aDim][Algo] ); + myDlg->tab( aDim )->setAvailableHyps( Algo, anAvailable ); + index = myAvailableHypData[aDim][Algo].indexOf( aHypData ); + } + setCurrentHyp( aDim, Algo, index ); + onAlgoSelected( index, aDim ); + processSet(); + } + else + { + bool mainHyp = true; + QStringList anAvailable; + availableHyps( aDim, MainHyp, anAvailable, myAvailableHypData[aDim][MainHyp] ); + myDlg->tab( aDim )->setAvailableHyps( MainHyp, anAvailable ); + int index = myAvailableHypData[aDim][MainHyp].indexOf( aHypData ); + if ( index < 0 ) + { + mainHyp = false; + index = myAvailableHypData[aDim][AddHyp].indexOf( aHypData ); + } + if (index >= 0) + createHypothesis(aDim, mainHyp ? MainHyp : AddHyp, aHypoTypeName); + else + processSet(); + } } //================================================================================ @@ -1540,7 +1677,7 @@ bool SMESHGUI_MeshOp::createSubMesh( QString& theMess ) aNewGeomGroupName += aName; SALOMEDS::SObject_var aNewGroupSO = geomGen->AddInStudy(aSMESHGen->GetCurrentStudy(), aGeomVar, - aNewGeomGroupName.toLatin1().data(), mainGeom); + aNewGeomGroupName.toLatin1().data(), mainGeom); } } } @@ -1686,37 +1823,41 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) QStringList tmp; existingHyps( theDim, Algo, pObj, tmp, myExistingHyps[ theDim ][ Algo ]); - // look for anexisting algo of such a type + // look for an existing algo of such a type THypList& aHypVarList = myExistingHyps[ theDim ][ Algo ]; THypList::iterator anIter = aHypVarList.begin(); for ( ; anIter != aHypVarList.end(); anIter++) { SMESH::SMESH_Hypothesis_var aHypVar = (*anIter).first; CORBA::String_var aName = aHypVar->GetName(); - if ( !aHypVar->_is_nil() && aHypName == aName ) + if ( !aHypVar->_is_nil() && !strcmp(aHypName.toLatin1().data(), aName) ) { anAlgoVar = aHypVar; break; } } - if (anAlgoVar->_is_nil()) { + if (anAlgoVar->_is_nil()) + { HypothesisData* aHypData = SMESH::GetHypothesisData( aHypName ); - if (aHypData) { + if (aHypData) + { QString aClientLibName = aHypData->ClientLibName; - if (aClientLibName == "") { + if (aClientLibName == "") + { // Call hypothesis creation server method (without GUI) SMESH::CreateHypothesis(aHypName, aHypData->Label, true); - } else { + } + else + { // Get hypotheses creator client (GUI) // BUG 0020378 //SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHypName); - SMESH::HypothesisCreatorPtr aCreator = SMESH::GetHypothesisCreator(aHypName); + SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHypName); // Create algorithm - if (aCreator) { - aCreator->create(true, aHypName, myDlg); - } + if (aCreator) + aCreator->create(true, aHypName, myDlg, 0, QString::null ); else SMESH::CreateHypothesis(aHypName, aHypData->Label, true); } @@ -1730,7 +1871,7 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) { SMESH::SMESH_Hypothesis_var aHypVar = (*anIter).first; CORBA::String_var aName = aHypVar->GetName(); - if ( !aHypVar->_is_nil() && aHypName == aName ) + if ( !aHypVar->_is_nil() && !strcmp(aHypName.toLatin1().data(), aName) ) { anAlgoVar = aHypVar; break;