reflect algo<->algo and algo->hypos dependencies in GUI

This commit is contained in:
eap 2006-04-10 15:24:41 +00:00
parent 51593dbf13
commit 69a203b6d4
9 changed files with 427 additions and 105 deletions

View File

@ -85,21 +85,31 @@
<algorithm type="Regular_1D" <algorithm type="Regular_1D"
label-id="Wire discretisation" label-id="Wire discretisation"
icon-id="mesh_algo_regular.png" icon-id="mesh_algo_regular.png"
hypos="LocalLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength"
opt-hypos="Propagation,QuadraticMesh"
output="EDGE"
dim="1"/> dim="1"/>
<algorithm type="MEFISTO_2D" <algorithm type="MEFISTO_2D"
label-id="Triangle (Mefisto)" label-id="Triangle (Mefisto)"
icon-id="mesh_algo_mefisto.png" icon-id="mesh_algo_mefisto.png"
hypos="LengthFromEdges"
input="EDGE"
output="TRIA"
dim="2"/> dim="2"/>
<algorithm type="Quadrangle_2D" <algorithm type="Quadrangle_2D"
label-id="Quadrangle (Mapping)" label-id="Quadrangle (Mapping)"
icon-id="mesh_algo_quad.png" icon-id="mesh_algo_quad.png"
opt-hypos="QuadranglePreference"
input="EDGE"
output="QUAD"
dim="2"/> dim="2"/>
<algorithm type="Hexa_3D" <algorithm type="Hexa_3D"
label-id="Hexahedron (i,j,k)" label-id="Hexahedron (i,j,k)"
icon-id="mesh_algo_hexa.png" icon-id="mesh_algo_hexa.png"
input="QUAD"
dim="3"/> dim="3"/>
</algorithms> </algorithms>
</meshers-group> </meshers-group>

View File

