1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // SMESH SMESHGUI : GUI for SMESH component
23 // File : SMESHGUI_Hypotheses.cxx
24 // Author : Julia DOROVSKIKH, Open CASCADE S.A.S.
27 #include "SMESHGUI_Hypotheses.h"
30 #include "SMESHGUI_HypothesesUtils.h"
31 #include "SMESHGUI_Utils.h"
32 #include "SMESHGUI_SpinBox.h"
34 // SALOME KERNEL includes
35 #include <SALOMEDSClient_Study.hxx>
36 #include <utilities.h>
38 // SALOME GUI includes
39 #include <SUIT_Session.h>
40 #include <SUIT_MessageBox.h>
41 #include <SUIT_ResourceMgr.h>
42 #include <LightApp_Application.h>
43 #include <SalomeApp_IntSpinBox.h>
50 #include <QVBoxLayout>
55 SMESHGUI_GenericHypothesisCreator::SMESHGUI_GenericHypothesisCreator( const QString& theHypType )
56 : myHypType( theHypType ), myIsCreate( false ), myDlg( 0 )
60 SMESHGUI_GenericHypothesisCreator::~SMESHGUI_GenericHypothesisCreator()
64 void SMESHGUI_GenericHypothesisCreator::setInitParamsHypothesis(SMESH::SMESH_Hypothesis_ptr hyp)
66 if ( !CORBA::is_nil( hyp ) && hypType() == hyp->GetName() )
67 myInitParamsHypo = SMESH::SMESH_Hypothesis::_duplicate( hyp );
70 void SMESHGUI_GenericHypothesisCreator::create( SMESH::SMESH_Hypothesis_ptr initParamsHyp,
71 const QString& theHypName,
72 QWidget* parent, QObject* obj, const QString& slot )
74 MESSAGE( "Creation of hypothesis with initial params" );
75 setInitParamsHypothesis( initParamsHyp );
76 create( false, theHypName, parent, obj, slot );
79 void SMESHGUI_GenericHypothesisCreator::create( bool isAlgo,
80 const QString& theHypName,
81 QWidget* theParent, QObject* obj, const QString& slot )
83 MESSAGE( "Creation of hypothesis" );
87 // Create hypothesis/algorithm
89 SMESH::CreateHypothesis( hypType(), theHypName, isAlgo );
93 SMESH::SMESH_Hypothesis_var aHypothesis =
94 SMESH::CreateHypothesis( hypType(), theHypName, false );
95 editHypothesis( aHypothesis.in(), theHypName, theParent, obj, slot );
99 void SMESHGUI_GenericHypothesisCreator::edit( SMESH::SMESH_Hypothesis_ptr theHypothesis,
100 const QString& theHypName,
101 QWidget* theParent, QObject* obj, const QString& slot )
103 if( CORBA::is_nil( theHypothesis ) )
106 MESSAGE("Edition of hypothesis");
110 editHypothesis( theHypothesis, theHypName, theParent, obj, slot );
113 void SMESHGUI_GenericHypothesisCreator::editHypothesis( SMESH::SMESH_Hypothesis_ptr h,
114 const QString& theHypName,
116 QObject* obj, const QString& slot )
118 myHypName = theHypName;
119 myHypo = SMESH::SMESH_Hypothesis::_duplicate( h );
121 SMESHGUI_HypothesisDlg* Dlg = new SMESHGUI_HypothesisDlg( this, theParent );
122 connect( Dlg, SIGNAL( finished( int ) ), this, SLOT( onDialogFinished( int ) ) );
123 connect( this, SIGNAL( finished( int ) ), obj, slot.toLatin1().constData() );
126 QFrame* fr = buildFrame();
129 Dlg->setCustomFrame( fr );
130 Dlg->setWindowTitle( caption() );
131 Dlg->setObjectName( theHypName );
132 Dlg->setHIcon( icon() );
133 Dlg->setType( type() );
136 Dlg->resize( Dlg->minimumSizeHint() );
139 emit finished( QDialog::Accepted );
142 QFrame* SMESHGUI_GenericHypothesisCreator::buildStdFrame()
144 if( CORBA::is_nil( hypothesis() ) )
147 ListOfStdParams params;
148 if( !stdParams( params ) || params.isEmpty() )
151 QFrame* fr = new QFrame( 0 );
152 QVBoxLayout* lay = new QVBoxLayout( fr );
154 lay->setSpacing( 0 );
156 QGroupBox* GroupC1 = new QGroupBox( tr( "SMESH_ARGUMENTS" ), fr );
157 lay->addWidget( GroupC1 );
159 QGridLayout* GroupC1Layout = new QGridLayout( GroupC1 );
160 GroupC1Layout->setSpacing( SPACING );
161 GroupC1Layout->setMargin( MARGIN );
163 ListOfStdParams::const_iterator anIt = params.begin(), aLast = params.end();
164 for( int i=0; anIt!=aLast; anIt++, i++ )
166 QLabel* lab = new QLabel( (*anIt).myName, GroupC1 );
167 GroupC1Layout->addWidget( lab, i, 0 );
169 QWidget* w = getCustomWidget( *anIt, GroupC1, i );
171 switch( (*anIt).myValue.type() )
175 SalomeApp_IntSpinBox* sb = new SalomeApp_IntSpinBox( GroupC1 );
176 sb->setObjectName( (*anIt).myName );
177 attuneStdWidget( sb, i );
178 sb->setValue( (*anIt).myValue.toInt() );
179 connect( sb, SIGNAL( valueChanged( int ) ), this, SLOT( onValueChanged() ) );
183 case QVariant::Double:
185 SalomeApp_DoubleSpinBox* sb = new SMESHGUI_SpinBox( GroupC1 );
186 sb->setObjectName( (*anIt).myName );
187 attuneStdWidget( sb, i );
188 sb->setValue( (*anIt).myValue.toDouble() );
189 connect( sb, SIGNAL( valueChanged( double ) ), this, SLOT( onValueChanged() ) );
193 case QVariant::String:
195 if((*anIt).isVariable) {
196 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
197 QString aVar = (*anIt).myValue.toString();
198 if(aStudy->IsInteger(aVar.toLatin1().constData())){
199 SalomeApp_IntSpinBox* sb = new SalomeApp_IntSpinBox( GroupC1 );
200 sb->setObjectName( (*anIt).myName );
201 attuneStdWidget( sb, i );
203 connect( sb, SIGNAL( valueChanged( int ) ), this, SLOT( onValueChanged() ) );
206 else if(aStudy->IsReal(aVar.toLatin1().constData())){
207 SalomeApp_DoubleSpinBox* sb = new SMESHGUI_SpinBox( GroupC1 );
208 sb->setObjectName( (*anIt).myName );
209 attuneStdWidget( sb, i );
211 connect( sb, SIGNAL( valueChanged( double ) ), this, SLOT( onValueChanged() ) );
216 QLineEdit* le = new QLineEdit( GroupC1 );
217 le->setObjectName( (*anIt).myName );
218 attuneStdWidget( le, i );
219 le->setText( (*anIt).myValue.toString() );
220 connect( le, SIGNAL( textChanged( const QString& ) ), this, SLOT( onValueChanged() ) );
229 GroupC1Layout->addWidget( w, i, 1 );
230 changeWidgets().append( w );
237 void SMESHGUI_GenericHypothesisCreator::onValueChanged()
239 valueChanged( (QWidget*) sender() );
242 void SMESHGUI_GenericHypothesisCreator::valueChanged( QWidget* )
246 void SMESHGUI_GenericHypothesisCreator::onDialogFinished( int result )
248 bool res = result==QDialog::Accepted;
251 /*QString paramValues = */storeParams();
252 // No longer needed since NoteBook appears and "Value" OB field shows names of variable
253 // if ( !paramValues.isEmpty() ) {
254 // if ( _PTR(SObject) SHyp = SMESH::FindSObject( myHypo ))
255 // SMESH::SetValue( SHyp, paramValues );
259 changeWidgets().clear();
261 if( myIsCreate && !res )
263 //remove just created hypothesis
264 _PTR(SObject) aHypSObject = SMESH::FindSObject( myHypo );
265 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
266 if( aStudy && !aStudy->GetProperties()->IsLocked() )
268 _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
269 aBuilder->RemoveObjectWithChildren( aHypSObject );
272 else if( !myIsCreate && res )
274 SMESH::SObjectList listSOmesh = SMESH::GetMeshesUsingAlgoOrHypothesis( myHypo );
275 if( listSOmesh.size() > 0 )
276 for( int i = 0; i < listSOmesh.size(); i++ )
278 _PTR(SObject) submSO = listSOmesh[i];
279 SMESH::SMESH_Mesh_var aMesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( submSO );
280 SMESH::SMESH_subMesh_var aSubMesh = SMESH::SObjectToInterface<SMESH::SMESH_subMesh>( submSO );
281 if( !aSubMesh->_is_nil() )
282 aMesh = aSubMesh->GetFather();
283 _PTR(SObject) meshSO = SMESH::FindSObject( aMesh );
284 SMESH::ModifiedMesh( meshSO, false, aMesh->NbNodes()==0);
287 SMESHGUI::GetSMESHGUI()->updateObjBrowser( true, 0 );
288 myHypo = SMESH::SMESH_Hypothesis::_nil();
289 myInitParamsHypo = SMESH::SMESH_Hypothesis::_nil();
291 disconnect( myDlg, SIGNAL( finished( int ) ), this, SLOT( onDialogFinished( int ) ) );
295 emit finished( result );
298 bool SMESHGUI_GenericHypothesisCreator::stdParams( ListOfStdParams& ) const
303 bool SMESHGUI_GenericHypothesisCreator::getStdParamFromDlg( ListOfStdParams& params ) const
307 ListOfWidgets::const_iterator anIt = widgets().begin(), aLast = widgets().end();
308 for( ; anIt!=aLast; anIt++ )
310 item.myName = (*anIt)->objectName();
311 if( (*anIt)->inherits( "SalomeApp_IntSpinBox" ) )
313 SalomeApp_IntSpinBox* sb = ( SalomeApp_IntSpinBox* )( *anIt );
314 item.myValue = sb->value();
315 params.append( item );
318 else if( (*anIt)->inherits( "SalomeApp_DoubleSpinBox" ) )
320 SalomeApp_DoubleSpinBox* sb = ( SalomeApp_DoubleSpinBox* )( *anIt );
321 item.myValue = sb->value();
322 params.append( item );
325 else if( (*anIt)->inherits( "QLineEdit" ) )
327 QLineEdit* line = ( QLineEdit* )( *anIt );
328 item.myValue = line->text();
329 params.append( item );
332 else if ( getParamFromCustomWidget( item, *anIt ))
334 params.append( item );
344 QStringList SMESHGUI_GenericHypothesisCreator::getVariablesFromDlg() const
347 ListOfWidgets::const_iterator anIt = widgets().begin(), aLast = widgets().end();
348 for( ; anIt!=aLast; anIt++ ) {
349 if( (*anIt)->inherits( "QAbstractSpinBox" ) ) {
350 QAbstractSpinBox* sb = ( QAbstractSpinBox* )( *anIt );
351 aResult.append(sb->text());
357 QString SMESHGUI_GenericHypothesisCreator::stdParamValues( const ListOfStdParams& params)
359 QString valueStr = "";
360 ListOfStdParams::const_iterator param = params.begin(), aLast = params.end();
362 for( int i=0; param!=aLast; param++, i++ )
364 if ( valueStr.length() > len0 ) {
366 len0 = valueStr.length();
368 switch( (*param).myValue.type() )
371 valueStr += valueStr.number( (*param).myValue.toInt() );
373 case QVariant::Double:
374 valueStr += valueStr.number( (*param).myValue.toDouble() );
376 case QVariant::String:
377 valueStr += (*param).myValue.toString();
380 QVariant valCopy = (*param).myValue;
381 valueStr += valCopy.toString();
387 SMESH::SMESH_Hypothesis_var SMESHGUI_GenericHypothesisCreator::hypothesis() const
392 void SMESHGUI_GenericHypothesisCreator::setShapeEntry( const QString& theEntry )
394 myShapeEntry = theEntry;
397 //================================================================================
399 * \brief Return hypothesis containing initial parameters
400 * \param strictly - if true, always return myInitParamsHypo,
401 * else, return myInitParamsHypo only in creation mode and if it
404 //================================================================================
406 SMESH::SMESH_Hypothesis_var SMESHGUI_GenericHypothesisCreator::initParamsHypothesis(const bool strictly) const
409 return myInitParamsHypo;
410 if ( !isCreation() || CORBA::is_nil( myInitParamsHypo ))
412 return myInitParamsHypo;
415 bool SMESHGUI_GenericHypothesisCreator::hasInitParamsHypothesis() const
417 return !CORBA::is_nil( myInitParamsHypo );
420 QString SMESHGUI_GenericHypothesisCreator::hypType() const
425 QString SMESHGUI_GenericHypothesisCreator::hypName() const
430 const SMESHGUI_GenericHypothesisCreator::ListOfWidgets& SMESHGUI_GenericHypothesisCreator::widgets() const
432 return myParamWidgets;
435 SMESHGUI_GenericHypothesisCreator::ListOfWidgets& SMESHGUI_GenericHypothesisCreator::changeWidgets()
437 return myParamWidgets;
440 QtxDialog* SMESHGUI_GenericHypothesisCreator:: dlg() const
445 bool SMESHGUI_GenericHypothesisCreator::isCreation() const
450 void SMESHGUI_GenericHypothesisCreator::attuneStdWidget( QWidget*, const int ) const
454 QString SMESHGUI_GenericHypothesisCreator::caption() const
459 QPixmap SMESHGUI_GenericHypothesisCreator::icon() const
464 QString SMESHGUI_GenericHypothesisCreator::type() const
468 QWidget* SMESHGUI_GenericHypothesisCreator::getCustomWidget( const StdParam & /*param*/,
470 const int /*index*/) const
474 bool SMESHGUI_GenericHypothesisCreator::getParamFromCustomWidget( StdParam&, QWidget* ) const
479 bool SMESHGUI_GenericHypothesisCreator::checkParams( QString& msg ) const
482 ListOfWidgets::const_iterator anIt = widgets().begin(), aLast = widgets().end();
483 for( ; anIt!=aLast; anIt++ )
485 if( (*anIt)->inherits( "SalomeApp_IntSpinBox" ) )
487 SalomeApp_IntSpinBox* sb = ( SalomeApp_IntSpinBox* )( *anIt );
488 ok = sb->isValid( msg, true ) && ok;
490 else if( (*anIt)->inherits( "SalomeApp_DoubleSpinBox" ) )
492 SalomeApp_DoubleSpinBox* sb = ( SalomeApp_DoubleSpinBox* )( *anIt );
493 ok = sb->isValid( msg, true ) && ok;
499 void SMESHGUI_GenericHypothesisCreator::onReject()
503 QString SMESHGUI_GenericHypothesisCreator::helpPage() const
505 QString aHypType = hypType();
506 QString aHelpFileName = "";
507 if ( aHypType == "LocalLength" )
508 aHelpFileName = "a1d_meshing_hypo_page.html#average_length_anchor";
509 else if ( aHypType == "MaxLength" )
510 aHelpFileName = "a1d_meshing_hypo_page.html#max_length_anchor";
511 else if ( aHypType == "Arithmetic1D")
512 aHelpFileName = "a1d_meshing_hypo_page.html#arithmetic_1d_anchor";
513 else if ( aHypType == "FixedPoints1D")
514 aHelpFileName = "a1d_meshing_hypo_page.html#fixed_points_1d_anchor";
515 else if ( aHypType == "MaxElementArea")
516 aHelpFileName = "a2d_meshing_hypo_page.html#max_element_area_anchor";
517 else if ( aHypType == "MaxElementVolume")
518 aHelpFileName = "max_element_volume_hypo_page.html";
519 else if ( aHypType == "StartEndLength")
520 aHelpFileName = "a1d_meshing_hypo_page.html#start_and_end_length_anchor";
521 else if ( aHypType == "Deflection1D")
522 aHelpFileName = "a1d_meshing_hypo_page.html#deflection_1d_anchor";
523 else if ( aHypType == "AutomaticLength")
524 aHelpFileName = "a1d_meshing_hypo_page.html#automatic_length_anchor";
525 else if ( aHypType == "NumberOfSegments")
526 aHelpFileName = "a1d_meshing_hypo_page.html#number_of_segments_anchor";
527 else if ( aHypType == "ProjectionSource1D")
528 aHelpFileName = "projection_algos_page.html";
529 else if ( aHypType == "ProjectionSource2D")
530 aHelpFileName = "projection_algos_page.html";
531 else if ( aHypType == "ProjectionSource3D")
532 aHelpFileName = "projection_algos_page.html";
533 else if ( aHypType == "NumberOfLayers")
534 aHelpFileName = "radial_prism_algo_page.html";
535 else if ( aHypType == "NumberOfLayers2D")
536 aHelpFileName = "radial_quadrangle_1D2D_algo_page.html";
537 else if ( aHypType == "LayerDistribution")
538 aHelpFileName = "radial_prism_algo_page.html";
539 else if ( aHypType == "LayerDistribution2D")
540 aHelpFileName = "radial_quadrangle_1D2D_algo_page.html";
541 else if ( aHypType == "SegmentLengthAroundVertex")
542 aHelpFileName = "segments_around_vertex_algo_page.html";
543 else if ( aHypType == "QuadrangleParams")
544 aHelpFileName = "a2d_meshing_hypo_page.html#hypo_quad_params_anchor";
545 return aHelpFileName;
551 SMESHGUI_HypothesisDlg::SMESHGUI_HypothesisDlg( SMESHGUI_GenericHypothesisCreator* creator, QWidget* parent )
552 : QtxDialog( parent, false, true ),
555 setAttribute(Qt::WA_DeleteOnClose, true);
556 setMinimumSize( 300, height() );
557 // setFixedSize( 300, height() );
558 QVBoxLayout* topLayout = new QVBoxLayout( mainFrame() );
559 topLayout->setMargin( 0 );
560 topLayout->setSpacing( 0 );
562 QFrame* titFrame = new QFrame( mainFrame() );
563 QHBoxLayout* titLay = new QHBoxLayout( titFrame );
564 titLay->setMargin( 0 );
565 titLay->setSpacing( SPACING );
567 myIconLabel = new QLabel( titFrame );
568 myIconLabel->setScaledContents( false );
569 myIconLabel->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
570 myTypeLabel = new QLabel( titFrame );
572 myTypeLabel->setText( creator->hypType() );
574 titLay->addWidget( myIconLabel, 0 );
575 titLay->addWidget( myTypeLabel, 0 );
576 titLay->addStretch( 1 );
578 topLayout->addWidget( titFrame, 0 );
580 myHelpFileName = creator->helpPage();
582 connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) );
585 SMESHGUI_HypothesisDlg::~SMESHGUI_HypothesisDlg()
590 void SMESHGUI_HypothesisDlg::setCustomFrame( QFrame* f )
594 f->setParent( mainFrame() );
595 qobject_cast<QVBoxLayout*>( mainFrame()->layout() )->insertWidget( 1, f, 1 );
599 void SMESHGUI_HypothesisDlg::accept()
602 if ( myCreator && !myCreator->checkParams( msg ) )
604 QString str( tr( "SMESH_INCORRECT_INPUT" ) );
605 if ( !msg.isEmpty() )
607 SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
613 void SMESHGUI_HypothesisDlg::reject()
615 if ( myCreator ) myCreator->onReject();
619 void SMESHGUI_HypothesisDlg::onHelp()
621 LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
623 SMESHGUI* aSMESHGUI = dynamic_cast<SMESHGUI*>( app->activeModule() );
624 app->onHelpContextModule(aSMESHGUI ? app->moduleName(aSMESHGUI->moduleName()) : QString(""), myHelpFileName);
629 platform = "winapplication";
631 platform = "application";
633 SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
634 tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
635 arg(app->resourceMgr()->stringValue("ExternalBrowser",
637 arg(myHelpFileName));
641 void SMESHGUI_HypothesisDlg::setHIcon( const QPixmap& p )
643 myIconLabel->setPixmap( p );
646 void SMESHGUI_HypothesisDlg::setType( const QString& t )
648 myTypeLabel->setText( t );
651 HypothesisData::HypothesisData( const QString& theTypeName,
652 const QString& thePluginName,
653 const QString& theServerLibName,
654 const QString& theClientLibName,
655 const QString& theLabel,
656 const QString& theIconId,
657 const QList<int>& theDim,
659 const QStringList& theNeededHypos,
660 const QStringList& theOptionalHypos,
661 const QStringList& theInputTypes,
662 const QStringList& theOutputTypes,
663 const bool theIsNeedGeometry,
664 const bool supportSub)
665 : TypeName( theTypeName ),
666 PluginName( thePluginName ),
667 ServerLibName( theServerLibName ),
668 ClientLibName( theClientLibName ),
673 NeededHypos( theNeededHypos ),
674 OptionalHypos( theOptionalHypos ),
675 InputTypes( theInputTypes ),
676 OutputTypes( theOutputTypes ),
677 IsNeedGeometry( theIsNeedGeometry ),
678 IsSupportSubmeshes( supportSub )
682 HypothesesSet::HypothesesSet( const QString& theSetName )
683 : myHypoSetName( theSetName ),
688 HypothesesSet::HypothesesSet( const QString& theSetName,
689 const QStringList& theHypoList,
690 const QStringList& theAlgoList )
691 : myHypoSetName( theSetName ),
692 myHypoList( theHypoList ),
693 myAlgoList( theAlgoList ),
698 QStringList* HypothesesSet::list(bool is_algo) const
700 return const_cast<QStringList*>( &( is_algo ? myAlgoList : myHypoList ) );
703 QStringList* HypothesesSet::list() const
705 return list( myIsAlgo );
708 QString HypothesesSet::name() const
710 return myHypoSetName;
713 void HypothesesSet::set( bool isAlgo, const QStringList& lst )
718 int HypothesesSet::count( bool isAlgo ) const
720 return list(isAlgo)->count();
723 bool HypothesesSet::isAlgo() const
728 void HypothesesSet::init( bool isAlgo )
734 bool HypothesesSet::more() const
736 return myIndex < list()->count();
739 void HypothesesSet::next()
744 QString HypothesesSet::current() const
746 return list()->at(myIndex);