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";
544 return aHelpFileName;
550 SMESHGUI_HypothesisDlg::SMESHGUI_HypothesisDlg( SMESHGUI_GenericHypothesisCreator* creator, QWidget* parent )
551 : QtxDialog( parent, false, true ),
554 setAttribute(Qt::WA_DeleteOnClose, true);
555 setMinimumSize( 300, height() );
556 // setFixedSize( 300, height() );
557 QVBoxLayout* topLayout = new QVBoxLayout( mainFrame() );
558 topLayout->setMargin( 0 );
559 topLayout->setSpacing( 0 );
561 QFrame* titFrame = new QFrame( mainFrame() );
562 QHBoxLayout* titLay = new QHBoxLayout( titFrame );
563 titLay->setMargin( 0 );
564 titLay->setSpacing( SPACING );
566 myIconLabel = new QLabel( titFrame );
567 myIconLabel->setScaledContents( false );
568 myIconLabel->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
569 myTypeLabel = new QLabel( titFrame );
571 myTypeLabel->setText( creator->hypType() );
573 titLay->addWidget( myIconLabel, 0 );
574 titLay->addWidget( myTypeLabel, 0 );
575 titLay->addStretch( 1 );
577 topLayout->addWidget( titFrame, 0 );
579 myHelpFileName = creator->helpPage();
581 connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) );
584 SMESHGUI_HypothesisDlg::~SMESHGUI_HypothesisDlg()
589 void SMESHGUI_HypothesisDlg::setCustomFrame( QFrame* f )
593 f->setParent( mainFrame() );
594 qobject_cast<QVBoxLayout*>( mainFrame()->layout() )->insertWidget( 1, f, 1 );
598 void SMESHGUI_HypothesisDlg::accept()
601 if ( myCreator && !myCreator->checkParams( msg ) )
603 QString str( tr( "SMESH_INCORRECT_INPUT" ) );
604 if ( !msg.isEmpty() )
606 SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str );
612 void SMESHGUI_HypothesisDlg::reject()
614 if ( myCreator ) myCreator->onReject();
618 void SMESHGUI_HypothesisDlg::onHelp()
620 LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
622 SMESHGUI* aSMESHGUI = dynamic_cast<SMESHGUI*>( app->activeModule() );
623 app->onHelpContextModule(aSMESHGUI ? app->moduleName(aSMESHGUI->moduleName()) : QString(""), myHelpFileName);
628 platform = "winapplication";
630 platform = "application";
632 SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
633 tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
634 arg(app->resourceMgr()->stringValue("ExternalBrowser",
636 arg(myHelpFileName));
640 void SMESHGUI_HypothesisDlg::setHIcon( const QPixmap& p )
642 myIconLabel->setPixmap( p );
645 void SMESHGUI_HypothesisDlg::setType( const QString& t )
647 myTypeLabel->setText( t );
650 HypothesisData::HypothesisData( const QString& theTypeName,
651 const QString& thePluginName,
652 const QString& theServerLibName,
653 const QString& theClientLibName,
654 const QString& theLabel,
655 const QString& theIconId,
656 const QList<int>& theDim,
658 const QStringList& theNeededHypos,
659 const QStringList& theOptionalHypos,
660 const QStringList& theInputTypes,
661 const QStringList& theOutputTypes,
662 const bool theIsNeedGeometry,
663 const bool supportSub)
664 : TypeName( theTypeName ),
665 PluginName( thePluginName ),
666 ServerLibName( theServerLibName ),
667 ClientLibName( theClientLibName ),
672 NeededHypos( theNeededHypos ),
673 OptionalHypos( theOptionalHypos ),
674 InputTypes( theInputTypes ),
675 OutputTypes( theOutputTypes ),
676 IsNeedGeometry( theIsNeedGeometry ),
677 IsSupportSubmeshes( supportSub )
681 HypothesesSet::HypothesesSet( const QString& theSetName )
682 : myHypoSetName( theSetName ),
687 HypothesesSet::HypothesesSet( const QString& theSetName,
688 const QStringList& theHypoList,
689 const QStringList& theAlgoList )
690 : myHypoSetName( theSetName ),
691 myHypoList( theHypoList ),
692 myAlgoList( theAlgoList ),
697 QStringList* HypothesesSet::list(bool is_algo) const
699 return const_cast<QStringList*>( &( is_algo ? myAlgoList : myHypoList ) );
702 QStringList* HypothesesSet::list() const
704 return list( myIsAlgo );
707 QString HypothesesSet::name() const
709 return myHypoSetName;
712 void HypothesesSet::set( bool isAlgo, const QStringList& lst )
717 int HypothesesSet::count( bool isAlgo ) const
719 return list(isAlgo)->count();
722 bool HypothesesSet::isAlgo() const
727 void HypothesesSet::init( bool isAlgo )
733 bool HypothesesSet::more() const
735 return myIndex < list()->count();
738 void HypothesesSet::next()
743 QString HypothesesSet::current() const
745 return list()->at(myIndex);