@ -128,22 +128,31 @@ private:
class HypothesisData class HypothesisData
{ {
public: public:
HypothesisData( const QString& thePluginName, HypothesisData( const QString& theTypeName,
const QString& thePluginName,
const QString& theServerLibName, const QString& theServerLibName,
const QString& theClientLibName, const QString& theClientLibName,
const QString& theLabel, const QString& theLabel,
const QString& theIconId, const QString& theIconId,
const QValueList<int>& theDim, const QValueList<int>& theDim,
const bool theIsAux ) const bool theIsAux,
: PluginName( thePluginName ), const QStringList& theNeededHypos,
const QStringList& theOptionalHypos,
const QStringList& theInputTypes,
const QStringList& theOutputTypes)
: TypeName( theTypeName ),
PluginName( thePluginName ),
ServerLibName( theServerLibName ), ServerLibName( theServerLibName ),
ClientLibName( theClientLibName ), ClientLibName( theClientLibName ),
Label( theLabel ), Label( theLabel ),
IconId( theIconId ), IconId( theIconId ),
Dim( theDim ), Dim( theDim ),
IsAux( theIsAux ) IsAux( theIsAux ),
NeededHypos( theNeededHypos ), OptionalHypos( theOptionalHypos ),
InputTypes( theInputTypes ), OutputTypes( theOutputTypes )
{}; {};
QString TypeName; //!< hypothesis type name
QString PluginName; //!< plugin name QString PluginName; //!< plugin name
QString ServerLibName; //!< server library name QString ServerLibName; //!< server library name
QString ClientLibName; //!< client library name QString ClientLibName; //!< client library name
@ -151,6 +160,12 @@ class HypothesisData
QString IconId; //!< icon identifier QString IconId; //!< icon identifier
QValueList<int> Dim; //!< list of supported dimensions (see SMESH::Dimension enumeration) QValueList<int> Dim; //!< list of supported dimensions (see SMESH::Dimension enumeration)
bool IsAux; //!< TRUE if given hypothesis is auxiliary one, FALSE otherwise bool IsAux; //!< TRUE if given hypothesis is auxiliary one, FALSE otherwise
// for algorithm only: dependencies algo <-> algo and algo -> hypos
QStringList NeededHypos; //!< list of obligatory 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
}; };
/*! /*!

View File

@ -250,17 +250,50 @@ namespace SMESH{
// Init list of available hypotheses, if needed // Init list of available hypotheses, if needed
InitAvailableHypotheses(); InitAvailableHypotheses();
if (myHypothesesMap.find(aHypType) == myHypothesesMap.end()) { THypothesisDataMap::iterator type_data = myHypothesesMap.find(aHypType);
if (myAlgorithmsMap.find(aHypType) != myAlgorithmsMap.end()) { if (type_data != myHypothesesMap.end()) {
aHypData = myAlgorithmsMap[aHypType]; aHypData = type_data->second;
}
} }
else { else {
aHypData = myHypothesesMap[aHypType]; type_data = myAlgorithmsMap.find(aHypType);
if (type_data != myAlgorithmsMap.end())
aHypData = type_data->second;
} }
return aHypData; return aHypData;
} }
bool IsAvailableHypothesis(const HypothesisData* algoData,
const QString& hypType,
bool& isAuxiliary)
{
isAuxiliary = false;
if ( !algoData )
return false;
if ( algoData->NeededHypos.contains( hypType ))
return true;
if ( algoData->OptionalHypos.contains( hypType)) {
isAuxiliary = true;
return true;
}
return false;
}
bool IsCompatibleAlgorithm(const HypothesisData* algo1Data,
const HypothesisData* algo2Data)
{
if ( !algo1Data || !algo2Data )
return false;
const HypothesisData* algoIn = algo1Data, *algoMain = algo2Data;
if ( algoIn->Dim.first() > algoMain->Dim.first() ) {
algoIn = algo2Data; algoMain = algo1Data;
}
// look for any output type of algoIn between input types of algoMain
QStringList::const_iterator inElemType = algoIn->OutputTypes.begin();
for ( ; inElemType != algoIn->OutputTypes.end(); ++inElemType )
if ( algoMain->InputTypes.contains( *inElemType ))
return true;
return false;
}
SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator(const char* aHypType) SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator(const char* aHypType)
{ {

View File

@ -61,6 +61,13 @@ namespace SMESH{
HypothesisData* GetHypothesisData(const char* aHypType); HypothesisData* GetHypothesisData(const char* aHypType);
bool IsAvailableHypothesis(const HypothesisData* algoData,
const QString& hypType,
bool& isOptional);
bool IsCompatibleAlgorithm(const HypothesisData* algo1Data,
const HypothesisData* algo2Data);
SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator(const char* aHypType); SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator(const char* aHypType);
SMESH::SMESH_Hypothesis_ptr CreateHypothesis(const char* aHypType, SMESH::SMESH_Hypothesis_ptr CreateHypothesis(const char* aHypType,

View File

@ -115,6 +115,7 @@ SMESHGUI_MeshTab::SMESHGUI_MeshTab( QWidget* theParent )
connect( myEditHyp[ i ], SIGNAL( clicked() ), SLOT( onEditHyp() ) ); connect( myEditHyp[ i ], SIGNAL( clicked() ), SLOT( onEditHyp() ) );
connect( myHyp[ i ], SIGNAL( activated( int ) ), SLOT( onHyp( int ) ) ); connect( myHyp[ i ], SIGNAL( activated( int ) ), SLOT( onHyp( int ) ) );
} }
connect( myHyp[ Algo ], SIGNAL( activated( int ) ), SLOT( onHyp( int ) ) );
// Initialize controls // Initialize controls
@ -141,6 +142,8 @@ SMESHGUI_MeshTab::~SMESHGUI_MeshTab()
void SMESHGUI_MeshTab::setAvailableHyps( const int theId, const QStringList& theHyps ) void SMESHGUI_MeshTab::setAvailableHyps( const int theId, const QStringList& theHyps )
{ {
myAvailableHyps[ theId ] = theHyps; myAvailableHyps[ theId ] = theHyps;
bool enable = ! theHyps.isEmpty();
if ( theId == Algo ) if ( theId == Algo )
{ {
myHyp[ Algo ]->clear(); myHyp[ Algo ]->clear();
@ -148,6 +151,11 @@ void SMESHGUI_MeshTab::setAvailableHyps( const int theId, const QStringList& the
myHyp[ Algo ]->insertStringList( theHyps ); myHyp[ Algo ]->insertStringList( theHyps );
myHyp[ Algo ]->setCurrentItem( 0 ); myHyp[ Algo ]->setCurrentItem( 0 );
} }
else {
myCreateHyp[ theId ]->setEnabled( enable );
myEditHyp[ theId ]->setEnabled( false );
}
myHyp[ theId ]->setEnabled( enable );
} }
//================================================================================ //================================================================================
@ -295,15 +303,20 @@ void SMESHGUI_MeshTab::onEditHyp()
/*! /*!
* \brief Updates "Edit hypothesis" button state * \brief Updates "Edit hypothesis" button state
* *
* SLOT called when current hypothesis changed disables "Edit hypothesis" button * SLOT called when current hypothesis changed. Disables "Edit hypothesis" button
* if current hypothesis is <None>, enables otherwise * if current hypothesis is <None>, enables otherwise.
* If an algorithm changed, emits selectAlgo( theIndex ) signal
*/ */
//================================================================================ //================================================================================
void SMESHGUI_MeshTab::onHyp( int theIndex ) void SMESHGUI_MeshTab::onHyp( int theIndex )
{ {
const QObject* aSender = sender(); const QObject* aSender = sender();
if ( aSender == myHyp[ Algo ] )
emit selectAlgo( theIndex - 1 ); // - 1 because there is NONE on the top
else {
int anIndex = aSender == myHyp[ MainHyp ] ? MainHyp : AddHyp; int anIndex = aSender == myHyp[ MainHyp ] ? MainHyp : AddHyp;
myEditHyp[ anIndex ]->setEnabled( theIndex > 0 ); myEditHyp[ anIndex ]->setEnabled( theIndex > 0 );
}
} }
//================================================================================ //================================================================================
@ -379,9 +392,9 @@ SMESHGUI_MeshDlg::SMESHGUI_MeshDlg( const bool theToCreate, const bool theIsMesh
myTabs[ Dim1D ] = new SMESHGUI_MeshTab( myTabWg ); myTabs[ Dim1D ] = new SMESHGUI_MeshTab( myTabWg );
myTabs[ Dim2D ] = new SMESHGUI_MeshTab( myTabWg ); myTabs[ Dim2D ] = new SMESHGUI_MeshTab( myTabWg );
myTabs[ Dim3D ] = new SMESHGUI_MeshTab( myTabWg ); myTabs[ Dim3D ] = new SMESHGUI_MeshTab( myTabWg );
myTabWg->addTab( myTabs[ Dim1D ], tr( "DIM_1D" ) );
myTabWg->addTab( myTabs[ Dim2D ], tr( "DIM_2D" ) );
myTabWg->addTab( myTabs[ Dim3D ], tr( "DIM_3D" ) ); myTabWg->addTab( myTabs[ Dim3D ], tr( "DIM_3D" ) );
myTabWg->addTab( myTabs[ Dim2D ], tr( "DIM_2D" ) );
myTabWg->addTab( myTabs[ Dim1D ], tr( "DIM_1D" ) );
// Hypotheses Sets // Hypotheses Sets
myHypoSetPopup = new QPopupMenu(); myHypoSetPopup = new QPopupMenu();
@ -462,7 +475,7 @@ void SMESHGUI_MeshDlg::reset()
//================================================================================ //================================================================================
void SMESHGUI_MeshDlg::setCurrentTab( const int theId ) void SMESHGUI_MeshDlg::setCurrentTab( const int theId )
{ {
myTabWg->setCurrentPage( theId ); myTabWg->setCurrentPage( Dim3D - theId );
} }
//================================================================================ //================================================================================

View File

@ -129,6 +129,8 @@ signals:
//!< Emited when "Create hypothesis" button clicked //!< Emited when "Create hypothesis" button clicked
void editHyp( const int theHypType, const int theIndex ); void editHyp( const int theHypType, const int theIndex );
//!< Emited when "Edit hypothesis" button clicked //!< Emited when "Edit hypothesis" button clicked
void selectAlgo( const int theIndex );
//!< Emited when an algorithm is selected
private slots: private slots:
@ -150,7 +152,3 @@ private:
}; };
#endif #endif

