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 QtxDoubleSpinBox* 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 QLineEdit* le = new QLineEdit( GroupC1 );
230 le->setObjectName( (*anIt).myName );
231 attuneStdWidget( le, i );
232 le->setText( (*anIt).myValue.toString() );
233 connect( le, SIGNAL( textChanged( const QString& ) ), this, SLOT( onValueChanged() ) );
241 GroupC1Layout->addWidget( w, i, 1 );
242 changeWidgets().append( w );
249 void SMESHGUI_GenericHypothesisCreator::onValueChanged()
253 void SMESHGUI_GenericHypothesisCreator::onDialogFinished( int /*result*/ )
259 bool SMESHGUI_GenericHypothesisCreator::stdParams( ListOfStdParams& ) const
264 bool SMESHGUI_GenericHypothesisCreator::getStdParamFromDlg( ListOfStdParams& params ) const
268 ListOfWidgets::const_iterator anIt = widgets().begin(), aLast = widgets().end();
269 for( ; anIt!=aLast; anIt++ )
271 item.myName = (*anIt)->objectName();
272 if( (*anIt)->inherits( "SalomeApp_IntSpinBox" ) )
274 SalomeApp_IntSpinBox* sb = ( SalomeApp_IntSpinBox* )( *anIt );
275 item.myValue = sb->value();
276 params.append( item );
279 else if( (*anIt)->inherits( "QtxDoubleSpinBox" ) )
281 QtxDoubleSpinBox* sb = ( QtxDoubleSpinBox* )( *anIt );
282 item.myValue = sb->value();
283 params.append( item );
286 else if( (*anIt)->inherits( "QLineEdit" ) )
288 QLineEdit* line = ( QLineEdit* )( *anIt );
289 item.myValue = line->text();
290 params.append( item );
293 else if ( getParamFromCustomWidget( item, *anIt ))
295 params.append( item );
304 QString SMESHGUI_GenericHypothesisCreator::stdParamValues( const ListOfStdParams& params)
306 QString valueStr = "";
307 ListOfStdParams::const_iterator param = params.begin(), aLast = params.end();
309 for( int i=0; param!=aLast; param++, i++ )
311 if ( valueStr.length() > len0 ) {
313 len0 = valueStr.length();
315 switch( (*param).myValue.type() )
318 valueStr += valueStr.number( (*param).myValue.toInt() );
320 case QVariant::Double:
321 valueStr += valueStr.number( (*param).myValue.toDouble() );
323 case QVariant::String:
324 valueStr += (*param).myValue.toString();
327 QVariant valCopy = (*param).myValue;
328 valueStr += valCopy.toString();
334 SMESH::SMESH_Hypothesis_var SMESHGUI_GenericHypothesisCreator::hypothesis() const
339 SMESH::SMESH_Hypothesis_var SMESHGUI_GenericHypothesisCreator::initParamsHypothesis() const
341 if ( CORBA::is_nil( myInitParamsHypo ))
343 return myInitParamsHypo;
346 QString SMESHGUI_GenericHypothesisCreator::hypType() const
351 QString SMESHGUI_GenericHypothesisCreator::hypName() const
356 const SMESHGUI_GenericHypothesisCreator::ListOfWidgets& SMESHGUI_GenericHypothesisCreator::widgets() const
358 return myParamWidgets;
361 SMESHGUI_GenericHypothesisCreator::ListOfWidgets& SMESHGUI_GenericHypothesisCreator::changeWidgets()
363 return myParamWidgets;
366 QtxDialog* SMESHGUI_GenericHypothesisCreator:: dlg() const
371 bool SMESHGUI_GenericHypothesisCreator::isCreation() const
376 void SMESHGUI_GenericHypothesisCreator::attuneStdWidget( QWidget*, const int ) const
380 QString SMESHGUI_GenericHypothesisCreator::caption() const
385 QPixmap SMESHGUI_GenericHypothesisCreator::icon() const
390 QString SMESHGUI_GenericHypothesisCreator::type() const
394 QWidget* SMESHGUI_GenericHypothesisCreator::getCustomWidget( const StdParam & /*param*/,
396 const int /*index*/) const
400 bool SMESHGUI_GenericHypothesisCreator::getParamFromCustomWidget( StdParam&, QWidget* ) const
405 bool SMESHGUI_GenericHypothesisCreator::checkParams() const
407 ListOfWidgets::const_iterator anIt = widgets().begin(), aLast = widgets().end();
408 for( ; anIt!=aLast; anIt++ )
410 if( (*anIt)->inherits( "SalomeApp_IntSpinBox" ) )
412 SalomeApp_IntSpinBox* sb = ( SalomeApp_IntSpinBox* )( *anIt );
416 else if( (*anIt)->inherits( "SalomeApp_DoubleSpinBox" ) )
418 SalomeApp_DoubleSpinBox* sb = ( SalomeApp_DoubleSpinBox* )( *anIt );
426 void SMESHGUI_GenericHypothesisCreator::onReject()
430 QString SMESHGUI_GenericHypothesisCreator::helpPage() const
432 QString aHypType = hypType();
433 QString aHelpFileName;
434 if ( aHypType == "LocalLength" )
435 aHelpFileName = "a1d_meshing_hypo_page.html#average_length_anchor";
436 else if ( aHypType == "Arithmetic1D")
437 aHelpFileName = "a1d_meshing_hypo_page.html#arithmetic_1d_anchor";
438 else if ( aHypType == "MaxElementArea")
439 aHelpFileName = "a2d_meshing_hypo_page.html#max_element_area_anchor";
440 else if ( aHypType == "MaxElementVolume")
441 aHelpFileName = "max_element_volume_hypo_page.html";
442 else if ( aHypType == "StartEndLength")
443 aHelpFileName = "a1d_meshing_hypo_page.html#start_and_end_length_anchor";
444 else if ( aHypType == "Deflection1D")
445 aHelpFileName = "a1d_meshing_hypo_page.html#deflection_1d_anchor";
446 else if ( aHypType == "AutomaticLength")
447 aHelpFileName = "a1d_meshing_hypo_page.html#automatic_length_anchor";
448 else if ( aHypType == "NumberOfSegments")
449 aHelpFileName = "a1d_meshing_hypo_page.html#number_of_segments_anchor";
452 return aHelpFileName;
458 SMESHGUI_HypothesisDlg::SMESHGUI_HypothesisDlg( SMESHGUI_GenericHypothesisCreator* creator, QWidget* parent )
459 : QtxDialog( parent, false, true ),
462 setMinimumSize( 300, height() );
463 // setFixedSize( 300, height() );
464 QVBoxLayout* topLayout = new QVBoxLayout( mainFrame() );
465 topLayout->setMargin( 0 );
466 topLayout->setSpacing( 0 );
468 QFrame* titFrame = new QFrame( mainFrame() );
469 QHBoxLayout* titLay = new QHBoxLayout( titFrame );
470 titLay->setMargin( 0 );
471 titLay->setSpacing( SPACING );
473 myIconLabel = new QLabel( titFrame );
474 myIconLabel->setScaledContents( false );
475 myIconLabel->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
476 myTypeLabel = new QLabel( titFrame );
478 myTypeLabel->setText( creator->hypType() );
480 titLay->addWidget( myIconLabel, 0 );
481 titLay->addWidget( myTypeLabel, 0 );
482 titLay->addStretch( 1 );
484 topLayout->addWidget( titFrame, 0 );
486 myHelpFileName = creator->helpPage();
488 connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) );
491 SMESHGUI_HypothesisDlg::~SMESHGUI_HypothesisDlg()
495 void SMESHGUI_HypothesisDlg::setCustomFrame( QFrame* f )
499 f->setParent( mainFrame() );
500 qobject_cast<QVBoxLayout*>( mainFrame()->layout() )->insertWidget( 1, f, 1 );
504 void SMESHGUI_HypothesisDlg::accept()
506 if ( myCreator && !myCreator->checkParams() )
508 SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), tr( "SMESH_INCORRECT_INPUT" ) );
514 void SMESHGUI_HypothesisDlg::reject()
516 if ( myCreator ) myCreator->onReject();
520 void SMESHGUI_HypothesisDlg::onHelp()
522 LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
524 SMESHGUI* aSMESHGUI = dynamic_cast<SMESHGUI*>( app->activeModule() );
525 app->onHelpContextModule(aSMESHGUI ? app->moduleName(aSMESHGUI->moduleName()) : QString(""), myHelpFileName);
530 platform = "winapplication";
532 platform = "application";
534 SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
535 tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
536 arg(app->resourceMgr()->stringValue("ExternalBrowser",
538 arg(myHelpFileName));
542 void SMESHGUI_HypothesisDlg::setHIcon( const QPixmap& p )
544 myIconLabel->setPixmap( p );
547 void SMESHGUI_HypothesisDlg::setType( const QString& t )
549 myTypeLabel->setText( t );
552 HypothesisData::HypothesisData( const QString& theTypeName,
553 const QString& thePluginName,
554 const QString& theServerLibName,
555 const QString& theClientLibName,
556 const QString& theLabel,
557 const QString& theIconId,
558 const QList<int>& theDim,
560 const QStringList& theNeededHypos,
561 const QStringList& theOptionalHypos,
562 const QStringList& theInputTypes,
563 const QStringList& theOutputTypes,
564 const bool theIsNeedGeometry,
565 const bool supportSub)
566 : TypeName( theTypeName ),
567 PluginName( thePluginName ),
568 ServerLibName( theServerLibName ),
569 ClientLibName( theClientLibName ),
574 NeededHypos( theNeededHypos ),
575 OptionalHypos( theOptionalHypos ),
576 InputTypes( theInputTypes ),
577 OutputTypes( theOutputTypes ),
578 IsNeedGeometry( theIsNeedGeometry ),
579 IsSupportSubmeshes( supportSub )
583 HypothesesSet::HypothesesSet( const QString& theSetName )
584 : HypoSetName( theSetName )
588 HypothesesSet::HypothesesSet( const QString& theSetName,
589 const QStringList& theHypoList,
590 const QStringList& theAlgoList )
591 : HypoSetName( theSetName ),
592 HypoList( theHypoList ),
593 AlgoList( theAlgoList )