Salome HOME
Copyrights update 2015.
[plugins/netgenplugin.git] / src / GUI / NETGENPluginGUI_HypothesisCreator.cxx
1 // Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
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, or (at your option) any later version.
10 //
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.
15 //
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
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 //  NETGENPlugin GUI: GUI for plugged-in mesher NETGENPlugin
24 //  File   : NETGENPluginGUI_HypothesisCreator.cxx
25 //  Author : Michael Zorin
26 //  Module : NETGENPlugin
27 //
28 #include "NETGENPluginGUI_HypothesisCreator.h"
29
30 #include <SMESHGUI_Utils.h>
31 #include <SMESHGUI_HypothesesUtils.h>
32 #include <SMESHGUI_SpinBox.h>
33 #include <GeomSelectionTools.h>
34
35 #include CORBA_SERVER_HEADER(NETGENPlugin_Algorithm)
36
37 #include <SUIT_Session.h>
38 #include <SUIT_ResourceMgr.h>
39
40 #include <SalomeApp_Tools.h>
41 #include <LightApp_SelectionMgr.h>
42 #include <SALOME_ListIO.hxx>
43
44 #include <QComboBox>
45 #include <QLabel>
46 #include <QGroupBox>
47 #include <QFrame>
48 #include <QLayout>
49 #include <QLineEdit>
50 #include <QCheckBox>
51 #include <QPixmap>
52 #include <QTableWidget>
53 #include <QHeaderView>
54 #include <QPushButton>
55
56 enum Fineness
57   {
58     VeryCoarse,
59     Coarse,
60     Moderate,
61     Fine,
62     VeryFine,
63     UserDefined
64   };
65
66 enum {
67   STD_TAB = 0,
68   LSZ_TAB
69 };
70
71 enum {
72   LSZ_ENTRY_COLUMN = 0,
73   LSZ_NAME_COLUMN,
74   LSZ_LOCALSIZE_COLUMN,
75   LSZ_NB_COLUMNS
76 };
77
78 enum {
79   LSZ_BTNS = 0,
80   LSZ_VERTEX_BTN,
81   LSZ_EDGE_BTN,
82   LSZ_FACE_BTN,
83   LSZ_SEPARATOR2,
84   LSZ_REMOVE_BTN
85 };
86
87 NETGENPluginGUI_HypothesisCreator::NETGENPluginGUI_HypothesisCreator( const QString& theHypType )
88   : SMESHGUI_GenericHypothesisCreator( theHypType )
89 {
90   myGeomSelectionTools = NULL;
91   myLocalSizeMap.clear();
92   myIs2D   = ( theHypType.startsWith("NETGEN_Parameters_2D"));
93   myIsONLY = ( theHypType == "NETGEN_Parameters_2D_ONLY" ||
94                theHypType == "NETGEN_Parameters_3D");
95 }
96
97 NETGENPluginGUI_HypothesisCreator::~NETGENPluginGUI_HypothesisCreator()
98 {
99 }
100
101 bool NETGENPluginGUI_HypothesisCreator::checkParams(QString& msg) const
102 {
103   NetgenHypothesisData data_old, data_new;
104   readParamsFromHypo( data_old );
105   readParamsFromWidgets( data_new );
106   bool res = storeParamsToHypo( data_new );
107   //storeParamsToHypo( data_old ); -- issue 0021364: Dump of netgen parameters has duplicate lines
108   
109   res = myMaxSize->isValid(msg,true) && res;
110   res = myMinSize->isValid(msg,true) && res;
111   res = myGrowthRate->isValid(msg,true) && res; ;
112   if ( myNbSegPerEdge )
113     res = myNbSegPerEdge->isValid(msg,true) && res;
114   if ( myNbSegPerRadius )
115     res = myNbSegPerRadius->isValid(msg,true) && res;
116
117   if ( !res ) //  -- issue 0021364: Dump of netgen parameters has duplicate lines
118     storeParamsToHypo( data_old );
119
120   return res;
121 }
122
123 QFrame* NETGENPluginGUI_HypothesisCreator::buildFrame()
124 {
125   QFrame* fr = new QFrame( 0 );
126   fr->setObjectName( "myframe" );
127   QVBoxLayout* lay = new QVBoxLayout( fr );
128   lay->setMargin( 5 );
129   lay->setSpacing( 0 );
130
131   QTabWidget* tab = new QTabWidget( fr );
132   tab->setTabShape( QTabWidget::Rounded );
133   tab->setTabPosition( QTabWidget::North );
134   lay->addWidget( tab );
135   QWidget* GroupC1 = new QWidget();
136   tab->insertTab( STD_TAB, GroupC1, tr( "SMESH_ARGUMENTS" ) );
137   
138   QGridLayout* aGroupLayout = new QGridLayout( GroupC1 );
139   aGroupLayout->setSpacing( 6 );
140   aGroupLayout->setMargin( 11 );
141   
142   int row = 0;
143   myName = 0;
144   if( isCreation() )
145   {
146     aGroupLayout->addWidget( new QLabel( tr( "SMESH_NAME" ), GroupC1 ), row, 0 );
147     myName = new QLineEdit( GroupC1 );
148     myName->setMinimumWidth(160);
149     aGroupLayout->addWidget( myName, row, 1 );
150     row++;
151   }
152
153   aGroupLayout->addWidget( new QLabel( tr( "NETGEN_MAX_SIZE" ), GroupC1 ), row, 0 );
154   myMaxSize = new SMESHGUI_SpinBox( GroupC1 );
155   myMaxSize->RangeStepAndValidator( 1e-07, 1e+06, 10., "length_precision" );
156   aGroupLayout->addWidget( myMaxSize, row, 1 );
157   row++;
158
159   aGroupLayout->addWidget( new QLabel( tr( "NETGEN_MIN_SIZE" ), GroupC1 ), row, 0 );
160   myMinSize = new SMESHGUI_SpinBox( GroupC1 );
161   myMinSize->RangeStepAndValidator( 0.0, 1e+06, 10., "length_precision" );
162   aGroupLayout->addWidget( myMinSize, row, 1 );
163   row++;
164
165   mySecondOrder = 0;
166   if ( !myIsONLY )
167   {
168     mySecondOrder = new QCheckBox( tr( "NETGEN_SECOND_ORDER" ), GroupC1 );
169     aGroupLayout->addWidget( mySecondOrder, row, 0, 1, 2 );
170     row++;
171   }
172
173   aGroupLayout->addWidget( new QLabel( tr( "NETGEN_FINENESS" ), GroupC1 ), row, 0 );
174   myFineness = new QComboBox( GroupC1 );
175   QStringList types;
176   types << tr( "NETGEN_VERYCOARSE" ) << tr( "NETGEN_COARSE" )   << tr( "NETGEN_MODERATE" ) <<
177            tr( "NETGEN_FINE" )       << tr( "NETGEN_VERYFINE" ) << tr( "NETGEN_CUSTOM" );
178   myFineness->addItems( types );
179   aGroupLayout->addWidget( myFineness, row, 1 );
180   connect( myFineness, SIGNAL( activated( int ) ), this, SLOT( onFinenessChanged() ) );
181   row++;
182
183   aGroupLayout->addWidget( new QLabel( tr( "NETGEN_GROWTH_RATE" ), GroupC1 ), row, 0 );
184   myGrowthRate = new SMESHGUI_SpinBox( GroupC1 );
185   myGrowthRate->RangeStepAndValidator( .0001, 10., .1, "parametric_precision" );
186   aGroupLayout->addWidget( myGrowthRate, row, 1 );
187   row++;
188
189   myNbSegPerEdge = 0;
190   myNbSegPerRadius = 0;
191   if ( !myIsONLY )
192   {
193     const double VALUE_MAX = 1.0e+6;
194
195     aGroupLayout->addWidget( new QLabel( tr( "NETGEN_SEG_PER_EDGE" ), GroupC1 ), row, 0 );
196     myNbSegPerEdge = new SMESHGUI_SpinBox( GroupC1 );
197     myNbSegPerEdge->RangeStepAndValidator( .2, VALUE_MAX, .1, "parametric_precision" );
198     aGroupLayout->addWidget( myNbSegPerEdge, row, 1 );
199     row++;
200
201     aGroupLayout->addWidget( new QLabel( tr( "NETGEN_SEG_PER_RADIUS" ), GroupC1 ), row, 0 );
202     myNbSegPerRadius = new SMESHGUI_SpinBox( GroupC1 );
203     myNbSegPerRadius->RangeStepAndValidator( .2, VALUE_MAX, .1, "parametric_precision" );
204     aGroupLayout->addWidget( myNbSegPerRadius, row, 1 );
205     row++;
206   }
207
208   mySurfaceCurvature = 0;
209   if ( myIs2D || !myIsONLY )
210   {
211     mySurfaceCurvature = new QCheckBox( tr( "NETGEN_SURFACE_CURVATURE" ), GroupC1 );
212     aGroupLayout->addWidget( mySurfaceCurvature, row, 0, 1, 2 );
213     connect( mySurfaceCurvature, SIGNAL( stateChanged( int ) ), this, SLOT( onSurfaceCurvatureChanged() ) );
214     row++;
215   }
216
217   myAllowQuadrangles = 0;
218   if ( myIs2D || !myIsONLY ) // disable only for NETGEN 3D
219   {
220     myAllowQuadrangles = new QCheckBox( tr( "NETGEN_ALLOW_QUADRANGLES" ), GroupC1 );
221     aGroupLayout->addWidget( myAllowQuadrangles, row, 0, 1, 2 );
222     row++;
223   }
224
225   myOptimize = new QCheckBox( tr( "NETGEN_OPTIMIZE" ), GroupC1 );
226   aGroupLayout->addWidget( myOptimize, row, 0, 1, 2 );
227   row++;
228
229   myFuseEdges = 0;
230   if (!myIsONLY)
231   {
232     myFuseEdges = new QCheckBox( tr( "NETGEN_FUSE_EDGES" ), GroupC1 );
233     aGroupLayout->addWidget( myFuseEdges, row, 0, 1, 2 );
234     row++;
235   }
236
237   myLocalSizeTable = 0;
238   if ( !myIsONLY )
239   {
240     QWidget* localSizeGroup = new QWidget();
241     QGridLayout* localSizeLayout = new QGridLayout(localSizeGroup);
242
243     myLocalSizeTable = new QTableWidget(0, LSZ_NB_COLUMNS, localSizeGroup);
244     localSizeLayout->addWidget(myLocalSizeTable, 1, 0, 8, 1);
245     QStringList localSizeHeaders;
246     localSizeHeaders << tr( "LSZ_ENTRY_COLUMN" )<< tr( "LSZ_NAME_COLUMN" ) << tr( "LSZ_LOCALSIZE_COLUMN" );
247     myLocalSizeTable->setHorizontalHeaderLabels(localSizeHeaders);
248     myLocalSizeTable->horizontalHeader()->hideSection(LSZ_ENTRY_COLUMN);
249     myLocalSizeTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
250     myLocalSizeTable->resizeColumnToContents(LSZ_NAME_COLUMN);
251     myLocalSizeTable->resizeColumnToContents(LSZ_LOCALSIZE_COLUMN);
252     myLocalSizeTable->setAlternatingRowColors(true);
253     myLocalSizeTable->verticalHeader()->hide();
254
255     QPushButton* addVertexButton = new QPushButton(tr("NETGEN_LSZ_VERTEX"), localSizeGroup);
256     localSizeLayout->addWidget(addVertexButton, LSZ_VERTEX_BTN, 1, 1, 1);
257     QPushButton* addEdgeButton = new QPushButton(tr("NETGEN_LSZ_EDGE"), localSizeGroup);
258     localSizeLayout->addWidget(addEdgeButton, LSZ_EDGE_BTN, 1, 1, 1);
259     QPushButton* addFaceButton = new QPushButton(tr("NETGEN_LSZ_FACE"), localSizeGroup);
260     localSizeLayout->addWidget(addFaceButton, LSZ_FACE_BTN, 1, 1, 1);
261
262     QFrame *line2 = new QFrame(localSizeGroup);
263     line2->setFrameShape(QFrame::HLine);
264     line2->setFrameShadow(QFrame::Sunken);
265     localSizeLayout->addWidget(line2, LSZ_SEPARATOR2, 1, 1, 1);
266
267     QPushButton* removeButton = new QPushButton(tr("NETGEN_LSZ_REMOVE"), localSizeGroup);
268     localSizeLayout->addWidget(removeButton, LSZ_REMOVE_BTN, 1, 1, 1);
269
270     connect( addVertexButton, SIGNAL(clicked()), this, SLOT(onAddLocalSizeOnVertex()));
271     connect( addEdgeButton, SIGNAL(clicked()), this, SLOT(onAddLocalSizeOnEdge()));
272     connect( addFaceButton, SIGNAL(clicked()), this, SLOT(onAddLocalSizeOnFace()));
273     connect( removeButton, SIGNAL(clicked()), this, SLOT(onRemoveLocalSizeOnShape()));
274     connect( myLocalSizeTable, SIGNAL(cellChanged(int, int)), this, SLOT(onSetLocalSize(int, int)));
275
276     tab->insertTab(LSZ_TAB, localSizeGroup, tr("NETGEN_LOCAL_SIZE"));
277   }
278   return fr;
279 }
280
281 void NETGENPluginGUI_HypothesisCreator::retrieveParams() const
282 {
283   NetgenHypothesisData data;
284   readParamsFromHypo( data );
285
286   if( myName )
287     myName->setText( data.myName );
288   if(data.myMaxSizeVar.isEmpty())
289     myMaxSize->setValue( data.myMaxSize );
290   else
291     myMaxSize->setText( data.myMaxSizeVar );
292
293   if(data.myMinSizeVar.isEmpty())
294     myMinSize->setValue( data.myMinSize );
295   else
296     myMinSize->setText( data.myMinSizeVar );
297
298   if ( mySecondOrder )
299     mySecondOrder->setChecked( data.mySecondOrder );
300   if ( myOptimize )
301     myOptimize->setChecked( data.myOptimize );
302   myFineness->setCurrentIndex( data.myFineness );
303
304   if(data.myGrowthRateVar.isEmpty())
305     myGrowthRate->setValue( data.myGrowthRate );
306   else
307     myGrowthRate->setText( data.myGrowthRateVar );
308
309   if ( myNbSegPerEdge )
310   {
311     if(data.myNbSegPerEdgeVar.isEmpty())
312       myNbSegPerEdge->setValue( data.myNbSegPerEdge );
313     else
314       myNbSegPerEdge->setText( data.myNbSegPerEdgeVar );
315   }
316   if ( myNbSegPerRadius )
317   {
318     if(data.myNbSegPerRadiusVar.isEmpty())
319       myNbSegPerRadius->setValue( data.myNbSegPerRadius );
320     else
321       myNbSegPerRadius->setText( data.myNbSegPerRadiusVar );
322   }  
323   if (myAllowQuadrangles)
324     myAllowQuadrangles->setChecked( data.myAllowQuadrangles );
325
326   if (mySurfaceCurvature)
327     mySurfaceCurvature->setChecked( data.mySurfaceCurvature );
328
329   if (myFuseEdges)
330     myFuseEdges->setChecked( data.myFuseEdges );
331
332   // update widgets
333   ((NETGENPluginGUI_HypothesisCreator*) this )-> onSurfaceCurvatureChanged();
334
335   if ( myLocalSizeTable )
336   {
337     NETGENPluginGUI_HypothesisCreator* that = (NETGENPluginGUI_HypothesisCreator*)this;
338     QMapIterator<QString, QString> i(myLocalSizeMap);
339     GeomSelectionTools* geomSelectionTools = that->getGeomSelectionTools();
340     while (i.hasNext()) {
341       i.next();
342       const QString entry = i.key();
343       std::string shapeName = geomSelectionTools->getNameFromEntry(entry.toStdString());
344       const QString localSize = i.value();
345       int row = myLocalSizeTable->rowCount();
346       myLocalSizeTable->setRowCount(row+1);
347       myLocalSizeTable->setItem(row, LSZ_ENTRY_COLUMN, new QTableWidgetItem(entry));
348       myLocalSizeTable->item(row, LSZ_ENTRY_COLUMN)->setFlags(0);
349       myLocalSizeTable->setItem(row, LSZ_NAME_COLUMN, new QTableWidgetItem(QString::fromStdString(shapeName)));
350       myLocalSizeTable->item(row, LSZ_NAME_COLUMN)->setFlags(0);
351       myLocalSizeTable->setItem(row, LSZ_LOCALSIZE_COLUMN, new QTableWidgetItem(localSize));
352       myLocalSizeTable->item(row, LSZ_LOCALSIZE_COLUMN)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled);
353     }
354     myLocalSizeTable->resizeColumnToContents(LSZ_NAME_COLUMN);
355     myLocalSizeTable->resizeColumnToContents(LSZ_LOCALSIZE_COLUMN);
356   }
357 }
358
359 QString NETGENPluginGUI_HypothesisCreator::storeParams() const
360 {
361   NetgenHypothesisData data;
362   readParamsFromWidgets( data );
363   storeParamsToHypo( data );
364   
365   QString valStr = tr("NETGEN_MAX_SIZE") + " = " + QString::number( data.myMaxSize ) + "; ";
366   valStr += tr("NETGEN_MIN_SIZE") + " = " + QString::number( data.myMinSize ) + "; ";
367   if ( data.mySecondOrder )
368     valStr +=  tr("NETGEN_SECOND_ORDER") + "; ";
369   if ( data.myOptimize )
370     valStr +=  tr("NETGEN_OPTIMIZE") + "; ";
371   valStr += myFineness->currentText() + "(" +  QString::number( data.myGrowthRate )     + ", " +
372                                                QString::number( data.myNbSegPerEdge )   + ", " +
373                                                QString::number( data.myNbSegPerRadius ) + ")";
374
375   if ( myIs2D && data.myAllowQuadrangles )
376     valStr += "; " + tr("NETGEN_ALLOW_QUADRANGLES");
377   
378   if ( data.mySurfaceCurvature )
379     valStr += "; " + tr("NETGEN_SURFACE_CURVATURE");
380
381   if ( data.myFuseEdges )
382     valStr += "; " + tr("NETGEN_FUSE_EDGES");
383
384   return valStr;
385 }
386
387 bool NETGENPluginGUI_HypothesisCreator::readParamsFromHypo( NetgenHypothesisData& h_data ) const
388 {
389   NETGENPlugin::NETGENPlugin_Hypothesis_var h =
390     NETGENPlugin::NETGENPlugin_Hypothesis::_narrow( initParamsHypothesis() );
391
392   HypothesisData* data = SMESH::GetHypothesisData( hypType() );
393   h_data.myName = isCreation() && data ? data->Label : "";
394
395   h_data.myMaxSize = h->GetMaxSize();
396   h_data.myMaxSizeVar = getVariableName("SetMaxSize");
397   h_data.mySecondOrder = h->GetSecondOrder();
398   h_data.myOptimize = h->GetOptimize();
399
400   h_data.myFineness = (int) h->GetFineness();
401   h_data.myGrowthRate = h->GetGrowthRate();
402   h_data.myGrowthRateVar = getVariableName("SetGrowthRate");
403   h_data.myNbSegPerEdge = h->GetNbSegPerEdge();
404   h_data.myNbSegPerEdgeVar  = getVariableName("SetNbSegPerEdge");
405   h_data.myNbSegPerRadius = h->GetNbSegPerRadius();
406   h_data.myNbSegPerRadiusVar = getVariableName("SetNbSegPerRadius");
407   h_data.myMinSize = h->GetMinSize();
408   h_data.myMinSizeVar = getVariableName("SetMinSize");
409   h_data.mySurfaceCurvature = h->GetUseSurfaceCurvature();
410   h_data.myFuseEdges = h->GetFuseEdges();
411
412   //if ( myIs2D )
413     {
414       NETGENPlugin::NETGENPlugin_Hypothesis_var h =
415         NETGENPlugin::NETGENPlugin_Hypothesis::_narrow( initParamsHypothesis() );
416
417       if ( !h->_is_nil() )
418         h_data.myAllowQuadrangles = h->GetQuadAllowed();
419     }
420   
421   NETGENPluginGUI_HypothesisCreator* that = (NETGENPluginGUI_HypothesisCreator*)this;
422   NETGENPlugin::string_array_var myEntries = h->GetLocalSizeEntries();
423   for ( int i=0 ; i<myEntries->length() ; i++ )
424     {
425       QString entry = myEntries[i].in();
426       double val = h->GetLocalSizeOnEntry(entry.toStdString().c_str());
427       std::ostringstream tmp;
428       tmp << val;
429       QString valstring = QString::fromStdString(tmp.str());
430       if (myLocalSizeMap.contains(entry))
431         {
432           if (myLocalSizeMap[entry] == "__TO_DELETE__")
433             {
434               continue;
435             }
436         }
437       that->myLocalSizeMap[entry] = valstring;
438     }
439
440   return true;
441 }
442
443 bool NETGENPluginGUI_HypothesisCreator::storeParamsToHypo( const NetgenHypothesisData& h_data ) const
444 {
445   NETGENPlugin::NETGENPlugin_Hypothesis_var h =
446     NETGENPlugin::NETGENPlugin_Hypothesis::_narrow( hypothesis() );
447
448   bool ok = true;
449   try
450   {
451     if( isCreation() )
452       SMESH::SetName( SMESH::FindSObject( h ), h_data.myName.toLatin1().data() );
453     h->SetVarParameter( h_data.myMaxSizeVar.toLatin1().constData(), "SetMaxSize");
454     h->SetMaxSize     ( h_data.myMaxSize );
455     h->SetSecondOrder ( h_data.mySecondOrder );
456     h->SetOptimize    ( h_data.myOptimize );
457     int fineness = h_data.myFineness;
458     h->SetFineness    ( fineness );
459
460     if( fineness==UserDefined )
461       {
462         h->SetVarParameter  ( h_data.myGrowthRateVar.toLatin1().constData(), "SetGrowthRate");
463         h->SetGrowthRate    ( h_data.myGrowthRate );
464         h->SetVarParameter  ( h_data.myNbSegPerEdgeVar.toLatin1().constData(), "SetNbSegPerEdge");
465         h->SetNbSegPerEdge  ( h_data.myNbSegPerEdge );
466         h->SetVarParameter  ( h_data.myNbSegPerRadiusVar.toLatin1().constData(), "SetNbSegPerRadius");
467         h->SetNbSegPerRadius( h_data.myNbSegPerRadius );
468       }
469     h->SetVarParameter       ( h_data.myMinSizeVar.toLatin1().constData(), "SetMinSize");
470     h->SetMinSize            ( h_data.myMinSize );
471     h->SetUseSurfaceCurvature( h_data.mySurfaceCurvature );
472     h->SetFuseEdges          ( h_data.myFuseEdges );
473     
474     //if ( myIs2D )
475       {
476         // NETGENPlugin::NETGENPlugin_Hypothesis_2D_var h_2d =
477         //   NETGENPlugin::NETGENPlugin_Hypothesis_2D::_narrow( h );
478         
479         // if ( !h_2d->_is_nil() )
480         //   h_2d->SetQuadAllowed( h_data.myAllowQuadrangles );
481         h->SetQuadAllowed( h_data.myAllowQuadrangles );
482       }
483
484     QMapIterator<QString,QString> i(myLocalSizeMap);
485     while (i.hasNext()) {
486       i.next();
487       const QString entry = i.key();
488       const QString localSize = i.value();
489       if (localSize == "__TO_DELETE__")
490         {
491           h->UnsetLocalSizeOnEntry(entry.toLatin1().constData());
492         }
493       else
494         {
495           std::istringstream tmp(localSize.toLatin1().constData());
496           double val;
497           tmp >> val;
498           h->SetLocalSizeOnEntry(entry.toLatin1().constData(), val);
499         }
500     }
501   }
502   catch(const SALOME::SALOME_Exception& ex)
503   {
504     SalomeApp_Tools::QtCatchCorbaException(ex);
505     ok = false;
506   }
507   return ok;
508 }
509
510 bool NETGENPluginGUI_HypothesisCreator::readParamsFromWidgets( NetgenHypothesisData& h_data ) const
511 {
512   h_data.myName           = myName ? myName->text() : "";
513   h_data.myMaxSize        = myMaxSize->value();
514   h_data.myMaxSizeVar     = myMaxSize->text();
515   h_data.myMinSize        = myMinSize->value();
516   h_data.myMinSizeVar     = myMinSize->text();
517   if ( mySecondOrder )
518     h_data.mySecondOrder  = mySecondOrder->isChecked();
519   if ( myOptimize )
520     h_data.myOptimize     = myOptimize->isChecked();
521   h_data.myFineness       = myFineness->currentIndex();
522   h_data.myGrowthRate     = myGrowthRate->value();
523   if ( myNbSegPerEdge )
524     h_data.myNbSegPerEdge = myNbSegPerEdge->value();
525   if ( myNbSegPerRadius )
526     h_data.myNbSegPerRadius = myNbSegPerRadius->value();
527
528   h_data.myGrowthRateVar  = myGrowthRate->text();
529   if ( myNbSegPerEdge )
530     h_data.myNbSegPerEdgeVar = myNbSegPerEdge->text();
531   if ( myNbSegPerRadius )
532     h_data.myNbSegPerRadiusVar = myNbSegPerRadius->text();
533
534   
535   if ( myAllowQuadrangles )
536     h_data.myAllowQuadrangles = myAllowQuadrangles->isChecked();
537
538   if ( mySurfaceCurvature )
539     h_data.mySurfaceCurvature = mySurfaceCurvature->isChecked();
540
541   if ( myFuseEdges )
542     h_data.myFuseEdges = myFuseEdges->isChecked();
543
544   if ( myLocalSizeTable )
545   {
546     NETGENPluginGUI_HypothesisCreator* that = (NETGENPluginGUI_HypothesisCreator*)this;
547     int nbRows = myLocalSizeTable->rowCount();
548     for(int row=0 ; row < nbRows ; row++)
549     {
550       QString entry = myLocalSizeTable->item(row, LSZ_ENTRY_COLUMN)->text();
551       QString localSize = myLocalSizeTable->item(row, LSZ_LOCALSIZE_COLUMN)->text().trimmed();
552       that->myLocalSizeMap[entry] = localSize;
553     }
554   }
555   return true;
556 }
557
558 void NETGENPluginGUI_HypothesisCreator::onSurfaceCurvatureChanged()
559 {
560   bool isSurfaceCurvature = (mySurfaceCurvature ? mySurfaceCurvature->isChecked() : true);
561   bool isCustom           = (myFineness->currentIndex() == UserDefined);
562   //myFineness->setEnabled(isSurfaceCurvature);
563   myGrowthRate->setEnabled(isCustom);
564   if ( myNbSegPerEdge )
565     myNbSegPerEdge->setEnabled(isCustom && isSurfaceCurvature);
566   if ( myNbSegPerRadius )
567     myNbSegPerRadius->setEnabled(isCustom && isSurfaceCurvature);
568 }
569
570 void NETGENPluginGUI_HypothesisCreator::onFinenessChanged()
571 {
572   bool isCustom = (myFineness->currentIndex() == UserDefined);
573   
574   myGrowthRate->setEnabled(isCustom);
575   if ( myNbSegPerEdge )
576     myNbSegPerEdge->setEnabled(isCustom);
577   if ( myNbSegPerRadius )
578     myNbSegPerRadius->setEnabled(isCustom);
579
580   if (!isCustom)
581     {
582       double aGrowthRate, aNbSegPerEdge, aNbSegPerRadius;
583       
584       switch ( myFineness->currentIndex() )
585         {
586         case VeryCoarse:
587           aGrowthRate = 0.7;
588           aNbSegPerEdge = 0.3;
589           aNbSegPerRadius = 1;
590           break;
591         case Coarse:
592           aGrowthRate = 0.5;
593           aNbSegPerEdge = 0.5;
594           aNbSegPerRadius = 1.5;
595           break;
596         case Fine:
597           aGrowthRate = 0.2;
598           aNbSegPerEdge = 2;
599           aNbSegPerRadius = 3;
600           break;
601         case VeryFine:
602           aGrowthRate = 0.1;
603           aNbSegPerEdge = 3;
604           aNbSegPerRadius = 5;
605           break;
606         case Moderate:
607         default:
608           aGrowthRate = 0.3;
609           aNbSegPerEdge = 1;
610           aNbSegPerRadius = 2;
611           break;
612         }
613       
614       myGrowthRate->setValue( aGrowthRate );
615       if ( myNbSegPerEdge )
616         myNbSegPerEdge->setValue( aNbSegPerEdge );
617       if ( myNbSegPerRadius )
618         myNbSegPerRadius->setValue( aNbSegPerRadius );
619     }
620 }
621
622 void NETGENPluginGUI_HypothesisCreator::onAddLocalSizeOnVertex()
623 {
624   addLocalSizeOnShape(TopAbs_VERTEX);
625 }
626
627 void NETGENPluginGUI_HypothesisCreator::onAddLocalSizeOnEdge()
628 {
629   addLocalSizeOnShape(TopAbs_EDGE);
630 }
631
632 void NETGENPluginGUI_HypothesisCreator::onAddLocalSizeOnFace()
633 {
634   addLocalSizeOnShape(TopAbs_FACE);
635 }
636
637 void NETGENPluginGUI_HypothesisCreator::addLocalSizeOnShape(TopAbs_ShapeEnum typeShapeAsked)
638 {
639   NETGENPlugin::NETGENPlugin_Hypothesis_var h = NETGENPlugin::NETGENPlugin_Hypothesis::_narrow(initParamsHypothesis());
640   GeomSelectionTools* geomSelectionTools = getGeomSelectionTools();
641   LightApp_SelectionMgr* mySel = geomSelectionTools->selectionMgr();
642   SALOME_ListIO ListSelectedObjects;
643   mySel->selectedObjects(ListSelectedObjects, NULL, false );
644   SALOME_ListIteratorOfListIO Object_It(ListSelectedObjects);
645   for (Object_It ; Object_It.More() ; Object_It.Next())
646     {
647       Handle(SALOME_InteractiveObject) anObject = Object_It.Value();
648       std::string entry, shapeName;
649       entry = geomSelectionTools->getEntryOfObject(anObject);
650       shapeName = anObject->getName();
651       TopAbs_ShapeEnum shapeType;
652       shapeType = geomSelectionTools->entryToShapeType(entry);
653       if (shapeType == TopAbs_SHAPE)
654         {
655           // E.A. if shapeType == TopAbs_SHAPE, it is NOT a TopoDS_Shape !!!
656           continue;
657         }
658       // --
659       if(shapeType != typeShapeAsked)
660         {
661           continue;
662         }
663       // --
664       myLocalSizeTable->setFocus();
665       QString shapeEntry;
666       shapeEntry = QString::fromStdString(entry);
667       if (myLocalSizeMap.contains(shapeEntry))
668         {
669           if (myLocalSizeMap[shapeEntry] != "__TO_DELETE__")
670             {
671               continue;
672             }
673         }
674       double phySize = h->GetMaxSize();
675       std::ostringstream oss;
676       oss << phySize;
677       QString localSize;
678       localSize  = QString::fromStdString(oss.str());
679       // --
680       int row = myLocalSizeTable->rowCount() ;
681       myLocalSizeTable->setRowCount(row+1);
682       myLocalSizeTable->setItem(row, LSZ_ENTRY_COLUMN, new QTableWidgetItem(shapeEntry));
683       myLocalSizeTable->item(row, LSZ_ENTRY_COLUMN )->setFlags(0);
684       myLocalSizeTable->setItem(row, LSZ_NAME_COLUMN, new QTableWidgetItem(QString::fromStdString(shapeName)));
685       myLocalSizeTable->item(row, LSZ_NAME_COLUMN )->setFlags(0);
686       myLocalSizeTable->setItem(row, LSZ_LOCALSIZE_COLUMN, new QTableWidgetItem(localSize));
687       myLocalSizeTable->item(row, LSZ_LOCALSIZE_COLUMN )->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled);
688       myLocalSizeTable->resizeColumnToContents(LSZ_NAME_COLUMN);
689       myLocalSizeTable->resizeColumnToContents(LSZ_LOCALSIZE_COLUMN);
690       myLocalSizeTable->clearSelection();
691       myLocalSizeTable->scrollToItem( myLocalSizeTable->item( row, LSZ_LOCALSIZE_COLUMN ) );
692       // --
693     }
694 }
695
696 void NETGENPluginGUI_HypothesisCreator::onRemoveLocalSizeOnShape()
697 {
698   QList<int> selectedRows;
699   QList<QTableWidgetItem*> selected = myLocalSizeTable->selectedItems();
700   QTableWidgetItem* item;
701   int row;
702   foreach(item, selected) {
703     row = item->row();
704     if (!selectedRows.contains(row))
705       selectedRows.append( row );
706   }
707   qSort( selectedRows );
708   QListIterator<int> it( selectedRows );
709   it.toBack();
710   while (it.hasPrevious())
711     {
712       row = it.previous();
713       QString entry = myLocalSizeTable->item(row,LSZ_ENTRY_COLUMN)->text();
714       if (myLocalSizeMap.contains(entry))
715         {
716           myLocalSizeMap[entry] = "__TO_DELETE__";
717         }
718       myLocalSizeTable->removeRow(row );
719     }
720   myLocalSizeTable->resizeColumnToContents(LSZ_NAME_COLUMN);
721   myLocalSizeTable->resizeColumnToContents(LSZ_LOCALSIZE_COLUMN);
722 }
723
724 void NETGENPluginGUI_HypothesisCreator::onSetLocalSize(int row,int col)
725 {
726   if (col == LSZ_LOCALSIZE_COLUMN) {
727     QString entry = myLocalSizeTable->item(row, LSZ_ENTRY_COLUMN)->text();
728     QString localSize = myLocalSizeTable->item(row, LSZ_LOCALSIZE_COLUMN)->text().trimmed();
729     myLocalSizeMap[entry] = localSize;
730     myLocalSizeTable->resizeColumnToContents(LSZ_LOCALSIZE_COLUMN);
731   }
732 }
733
734 GeomSelectionTools* NETGENPluginGUI_HypothesisCreator::getGeomSelectionTools()
735 {
736   _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
737   if (myGeomSelectionTools == NULL || myGeomSelectionTools->getMyStudy() != aStudy) {
738     delete myGeomSelectionTools;
739     myGeomSelectionTools = new GeomSelectionTools(aStudy);
740   }
741   return myGeomSelectionTools;
742 }
743
744 QString NETGENPluginGUI_HypothesisCreator::caption() const
745 {
746   return tr( QString( "NETGEN_%1_TITLE" ).arg(myIs2D?QString("2D"):QString("3D")).toLatin1().data() );
747 }
748
749 QPixmap NETGENPluginGUI_HypothesisCreator::icon() const
750 {
751   QString hypIconName = tr( QString("ICON_DLG_NETGEN_PARAMETERS%1").arg(myIs2D?QString("_2D"):QString("")).toLatin1().data() );
752   return SUIT_Session::session()->resourceMgr()->loadPixmap( "NETGENPlugin", hypIconName );
753 }
754
755 QString NETGENPluginGUI_HypothesisCreator::type() const
756 {
757   return tr( QString( "NETGEN_%1_HYPOTHESIS" ).arg(myIs2D?QString("2D"):QString("3D")).toLatin1().data() );
758 }
759
760 QString NETGENPluginGUI_HypothesisCreator::helpPage() const
761 {
762   return "netgen_2d_3d_hypo_page.html";
763 }