View File

@ -203,9 +203,11 @@ void SMESHGUI_MeshOp::startOperation()
for ( int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++ ) for ( int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++ )
{ {
connect( myDlg->tab( i ), SIGNAL( createHyp( const int, const int ) ), connect( myDlg->tab( i ), SIGNAL( createHyp( const int, const int ) ),
this, SLOT( onCreateHyp( const int, const int) ) ); this, SLOT( onCreateHyp( const int, const int ) ) );
connect( myDlg->tab( i ), SIGNAL( editHyp( const int, const int ) ), connect( myDlg->tab( i ), SIGNAL( editHyp( const int, const int ) ),
this, SLOT( onEditHyp( const int, const int) ) ); this, SLOT( onEditHyp( const int, const int ) ) );
connect( myDlg->tab( i ), SIGNAL( selectAlgo( const int ) ),
this, SLOT( onAlgoSelected( const int ) ) );
} }
connect( myDlg, SIGNAL( hypoSet( const QString& )), SLOT( onHypoSet( const QString& ))); connect( myDlg, SIGNAL( hypoSet( const QString& )), SLOT( onHypoSet( const QString& )));
connect( myDlg, SIGNAL( geomSelectionByMesh( bool )), SLOT( onGeomSelectionByMesh( bool ))); connect( myDlg, SIGNAL( geomSelectionByMesh( bool )), SLOT( onGeomSelectionByMesh( bool )));
@ -217,22 +219,19 @@ void SMESHGUI_MeshOp::startOperation()
} }
SMESHGUI_SelectionOp::startOperation(); SMESHGUI_SelectionOp::startOperation();
// iterate through dimensions and get available and existing algoritms and hypotheses, // iterate through dimensions and get available algoritms,
// set them to the dialog // set them to the dialog
int i, j;
_PTR(SComponent) aFather = SMESH::GetActiveStudyDocument()->FindComponent( "SMESH" ); _PTR(SComponent) aFather = SMESH::GetActiveStudyDocument()->FindComponent( "SMESH" );
for ( i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++ ) for ( int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++ )
{ {
SMESHGUI_MeshTab* aTab = myDlg->tab( i ); SMESHGUI_MeshTab* aTab = myDlg->tab( i );
QStringList anAvailable, anExisting; QStringList anAvailable;
for ( j = Algo; j <= AddHyp; j++ ) // clear available hypotheses
{ aTab->setAvailableHyps( MainHyp, anAvailable );
availableHyps( i, j, anAvailable ); aTab->setAvailableHyps( AddHyp, anAvailable );
existingHyps( i, j, aFather, anExisting, myExistingHyps[ i ][ j ] ); // set algos
availableHyps( i, Algo, anAvailable, myAvailableHypData[i][Algo] );
aTab->setAvailableHyps( j, anAvailable ); aTab->setAvailableHyps( Algo, anAvailable );
aTab->setExistingHyps( j, anExisting );
}
} }
if ( myToCreate ) if ( myToCreate )
{ {
@ -244,7 +243,7 @@ void SMESHGUI_MeshOp::startOperation()
myDlg->setHypoSets( SMESH::GetHypothesesSets() ); myDlg->setHypoSets( SMESH::GetHypothesesSets() );
myDlg->setCurrentTab( SMESH::DIM_1D ); myDlg->setCurrentTab( SMESH::DIM_3D );
myDlg->show(); myDlg->show();
selectionDone(); selectionDone();
@ -580,6 +579,31 @@ bool SMESHGUI_MeshOp::isValid( QString& theMess ) const
return true; return true;
} }
//================================================================================
/*!
* \brief check compatibility of the algorithm and another algorithm or hypothesis
* \param theAlgoData - algorithm data
* \param theHypData - hypothesis data
* \param theHypType - hypothesis type
* \param theHypTypeName - hypothesis type name, must be provided if 2-nd arg is not algo
* \retval bool - check result
*/
//================================================================================
static bool isCompatible(const HypothesisData* theAlgoData,
const HypothesisData* theHypData,
const int theHypType)
{
if ( !theAlgoData )
return true;
if ( theHypType == SMESHGUI_MeshOp::Algo )
return SMESH::IsCompatibleAlgorithm( theAlgoData, theHypData );
bool isAux;
return ( SMESH::IsAvailableHypothesis( theAlgoData, theHypData->TypeName, isAux ));
}
//================================================================================ //================================================================================
/*! /*!
* \brief Gets available hypotheses or algorithms * \brief Gets available hypotheses or algorithms
@ -587,23 +611,32 @@ bool SMESHGUI_MeshOp::isValid( QString& theMess ) const
* \param theHypType - specifies whether algorims or hypotheses or additional ones * \param theHypType - specifies whether algorims or hypotheses or additional ones
* are retrieved (possible values are in HypType enumeration) * are retrieved (possible values are in HypType enumeration)
* \param theHyps - Output list of hypotheses' names * \param theHyps - Output list of hypotheses' names
* \param theAlgoData - to select hypos able to be used by this algo (optional)
* *
* Gets available hypotheses or algorithm in accordance with input parameters * Gets available hypotheses or algorithm in accordance with input parameters
*/ */
//================================================================================ //================================================================================
void SMESHGUI_MeshOp::availableHyps( const int theDim, void SMESHGUI_MeshOp::availableHyps( const int theDim,
const int theHypType, const int theHypType,
QStringList& theHyps ) const QStringList& theHyps,
THypDataList& theDataList,
HypothesisData* theAlgoData ) const
{ {
theDataList.clear();
theHyps.clear(); theHyps.clear();
QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses( bool isAlgo = ( theHypType == Algo );
theHypType == Algo , theDim, theHypType == AddHyp ); bool isAux = ( theHypType == AddHyp );
QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses( isAlgo, theDim, isAux );
QStringList::const_iterator anIter; QStringList::const_iterator anIter;
for ( anIter = aHypTypeNameList.begin(); anIter != aHypTypeNameList.end(); ++anIter ) for ( anIter = aHypTypeNameList.begin(); anIter != aHypTypeNameList.end(); ++anIter )
{ {
HypothesisData* aData = SMESH::GetHypothesisData( *anIter ); HypothesisData* aData = SMESH::GetHypothesisData( *anIter );
if ( isCompatible ( theAlgoData, aData, theHypType )) {
theDataList.append( aData );
theHyps.append( aData->Label ); theHyps.append( aData->Label );
} }
}
} }
//================================================================================ //================================================================================
@ -613,8 +646,10 @@ void SMESHGUI_MeshOp::availableHyps( const int theDim,
* \param theHypType - specifies whether algorims or hypotheses or additional ones * \param theHypType - specifies whether algorims or hypotheses or additional ones
* are retrieved (possible values are in HypType enumeration) * are retrieved (possible values are in HypType enumeration)
* \param theFather - start object for finding ( may be component, mesh, or sub-mesh ) * \param theFather - start object for finding ( may be component, mesh, or sub-mesh )
* \param theDataList - output list of hypotheses data
* \param theHyps - output list of names. * \param theHyps - output list of names.
* \param theHypVars - output list of variables. * \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 * Gets existing (i.e. already created) hypotheses or algorithm in accordance with
* input parameters * input parameters
@ -624,7 +659,8 @@ void SMESHGUI_MeshOp::existingHyps( const int theDim,
const int theHypType, const int theHypType,
_PTR(SObject) theFather, _PTR(SObject) theFather,
QStringList& theHyps, QStringList& theHyps,
QValueList<SMESH::SMESH_Hypothesis_var>& theHypVars ) QValueList<SMESH::SMESH_Hypothesis_var>& theHypVars,
HypothesisData* theAlgoData)
{ {
// Clear hypoheses list // Clear hypoheses list
theHyps.clear(); theHyps.clear();
@ -633,6 +669,8 @@ void SMESHGUI_MeshOp::existingHyps( const int theDim,
if ( !theFather ) if ( !theFather )
return; return;
const bool isAux = ( theHypType == AddHyp );
_PTR(SObject) aHypRoot; _PTR(SObject) aHypRoot;
_PTR(GenericAttribute) anAttr; _PTR(GenericAttribute) anAttr;
_PTR(AttributeName) aName; _PTR(AttributeName) aName;
@ -672,8 +710,10 @@ void SMESHGUI_MeshOp::existingHyps( const int theDim,
QString aHypType( aHypVar->GetName() ); QString aHypType( aHypVar->GetName() );
HypothesisData* aData = SMESH::GetHypothesisData( aHypType ); HypothesisData* aData = SMESH::GetHypothesisData( aHypType );
if ( ( theDim == -1 || aData->Dim.contains( theDim ) ) && if ( ( theDim == -1 || aData->Dim.contains( theDim ) ) &&
( theHypType == AddHyp ) == aData->IsAux ) ( isCompatible ( theAlgoData, aData, theHypType )) &&
( isAux == aData->IsAux ))
{ {
//theDataList.append( aData );
theHyps.append( aName->Value().c_str() ); theHyps.append( aName->Value().c_str() );
theHypVars.append( aHypVar ); theHypVars.append( aHypVar );
} }
@ -744,6 +784,24 @@ SMESHGUI_MeshOp::getInitParamsHypothesis( const QString& aHypType,
return SMESH::SMESH_Hypothesis::_nil(); return SMESH::SMESH_Hypothesis::_nil();
} }
//================================================================================
/*!
* \Brief Returns tab dimention
* \param tab - the tab in the dlg
* \param dlg - my dialogue
* \retval int - dimention
*/
//================================================================================
static int getTabDim (const QObject* tab, SMESHGUI_MeshDlg* dlg )
{
int aDim = -1;
for (int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++)
if (tab == dlg->tab(i))
aDim = i;
return aDim;
}
//================================================================================ //================================================================================
/*! /*!
* \brief Create hypothesis * \brief Create hypothesis
@ -757,19 +815,15 @@ SMESHGUI_MeshOp::getInitParamsHypothesis( const QString& aHypType,
void SMESHGUI_MeshOp::onCreateHyp( const int theHypType, const int theIndex ) void SMESHGUI_MeshOp::onCreateHyp( const int theHypType, const int theIndex )
{ {
// Specifies dimension of hypothesis to be created // Specifies dimension of hypothesis to be created
const QObject* aSender = sender(); int aDim = getTabDim( sender(), myDlg );
int aDim = -1;
for (int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++)
if (aSender == myDlg->tab(i))
aDim = i;
if (aDim == -1) if (aDim == -1)
return; return;
// Specifies type of hypothesis to be created // Specifies type of hypothesis to be created
QStringList aHypTypeNames = SMESH::GetAvailableHypotheses(false, aDim, theHypType == AddHyp); THypDataList& dataList = myAvailableHypData[ aDim ][ theHypType ];
if (theIndex < 0 || theIndex >= aHypTypeNames.count()) if (theIndex < 0 || theIndex >= dataList.count())
return; return;
QString aHypTypeName = aHypTypeNames[ theIndex ]; QString aHypTypeName = dataList[ theIndex ]->TypeName;
// Create hypothesis // Create hypothesis
createHypothesis(aDim, theHypType, aHypTypeName); createHypothesis(aDim, theHypType, aHypTypeName);
@ -792,8 +846,7 @@ void SMESHGUI_MeshOp::createHypothesis (const int theDim,
return; return;
// existing hypos // existing hypos
QValueList<SMESH::SMESH_Hypothesis_var>& aList = myExistingHyps[theDim][theType]; int nbHyp = myExistingHyps[theDim][theType].count();
int nbHyp = aList.count();
QString aClientLibName = aData->ClientLibName; QString aClientLibName = aData->ClientLibName;
if (aClientLibName == "") { if (aClientLibName == "") {
@ -817,8 +870,9 @@ void SMESHGUI_MeshOp::createHypothesis (const int theDim,
_PTR(SComponent) aFather = SMESH::GetActiveStudyDocument()->FindComponent("SMESH"); _PTR(SComponent) aFather = SMESH::GetActiveStudyDocument()->FindComponent("SMESH");
HypothesisData* algoData = hypData( theDim, Algo, currentHyp( theDim, Algo ));
QStringList aNewHyps; QStringList aNewHyps;
existingHyps(theDim, theType, aFather, aNewHyps, myExistingHyps[theDim][theType]); existingHyps(theDim, theType, aFather, aNewHyps, myExistingHyps[theDim][theType], algoData);
if (aNewHyps.count() > nbHyp) { if (aNewHyps.count() > nbHyp) {
for (int i = nbHyp; i < aNewHyps.count(); i++) for (int i = nbHyp; i < aNewHyps.count(); i++)
myDlg->tab(theDim)->addHyp(theType, aNewHyps[i]); myDlg->tab(theDim)->addHyp(theType, aNewHyps[i]);
@ -838,15 +892,13 @@ void SMESHGUI_MeshOp::createHypothesis (const int theDim,
void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex ) void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex )
{ {
// Speicfies dimension of hypothesis to be created // Speicfies dimension of hypothesis to be created
const QObject* aSender = sender(); int aDim = getTabDim( sender(), myDlg );
int aDim = -1; if (aDim == -1)
for ( int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++ )
if ( aSender == myDlg->tab( i ) )
aDim = i;
if ( aDim == -1 )
return; return;
QValueList<SMESH::SMESH_Hypothesis_var> aList = myExistingHyps[ aDim ][ theHypType ]; QValueList<SMESH::SMESH_Hypothesis_var> aList = myExistingHyps[ aDim ][ theHypType ];
if ( theIndex < 0 || theIndex >= aList.count() )
return;
SMESH::SMESH_Hypothesis_var aHyp = aList[ theIndex - 1 ]; SMESH::SMESH_Hypothesis_var aHyp = aList[ theIndex - 1 ];
if ( aHyp->_is_nil() ) if ( aHyp->_is_nil() )
return; return;
@ -857,6 +909,150 @@ void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex )
aCreator->edit( aHyp.in(), dlg() ); aCreator->edit( aHyp.in(), dlg() );
} }
//================================================================================
/*!
* \brief access to hypothesis data
* \param theDim - hyp dimension
* \param theHypType - hyp type (Algo,MainHyp or AddHyp)
* \param theIndex - index in the list
* \retval HypothesisData* - result data, may be 0
*/
//================================================================================
HypothesisData* SMESHGUI_MeshOp::hypData( const int theDim,
const int theHypType,
const int theIndex)
{
if ( theDim > -1 && theDim < 3 &&
theHypType > -1 && theHypType < NbHypTypes &&
theIndex > -1 && theIndex < myAvailableHypData[ theDim ][ theHypType ].count() )
return myAvailableHypData[ theDim ][ theHypType ][ theIndex ];
return 0;
}
//================================================================================
/*!
* \brief Set available algos and hypos according to the selected algorithm
* \param theIndex - algorithm index
*/
//================================================================================
void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex,
const int theDim )
{
if ( myIgnoreAlgoSelection )
return;
int aDim = theDim < 0 ? getTabDim( sender(), myDlg ): theDim;
if (aDim == -1)
return;
// find highest available dimension, all algos of this dimension are available for choice
int aTopDim = -1;
for (int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++)
if (isAccessibleDim( i ))
aTopDim = i;
if (aTopDim == -1)
return;
HypothesisData* algoData = hypData( aDim, Algo, theIndex );
HypothesisData* algoByDim[3];
algoByDim[ aDim ] = algoData;
QStringList anAvailable;
if ( !algoData ) { // all algos becomes available
availableHyps( aDim, Algo, anAvailable, myAvailableHypData[ aDim ][ Algo ]);
myDlg->tab( aDim )->setAvailableHyps( Algo, anAvailable );
}
// check that algorithms of other dimentions are compatible with
// the selected one
// 2 loops: backward and forward from algo dimension
for ( int forward = false; forward <= true; ++forward )
{
int dim = aDim + 1, lastDim = SMESH::DIM_3D, dir = 1;
if ( !forward ) {
dim = aDim - 1; lastDim = SMESH::DIM_1D; dir = -1;
}
HypothesisData* prevAlgo = algoData;
for ( ; dim * dir <= lastDim * dir ; dim += dir )
{
if ( !isAccessibleDim( dim ))
continue;
// get currently selected algo
int algoIndex = currentHyp( dim, Algo );
HypothesisData* curAlgo = hypData( dim, Algo, algoIndex );
if ( curAlgo ) { // some algo selected
if ( !isCompatible( prevAlgo, curAlgo, Algo ))
curAlgo = 0;
}
// set new available algoritms
availableHyps( dim, Algo, anAvailable, myAvailableHypData[dim][Algo], prevAlgo );
HypothesisData* soleCompatible = 0;
if ( anAvailable.count() == 1 )
soleCompatible = myAvailableHypData[dim][Algo][0];
if ( dim == aTopDim && prevAlgo ) // all available algoritms should be selectable any way
availableHyps( dim, Algo, anAvailable, myAvailableHypData[dim][Algo], 0 );
myDlg->tab( dim )->setAvailableHyps( Algo, anAvailable );
// restore previously selected algo
algoIndex = myAvailableHypData[dim][Algo].findIndex( curAlgo );
if ( algoIndex < 0 && soleCompatible )
// select the sole compatible algo
algoIndex = myAvailableHypData[dim][Algo].findIndex( soleCompatible );
setCurrentHyp( dim, Algo, algoIndex );
// remember current algo
prevAlgo = algoByDim[ dim ] = hypData( dim, Algo, algoIndex );
}
}
// set hypotheses corresponding to the found algoritms
QString anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj );
_PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.latin1() );
if ( !pObj )
pObj = SMESH::GetActiveStudyDocument()->FindComponent("SMESH");
for ( int dim = SMESH::DIM_1D; dim <= SMESH::DIM_3D; dim++ )
{
if ( !isAccessibleDim( dim ))
continue;
for ( int type = MainHyp; type < NbHypTypes; type++ )
{
myAvailableHypData[ dim ][ type ].clear();
QStringList anAvailable, anExisting;
SMESH::SMESH_Hypothesis_var curHyp;
// get hyps compatible with curAlgo
if ( HypothesisData* curAlgo = algoByDim[ dim ] )
{
// get current existing hypothesis
int hypIndex = currentHyp( dim, type );
if ( hypIndex >= 0 && hypIndex < myExistingHyps[ dim ][ type ].count() ) {
curHyp = myExistingHyps[ dim ][ type ][ hypIndex ];
QString hypTypeName = curHyp->GetName();
HypothesisData* hypData = SMESH::GetHypothesisData( hypTypeName );
if ( !isCompatible( curAlgo, hypData, type ))
curHyp = SMESH::SMESH_Hypothesis::_nil();
}
existingHyps( dim, type, pObj, anExisting, myExistingHyps[ dim ][ type ], curAlgo);
availableHyps( dim, type, anAvailable, myAvailableHypData[ dim ][ type ], curAlgo);
}
// set list of hypotheses
myDlg->tab( dim )->setAvailableHyps( type, anAvailable );
myDlg->tab( dim )->setExistingHyps( type, anExisting );
// set current hypothesis
int hypIndex = -1;
if ( !curHyp->_is_nil() && !anExisting.isEmpty() )
hypIndex = this->find( curHyp, myExistingHyps[ dim ][ type ]);
setCurrentHyp( dim, type, hypIndex );
}
}
}
//================================================================================ //================================================================================
/*! /*!
* \brief Creates and selects hypothesis of hypotheses set * \brief Creates and selects hypothesis of hypotheses set
@ -886,12 +1082,21 @@ void SMESHGUI_MeshOp::onHypoSet( const QString& theSetName )
int aDim = aHypData->Dim[0]; int aDim = aHypData->Dim[0];
// create or/and set // create or/and set
if (isAlgo) { if (isAlgo) {
QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses(isAlgo, aDim); QStringList tmp;
int index = aHypTypeNameList.findIndex(aHypoTypeName); availableHyps( aDim, Algo, tmp, myAvailableHypData[aDim][Algo] );
if (index < 0) continue; int index = myAvailableHypData[aDim][Algo].findIndex( aHypData );
setCurrentHyp(aDim, aHypType, index); setCurrentHyp( aDim, Algo, index );
} else { onAlgoSelected( index, aDim );
createHypothesis(aDim, aHypType, aHypoTypeName); }
else {
bool mainHyp = true;
int index = myAvailableHypData[aDim][MainHyp].findIndex( aHypData );
if ( index < 0 ) {
mainHyp = false;
index = myAvailableHypData[aDim][AddHyp].findIndex( aHypData );
}
if (index >= 0)
createHypothesis(aDim, mainHyp ? MainHyp : AddHyp, aHypoTypeName);
} }
} // loop on hypos in the set } // loop on hypos in the set
} // loop on algo/hypo } // loop on algo/hypo
@ -1033,7 +1238,7 @@ int SMESHGUI_MeshOp::currentHyp( const int theDim, const int theHypType ) const
* \retval bool - result * \retval bool - result
*/ */
//================================================================================ //================================================================================
bool SMESHGUI_MeshOp::isAccessibleDim( const int theDim) const bool SMESHGUI_MeshOp::isAccessibleDim( const int theDim ) const
{ {
return myDlg->tab( theDim )->isEnabled(); return myDlg->tab( theDim )->isEnabled();
} }
@ -1052,7 +1257,9 @@ void SMESHGUI_MeshOp::setCurrentHyp( const int theDim,
const int theHypType, const int theHypType,
const int theIndex ) const int theIndex )
{ {
myIgnoreAlgoSelection = true;
myDlg->tab( theDim )->setCurrentHyp( theHypType, theIndex + 1 ); myDlg->tab( theDim )->setCurrentHyp( theHypType, theIndex + 1 );
myIgnoreAlgoSelection = false;
} }
//================================================================================ //================================================================================
@ -1094,11 +1301,20 @@ void SMESHGUI_MeshOp::setDefaultName() const
SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim )
{ {
SMESH::SMESH_Hypothesis_var anAlgoVar; SMESH::SMESH_Hypothesis_var anAlgoVar;
// get type of the selected algo
int aHypIndex = currentHyp( theDim, Algo ); int aHypIndex = currentHyp( theDim, Algo );
QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses( true, theDim, false ); THypDataList& dataList = myAvailableHypData[ theDim ][ Algo ];
if ( aHypIndex < 0 || aHypIndex >= aHypTypeNameList.count() ) if ( aHypIndex < 0 || aHypIndex >= dataList.count())
return anAlgoVar; return anAlgoVar;
QString aHypName = aHypTypeNameList[ aHypIndex ]; QString aHypName = dataList[ aHypIndex ]->TypeName;
// get existing algoritms
_PTR(SObject) pObj = SMESH::GetActiveStudyDocument()->FindComponent("SMESH");
QStringList tmp;
existingHyps( theDim, Algo, pObj, tmp, myExistingHyps[ theDim ][ Algo ]);
// look for anexisting algo of such a type
QValueList<SMESH::SMESH_Hypothesis_var>& aHypVarList = myExistingHyps[ theDim ][ Algo ]; QValueList<SMESH::SMESH_Hypothesis_var>& aHypVarList = myExistingHyps[ theDim ][ Algo ];
QValueList<SMESH::SMESH_Hypothesis_var>::iterator anIter; QValueList<SMESH::SMESH_Hypothesis_var>::iterator anIter;
for ( anIter = aHypVarList.begin(); anIter != aHypVarList.end(); anIter++ ) for ( anIter = aHypVarList.begin(); anIter != aHypVarList.end(); anIter++ )
@ -1195,26 +1411,21 @@ void SMESHGUI_MeshOp::readMesh()
existingHyps( dim, Algo, pObj, anExisting, myObjHyps[ dim ][ Algo ] ); existingHyps( dim, Algo, pObj, anExisting, myObjHyps[ dim ][ Algo ] );
if ( myObjHyps[ dim ][ Algo ].count() > 0 ) if ( myObjHyps[ dim ][ Algo ].count() > 0 )
{ {
// find algo index among available ones
SMESH::SMESH_Hypothesis_var aVar = myObjHyps[ dim ][ Algo ].first(); SMESH::SMESH_Hypothesis_var aVar = myObjHyps[ dim ][ Algo ].first();
QString aHypTypeName = aVar->GetName(); QString aHypTypeName = aVar->GetName();
HypothesisData* algoData = SMESH::GetHypothesisData( aHypTypeName );
QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses( true , dim, false ); aHypIndex = myAvailableHypData[ dim ][ Algo ].findIndex ( algoData );
for ( int i = 0, n = aHypTypeNameList.count(); i < n; i++ )
if ( aHypTypeName == aHypTypeNameList[ i ] )
{
aHypIndex = i;
break;
}
} }
setCurrentHyp( dim, Algo, aHypIndex ); setCurrentHyp( dim, Algo, aHypIndex );
onAlgoSelected( aHypIndex, dim );
// get hypotheses // get hypotheses
for ( int hypType = MainHyp; hypType <= AddHyp; hypType++ ) for ( int hypType = MainHyp; hypType <= AddHyp; hypType++ )
{ {
// get hypotheses // get hypotheses
existingHyps( dim, hypType, pObj, anExisting, myObjHyps[ dim ][ hypType ] ); existingHyps( dim, hypType, pObj, anExisting, myObjHyps[ dim ][ hypType ] );
// find index of requered hypothesis among existing ones for this dimension // find index of requered hypothesis among existing ones for this dimension and type
// and hyp types
int aHypIndex = -1; int aHypIndex = -1;
if ( myObjHyps[ dim ][ hypType ].count() > 0 ) if ( myObjHyps[ dim ][ hypType ].count() > 0 )
aHypIndex = find( myObjHyps[ dim ][ hypType ].first(), aHypIndex = find( myObjHyps[ dim ][ hypType ].first(),
@ -1331,9 +1542,10 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess )
} }
} }
// remove old algorithm // remove old algorithm
if ( toDelete ) if ( toDelete ) {
SMESH::RemoveHypothesisOrAlgorithmOnMesh SMESH::RemoveHypothesisOrAlgorithmOnMesh ( pObj, myObjHyps[ dim ][ Algo ].first() );
( pObj, myObjHyps[ dim ][ Algo ].first() ); myObjHyps[ dim ][ Algo ].clear();
}
// assign new algorithm // assign new algorithm
if ( toAdd ) { if ( toAdd ) {
@ -1348,6 +1560,7 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess )
if ( !aVar->_is_nil() ) if ( !aVar->_is_nil() )
SMESH::AddHypothesisOnSubMesh( aVar, anAlgoVar ); SMESH::AddHypothesisOnSubMesh( aVar, anAlgoVar );
} }
myObjHyps[ dim ][ Algo ].append( anAlgoVar );
} }
// assign hypotheses // assign hypotheses
@ -1361,9 +1574,11 @@ bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess )
if ( aNewHypIndex != anOldHypIndex ) if ( aNewHypIndex != anOldHypIndex )
{ {
// remove old hypotheses // remove old hypotheses
if ( anOldHypIndex >= 0 ) if ( anOldHypIndex >= 0 ) {
SMESH::RemoveHypothesisOrAlgorithmOnMesh( SMESH::RemoveHypothesisOrAlgorithmOnMesh(
pObj, myExistingHyps[ dim ][ hypType ][ anOldHypIndex ] ); pObj, myExistingHyps[ dim ][ hypType ][ anOldHypIndex ] );
myExistingHyps.remove( anOldHypIndex );
}
// assign new hypotheses // assign new hypotheses
if ( aNewHypIndex != -1 ) if ( aNewHypIndex != -1 )
@ -1435,9 +1650,9 @@ void SMESHGUI_MeshOp::onGeomSelectionByMesh( bool theByMesh )
SMESH::SMESH_Mesh_var aMeshVar = SMESH::SMESH_Mesh_var aMeshVar =
SMESH::SMESH_Mesh::_narrow( _CAST( SObject,pMesh )->GetObject() ); SMESH::SMESH_Mesh::_narrow( _CAST( SObject,pMesh )->GetObject() );
if ( !aMeshVar->_is_nil() ) { if ( !aMeshVar->_is_nil() ) {
myDlg->hide(); myDlg->hide(); // stop processing selection
myShapeByMeshOp->setModule( getSMESHGUI() ); myShapeByMeshOp->setModule( getSMESHGUI() );
myShapeByMeshOp->setStudy( 0 ); myShapeByMeshOp->setStudy( 0 ); // it's really necessary
myShapeByMeshOp->SetMesh( aMeshVar ); myShapeByMeshOp->SetMesh( aMeshVar );
myShapeByMeshOp->start(); myShapeByMeshOp->start();
} }

View File

@ -41,6 +41,7 @@
class SMESHGUI_MeshDlg; class SMESHGUI_MeshDlg;
class SMESHGUI_ShapeByMeshOp; class SMESHGUI_ShapeByMeshOp;
class HypothesisData;
/*! /*!
* \brief Operation for mech creation or editing * \brief Operation for mech creation or editing
@ -51,9 +52,10 @@ class SMESHGUI_MeshOp : public SMESHGUI_SelectionOp
{ {
Q_OBJECT Q_OBJECT
enum HypType{ Algo = 0, MainHyp, AddHyp };
public: public:
enum HypType{ Algo = 0, MainHyp, AddHyp, NbHypTypes };
SMESHGUI_MeshOp( const bool theToCreate, const bool theIsMesh = true ); SMESHGUI_MeshOp( const bool theToCreate, const bool theIsMesh = true );
virtual ~SMESHGUI_MeshOp(); virtual ~SMESHGUI_MeshOp();
@ -73,17 +75,28 @@ protected slots:
void onGeomSelectionByMesh( bool ); void onGeomSelectionByMesh( bool );
void onPublishShapeByMeshDlg(SUIT_Operation*); void onPublishShapeByMeshDlg(SUIT_Operation*);
void onCloseShapeByMeshDlg(SUIT_Operation*); void onCloseShapeByMeshDlg(SUIT_Operation*);
void onAlgoSelected( const int theIndex,
const int theDim = -1);
private: private:
typedef QValueList<HypothesisData*> THypDataList; // typedef: list of hypothesis data
bool isValid( QString& ) const; bool isValid( QString& ) const;
void availableHyps( const int theDim, void availableHyps( const int theDim,
const int theHypType, const int theHypType,
QStringList& theHyps ) const; QStringList& theHyps,
THypDataList& theDataList,
HypothesisData* theAlgoData = 0 ) const;
void existingHyps( const int theDim, void existingHyps( const int theDim,
const int theHypType, const int theHypType,
_PTR(SObject) theFather, _PTR(SObject) theFather,
QStringList& theHyps, QStringList& theHyps,
QValueList<SMESH::SMESH_Hypothesis_var>& theHypVars ); QValueList<SMESH::SMESH_Hypothesis_var>& theHypVars,
HypothesisData* theAlgoData = 0);
HypothesisData* hypData( const int theDim,
const int theHypType,
const int theIndex); // access to myAvailableHypData
void createHypothesis(const int theDim, const int theType, void createHypothesis(const int theDim, const int theType,
const QString& theTypeName); const QString& theTypeName);
@ -119,6 +132,11 @@ private:
DimToHypMap myExistingHyps; //!< all hypothesis of SMESH module DimToHypMap myExistingHyps; //!< all hypothesis of SMESH module
DimToHypMap myObjHyps; //!< hypothesis assigned to the current DimToHypMap myObjHyps; //!< hypothesis assigned to the current
// edited mesh/sub-mesh // edited mesh/sub-mesh
// hypdata corresponding to hypotheses present in myDlg
THypDataList myAvailableHypData[3][NbHypTypes];
bool myIgnoreAlgoSelection;
}; };
#endif #endif

View File

@ -129,9 +129,22 @@ bool SMESHGUI_XmlHandler::startElement (const QString&, const QString&,
aDim.append( aVal - 1 ); aDim.append( aVal - 1 );
} }
// for algo
enum { HYPOS = 0, OPT_HYPOS, INPUT, OUTPUT, NB_ATTRIBUTES };
const char* name [NB_ATTRIBUTES] = { "hypos", "opt-hypos", "input", "output" };
QStringList attr [NB_ATTRIBUTES];
for ( int i = 0; i < NB_ATTRIBUTES; ++i ) {
QString aStr = atts.value( name[i] );
if ( !aStr.isEmpty() ) {
aStr.remove( ' ' );
attr[ i ] = QStringList::split( ',', aStr );
}
}
HypothesisData* aHypLibNames = HypothesisData* aHypLibNames =
new HypothesisData (myPluginName, myServerLib, myClientLib, new HypothesisData (aHypAlType, myPluginName, myServerLib, myClientLib,
aLabel, anIcon, aDim, isAux ); aLabel, anIcon, aDim, isAux,
attr[ HYPOS ], attr[ OPT_HYPOS ], attr[ INPUT ], attr[ OUTPUT ]);
if (qName == "algorithm") if (qName == "algorithm")
{ {