-// 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
//
// 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"
myToCreate( theToCreate ),
myIsMesh( theIsMesh ),
myDlg( 0 ),
- myShapeByMeshOp( 0 )
+ myShapeByMeshOp( 0 ),
+ myHypoSet( 0 )
{
if ( GeometryGUI::GetGeomGen()->_is_nil() )// check that GEOM_Gen exists
GeometryGUI::InitGeomGen();
else if ( !myToCreate )
aResult = editMeshOrSubMesh( aMess );
if ( aResult )
+ {
+ SMESHGUI::Modified();
update( UF_ObjBrowser | UF_Model );
+ }
}
catch ( const SALOME::SALOME_Exception& S_ex )
{
SMESH::SObjectToInterface<SMESH::SMESH_subMesh>( 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();
}
}
- 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;
}
//================================================================================
*/
//================================================================================
-void SMESHGUI_MeshOp::createHypothesis (const int theDim,
+void SMESHGUI_MeshOp::createHypothesis(const int theDim,
const int theType,
const QString& theTypeName)
{
if (!aData)
return;
+ myDim = theDim;
+ myType = theType;
QStringList aHypNames;
TDim2Type2HypList::const_iterator aDimIter = myExistingHyps.begin();
for ( ; aDimIter != myExistingHyps.end(); aDimIter++) {
QString aHypName = GetUniqueName( aHypNames, aData->Label);
// existing hypos
- int nbHyp = myExistingHyps[theDim][theType].count();
+ bool dialog = false;
QString aClientLibName = aData->ClientLibName;
if (aClientLibName == "") {
// 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) {
SMESH::SMESH_Hypothesis_var initParamHyp =
getInitParamsHypothesis(theTypeName, aData->ServerLibName);
- int obj = myDlg->getActiveObject();
removeCustomFilters(); // Issue 0020170
- // Set Geometry
- QStringList aList;
- myDlg->selectedObject( SMESHGUI_MeshDlg::Geom, aList );
- if (aList.count() != 0)
- aCreator->setShapeEntry( aList.first() );
- else
- aCreator->setShapeEntry( QString() );
+ // Get Entry of the Geom object
+ QString aGeomEntry = "";
+ QString aMeshEntry = "";
+ QString anObjEntry = "";
+ 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 );
+ if ( !aGeomVar->_is_nil() )
+ aGeomEntry = aGeomVar->GetStudyEntry();
+ }
+
+ 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();
}
//================================================================================
// 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
getInitParamsHypothesis( aHyp->GetName(), aHyp->GetLibName());
aCreator->setInitParamsHypothesis( initParamHyp );
- // Set Geometry
- QStringList aList;
- myDlg->selectedObject( SMESHGUI_MeshDlg::Geom, aList );
- if (aList.count() > 0)
- aCreator->setShapeEntry( aList.first() );
- else
- aCreator->setShapeEntry( "" );
+ // Get Entry of the Geom object
+ QString aGeomEntry = "";
+ QString aMeshEntry = "";
+ QString anObjEntry = "";
+ 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();
+ }
- int obj = myDlg->getActiveObject();
+ if ( aMeshEntry == "" && aGeomEntry == "" ) {
+ _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() );
+ GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj );
+ if ( !aGeomVar->_is_nil() )
+ aGeomEntry = aGeomVar->GetStudyEntry();
+ }
+
+ 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
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) {
//================================================================================
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++) {
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();
+ }
}
//================================================================================
aNewGeomGroupName += aName;
SALOMEDS::SObject_var aNewGroupSO =
geomGen->AddInStudy(aSMESHGen->GetCurrentStudy(), aGeomVar,
- aNewGeomGroupName.toLatin1().data(), mainGeom);
+ aNewGeomGroupName.toLatin1().data(), mainGeom);
}
}
}
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);
}
{
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;