From 24d6fd82e6e0f8daa90e318e365226e81e7816ee Mon Sep 17 00:00:00 2001 From: sln Date: Tue, 23 Aug 2005 08:53:35 +0000 Subject: [PATCH] Mesh redesine. Dialog and operation for creation and editing mesh and hypothesis --- src/SMESHGUI/SMESHGUI_MeshDlg.cxx | 447 ++++++++++++++ src/SMESHGUI/SMESHGUI_MeshDlg.h | 120 ++++ src/SMESHGUI/SMESHGUI_MeshOp.cxx | 974 ++++++++++++++++++++++++++++++ src/SMESHGUI/SMESHGUI_MeshOp.h | 93 +++ 4 files changed, 1634 insertions(+) create mode 100644 src/SMESHGUI/SMESHGUI_MeshDlg.cxx create mode 100644 src/SMESHGUI/SMESHGUI_MeshDlg.h create mode 100644 src/SMESHGUI/SMESHGUI_MeshOp.cxx create mode 100644 src/SMESHGUI/SMESHGUI_MeshOp.h diff --git a/src/SMESHGUI/SMESHGUI_MeshDlg.cxx b/src/SMESHGUI/SMESHGUI_MeshDlg.cxx new file mode 100644 index 000000000..8f427ffe9 --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_MeshDlg.cxx @@ -0,0 +1,447 @@ +/** +* SMESH SMESHGUI +* +* Copyright (C) 2005 CEA/DEN, EDF R&D +* +* +* +* File : SMESHGUI_MeshDlg.cxx +* Author : Sergey LITONIN +* Module : SMESH +*/ + +#include "SMESHGUI_MeshDlg.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/*! + * \brief Tab for tab widget containing controls for definition of + * algorithms and hypotheses +*/ + +//================================================================================ +/*! + * \brief Constructor + * \param theParent - Parent widget for this tab + * + * Makes tab's look and feel + */ +//================================================================================ +SMESHGUI_MeshTab::SMESHGUI_MeshTab( QWidget* theParent ) +: QFrame( theParent ), + myPopup( 0 ) +{ + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + QIconSet aCreateIcon( aResMgr->loadPixmap( "SMESH", tr( "ICON_HYPO" ) ) ); + QIconSet aEditIcon( aResMgr->loadPixmap( "SMESH", tr( "ICON_HYPO_EDIT" ) ) ); + + // Algorifm + QLabel* anAlgoLbl = new QLabel( tr( "ALGORITHM" ), this ); + myHyp[ Algo ] = new QComboBox( this ); + + // Hypothesis + QLabel* aHypLbl = new QLabel( tr( "HYPOTHESIS" ), this ); + myHyp[ MainHyp ] = new QComboBox( this ); + myHyp[ MainHyp ]->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); + myCreateHyp[ MainHyp ] = new QToolButton( this ); + myCreateHyp[ MainHyp ]->setIconSet( aCreateIcon ); + myEditHyp[ MainHyp ] = new QToolButton( this ); + myEditHyp[ MainHyp ]->setIconSet( aEditIcon ); + + // Line + QFrame* aLine = new QFrame( this ); + aLine->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + + // Add. hypothesis + QLabel* anAddHypLbl = new QLabel( tr( "ADD_HYPOTHESIS" ), this ); + myHyp[ AddHyp ] = new QComboBox( this ); + myHyp[ AddHyp ]->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); + myCreateHyp[ AddHyp ] = new QToolButton( this ); + myCreateHyp[ AddHyp ]->setIconSet( aCreateIcon ); + myEditHyp[ AddHyp ] = new QToolButton( this ); + myEditHyp[ AddHyp ]->setIconSet( aEditIcon ); + + // Fill layout + QGridLayout* aLay = new QGridLayout( this, 5, 4, 5, 5 ); + aLay->addWidget( anAlgoLbl, 0, 0 ); + aLay->addWidget( myHyp[ Algo ], 0, 1 ); + aLay->addWidget( aHypLbl, 1, 0 ); + aLay->addWidget( myHyp[ MainHyp ], 1, 1 ); + aLay->addWidget( myCreateHyp[ MainHyp ], 1, 2 ); + aLay->addWidget( myEditHyp[ MainHyp ], 1, 3 ); + aLay->addMultiCellWidget( aLine, 2, 2, 0, 3 ); + aLay->addWidget( anAddHypLbl, 3, 0 ); + aLay->addWidget( myHyp[ AddHyp ], 3, 1 ); + aLay->addWidget( myCreateHyp[ AddHyp ], 3, 2 ); + aLay->addWidget( myEditHyp[ AddHyp ], 3, 3 ); + aLay->addItem( new QSpacerItem( 0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding ), 4, 0 ); + + // Connect signals and slots + for ( int i = MainHyp; i <= AddHyp; i++ ) + { + connect( myCreateHyp[ i ], SIGNAL( clicked() ), SLOT( onCreateHyp() ) ); + connect( myEditHyp[ i ], SIGNAL( clicked() ), SLOT( onEditHyp() ) ); + connect( myHyp[ i ], SIGNAL( activated( int ) ), SLOT( onHyp( int ) ) ); + } + + // Initialize controls + + setAvailableHyps( Algo, QStringList() ); + setAvailableHyps( MainHyp, QStringList() ); + setAvailableHyps( AddHyp, QStringList() ); +} + +SMESHGUI_MeshTab::~SMESHGUI_MeshTab() +{ + if ( myPopup ) + delete myPopup; +} + +//================================================================================ +/*! + * \brief Sets available hypothesis or algorithms + * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) + * \param theHyps - list of available hypothesis names + * + * Sets available main or additional hypothesis for this tab + */ +//================================================================================ +void SMESHGUI_MeshTab::setAvailableHyps( const int theId, const QStringList& theHyps ) +{ + myAvailableHyps[ theId ] = theHyps; + if ( theId == Algo ) + { + myHyp[ Algo ]->clear(); + myHyp[ Algo ]->insertItem( tr( "NONE" ) ); + myHyp[ Algo ]->insertStringList( theHyps ); + myHyp[ Algo ]->setCurrentItem( 0 ); + } +} + +//================================================================================ +/*! + * \brief Sets existing hypothesis + * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) + * \param theHyps - list of available hypothesis names + * + * Sets existing main or additional hypothesis for this tab + */ +//================================================================================ +void SMESHGUI_MeshTab::setExistingHyps( const int theId, const QStringList& theHyps ) +{ + if ( theId != Algo ) + { + myHyp[ theId ]->clear(); + myHyp[ theId ]->insertItem( tr( "NONE" ) ); + myHyp[ theId ]->insertStringList( theHyps ); + myHyp[ theId ]->setCurrentItem( 0 ); + myEditHyp[ theId ]->setEnabled( false ); + } +} + +//================================================================================ +/*! + * \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 + * + * Adds hypothesis in combo box of available ones. This method is called by operation + * after creation of new hypothesis. + */ +//================================================================================ +void SMESHGUI_MeshTab::addHyp( const int theId, const QString& theHyp ) +{ + myHyp[ theId ]->insertItem( theHyp ); + myHyp[ theId ]->setCurrentItem( myHyp[ theId ]->count() - 1 ); + myEditHyp[ theId ]->setEnabled( true ); +} + +//================================================================================ +/*! + * \brief Renames hypothesis + * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) + * \param theIndex - index of hypothesis to be renamed + * \param theNewName - new name of hypothesis to be renamed + * + * Renames hypothesis + */ +//================================================================================ +void SMESHGUI_MeshTab::renameHyp( const int theId, + const int theIndex, + const QString& theNewName ) +{ + if ( theIndex > 0 && theIndex < myHyp[ theId ]->count() ) + myHyp[ theId ]->changeItem( theNewName, theIndex ); +} + +//================================================================================ +/*! + * \brief Sets current hypothesis + * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) + * \param theIndex - index of hypothesis to be set as current + * + * Sets current hypothesis + */ +//================================================================================ +void SMESHGUI_MeshTab::setCurrentHyp( const int theId, const int theIndex ) +{ + if ( theIndex >= 0 && theIndex < myHyp[ theId ]->count() ) + { + myHyp[ theId ]->setCurrentItem( theIndex ); + if ( myEditHyp[ theId ] ) + myEditHyp[ theId ]->setEnabled( theIndex > 0 ); + } +} + +//================================================================================ +/*! + * \brief Gets current hypothesis + * \param theId - identifier of hypothesis (main or additional, see HypType enumeration) + * \retval int - index of current hypothesis + * + * Gets current hypothesis + */ +//================================================================================ +int SMESHGUI_MeshTab::currentHyp( const int theId ) const +{ + return myHyp[ theId ]->currentItem(); +} + +//================================================================================ +/*! + * \brief Emits createHyp( const int ) signal + * + * SLOT called when "Create hypothesis" button clicked specifies sender and emits + * createHyp( const int ) signal + */ +//================================================================================ +void SMESHGUI_MeshTab::onCreateHyp() +{ + const QObject* aSender = sender(); + + if ( !myPopup ) + { + myPopup = new QPopupMenu( 0 ); + connect( myPopup, SIGNAL( activated( int ) ), SLOT( onPopupItem( int ) ) ); + } + + QStringList aHypNames; + if ( aSender == myCreateHyp[ MainHyp ] ) + { + aHypNames = myAvailableHyps[ MainHyp ]; + myPopup->setName( "MainHypPopup" ); + } + else + { + aHypNames = myAvailableHyps[ AddHyp ]; + myPopup->setName( "AddHypPopup" ); + } + + myPopup->clear(); + for ( int i = 0, n = aHypNames.count(); i < n; i++ ) + myPopup->insertItem( aHypNames[ i ], i ); + + myPopup->exec( QCursor::pos() ); +} + +//================================================================================ +/*! + * \brief Emits editHyp( const int ) signal + * + * SLOT called when "Edit hypothesis" button clicked specifies sender and emits + * editHyp( const int ) signal + */ +//================================================================================ +void SMESHGUI_MeshTab::onEditHyp() +{ + const QObject* aSender = sender(); + int aHypType = aSender == myEditHyp[ MainHyp ] ? MainHyp : AddHyp; + emit editHyp( aHypType, myHyp[ aHypType ]->currentItem() ); +} + +//================================================================================ +/*! + * \brief Updates "Edit hypothesis" button state + * + * SLOT called when current hypothesis changed disables "Edit hypothesis" button + * if current hypothesis is , enables otherwise + */ +//================================================================================ +void SMESHGUI_MeshTab::onHyp( int theIndex ) +{ + const QObject* aSender = sender(); + int anIndex = aSender == myHyp[ MainHyp ] ? MainHyp : AddHyp; + myEditHyp[ anIndex ]->setEnabled( theIndex > 0 ); +} + +//================================================================================ +/*! + * \brief Emits createHyp signal + * + * SLOT called when item of popup for hypothesis creation is activated. Emits + * createHyp signal to notify operation obout this event + */ +//================================================================================ +void SMESHGUI_MeshTab::onPopupItem( int theId ) +{ + const QObject* aSender = sender(); + if ( aSender ) + emit createHyp( strcmp( aSender->name(), "MainHypPopup" ) == 0 ? MainHyp : AddHyp, theId ); +} + +//================================================================================ +/*! + * \brief Resets all tab fields + * + * Resets all tab fields + */ +//================================================================================ +void SMESHGUI_MeshTab::reset() +{ + for ( int i = Algo; i <= AddHyp; i++ ) + { + myHyp[ i ]->setCurrentItem( 0 ); + if ( myEditHyp[ i ] ) + myEditHyp[ i ]->setEnabled( false ); + } +} + +/*! + * \brief Dialog for mech creation or editing + * + * This dialog is used for mech creation or editing. +*/ + +//================================================================================ +/*! + * \brief Constructor + * \param theToCreate - if this parameter is true then dialog is used for creation, + * for editing otherwise + * \param theIsMesh - if this parameter is true then dialog is used for mesh, + * for sub-mesh otherwise + * + * Makes dialog's look and feel + */ +//================================================================================ +SMESHGUI_MeshDlg::SMESHGUI_MeshDlg( const bool theToCreate, const bool theIsMesh ) +: SMESHGUI_Dialog( 0, false, true ) +{ + // Create top controls + + QGroupBox* aGrp = new QGroupBox( 3, Qt::Horizontal, mainFrame() ); + aGrp->setFrameStyle( QFrame::NoFrame ); + aGrp->setInsideMargin( 0 ); + // name + createObject( tr( "NAME" ), aGrp, Obj ); + setNameIndication( Obj, OneName ); + setReadOnly( Obj, false ); + // mesh + createObject( tr( "MESH" ), aGrp, Mesh ); + // geometry + createObject( tr( "GEOMETRY" ), aGrp, Geom ); + + // Create tab widget + + myTabWg = new QTabWidget( mainFrame() ); + myTabs[ Dim1D ] = new SMESHGUI_MeshTab( myTabWg ); + myTabs[ Dim2D ] = 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" ) ); + + // Fill layout + + QVBoxLayout* aLay = new QVBoxLayout( mainFrame(), 0, 5 ); + aLay->addWidget( aGrp ); + aLay->addItem( new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum) ); + aLay->addWidget( myTabWg ); + + // Disable controls if necessary + setObjectShown( Mesh, false ); + if ( theToCreate ) + { + setCaption( tr( "CREATE_MESH" ) ); + objectWg( Obj, Btn )->hide(); + if ( theIsMesh ) + setCaption( tr( "CREATE_MESH" ) ); + else + { + setCaption( tr( "CREATE_SUBMESH" ) ); + setObjectShown( Mesh, true ); + } + } + else + { + setCaption( tr( "EDIT_MESH_SUBMESH" ) ); + objectWg( Mesh, Btn )->hide(); + objectWg( Geom, Btn )->hide(); + } +} + +SMESHGUI_MeshDlg::~SMESHGUI_MeshDlg() +{ +} + +//================================================================================ +/*! + * \brief Gets tab with given id + * \param theId - Tab identifier. Possible values are in "Dimensions" enumeration + * \retval SMESHGUI_MeshTab* - pointer to the tab or null if given parameter is + * invalid + * + * Gets tab containing controls for definition of algorithms and AddHypotheses + */ +//================================================================================ +SMESHGUI_MeshTab* SMESHGUI_MeshDlg::tab( const int theId ) const +{ + return ( theId >= Dim1D && theId <= Dim3D ? myTabs[ theId ] : 0 ); +} + +//================================================================================ +/*! + * \brief Resets all dialog fields + */ +//================================================================================ +void SMESHGUI_MeshDlg::reset() +{ + clearSelection(); + myTabs[ Dim1D ]->reset(); + myTabs[ Dim2D ]->reset(); + myTabs[ Dim3D ]->reset(); +} + +//================================================================================ +/*! + * \brief Sets curent tab + */ +//================================================================================ +void SMESHGUI_MeshDlg::setCurrentTab( const int theId ) +{ + myTabWg->setCurrentPage( theId ); +} + + + + + + + + + + + + + diff --git a/src/SMESHGUI/SMESHGUI_MeshDlg.h b/src/SMESHGUI/SMESHGUI_MeshDlg.h new file mode 100644 index 000000000..47fb33a34 --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_MeshDlg.h @@ -0,0 +1,120 @@ +/** +* SMESH SMESHGUI +* +* Copyright (C) 2005 CEA/DEN, EDF R&D +* +* +* +* File : SMESHGUI_MeshDlg.h +* Author : Sergey LITONIN +* Module : SMESH +*/ + + +#ifndef SMESHGUI_MeshDlg_H +#define SMESHGUI_MeshDlg_H + +#include "SMESHGUI_Dialog.h" +#include +#include +#include + +class SMESHGUI_MeshTab; +class QTabWidget; +class QLineEdit; +class QComboBox; +class QToolButton; +class QString; +class QPopupMenu; + +/*! + * \brief Dialog for mech creation or editing + * + * This dialog is used for mech creation or editing. +*/ +class SMESHGUI_MeshDlg : public SMESHGUI_Dialog +{ + Q_OBJECT + +public: + + enum Controls { Obj, Mesh, Geom }; + + /*! Describes dimensions */ + enum Dimensions { Dim1D = 0, Dim2D, Dim3D }; + +public: + SMESHGUI_MeshDlg( const bool theToCreate, const bool theIsMesh ); + virtual ~SMESHGUI_MeshDlg(); + + SMESHGUI_MeshTab* tab( const int ) const; + void reset(); + void setCurrentTab( const int ); + +private: + + QMap< int, SMESHGUI_MeshTab* > myTabs; + QTabWidget* myTabWg; +}; + +/*! + * \brief Tab for tab widget containing controls for definition of + * algorithms and hypotheses +*/ + +class SMESHGUI_MeshTab : public QFrame +{ + Q_OBJECT + +public: + /*! To differ main algorithms, hypotheses and additional ones*/ + enum HypType + { + Algo = 0, //!< algorithms + MainHyp, //!< main hypothesis + AddHyp //!< additional hypothesis + }; + +public: + SMESHGUI_MeshTab( QWidget* ); + virtual ~SMESHGUI_MeshTab(); + + void setAvailableHyps( const int, const QStringList& ); + void setExistingHyps( const int, const QStringList& ); + void addHyp( const int, const QString& ); + void renameHyp( const int, const int, const QString& ); + void setCurrentHyp( const int, const int ); + int currentHyp( const int ) const; + void reset(); + +signals: + + void createHyp( const int theHypType, const int theIndex ); + //!< Emited when "Create hypothesis" button clicked + void editHyp( const int theHypType, const int theIndex ); + //!< Emited when "Edit hypothesis" button clicked + +private slots: + + void onCreateHyp(); + void onEditHyp(); + void onHyp( int ); + void onPopupItem( int ); + +private: + + QMap< int, QComboBox* > myHyp; + QMap< int, QToolButton* > myCreateHyp; + QMap< int, QToolButton* > myEditHyp; + + QMap< int, QStringList > myAvailableHyps; + QMap< int, QStringList > myExistingHyps; + + QPopupMenu* myPopup; +}; + +#endif + + + + diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.cxx b/src/SMESHGUI/SMESHGUI_MeshOp.cxx new file mode 100644 index 000000000..1c5df7f4c --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_MeshOp.cxx @@ -0,0 +1,974 @@ +/** +* SMESH SMESHGUI +* +* Copyright (C) 2005 CEA/DEN, EDF R&D +* +* +* +* File : SMESHGUI_MeshOp.h +* Author : Sergey LITONIN +* Module : SMESHGUI +*/ + +#include "SMESHGUI_MeshOp.h" +#include "SMESHGUI_MeshDlg.h" +#include "SMESH_TypeFilter.hxx" +#include "SMESHGUI.h" + +#include "SMESHGUI_HypothesesUtils.h" +#include "SMESHGUI_Hypotheses.h" +#include "SMESHGUI_Utils.h" +#include "SMESHGUI_GEOMGenUtils.h" + +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include + +#define DEB_SLN + +//================================================================================ +/*! + * \brief Constructor + * \param theToCreate - if this parameter is true then operation is used for creation, + * for editing otherwise + * + * Initialize operation +*/ +//================================================================================ +SMESHGUI_MeshOp::SMESHGUI_MeshOp( const bool theToCreate, const bool theIsMesh ) +: SMESHGUI_SelectionOp(), + myToCreate( theToCreate ), + myIsMesh( theIsMesh ), + myDlg( 0 ) +{ +} + +//================================================================================ +/*! + * \brief Destructor +*/ +//================================================================================ +SMESHGUI_MeshOp::~SMESHGUI_MeshOp() +{ + if( myDlg ) + delete myDlg; +} + +//================================================================================ +/*! + * \brief Gets dialog of this operation + * \retval SalomeApp_Dialog* - pointer to dialog of this operation +*/ +//================================================================================ +SalomeApp_Dialog* SMESHGUI_MeshOp::dlg() const +{ + return myDlg; +} + +//================================================================================ +/*! + * \brief Creates or edits mesh + * \retval bool - TRUE if operation is performed successfully, FALSE otherwise + * + * Virtual slot redefined from the base class called when "Apply" button is clicked + * creates or edits mesh + */ +//================================================================================ +bool SMESHGUI_MeshOp::onApply() +{ + if( isStudyLocked() ) + return false; + + QString aMess; + if ( !isValid( aMess ) ) + { + if ( aMess != "" ) + SUIT_MessageBox::warn1( myDlg, + tr( "SMESH_WRN_WARNING" ), aMess, tr( "SMESH_BUT_OK" ) ); + return false; + } + + bool aResult = false; + aMess = ""; + if ( myToCreate && myIsMesh ) + aResult = createMesh( aMess ); + if ( myToCreate && !myIsMesh ) + aResult = createSubMesh( aMess ); + else if ( !myToCreate ) + aResult = editMeshOrSubMesh( aMess ); + + if ( aResult ) + { + update( UF_ObjBrowser | UF_Model ); + + // set default name if necessary + if ( myToCreate ) + setDefaultName(); + } + else + { + if ( aMess == "" ) + aMess = tr( "SMESH_OPERATION_FAILED" ); + SUIT_MessageBox::warn1( myDlg, + tr( "SMESH_ERROR" ), aMess, tr( "SMESH_BUT_OK" ) ); + } + + return aResult; +} + +//================================================================================ +/*! + * \brief Creates dialog if necessary and shows it + * + * Virtual method redefined from base class called when operation is started creates + * dialog if necessary and shows it, activates selection + */ +//================================================================================ +void SMESHGUI_MeshOp::startOperation() +{ + if( !myDlg ) + { + myDlg = new SMESHGUI_MeshDlg( myToCreate, myIsMesh ); + for ( int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++ ) + { + connect( myDlg->tab( i ), SIGNAL( createHyp( const int, const int ) ), + this, SLOT( onCreateHyp( const int, const int) ) ); + connect( myDlg->tab( i ), SIGNAL( editHyp( const int, const int ) ), + this, SLOT( onEditHyp( const int, const int) ) ); + } + } + SMESHGUI_SelectionOp::startOperation(); + + // iterate through dimensions and get available and existing algoritms and hypotheses, + // set them to the dialog + int i, j; + _PTR(SComponent) aFather = SMESH::GetActiveStudyDocument()->FindComponent( "SMESH" ); + for ( i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++ ) + { + SMESHGUI_MeshTab* aTab = myDlg->tab( i ); + QStringList anAvailable, anExisting; + for ( j = Algo; j <= AddHyp; j++ ) + { + availableHyps( i, j, anAvailable ); + existingHyps( i, j, aFather, anExisting, myExistingHyps[ i ][ j ] ); + + aTab->setAvailableHyps( j, anAvailable ); + aTab->setExistingHyps( j, anExisting ); + } + } + if ( myToCreate ) + { + setDefaultName(); + myDlg->activateObject( myIsMesh ? SMESHGUI_MeshDlg::Geom : SMESHGUI_MeshDlg::Mesh ); + } + else + myDlg->activateObject( SMESHGUI_MeshDlg::Obj ); + + selectionDone(); + + myDlg->setCurrentTab( SMESH::DIM_1D ); + myDlg->show(); +} + +//================================================================================ +/*! + * \brief Creates selection filter + * \param theId - identifier of current selection widget + * \retval SUIT_SelectionFilter* - pointer to the created filter or null + * + * Creates selection filter in accordance with identifier of current selection widget + */ +//================================================================================ +SUIT_SelectionFilter* SMESHGUI_MeshOp::createFilter( const int theId ) const +{ + if ( theId == SMESHGUI_MeshDlg::Geom ) + { +// TColStd_MapOfInteger allTypesMap; +// for ( int i = 0; i < 10; i++ ) +// allTypesMap.Add( i ); +// return new SMESH_NumberFilter( "GEOM", TopAbs_SHAPE, 0, allTypesMap ); + return new GEOM_SelectionFilter( (SalomeApp_Study*)study(), true ); + } + else if ( theId == SMESHGUI_MeshDlg::Obj && !myToCreate ) + return new SMESH_TypeFilter( MESHorSUBMESH ); + else if ( theId == SMESHGUI_MeshDlg::Mesh ) + return new SMESH_TypeFilter( MESH ); + else + return 0; +} + +//================================================================================ +/*! + * \brief Updates dialog's look and feel + * + * Virtual method redefined from the base class updates dialog's look and feel + */ +//================================================================================ +void SMESHGUI_MeshOp::selectionDone() +{ + SMESHGUI_SelectionOp::selectionDone(); + + if ( !myToCreate ) + { + QString anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); + _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry ); + if ( pObj != 0 ) + { + SMESH::SMESH_subMesh_var aVar = + SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() ); + myDlg->setObjectShown( SMESHGUI_MeshDlg::Mesh, !aVar->_is_nil() ); + myDlg->objectWg( SMESHGUI_MeshDlg::Mesh, SMESHGUI_MeshDlg::Btn )->hide(); + myDlg->updateGeometry(); + myDlg->adjustSize(); + readMesh(); + } + else + myDlg->reset(); + } +} + +//================================================================================ +/*! + * \brief Verifies validity of input data + * \param theMess - Output parameter intended for returning error message + * \retval bool - TRUE if input data is valid, false otherwise + * + * Verifies validity of input data. This method is called when "Apply" or "OK" button + * is pressed before mesh creation or editing. + */ +//================================================================================ +bool SMESHGUI_MeshOp::isValid( QString& theMess ) const +{ + // Selected object to be edited + if ( !myToCreate && myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ) == "" ) + { + theMess = tr( "THERE_IS_NO_OBJECT_FOR_EDITING" ); + return false; + } + + // Name + QString aMeshName = myDlg->objectText( SMESHGUI_MeshDlg::Obj ); + aMeshName = aMeshName.stripWhiteSpace(); + if ( aMeshName == "" ) + { + theMess = myIsMesh ? tr( "NAME_OF_MESH_IS_EMPTY" ) : tr( "NAME_OF_SUBMESH_IS_EMPTY" ); + return false; + } + + // Geom + if ( myToCreate ) + { + QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); + if ( aGeomEntry == "" ) + { + theMess = tr( "GEOMETRY_OBJECT_IS_NOT_DEFINED" ); + return false; + } + _PTR(SObject) pGeom = studyDS()->FindObjectID( aGeomEntry ); + if ( !pGeom || GEOM::GEOM_Object::_narrow( _CAST( SObject,pGeom )->GetObject() )->_is_nil() ) + { + theMess = tr( "GEOMETRY_OBJECT_IS_NULL" ); + return false; + } + + // Mesh + if ( !myIsMesh ) // i.e sub-mesh creation, + { + QString aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh ); + if ( aMeshEntry == "" ) + { + theMess = tr( "MESH_IS_NOT_DEFINED" ); + return false; + } + _PTR(SObject) pMesh = studyDS()->FindObjectID( aMeshEntry ); + if ( !pMesh || SMESH::SMESH_Mesh::_narrow( _CAST( SObject,pMesh )->GetObject() )->_is_nil() ) + { + theMess = tr( "MESH_IS_NULL" ); + return false; + } + } + } + return true; +} + +//================================================================================ +/*! + * \brief Gets available 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 theHyps - Output list of hypotheses' names + * + * Gets available hypotheses or algorithm in accordance with input parameters + */ +//================================================================================ +void SMESHGUI_MeshOp::availableHyps( const int theDim, + const int theHypType, + QStringList& theHyps ) const +{ + theHyps.clear(); + QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses( + theHypType == Algo , theDim, theHypType == AddHyp ); + QStringList::const_iterator anIter; + for ( anIter = aHypTypeNameList.begin(); anIter != aHypTypeNameList.end(); ++anIter ) + { + HypothesisData* aData = SMESH::GetHypothesisData( *anIter ); + theHyps.append( aData->Label ); + } +} + +//================================================================================ +/*! + * \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. + * + * 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, + QValueList& theHypVars ) +{ + // Clear hypoheses list + theHyps.clear(); + theHypVars.clear(); + + if ( !theFather ) + return; + + _PTR(SObject) aHypRoot; + _PTR(GenericAttribute) anAttr; + _PTR(AttributeName) aName; + _PTR(AttributeIOR) anIOR; + + bool isMesh = !_CAST( SComponent, theFather ); + int aPart = -1; + if ( isMesh ) + aPart = theHypType == Algo ? 3 : 2; + else + aPart = theHypType == Algo ? 2 : 1; + + if ( theFather->FindSubObject( aPart, aHypRoot ) ) + { + _PTR(ChildIterator) anIter = + SMESH::GetActiveStudyDocument()->NewChildIterator( aHypRoot ); + for (; anIter->More(); anIter->Next() ) + { + _PTR(SObject) anObj = anIter->Value(); + if ( isMesh ) // i.e. mesh or submesh + { + _PTR(SObject) aRefObj; + if ( anObj->ReferencedObject( aRefObj ) ) + anObj = aRefObj; + else + continue; + } + if ( anObj->FindAttribute( anAttr, "AttributeName" ) ) + { + aName = anAttr; + CORBA::Object_var aVar = _CAST(SObject,anObj)->GetObject(); + if ( !CORBA::is_nil( aVar ) ) + { + SMESH::SMESH_Hypothesis_var aHypVar = SMESH::SMESH_Hypothesis::_narrow( aVar ); + if ( !aHypVar->_is_nil() ) + { + QString aHypType( aHypVar->GetName() ); + HypothesisData* aData = SMESH::GetHypothesisData( aHypType ); + if ( ( theDim == -1 || aData->Dim.contains( theDim ) ) && + ( theHypType == AddHyp ) == aData->IsAux ) + { + theHyps.append( aName->Value().c_str() ); + theHypVars.append( aHypVar ); + } + } + } + } + } + } +} + +//================================================================================ +/*! + * \brief Calls plugin methods for hypothesis creation + * \param theHypType - specifies whether main hypotheses or additional ones + * are created + * \param theIndex - index of type of hypothesis to be cerated + * + * Speicfies dimension of hypothesis to be created (using sender() method), specifies + * its type and calls plugin methods for hypothesis creation + */ +//================================================================================ +void SMESHGUI_MeshOp::onCreateHyp( const int theHypType, const int theIndex ) +{ + // Speicfies dimension of hypothesis to be created + const QObject* aSender = sender(); + int aDim = -1; + for ( int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++ ) + if ( aSender == myDlg->tab( i ) ) + aDim = i; + if ( aDim == -1 ) + return; + + // Speicfies type of hypothesis to be created + QStringList aHypTypeNames = SMESH::GetAvailableHypotheses( false , aDim, theHypType == AddHyp ); + if ( theIndex < 0 || theIndex >= aHypTypeNames.count() ) + return; + + QString aHypTypeName = aHypTypeNames[ theIndex ]; + HypothesisData* aData = SMESH::GetHypothesisData( aHypTypeName.latin1() ); + if ( aData == 0 ) + return; + + QString aClientLibName = aData->ClientLibName; + QStringList anOldHyps; + _PTR(SComponent) aFather = SMESH::GetActiveStudyDocument()->FindComponent( "SMESH" ); + existingHyps( aDim, theHypType, aFather, anOldHyps, myExistingHyps[ aDim ][ theHypType ] ); + + if ( aClientLibName == "" ) + { + // Call hypothesis creation server method (without GUI) + QString aHypName = aData->Label; + SMESH::CreateHypothesis( aHypTypeName, aHypName, false ); + } + else + { + // Get hypotheses creator client (GUI) + SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator( aHypTypeName ); + + // Create hypothesis + aCreator->CreateHypothesis( false, myDlg ); + } + + QStringList aNewHyps; + aFather = SMESH::GetActiveStudyDocument()->FindComponent( "SMESH" ); + existingHyps( aDim, theHypType, aFather, aNewHyps, myExistingHyps[ aDim ][ theHypType ] ); + if ( aNewHyps.count() > anOldHyps.count() ) + { + for ( int i = anOldHyps.count(); i < aNewHyps.count(); i++ ) + myDlg->tab( aDim )->addHyp( theHypType, aNewHyps[ i ] ); + } +} + +//================================================================================ +/*! + * \brief Calls plugin methods for hypothesis editing + * \param theHypType - specifies whether main hypothesis or additional one + * is edited + * \param theIndex - index of existing hypothesis + * + * Calls plugin methods for hypothesis editing + */ +//================================================================================ +void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex ) +{ + // Speicfies dimension of hypothesis to be created + const QObject* aSender = sender(); + int aDim = -1; + for ( int i = SMESH::DIM_1D; i <= SMESH::DIM_3D; i++ ) + if ( aSender == myDlg->tab( i ) ) + aDim = i; + if ( aDim == -1 ) + return; + + QValueList aList = myExistingHyps[ aDim ][ theHypType ]; + SMESH::SMESH_Hypothesis_var aHyp = aList[ theIndex - 1 ]; + if ( aHyp->_is_nil() ) + return; + + char* aTypeName = aHyp->GetName(); + SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator( aTypeName ); + if ( aCreator ) + aCreator->EditHypothesis( aHyp ); +} + +//================================================================================ +/*! + * \brief Creates mesh + * \param theMess - Output parameter intended for returning error message + * \retval bool - TRUE if mesh is created, FALSE otherwise + * + * Creates mesh + */ +//================================================================================ +bool SMESHGUI_MeshOp::createMesh( QString& theMess ) +{ + theMess = ""; + + QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); + _PTR(SObject) pGeom = studyDS()->FindObjectID( aGeomEntry ); + GEOM::GEOM_Object_var aGeomVar = + GEOM::GEOM_Object::_narrow( _CAST( SObject,pGeom )->GetObject() ); + + SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen(); + if ( aSMESHGen->_is_nil() ) + return false; + + SUIT_OverrideCursor aWaitCursor; + + // create mesh + SMESH::SMESH_Mesh_var aMeshVar = aSMESHGen->CreateMesh( aGeomVar ); + if ( aMeshVar->_is_nil() ) + return false; + _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar.in() ); + if ( aMeshSO ) + SMESH::SetName( aMeshSO, myDlg->objectText( SMESHGUI_MeshDlg::Obj ).latin1() ); + + for ( int aDim = SMESH::DIM_1D; aDim <= SMESH::DIM_3D; aDim++ ) + { + // assign hypotheses + for ( int aHypType = MainHyp; aHypType <= AddHyp; aHypType++ ) + { + int aHypIndex = currentHyp( aDim, aHypType ); + if ( aHypIndex >= 0 && aHypIndex < myExistingHyps[ aDim ][ aHypType ].count() ) + { + SMESH::SMESH_Hypothesis_var aHypVar = myExistingHyps[ aDim ][ aHypType ][ aHypIndex ]; + if ( !aHypVar->_is_nil() ) + SMESH::AddHypothesisOnMesh( aMeshVar, aHypVar ); + } + } + // find or create algorithm + SMESH::SMESH_Hypothesis_var anAlgoVar = getAlgo( aDim ); + if ( !anAlgoVar->_is_nil() ) + SMESH::AddHypothesisOnMesh( aMeshVar, anAlgoVar ); + } + return true; +} + +//================================================================================ +/*! + * \brief Creates sub-mesh + * \param theMess - Output parameter intended for returning error message + * \retval bool - TRUE if sub-mesh is created, FALSE otherwise + * + * Creates sub-mesh + */ +//================================================================================ +bool SMESHGUI_MeshOp::createSubMesh( QString& theMess ) +{ + theMess = ""; + + SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen(); + if ( aSMESHGen->_is_nil() ) + return false; + + // get mesh object + QString aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh ); + _PTR(SObject) pMesh = studyDS()->FindObjectID( aMeshEntry ); + SMESH::SMESH_Mesh_var aMeshVar = + SMESH::SMESH_Mesh::_narrow( _CAST( SObject,pMesh )->GetObject() ); + + // get geom object + QString aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); + _PTR(SObject) pGeom = studyDS()->FindObjectID( aGeomEntry ); + GEOM::GEOM_Object_var aGeomVar = + GEOM::GEOM_Object::_narrow( _CAST( SObject,pGeom )->GetObject() ); + + SUIT_OverrideCursor aWaitCursor; + + // create sub-mesh + QString aName = myDlg->objectText( SMESHGUI_MeshDlg::Obj ); + SMESH::SMESH_subMesh_var aSubMeshVar = aMeshVar->GetSubMesh( aGeomVar, aName.latin1() ); + + for ( int aDim = SMESH::DIM_1D; aDim <= SMESH::DIM_3D; aDim++ ) + { + // assign hypotheses + for ( int aHypType = MainHyp; aHypType <= AddHyp; aHypType++ ) + { + int aHypIndex = currentHyp( aDim, aHypType ); + if ( aHypIndex >= 0 && aHypIndex < myExistingHyps[ aDim ][ aHypType ].count() ) + { + SMESH::SMESH_Hypothesis_var aHypVar = + myExistingHyps[ aDim ][ aHypType ][ aHypIndex ]; + if ( !aHypVar->_is_nil() ) + SMESH::AddHypothesisOnSubMesh( aSubMeshVar, aHypVar ); + } + } + // find or create algorithm + SMESH::SMESH_Hypothesis_var anAlgoVar = getAlgo( aDim ); + if ( !anAlgoVar->_is_nil() ) + SMESH::AddHypothesisOnSubMesh( aSubMeshVar, anAlgoVar ); + } + return true; +} + +//================================================================================ +/*! + * \brief Gets current hypothesis or algorithms + * \param theDim - dimension of hypothesis or algorithm + * \param theHypType - Type of hypothesis (Algo, MainHyp, AddHyp) + * \retval int - current hypothesis or algorithms + * + * Gets current hypothesis or algorithms + */ +//================================================================================ +int SMESHGUI_MeshOp::currentHyp( const int theDim, const int theHypType ) const +{ + return myDlg->tab( theDim )->currentHyp( theHypType ) - 1; +} + +//================================================================================ +/*! + * \brief Sets current hypothesis or algorithms + * \param theDim - dimension of hypothesis or algorithm + * \param theHypType - Type of hypothesis (Algo, MainHyp, AddHyp) + * \param theIndex - Index of hypothesis + * + * Gets current hypothesis or algorithms + */ +//================================================================================ +void SMESHGUI_MeshOp::setCurrentHyp( const int theDim, + const int theHypType, + const int theIndex ) +{ + myDlg->tab( theDim )->setCurrentHyp( theHypType, theIndex + 1 ); +} + +//================================================================================ +/*! + * \brief Generates default and sets mesh/submesh name + * + * Generates and sets default mesh/submesh name(Mesh_1, Mesh_2, etc.) + */ +//================================================================================ +void SMESHGUI_MeshOp::setDefaultName() const +{ + QString aResName; + + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + int i = 1; + QString aPrefix = tr( myIsMesh ? "SMESH_OBJECT_MESH" : "SMESH_SUBMESH" ) + "_"; + _PTR(SObject) anObj; + do + { + aResName = aPrefix + QString::number( i++ ); + anObj = aStudy->FindObject( aResName.latin1() ); + } + while ( anObj ); + + QLineEdit* aControl = ( QLineEdit* )myDlg->objectWg( + SMESHGUI_MeshDlg::Obj, SMESHGUI_MeshDlg::Control ); + aControl->setText( aResName ); +} + +//================================================================================ +/*! + * \brief Gets algorithm or creates it if necessary + * \param theDim - specifies dimension of returned hypotheses/algorifms + * \retval SMESH::SMESH_Hypothesis_var - algorithm + * + * Gets algorithm or creates it if necessary + */ +//================================================================================ +SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) +{ + SMESH::SMESH_Hypothesis_var anAlgoVar; + int aHypIndex = currentHyp( theDim, Algo ); + QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses( true, theDim, false ); + if ( aHypIndex < 0 || aHypIndex >= aHypTypeNameList.count() ) + return anAlgoVar; + QString aHypName = aHypTypeNameList[ aHypIndex ]; + QValueList& aHypVarList = myExistingHyps[ theDim ][ Algo ]; + QValueList::iterator anIter; + for ( anIter = aHypVarList.begin(); anIter != aHypVarList.end(); anIter++ ) + { + SMESH::SMESH_Hypothesis_var aHypVar = *anIter; + if ( !aHypVar->_is_nil() && aHypName == aHypVar->GetName() ) + { + anAlgoVar = aHypVar; + break; + } + } + if ( anAlgoVar->_is_nil() ) + { + HypothesisData* aHypData = SMESH::GetHypothesisData( aHypName ); + if ( aHypData ) + { + QString aClientLibName = aHypData->ClientLibName; + if ( aClientLibName == "" ) + SMESH::CreateHypothesis( aHypName, aHypData->Label, true ); + else + { + SMESHGUI_GenericHypothesisCreator* aCreator = + SMESH::GetHypothesisCreator( aHypName ); + if ( aCreator ) + aCreator->CreateHypothesis( true, myDlg ); + } + QStringList tmpList; + _PTR(SComponent) aFather = SMESH::GetActiveStudyDocument()->FindComponent( "SMESH" ); + existingHyps( theDim, Algo, aFather, tmpList, myExistingHyps[ theDim ][ Algo ] ); + } + + QValueList& aNewHypVarList = myExistingHyps[ theDim ][ Algo ]; + for ( anIter = aNewHypVarList.begin(); anIter != aNewHypVarList.end(); ++anIter ) + { + SMESH::SMESH_Hypothesis_var aHypVar = *anIter; + if ( !aHypVar->_is_nil() && aHypName == aHypVar->GetName() ) + { + anAlgoVar = aHypVar; + break; + } + } + } + + return anAlgoVar._retn(); +} + +//================================================================================ +/*! + * \brief Reads parameters of edited mesh and assigns them to the dialog + * + * Reads parameters of edited mesh and assigns them to the dialog (called when + * mesh is edited only) + */ +//================================================================================ +void SMESHGUI_MeshOp::readMesh() +{ + QString anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); + _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry ); + if ( !pObj ) + return; + + // Get name of mesh 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 ); + QString aMeshName = name( aMeshSO ); + myDlg->setObjectText( SMESHGUI_MeshDlg::Mesh, aMeshName ); + } + } + + // Get name of geometry object + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); + if ( !aGeomVar->_is_nil() ) + { + _PTR(SObject) aGeomSO = studyDS()->FindObjectID( aGeomVar->GetStudyEntry() ); + QString aShapeName = name( aGeomSO ); + myDlg->setObjectText( SMESHGUI_MeshDlg::Geom, aShapeName ); + } + + // Get hypotheses and algorithms assigned to the mesh/sub-mesh + for ( int dim = SMESH::DIM_1D; dim <= SMESH::DIM_3D; dim++ ) + { + // get algorithm + QStringList anExisting; + existingHyps( dim, Algo, pObj, anExisting, myObjHyps[ dim ][ Algo ] ); + SMESH::SMESH_Hypothesis_var aVar = myObjHyps[ dim ][ Algo ].first(); + QString aHypTypeName = aVar->GetName(); + + int aHypIndex = -1; + QStringList aHypTypeNameList = SMESH::GetAvailableHypotheses( true , dim, false ); + for ( int i = 0, n = aHypTypeNameList.count(); i < n; i++ ) + if ( aHypTypeName == aHypTypeNameList[ i ] ) + { + aHypIndex = i; + break; + } + setCurrentHyp( dim, Algo, aHypIndex ); + + // get hypotheses + for ( int hypType = MainHyp; hypType <= AddHyp; hypType++ ) + { + // get hypotheses + existingHyps( dim, hypType, pObj, anExisting, myObjHyps[ dim ][ hypType ] ); + // find index of requered hypothesis among existing ones for this dimension + // and hyp types + int aHypIndex = -1; + if ( myObjHyps[ dim ][ hypType ].count() > 0 ) + aHypIndex = find( myObjHyps[ dim ][ hypType ].first(), + myExistingHyps[ dim ][ hypType ] ); + setCurrentHyp( dim, hypType, aHypIndex ); + } + } +} + +//================================================================================ +/*! + * \brief Gets name of object + * \param theSO - SObject + * \retval QString - name of object + * + * Gets name of object + */ +//================================================================================ +QString SMESHGUI_MeshOp::name( _PTR(SObject) theSO ) const +{ + QString aResName; + if ( theSO ) + { + _PTR(GenericAttribute) anAttr; + _PTR(AttributeName) aNameAttr; + if ( theSO->FindAttribute( anAttr, "AttributeName" ) ) + { + aNameAttr = anAttr; + aResName = aNameAttr->Value().c_str(); + } + } + return aResName; +} + +//================================================================================ +/*! + * \brief Finds hypothesis in input list + * \param theHyp - hypothesis to be found + * \param theHypList - input list of hypotheses + * \retval int - index of hypothesis or -1 if it is not found + * + * Finds position of hypothesis in input list + */ +//================================================================================ +int SMESHGUI_MeshOp::find( const SMESH::SMESH_Hypothesis_var& theHyp, + const QValueList& theHypList ) const +{ + int aRes = -1; + if ( !theHyp->_is_nil() ) + { + int i = 0; + QValueList::const_iterator anIter; + for ( anIter = theHypList.begin(); anIter != theHypList.end(); ++ anIter ) + { + if ( theHyp->_is_equivalent( *anIter ) ) + { + aRes = i; + break; + } + i++; + } + } + return aRes; +} + +//================================================================================ +/*! + * \brief Edits mesh or sub-mesh + * \param theMess - Output parameter intended for returning error message + * \retval bool - TRUE if mesh is edited succesfully, FALSE otherwise + * + * Assigns new name hypotheses and algoriths to the mesh or sub-mesh + */ +//================================================================================ +bool SMESHGUI_MeshOp::editMeshOrSubMesh( QString& theMess ) +{ + theMess = ""; + + SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen(); + if ( aSMESHGen->_is_nil() ) + return false; + + QString anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); + _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry ); + if ( !pObj ) + return false; + + SUIT_OverrideCursor aWaitCursor; + + // Set new name + SMESH::SetName( pObj, myDlg->objectText( SMESHGUI_MeshDlg::Obj ).latin1() ); + + // Assign new hypotheses and algorithms + for ( int dim = SMESH::DIM_1D; dim <= SMESH::DIM_3D; dim++ ) + { + // create algorithm if necessary + getAlgo( dim ); + + // assign hypotheses + for ( int hypType = Algo; hypType <= AddHyp; hypType++ ) + { + int aNewHypIndex = currentHyp( dim, hypType ); + int anOldHypIndex = -1; + if ( myObjHyps[ dim ][ hypType ].count() > 0 ) + anOldHypIndex = find( myObjHyps[ dim ][ hypType ].first(), + myExistingHyps[ dim ][ hypType ] ); + if ( aNewHypIndex != anOldHypIndex ) + { + // remove old hypotheses + if ( anOldHypIndex >= 0 ) + SMESH::RemoveHypothesisOrAlgorithmOnMesh( + pObj, myExistingHyps[ dim ][ hypType ][ anOldHypIndex ] ); + + // assign new hypotheses + if ( aNewHypIndex != -1 ) + { + if ( myIsMesh ) + { + SMESH::SMESH_Mesh_var aVar = + SMESH::SMESH_Mesh::_narrow( _CAST(SObject,pObj)->GetObject() ); + if ( !aVar->_is_nil() ) + SMESH::AddHypothesisOnMesh( + aVar, myExistingHyps[ dim ][ hypType ][ aNewHypIndex ] ); + } + 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 ] ); + } + } + // reread all hypotheses of mesh if necessary + QStringList anExisting; + existingHyps( dim, hypType, pObj, anExisting, myObjHyps[ dim ][ hypType ] ); + } + } + } + + return true; +} + +//================================================================================ +/*! + * \brief Verifies whether given operator is valid for this one + * \param theOtherOp - other operation + * \return Returns TRUE if the given operator is valid for this one, FALSE otherwise +* +* Virtual method redefined from base class verifies whether given operator is valid for +* this one (i.e. can be started "above" this operator). In current implementation method +* retuns false if theOtherOp operation is not intended for deleting objects or mesh +* elements. +*/ +//================================================================================ +bool SMESHGUI_MeshOp::isValid( SUIT_Operation* theOp ) const +{ + return SMESHGUI_Operation::isValid( theOp ) && !theOp->inherits( "SMESHGUI_MeshOp" ); +} + + + + + + + + + diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.h b/src/SMESHGUI/SMESHGUI_MeshOp.h new file mode 100644 index 000000000..063ebcaac --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_MeshOp.h @@ -0,0 +1,93 @@ +/** +* SMESH SMESHGUI +* +* Copyright (C) 2005 CEA/DEN, EDF R&D +* +* +* +* File : SMESHGUI_MeshOp.h +* Author : Sergey LITONIN +* Module : SMESHGUI +*/ + +#ifndef SMESHGUI_MeshOp_H +#define SMESHGUI_MeshOp_H + +#include "SMESHGUI_SelectionOp.h" +#include + +#include +#include CORBA_SERVER_HEADER(GEOM_Gen) +#include CORBA_SERVER_HEADER(SMESH_Mesh) + +class SMESHGUI_MeshDlg; +class SMESH_TypeFilter; +class SMESH_NumberFilter; + + +/*! + * \brief Operation for mech creation or editing + * + * This operation is used for mech creation or editing. +*/ +class SMESHGUI_MeshOp : public SMESHGUI_SelectionOp +{ + Q_OBJECT + + enum HypType{ Algo = 0, MainHyp, AddHyp }; + +public: + SMESHGUI_MeshOp( const bool theToCreate, const bool theIsMesh = true ); + virtual ~SMESHGUI_MeshOp(); + + virtual SalomeApp_Dialog* dlg() const; + +protected: + virtual void startOperation(); + virtual void selectionDone(); + virtual SUIT_SelectionFilter* createFilter( const int ) const; + virtual bool isValid( SUIT_Operation* ) const; + +protected slots: + virtual bool onApply(); + void onCreateHyp( const int theHypType, const int theIndex ); + void onEditHyp( const int theHypType, const int theIndex ); + +private: + bool isValid( QString& ) const; + void availableHyps( const int theDim, + const int theHypType, + QStringList& theHyps ) const; + void existingHyps( const int theDim, + const int theHypType, + _PTR(SObject) theFather, + QStringList& theHyps, + QValueList& theHypVars ); + + bool createMesh( QString& ); + bool createSubMesh( QString& ); + bool editMeshOrSubMesh( QString& ); + + int currentHyp( const int, const int ) const; + void setCurrentHyp( const int, const int, const int ); + void setDefaultName() const; + SMESH::SMESH_Hypothesis_var getAlgo( const int ); + void readMesh(); + QString name( _PTR(SObject) ) const; + int find( const SMESH::SMESH_Hypothesis_var&, + const QValueList& ) const; + +private: + typedef QMap< int, QValueList > IdToHypListMap; + typedef QMap< int, IdToHypListMap > DimToHypMap; + + SMESHGUI_MeshDlg* myDlg; + bool myToCreate; + bool myIsMesh; + + DimToHypMap myExistingHyps; //!< all hypothesis of SMESH module + DimToHypMap myObjHyps; //!< hypothesis assigned to the current + // edited mesh/sub-mesh +}; + +#endif -- 2.30.2