1 // SMESH SMESHGUI : GUI for SMESH component
3 // Copyright (C) 2003 CEA
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation; either
8 // version 2.1 of the License.
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // Lesser General Public License for more details.
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 // File : SMESHGUI_Hypotheses.cxx
22 // Author : Julia DOROVSKIKH, Open CASCADE S.A.S.
26 #include "SMESHGUI_Hypotheses.h"
29 #include "SMESHGUI_HypothesesUtils.h"
30 #include "SMESHGUI_Utils.h"
31 #include "SMESHGUI_SpinBox.h"
33 // SALOME KERNEL includes
34 #include <SALOMEDSClient_Study.hxx>
35 #include <utilities.h>
37 // SALOME GUI includes
38 #include <SUIT_Session.h>
39 #include <SUIT_MessageBox.h>
40 #include <SUIT_ResourceMgr.h>
41 #include <LightApp_Application.h>
42 #include <SalomeApp_IntSpinBox.h>
49 #include <QVBoxLayout>
55 SMESHGUI_GenericHypothesisCreator::SMESHGUI_GenericHypothesisCreator( const QString& theHypType )
56 : myHypType( theHypType ), myIsCreate( false ), myDlg( 0 ), myEventLoop( 0 )
60 SMESHGUI_GenericHypothesisCreator::~SMESHGUI_GenericHypothesisCreator()
64 void SMESHGUI_GenericHypothesisCreator::create( SMESH::SMESH_Hypothesis_ptr initParamsHyp,
65 const QString& theHypName,
68 MESSAGE( "Creation of hypothesis with initial params" );
70 if ( !CORBA::is_nil( initParamsHyp ) && hypType() == initParamsHyp->GetName() )
71 myInitParamsHypo = SMESH::SMESH_Hypothesis::_duplicate( initParamsHyp );
72 create( false, theHypName, parent );
75 void SMESHGUI_GenericHypothesisCreator::create( bool isAlgo,
76 const QString& theHypName,
79 MESSAGE( "Creation of hypothesis" );
83 // Create hypothesis/algorithm
85 SMESH::CreateHypothesis( hypType(), theHypName, isAlgo );
88 SMESH::SMESH_Hypothesis_var aHypothesis =
89 SMESH::CreateHypothesis( hypType(), theHypName, false );
90 if( !editHypothesis( aHypothesis.in(), theHypName, theParent ) )
91 { //remove just created hypothesis
92 _PTR(SObject) aHypSObject = SMESH::FindSObject( aHypothesis.in() );
93 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
94 if( aStudy && !aStudy->GetProperties()->IsLocked() )
96 _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
97 aBuilder->RemoveObjectWithChildren( aHypSObject );
101 SMESHGUI::GetSMESHGUI()->updateObjBrowser( true, 0 );
104 void SMESHGUI_GenericHypothesisCreator::edit( SMESH::SMESH_Hypothesis_ptr theHypothesis,
105 const QString& theHypName,
108 if( CORBA::is_nil( theHypothesis ) )
111 MESSAGE("Edition of hypothesis");
115 if( !editHypothesis( theHypothesis, theHypName, theParent ) )
118 SMESH::SObjectList listSOmesh = SMESH::GetMeshesUsingAlgoOrHypothesis( theHypothesis );
119 if( listSOmesh.size() > 0 )
120 for( int i = 0; i < listSOmesh.size(); i++ )
122 _PTR(SObject) submSO = listSOmesh[i];
123 SMESH::SMESH_Mesh_var aMesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( submSO );
124 SMESH::SMESH_subMesh_var aSubMesh = SMESH::SObjectToInterface<SMESH::SMESH_subMesh>( submSO );
125 if( !aSubMesh->_is_nil() )
126 aMesh = aSubMesh->GetFather();
127 _PTR(SObject) meshSO = SMESH::FindSObject( aMesh );
128 SMESH::ModifiedMesh( meshSO, false, aMesh->NbNodes()==0);
130 SMESHGUI::GetSMESHGUI()->updateObjBrowser( true, 0 );
133 bool SMESHGUI_GenericHypothesisCreator::editHypothesis( SMESH::SMESH_Hypothesis_ptr h,
134 const QString& theHypName,
137 if( CORBA::is_nil( h ) )
141 myHypName = theHypName;
142 myHypo = SMESH::SMESH_Hypothesis::_duplicate( h );
144 SMESHGUI_HypothesisDlg* Dlg = new SMESHGUI_HypothesisDlg( this, theParent );
145 connect( Dlg, SIGNAL( finished( int ) ), this, SLOT( onDialogFinished( int ) ) );
147 QFrame* fr = buildFrame();
150 Dlg->setCustomFrame( fr );
151 Dlg->setWindowTitle( caption() );
152 Dlg->setObjectName( theHypName );
153 Dlg->setHIcon( icon() );
154 Dlg->setType( type() );
158 myEventLoop = new QEventLoop( this );
159 myEventLoop->exec(); // make myDlg not modal
160 res = myDlg->result();
162 QString paramValues = storeParams();
163 if ( !paramValues.isEmpty() ) {
164 if ( _PTR(SObject) SHyp = SMESH::FindSObject( myHypo ))
165 SMESH::SetValue( SHyp, paramValues );
169 delete Dlg; myDlg = 0;
170 changeWidgets().clear();
171 myHypo = SMESH::SMESH_Hypothesis::_nil();
172 myInitParamsHypo = SMESH::SMESH_Hypothesis::_nil();
176 QFrame* SMESHGUI_GenericHypothesisCreator::buildStdFrame()
178 if( CORBA::is_nil( hypothesis() ) )
181 ListOfStdParams params;
182 if( !stdParams( params ) || params.isEmpty() )
185 QFrame* fr = new QFrame( 0 );
186 QVBoxLayout* lay = new QVBoxLayout( fr );
188 lay->setSpacing( 0 );
190 QGroupBox* GroupC1 = new QGroupBox( tr( "SMESH_ARGUMENTS" ), fr );
191 lay->addWidget( GroupC1 );
193 QGridLayout* GroupC1Layout = new QGridLayout( GroupC1 );
194 GroupC1Layout->setSpacing( SPACING );
195 GroupC1Layout->setMargin( MARGIN );
197 ListOfStdParams::const_iterator anIt = params.begin(), aLast = params.end();
198 for( int i=0; anIt!=aLast; anIt++, i++ )
200 QLabel* lab = new QLabel( (*anIt).myName, GroupC1 );
201 GroupC1Layout->addWidget( lab, i, 0 );
203 QWidget* w = getCustomWidget( *anIt, GroupC1, i );
205 switch( (*anIt).myValue.type() )
209 SalomeApp_IntSpinBox* sb = new SalomeApp_IntSpinBox( GroupC1 );
210 sb->setObjectName( (*anIt).myName );
211 attuneStdWidget( sb, i );
212 sb->setValue( (*anIt).myValue.toInt() );
213 connect( sb, SIGNAL( valueChanged( int ) ), this, SLOT( onValueChanged() ) );
217 case QVariant::Double:
219 SalomeApp_DoubleSpinBox* sb = new SMESHGUI_SpinBox( GroupC1 );
220 sb->setObjectName( (*anIt).myName );
221 attuneStdWidget( sb, i );
222 sb->setValue( (*anIt).myValue.toDouble() );
223 connect( sb, SIGNAL( valueChanged( double ) ), this, SLOT( onValueChanged() ) );
227 case QVariant::String:
229 if((*anIt).isVariable) {
230 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
231 QString aVar = (*anIt).myValue.toString();
232 if(aStudy->IsInteger(aVar.toLatin1().constData())){
233 SalomeApp_IntSpinBox* sb = new SalomeApp_IntSpinBox( GroupC1 );
234 sb->setObjectName( (*anIt).myName );
235 attuneStdWidget( sb, i );
237 connect( sb, SIGNAL( valueChanged( int ) ), this, SLOT( onValueChanged() ) );
240 else if(aStudy->IsReal(aVar.toLatin1().constData())){
241 SalomeApp_DoubleSpinBox* sb = new SalomeApp_DoubleSpinBox( GroupC1 );
242 sb->setObjectName( (*anIt).myName );
243 attuneStdWidget( sb, i );
245 connect( sb, SIGNAL( valueChanged( double ) ), this, SLOT( onValueChanged() ) );
250 QLineEdit* le = new QLineEdit( GroupC1 );
251 le->setObjectName( (*anIt).myName );
252 attuneStdWidget( le, i );
253 le->setText( (*anIt).myValue.toString() );
254 connect( le, SIGNAL( textChanged( const QString& ) ), this, SLOT( onValueChanged() ) );
263 GroupC1Layout->addWidget( w, i, 1 );
264 changeWidgets().append( w );
271 void SMESHGUI_GenericHypothesisCreator::onValueChanged()
275 void SMESHGUI_GenericHypothesisCreator::onDialogFinished( int /*result*/ )
281 bool SMESHGUI_GenericHypothesisCreator::stdParams( ListOfStdParams& ) const
286 bool SMESHGUI_GenericHypothesisCreator::getStdParamFromDlg( ListOfStdParams& params ) const
290 ListOfWidgets::const_iterator anIt = widgets().begin(), aLast = widgets().end();
291 for( ; anIt!=aLast; anIt++ )
293 item.myName = (*anIt)->objectName();
294 if( (*anIt)->inherits( "SalomeApp_IntSpinBox" ) )
296 SalomeApp_IntSpinBox* sb = ( SalomeApp_IntSpinBox* )( *anIt );
297 item.myValue = sb->value();
298 params.append( item );
301 else if( (*anIt)->inherits( "SalomeApp_DoubleSpinBox" ) )
303 SalomeApp_DoubleSpinBox* sb = ( SalomeApp_DoubleSpinBox* )( *anIt );
304 item.myValue = sb->value();
305 params.append( item );
308 else if( (*anIt)->inherits( "QLineEdit" ) )
310 QLineEdit* line = ( QLineEdit* )( *anIt );
311 item.myValue = line->text();
312 params.append( item );
315 else if ( getParamFromCustomWidget( item, *anIt ))
317 params.append( item );
327 QStringList SMESHGUI_GenericHypothesisCreator::getVariablesFromDlg() const
330 ListOfWidgets::const_iterator anIt = widgets().begin(), aLast = widgets().end();
331 for( ; anIt!=aLast; anIt++ ) {
332 if( (*anIt)->inherits( "SalomeApp_IntSpinBox" ) ) {
333 SalomeApp_IntSpinBox* sb = ( SalomeApp_IntSpinBox* )( *anIt );
334 aResult.append(sb->text());
336 else if( (*anIt)->inherits( "QtxDoubleSpinBox" ) ) {
337 QtxDoubleSpinBox* sb = ( QtxDoubleSpinBox* )( *anIt );
338 aResult.append(sb->text());
344 QString SMESHGUI_GenericHypothesisCreator::stdParamValues( const ListOfStdParams& params)
346 QString valueStr = "";
347 ListOfStdParams::const_iterator param = params.begin(), aLast = params.end();
349 for( int i=0; param!=aLast; param++, i++ )
351 if ( valueStr.length() > len0 ) {
353 len0 = valueStr.length();
355 switch( (*param).myValue.type() )
358 valueStr += valueStr.number( (*param).myValue.toInt() );
360 case QVariant::Double:
361 valueStr += valueStr.number( (*param).myValue.toDouble() );
363 case QVariant::String:
364 valueStr += (*param).myValue.toString();
367 QVariant valCopy = (*param).myValue;
368 valueStr += valCopy.toString();
374 SMESH::SMESH_Hypothesis_var SMESHGUI_GenericHypothesisCreator::hypothesis() const
379 SMESH::SMESH_Hypothesis_var SMESHGUI_GenericHypothesisCreator::initParamsHypothesis() const
381 if ( CORBA::is_nil( myInitParamsHypo ))
383 return myInitParamsHypo;
386 QString SMESHGUI_GenericHypothesisCreator::hypType() const
391 QString SMESHGUI_GenericHypothesisCreator::hypName() const
396 const SMESHGUI_GenericHypothesisCreator::ListOfWidgets& SMESHGUI_GenericHypothesisCreator::widgets() const
398 return myParamWidgets;
401 SMESHGUI_GenericHypothesisCreator::ListOfWidgets& SMESHGUI_GenericHypothesisCreator::changeWidgets()
403 return myParamWidgets;
406 QtxDialog* SMESHGUI_GenericHypothesisCreator:: dlg() const
411 bool SMESHGUI_GenericHypothesisCreator::isCreation() const
416 void SMESHGUI_GenericHypothesisCreator::attuneStdWidget( QWidget*, const int ) const
420 QString SMESHGUI_GenericHypothesisCreator::caption() const
425 QPixmap SMESHGUI_GenericHypothesisCreator::icon() const
430 QString SMESHGUI_GenericHypothesisCreator::type() const
434 QWidget* SMESHGUI_GenericHypothesisCreator::getCustomWidget( const StdParam & /*param*/,
436 const int /*index*/) const
440 bool SMESHGUI_GenericHypothesisCreator::getParamFromCustomWidget( StdParam&, QWidget* ) const
445 bool SMESHGUI_GenericHypothesisCreator::checkParams( QString& msg ) const
448 ListOfWidgets::const_iterator anIt = widgets().begin(), aLast = widgets().end();
449 for( ; anIt!=aLast; anIt++ )
451 if( (*anIt)->inherits( "SalomeApp_IntSpinBox" ) )
453 SalomeApp_IntSpinBox* sb = ( SalomeApp_IntSpinBox* )( *anIt );
454 ok = sb->isValid( msg, true ) && ok;
456 else if( (*anIt)->inherits( "SalomeApp_DoubleSpinBox" ) )
458 SalomeApp_DoubleSpinBox* sb = ( SalomeApp_DoubleSpinBox* )( *anIt );
459 ok = sb->isValid( msg, true ) && ok;
465 void SMESHGUI_GenericHypothesisCreator::onReject()
469 QString SMESHGUI_GenericHypothesisCreator::helpPage() const
471 QString aHypType = hypType();
472 QString aHelpFileName;
473 if ( aHypType == "LocalLength" )
474 aHelpFileName = "a1d_meshing_hypo_page.html#average_length_anchor";
475 else if ( aHypType == "Arithmetic1D")
476 aHelpFileName = "a1d_meshing_hypo_page.html#arithmetic_1d_anchor";
477 else if ( aHypType == "MaxElementArea")
478 aHelpFileName = "a2d_meshing_hypo_page.html#max_element_area_anchor";
479 else if ( aHypType == "MaxElementVolume")
480 aHelpFileName = "max_element_volume_hypo_page.html";
481 else if ( aHypType == "StartEndLength")
482 aHelpFileName = "a1d_meshing_hypo_page.html#start_and_end_length_anchor";
483 else if ( aHypType == "Deflection1D")
484 aHelpFileName = "a1d_meshing_hypo_page.html#deflection_1d_anchor";
485 else if ( aHypType == "AutomaticLength")
486 aHelpFileName = "a1d_meshing_hypo_page.html#automatic_length_anchor";
487 else if ( aHypType == "NumberOfSegments")
488 aHelpFileName = "a1d_meshing_hypo_page.html#number_of_segments_anchor";
491 return aHelpFileName;
497 SMESHGUI_HypothesisDlg::SMESHGUI_HypothesisDlg( SMESHGUI_GenericHypothesisCreator* creator, QWidget* parent )
498 : QtxDialog( parent, false, true ),
501 setMinimumSize( 300, height() );
502 // setFixedSize( 300, height() );
503 QVBoxLayout* topLayout = new QVBoxLayout( mainFrame() );
504 topLayout->setMargin( 0 );
505 topLayout->setSpacing( 0 );
507 QFrame* titFrame = new QFrame( mainFrame() );
508 QHBoxLayout* titLay = new QHBoxLayout( titFrame );
509 titLay->setMargin( 0 );
510 titLay->setSpacing( SPACING );
512 myIconLabel = new QLabel( titFrame );
513 myIconLabel->setScaledContents( false );
514 myIconLabel->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
515 myTypeLabel = new QLabel( titFrame );
517 myTypeLabel->setText( creator->hypType() );
519 titLay->addWidget( myIconLabel, 0 );
520 titLay->addWidget( myTypeLabel, 0 );
521 titLay->addStretch( 1 );
523 topLayout->addWidget( titFrame, 0 );
525 myHelpFileName = creator->helpPage();
527 connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) );
530 SMESHGUI_HypothesisDlg::~SMESHGUI_HypothesisDlg()
534 void SMESHGUI_HypothesisDlg::setCustomFrame( QFrame* f )
538 f->setParent( mainFrame() );
539 qobject_cast<QVBoxLayout*>( mainFrame()->layout() )->insertWidget( 1, f, 1 );
543 void SMESHGUI_HypothesisDlg::accept()
546 if ( myCreator && !myCreator->checkParams( msg ) )
548 QString str( tr( "SMESH_INCORRECT_INPUT" ) );
549 if ( !msg.isEmpty() )
551 SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
557 void SMESHGUI_HypothesisDlg::reject()
559 if ( myCreator ) myCreator->onReject();
563 void SMESHGUI_HypothesisDlg::onHelp()
565 LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
567 SMESHGUI* aSMESHGUI = dynamic_cast<SMESHGUI*>( app->activeModule() );
568 app->onHelpContextModule(aSMESHGUI ? app->moduleName(aSMESHGUI->moduleName()) : QString(""), myHelpFileName);
573 platform = "winapplication";
575 platform = "application";
577 SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
578 tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
579 arg(app->resourceMgr()->stringValue("ExternalBrowser",
581 arg(myHelpFileName));
585 void SMESHGUI_HypothesisDlg::setHIcon( const QPixmap& p )
587 myIconLabel->setPixmap( p );
590 void SMESHGUI_HypothesisDlg::setType( const QString& t )
592 myTypeLabel->setText( t );
595 HypothesisData::HypothesisData( const QString& theTypeName,
596 const QString& thePluginName,
597 const QString& theServerLibName,
598 const QString& theClientLibName,
599 const QString& theLabel,
600 const QString& theIconId,
601 const QList<int>& theDim,
603 const QStringList& theNeededHypos,
604 const QStringList& theOptionalHypos,
605 const QStringList& theInputTypes,
606 const QStringList& theOutputTypes,
607 const bool theIsNeedGeometry,
608 const bool supportSub)
609 : TypeName( theTypeName ),
610 PluginName( thePluginName ),
611 ServerLibName( theServerLibName ),
612 ClientLibName( theClientLibName ),
617 NeededHypos( theNeededHypos ),
618 OptionalHypos( theOptionalHypos ),
619 InputTypes( theInputTypes ),
620 OutputTypes( theOutputTypes ),
621 IsNeedGeometry( theIsNeedGeometry ),
622 IsSupportSubmeshes( supportSub )
626 HypothesesSet::HypothesesSet( const QString& theSetName )
627 : HypoSetName( theSetName )
631 HypothesesSet::HypothesesSet( const QString& theSetName,
632 const QStringList& theHypoList,
633 const QStringList& theAlgoList )
634 : HypoSetName( theSetName ),
635 HypoList( theHypoList ),
636 AlgoList( theAlgoList )