Salome HOME
Join modifications from branch OCC_debug_for_3_2_0b1
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_CreatePatternDlg.cxx
1 //  SMESH SMESHGUI : GUI for SMESH component\r
2 //\r
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,\r
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS\r
5 //\r
6 //  This library is free software; you can redistribute it and/or\r
7 //  modify it under the terms of the GNU Lesser General Public\r
8 //  License as published by the Free Software Foundation; either\r
9 //  version 2.1 of the License.\r
10 //\r
11 //  This library is distributed in the hope that it will be useful,\r
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
14 //  Lesser General Public License for more details.\r
15 //\r
16 //  You should have received a copy of the GNU Lesser General Public\r
17 //  License along with this library; if not, write to the Free Software\r
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA\r
19 //\r
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org\r
21 //\r
22 //\r
23 //\r
24 //  File   : SMESHGUI_CreatePatternDlg.cxx\r
25 //  Author : Sergey LITONIN\r
26 //  Module : SMESH\r
27 \r
28 #include "SMESHGUI_CreatePatternDlg.h"\r
29 \r
30 #include "SMESHGUI.h"\r
31 #include "SMESHGUI_SpinBox.h"\r
32 #include "SMESHGUI_PatternWidget.h"\r
33 #include "SMESHGUI_Utils.h"\r
34 #include "SMESHGUI_VTKUtils.h"\r
35 #include "SMESHGUI_PatternUtils.h"\r
36 #include "SMESHGUI_GEOMGenUtils.h"\r
37 \r
38 #include "SMESH_NumberFilter.hxx"\r
39 \r
40 #include "SUIT_ResourceMgr.h"\r
41 #include "SUIT_Desktop.h"\r
42 #include "SUIT_FileDlg.h"\r
43 #include "SUIT_Session.h"\r
44 #include "SUIT_MessageBox.h"\r
45 \r
46 #include "SalomeApp_Study.h"\r
47 #include "LightApp_Application.h"\r
48 #include "LightApp_DataOwner.h"\r
49 #include "LightApp_SelectionMgr.h"\r
50 #include "SalomeApp_Tools.h"\r
51 \r
52 #include "SALOMEDS_SObject.hxx"\r
53 \r
54 #include "SALOME_ListIO.hxx"\r
55 #include "SVTK_ViewModel.h"\r
56 #include "SVTK_ViewWindow.h"\r
57 #include "SVTK_Selector.h"\r
58 #include "SVTK_Selection.h"\r
59 \r
60 // OCCT Includes\r
61 #include <TColStd_MapOfInteger.hxx>\r
62 \r
63 // QT Includes\r
64 #include <qframe.h>\r
65 #include <qlayout.h>\r
66 #include <qlineedit.h>\r
67 #include <qpushbutton.h>\r
68 #include <qgroupbox.h>\r
69 #include <qlabel.h>\r
70 #include <qradiobutton.h>\r
71 #include <qcheckbox.h>\r
72 #include <qbuttongroup.h>\r
73 #include <qmessagebox.h>\r
74 #include <qapplication.h>\r
75 \r
76 #define SPACING 5\r
77 #define MARGIN  10\r
78 \r
79 /*!\r
80  *  Class       : SMESHGUI_CreatePatternDlg\r
81  *  Description : Dialog to specify filters for VTK viewer\r
82  */\r
83 \r
84 //=======================================================================\r
85 // function : SMESHGUI_CreatePatternDlg()\r
86 // purpose  : Constructor\r
87 //=======================================================================\r
88 SMESHGUI_CreatePatternDlg::SMESHGUI_CreatePatternDlg( SMESHGUI*   theModule,\r
89                                                       const int   theType,\r
90                                                       const char* theName)\r
91      : QDialog( SMESH::GetDesktop( theModule ), theName, false,\r
92                 WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu),\r
93      mySMESHGUI( theModule ),\r
94      mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )\r
95 {\r
96   setCaption(tr("CAPTION"));\r
97 \r
98   QVBoxLayout* aDlgLay = new QVBoxLayout (this, MARGIN, SPACING);\r
99 \r
100   QFrame* aMainFrame = createMainFrame  (this);\r
101   QFrame* aBtnFrame  = createButtonFrame(this);\r
102 \r
103   aDlgLay->addWidget(aMainFrame);\r
104   aDlgLay->addWidget(aBtnFrame);\r
105 \r
106   aDlgLay->setStretchFactor(aMainFrame, 1);\r
107 \r
108   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))\r
109     mySelector = aViewWindow->GetSelector();\r
110 \r
111   myHelpFileName = "pattern_mapping.htm";\r
112 \r
113   Init(theType);\r
114 }\r
115 \r
116 //=======================================================================\r
117 // function : createMainFrame()\r
118 // purpose  : Create frame containing dialog's input fields\r
119 //=======================================================================\r
120 QFrame* SMESHGUI_CreatePatternDlg::createMainFrame (QWidget* theParent)\r
121 {\r
122   QPixmap iconSlct     (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));\r
123   QPixmap icon2d       (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_PATTERN_2d")));\r
124   QPixmap icon3d       (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_PATTERN_3d")));\r
125   QPixmap iconSample2d (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_PATTERN_SAMPLE_2D")));\r
126 \r
127   QGroupBox* aMainGrp = new QGroupBox(1, Qt::Horizontal, theParent);\r
128   aMainGrp->setFrameStyle(QFrame::NoFrame);\r
129   aMainGrp->setInsideMargin(0);\r
130 \r
131   // Pattern type group\r
132 \r
133   myTypeGrp = new QButtonGroup (1, Qt::Vertical, tr("PATTERN_TYPE"), aMainGrp);\r
134   mySwitch2d = new QRadioButton (myTypeGrp);\r
135   mySwitch3d = new QRadioButton (myTypeGrp);\r
136   mySwitch2d->setPixmap(icon2d);\r
137   mySwitch3d->setPixmap(icon3d);\r
138   myTypeGrp->insert(mySwitch2d, Type_2d);\r
139   myTypeGrp->insert(mySwitch3d, Type_3d);\r
140 \r
141   QGroupBox* aPatternGrp = new QGroupBox(1, Qt::Horizontal, tr("PATTERN"), aMainGrp);\r
142 \r
143   // Mesh and pattern name group\r
144 \r
145   QGroupBox* aMeshGrp = new QGroupBox(1, Qt::Vertical, aPatternGrp);\r
146   aMeshGrp->setFrameStyle(QFrame::NoFrame);\r
147   aMeshGrp->setInsideMargin(0);\r
148 \r
149   new QLabel(tr("MESH_OR_SUBMESH"), aMeshGrp);\r
150 \r
151   QPushButton* aSelBtn = new QPushButton(aMeshGrp);\r
152   aSelBtn->setPixmap(iconSlct);\r
153   myMeshEdit = new QLineEdit(aMeshGrp);\r
154   myMeshEdit->setReadOnly(true);\r
155 \r
156   QGroupBox* aPattGrp = new QGroupBox(1, Qt::Vertical, aPatternGrp);\r
157   aPattGrp->setFrameStyle(QFrame::NoFrame);\r
158   aPattGrp->setInsideMargin(0);\r
159 \r
160   new QLabel(tr("PATTERN_NAME"), aPattGrp);\r
161   myName = new QLineEdit(aPattGrp);\r
162 \r
163   // Picture 2d\r
164 \r
165   myPicture2d = new SMESHGUI_PatternWidget(aPatternGrp),\r
166   myPicture2d->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));\r
167 \r
168   // Project check box\r
169 \r
170   myProjectChk = new QCheckBox(tr("PROJECT"), aPatternGrp);\r
171 \r
172   // Connect signals and slots\r
173 \r
174   connect(myTypeGrp,    SIGNAL(clicked(int) ), SLOT(onTypeChanged(int)));\r
175   connect(myProjectChk, SIGNAL(toggled(bool)), SLOT(onProject(bool)   ));\r
176   connect(aSelBtn,      SIGNAL(clicked()      ), SLOT(onSelBtnClicked()));\r
177 \r
178   return aMainGrp;\r
179 }\r
180 \r
181 //=======================================================================\r
182 // function : createButtonFrame()\r
183 // purpose  : Create frame containing buttons\r
184 //=======================================================================\r
185 QFrame* SMESHGUI_CreatePatternDlg::createButtonFrame (QWidget* theParent)\r
186 {\r
187   QFrame* aFrame = new QFrame(theParent);\r
188   aFrame->setFrameStyle(QFrame::Box | QFrame::Sunken);\r
189 \r
190   myOkBtn    = new QPushButton(tr("SMESH_BUT_OK"    ), aFrame);\r
191   mySaveBtn  = new QPushButton(tr("SAVE"            ), aFrame);\r
192   myCloseBtn = new QPushButton(tr("SMESH_BUT_CANCEL"), aFrame);\r
193   myHelpBtn = new QPushButton(tr("SMESH_BUT_HELP"), aFrame);\r
194 \r
195   QSpacerItem* aSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);\r
196 \r
197   QHBoxLayout* aLay = new QHBoxLayout(aFrame, MARGIN, SPACING);\r
198 \r
199   aLay->addWidget(myOkBtn);\r
200   aLay->addWidget(mySaveBtn);\r
201   aLay->addItem(aSpacer);\r
202   aLay->addWidget(myCloseBtn);\r
203   aLay->addWidget(myHelpBtn);\r
204 \r
205   connect(myOkBtn,    SIGNAL(clicked()), SLOT(onOk()));\r
206   connect(myCloseBtn, SIGNAL(clicked()), SLOT(onClose()));\r
207   connect(mySaveBtn, SIGNAL(clicked()), SLOT(onSave()));\r
208   connect(myHelpBtn, SIGNAL(clicked()), SLOT(onHelp()));\r
209 \r
210   return aFrame;\r
211 }\r
212 \r
213 //=======================================================================\r
214 // function : ~SMESHGUI_CreatePatternDlg()\r
215 // purpose  : Destructor\r
216 //=======================================================================\r
217 SMESHGUI_CreatePatternDlg::~SMESHGUI_CreatePatternDlg()\r
218 {\r
219   // no need to delete child widgets, Qt does it all for us\r
220 }\r
221 \r
222 //=======================================================================\r
223 // function : onProject()\r
224 // purpose  : SLOT. Called when state of "Project nodes on ther face"\r
225 //            checkbox is changed\r
226 //=======================================================================\r
227 void SMESHGUI_CreatePatternDlg::onProject (bool)\r
228 {\r
229   loadFromObject(false);\r
230   displayPreview();\r
231 }\r
232 \r
233 //=======================================================================\r
234 // function : Init()\r
235 // purpose  : Init dialog fields, connect signals and slots, show dialog\r
236 //=======================================================================\r
237 void SMESHGUI_CreatePatternDlg::Init( const int theType )\r
238 {\r
239   myIsLoaded     = false;\r
240   myType         = -1;\r
241   myNbPoints     = -1;\r
242   mySubMesh      = SMESH::SMESH_subMesh::_nil();\r
243   myMesh         = SMESH::SMESH_Mesh::_nil();\r
244   myGeomObj      = GEOM::GEOM_Object::_nil();\r
245   myPattern      = SMESH::SMESH_Pattern::_nil();\r
246 \r
247   erasePreview();\r
248 \r
249   mySMESHGUI->SetActiveDialogBox((QDialog*)this);\r
250 \r
251   // selection and SMESHGUI\r
252   connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));\r
253   connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate()));\r
254   connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose()));\r
255 \r
256   mySwitch2d->setEnabled(theType == Type_2d);\r
257   mySwitch3d->setEnabled(theType == Type_3d);\r
258 \r
259   if (theType == Type_2d)\r
260     myProjectChk->show();\r
261   else\r
262     myProjectChk->hide();\r
263 \r
264   myTypeGrp->setButton(theType);\r
265   onTypeChanged(theType);\r
266 \r
267   myName->setText(getDefaultName());\r
268   myMeshEdit->setText("");\r
269 \r
270   setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding));\r
271   qApp->processEvents();\r
272   updateGeometry();\r
273   myPicture2d->updateGeometry();\r
274   adjustSize();\r
275   resize(minimumSize());\r
276 \r
277   activateSelection();\r
278   onSelectionDone();\r
279 \r
280   this->show();\r
281 }\r
282 \r
283 //=======================================================================\r
284 // function : SetMesh()\r
285 // purpose  : Set mesh to dialog\r
286 //=======================================================================\r
287 void SMESHGUI_CreatePatternDlg::SetMesh (SMESH::SMESH_Mesh_ptr thePtr)\r
288 {\r
289   myMesh = SMESH::SMESH_Mesh::_duplicate(thePtr);\r
290   mySubMesh = SMESH::SMESH_subMesh::_nil();\r
291 \r
292   bool isValidMesh = false;\r
293   if (!myMesh->_is_nil())\r
294   {\r
295     _PTR(SObject) aSobj = SMESH::FindSObject(myMesh.in());\r
296     //Handle(SALOME_InteractiveObject) anIObj =\r
297     //  new SALOME_InteractiveObject(aSobj->GetID().c_str(), "SMESH");\r
298     SUIT_DataOwnerPtr anIObj (new LightApp_DataOwner(aSobj->GetID().c_str()));\r
299 \r
300     isValidMesh = mySelectionMgr->isOk(anIObj);\r
301   }\r
302 \r
303   if (isValidMesh) {\r
304     _PTR(SObject) aSO = SMESH::FindSObject(myMesh.in());\r
305     myMeshEdit->setText(aSO->GetName().c_str());\r
306     myGeomObj = SMESH::GetGeom(aSO);\r
307   } else {\r
308     myMeshEdit->setText("");\r
309     myGeomObj = GEOM::GEOM_Object::_nil();\r
310   }\r
311 \r
312   if (myType == Type_2d) {\r
313     loadFromObject(false);\r
314     displayPreview();\r
315   }\r
316 }\r
317 \r
318 //=======================================================================\r
319 // function : isValid()\r
320 // purpose  : Verify validity of entry data\r
321 //=======================================================================\r
322 bool SMESHGUI_CreatePatternDlg::isValid()\r
323 {\r
324   if (myGeomObj->_is_nil()) {\r
325     QMessageBox::information(SMESH::GetDesktop( mySMESHGUI ),\r
326                              tr("SMESH_INSUFFICIENT_DATA"),\r
327                              tr("SMESHGUI_INVALID_PARAMETERS"),\r
328                              QMessageBox::Ok);\r
329     return false;\r
330   }\r
331   else\r
332     return true;\r
333 }\r
334 \r
335 //=======================================================================\r
336 // function : getDefaultName()\r
337 // purpose  : Get default pattern name\r
338 //=======================================================================\r
339 QString SMESHGUI_CreatePatternDlg::getDefaultName() const\r
340 {\r
341   return myType == Type_2d ? tr("DEFAULT_2D") : tr("DEFAULT_3D");\r
342 }\r
343 \r
344 //=======================================================================\r
345 // function : onSave()\r
346 // purpose  : SLOT called when "Save" button pressed. Build pattern and\r
347 //           save it to disk\r
348 //=======================================================================\r
349 void SMESHGUI_CreatePatternDlg::onSave()\r
350 {\r
351   try {\r
352     if (!isValid())\r
353       return;\r
354 \r
355     if (!myIsLoaded)\r
356       loadFromObject(true);\r
357 \r
358     // Load pattern from object\r
359     if (!myIsLoaded)\r
360       return;\r
361 \r
362     ///////////////////////////////////////////////////////\r
363     SUIT_FileDlg* aDlg = new SUIT_FileDlg (this, false);\r
364     aDlg->setCaption(tr("SAVE_PATTERN"));\r
365     aDlg->setMode(QFileDialog::AnyFile);\r
366     aDlg->setFilters(tr("PATTERN_FILT"));\r
367     if (myName->text() != "")\r
368       aDlg->setSelection(myName->text());\r
369 \r
370     if (aDlg->exec() != Accepted)\r
371       return;\r
372 \r
373     QString fName = aDlg->selectedFile();\r
374     if (fName.isEmpty())\r
375       return;\r
376 \r
377     if (QFileInfo(fName).extension().isEmpty())\r
378       fName = autoExtension(fName);\r
379 \r
380     fName = QDir::convertSeparators(fName);\r
381 \r
382     QString aData (myPattern->GetString());\r
383     long aLen = aData.length();\r
384 \r
385     QFile aFile (fName);\r
386     aFile.open(IO_WriteOnly);\r
387     long aWritten = aFile.writeBlock(aData, aLen);\r
388     aFile.close();\r
389 \r
390     if (aWritten != aLen) {\r
391       QMessageBox::information(SMESH::GetDesktop( mySMESHGUI ), tr("SMESH_ERROR"),\r
392                                tr("ERROR_OF_SAVING"), QMessageBox::Ok);\r
393     } else {\r
394       //SUIT_Application::getDesktop()->setSelectionModes(ActorSelection);\r
395       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))\r
396         aViewWindow->SetSelectionMode(ActorSelection);\r
397       disconnect(mySelectionMgr, 0, this, 0);\r
398       disconnect(mySMESHGUI, 0, this, 0);\r
399       mySMESHGUI->ResetState();\r
400       accept();\r
401       emit NewPattern();\r
402     }\r
403   } catch (const SALOME::SALOME_Exception& S_ex) {\r
404     SalomeApp_Tools::QtCatchCorbaException(S_ex);\r
405   } catch (...) {\r
406   }\r
407 }\r
408 \r
409 //=======================================================================\r
410 // function : GetPatternName()\r
411 // purpose  : Get name of pattern\r
412 //=======================================================================\r
413 QString SMESHGUI_CreatePatternDlg::GetPatternName() const\r
414 {\r
415   return myName->text();\r
416 }\r
417 \r
418 //=======================================================================\r
419 // function : GetPattern()\r
420 // purpose  : Get result pattern\r
421 //=======================================================================\r
422 SMESH::SMESH_Pattern_ptr SMESHGUI_CreatePatternDlg::GetPattern()\r
423 {\r
424   return myPattern.in();\r
425 }\r
426 \r
427 //=======================================================================\r
428 // function : onOk()\r
429 // purpose  : SLOT called when "Ok" button pressed.\r
430 //=======================================================================\r
431 void SMESHGUI_CreatePatternDlg::onOk()\r
432 {\r
433   try {\r
434     if (!isValid())\r
435       return;\r
436 \r
437     if (!myIsLoaded)\r
438       loadFromObject(true);\r
439 \r
440     // Load pattern from object\r
441     if (!myIsLoaded) {\r
442       return;\r
443     } else {\r
444       //SUIT_Application::getDesktop()->setSelectionModes(ActorSelection);\r
445       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))\r
446         aViewWindow->SetSelectionMode(ActorSelection);\r
447       disconnect(mySelectionMgr, 0, this, 0);\r
448       disconnect(mySMESHGUI, 0, this, 0);\r
449       mySMESHGUI->ResetState();\r
450       accept();\r
451       emit NewPattern();\r
452     }\r
453   } catch (const SALOME::SALOME_Exception& S_ex) {\r
454     SalomeApp_Tools::QtCatchCorbaException(S_ex);\r
455   } catch (...) {\r
456   }\r
457 }\r
458 \r
459 //=======================================================================\r
460 // function : onClose()\r
461 // purpose  : SLOT called when "Close" button pressed. Close dialog\r
462 //=======================================================================\r
463 void SMESHGUI_CreatePatternDlg::onClose()\r
464 {\r
465   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))\r
466     aViewWindow->SetSelectionMode(ActorSelection);\r
467   disconnect(mySelectionMgr, 0, this, 0);\r
468   disconnect(mySMESHGUI, 0, this, 0);\r
469   mySMESHGUI->ResetState();\r
470   reject();\r
471   emit Close();\r
472 }\r
473 \r
474 //=================================================================================\r
475 // function : onHelp()\r
476 // purpose  :\r
477 //=================================================================================\r
478 void SMESHGUI_CreatePatternDlg::onHelp()\r
479 {\r
480   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());\r
481   if (app) \r
482     app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);\r
483   else {\r
484     SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),\r
485                            QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").\r
486                            arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(myHelpFileName),\r
487                            QObject::tr("BUT_OK"));\r
488   }\r
489 }\r
490 \r
491 //=======================================================================\r
492 // function : loadFromObject()\r
493 // purpose  : Load pattern from geom object corresponding to the mesh/submesh\r
494 //=======================================================================\r
495 bool SMESHGUI_CreatePatternDlg::loadFromObject (const bool theMess)\r
496 {\r
497   try {\r
498     myIsLoaded = false;\r
499 \r
500     if (myPattern->_is_nil())\r
501       myPattern = SMESH::GetPattern();\r
502 \r
503     if (myMesh->_is_nil() && mySubMesh->_is_nil() || myGeomObj->_is_nil())\r
504       return false;\r
505 \r
506     SMESH::SMESH_Mesh_ptr aMesh = mySubMesh->_is_nil() ? myMesh.in() : mySubMesh->GetFather();\r
507 \r
508     myIsLoaded = myType == Type_2d\r
509       ? myPattern->LoadFromFace(aMesh, myGeomObj, myProjectChk->isChecked())\r
510       : myPattern->LoadFrom3DBlock(aMesh, myGeomObj);\r
511 \r
512     if (!myIsLoaded && theMess) {\r
513       QString aMess;\r
514       SMESH::SMESH_Pattern::ErrorCode aCode = myPattern->GetErrorCode();\r
515 \r
516       if      (aCode == SMESH::SMESH_Pattern::ERR_LOAD_EMPTY_SUBMESH  ) aMess = tr("ERR_LOAD_EMPTY_SUBMESH");\r
517       else if (aCode == SMESH::SMESH_Pattern::ERR_LOADF_NARROW_FACE   ) aMess = tr("ERR_LOADF_NARROW_FACE");\r
518       else if (aCode == SMESH::SMESH_Pattern::ERR_LOADF_CLOSED_FACE   ) aMess = tr("ERR_LOADF_CLOSED_FACE");\r
519       else if (aCode == SMESH::SMESH_Pattern::ERR_LOADF_CANT_PROJECT   ) aMess = tr("ERR_LOADF_CANT_PROJECT");\r
520       else if (aCode == SMESH::SMESH_Pattern::ERR_LOADV_BAD_SHAPE     ) aMess = tr("ERR_LOADV_BAD_SHAPE");\r
521       else if (aCode == SMESH::SMESH_Pattern::ERR_LOADV_COMPUTE_PARAMS) aMess = tr("ERR_LOADV_COMPUTE_PARAMS");\r
522       else                                                              aMess = tr("ERROR_OF_CREATION");\r
523 \r
524       QMessageBox::information(SMESH::GetDesktop( mySMESHGUI ),\r
525                                tr("SMESH_ERROR"), aMess, QMessageBox::Ok);\r
526     }\r
527   } catch (const SALOME::SALOME_Exception& S_ex) {\r
528     SalomeApp_Tools::QtCatchCorbaException(S_ex);\r
529   }\r
530 \r
531   return myIsLoaded;\r
532 }\r
533 \r
534 //=======================================================================\r
535 // function : onSelectionDone()\r
536 // purpose  : SLOT called when selection changed\r
537 //=======================================================================\r
538 void SMESHGUI_CreatePatternDlg::onSelectionDone()\r
539 {\r
540   try {\r
541     SALOME_ListIO aList;\r
542     mySelectionMgr->selectedObjects(aList, SVTK_Viewer::Type());\r
543     if (aList.Extent() != 1)\r
544       return;\r
545 \r
546     // Get mesh or sub-mesh from selection\r
547     Handle(SALOME_InteractiveObject) anIO = aList.First();\r
548     SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIO);\r
549     SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(anIO);\r
550     if (aMesh->_is_nil() && aSubMesh->_is_nil())\r
551       return;\r
552 \r
553     // Get geom object corresponding to the mesh\r
554     _PTR(SObject) aSO;\r
555     if (!aMesh->_is_nil())\r
556       aSO = SMESH::FindSObject(aMesh.in());\r
557     else\r
558       aSO = SMESH::FindSObject(aSubMesh.in());\r
559 \r
560     GEOM::GEOM_Object_var aGeomObj = SMESH::GetGeom(aSO);\r
561     if (aGeomObj->_is_nil())\r
562       return;\r
563 \r
564     myGeomObj = aGeomObj;\r
565 \r
566     // init class fields\r
567     if (!aMesh->_is_nil()) {\r
568       myMesh = aMesh;\r
569       mySubMesh = SMESH::SMESH_subMesh::_nil();\r
570     } else {\r
571       mySubMesh = aSubMesh;\r
572       myMesh = SMESH::SMESH_Mesh::_nil();\r
573     }\r
574 \r
575     QString aName;\r
576     SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aName);\r
577     myMeshEdit->setText(aName);\r
578 \r
579     if (myType == Type_2d) {\r
580       loadFromObject(true);\r
581       displayPreview();\r
582     }\r
583   } catch (...) {\r
584     myMesh = SMESH::SMESH_Mesh::_nil();\r
585     mySubMesh = SMESH::SMESH_subMesh::_nil();\r
586     myGeomObj = GEOM::GEOM_Object::_nil();\r
587     erasePreview();\r
588   }\r
589 }\r
590 \r
591 //=======================================================================\r
592 // function : onDeactivate()\r
593 // purpose  : SLOT called when dialog must be deativated\r
594 //=======================================================================\r
595 void SMESHGUI_CreatePatternDlg::onDeactivate()\r
596 {\r
597   disconnect(mySelectionMgr, 0, this, 0);\r
598   setEnabled(false);\r
599 }\r
600 \r
601 //=======================================================================\r
602 // function : enterEvent()\r
603 // purpose  : Event filter\r
604 //=======================================================================\r
605 void SMESHGUI_CreatePatternDlg::enterEvent (QEvent*)\r
606 {\r
607   // there is a stange problem that enterEvent() comes after onSave()\r
608   if ( isVisible () ) {\r
609     mySMESHGUI->EmitSignalDeactivateDialog();\r
610     setEnabled(true);\r
611     activateSelection();\r
612     connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));\r
613   }\r
614 }\r
615 \r
616 //=================================================================================\r
617 // function : closeEvent()\r
618 // purpose  : Close dialog box\r
619 //=================================================================================\r
620 void SMESHGUI_CreatePatternDlg::closeEvent (QCloseEvent*)\r
621 {\r
622   onClose();\r
623 }\r
624 \r
625 //=======================================================================\r
626 // function : onSelBtnClicked()\r
627 // purpose  : SLOT. Called when -> button clicked.\r
628 //=======================================================================\r
629 void SMESHGUI_CreatePatternDlg::onSelBtnClicked()\r
630 {\r
631   onSelectionDone();\r
632 }\r
633 \r
634 //================================================================\r
635 // function : autoExtension()\r
636 // purpose  : Append extension to the file name\r
637 //================================================================\r
638 QString SMESHGUI_CreatePatternDlg::autoExtension (const QString& theFileName) const\r
639 {\r
640   QString anExt = theFileName.section('.', -1);\r
641   return anExt != "smp" && anExt != "SMP" ? theFileName + ".smp" : theFileName;\r
642 }\r
643 \r
644 //=======================================================================\r
645 // function : displayPreview()\r
646 // purpose  : Display preview\r
647 //=======================================================================\r
648 void SMESHGUI_CreatePatternDlg::displayPreview()\r
649 {\r
650   // Redisplay preview in dialog\r
651   try {\r
652     if (!myIsLoaded) {\r
653       erasePreview();\r
654     } else {\r
655       SMESH::point_array_var pnts = myPattern->GetPoints();\r
656       SMESH::long_array_var keyPoints = myPattern->GetKeyPoints();\r
657       SMESH::array_of_long_array_var elemPoints = myPattern->GetElementPoints(false);\r
658 \r
659       if (pnts->length()       == 0 ||\r
660           keyPoints->length()  == 0 ||\r
661           elemPoints->length() == 0) {\r
662         myIsLoaded = false;\r
663         erasePreview();\r
664         return;\r
665       }\r
666 \r
667       PointVector aPoints (pnts->length());\r
668       QValueVector<int> aKeyPoints (keyPoints->length());\r
669       ConnectivityVector anElemPoints (elemPoints->length());\r
670 \r
671       for (int i = 0, n = pnts->length(); i < n; i++)\r
672         aPoints[ i ] = pnts[ i ];\r
673 \r
674       for (int i2 = 0, n2 = keyPoints->length(); i2 < n2; i2++)\r
675         aKeyPoints[ i2 ] = keyPoints[ i2 ];\r
676 \r
677       for (int i3 = 0, n3 = elemPoints->length(); i3 < n3; i3++) {\r
678         QValueVector<int> aVec (elemPoints[ i3 ].length());\r
679         for (int i4 = 0, n4 = elemPoints[ i3 ].length(); i4 < n4; i4++)\r
680           aVec[ i4 ] = elemPoints[ i3 ][ i4 ];\r
681 \r
682         anElemPoints[ i3 ] = aVec;\r
683       }\r
684 \r
685       myPicture2d->SetPoints(aPoints, aKeyPoints, anElemPoints);\r
686     }\r
687 \r
688     return;\r
689 \r
690   } catch (const SALOME::SALOME_Exception& S_ex) {\r
691     SalomeApp_Tools::QtCatchCorbaException(S_ex);\r
692   } catch (...) {\r
693   }\r
694   erasePreview();\r
695 }\r
696 \r
697 //=======================================================================\r
698 // function : erasePreview()\r
699 // purpose  : Erase preview\r
700 //=======================================================================\r
701 void SMESHGUI_CreatePatternDlg::erasePreview()\r
702 {\r
703   // Erase preview in 2D viewer\r
704   myPicture2d->SetPoints(PointVector(), QValueVector<int>(), ConnectivityVector());\r
705 }\r
706 \r
707 //=======================================================================\r
708 // function : activateSelection()\r
709 // purpose  : Activate selection in accordance with current pattern type\r
710 //=======================================================================\r
711 void SMESHGUI_CreatePatternDlg::activateSelection()\r
712 {\r
713   mySelectionMgr->clearFilters();\r
714   //SUIT_Application::getDesktop()->setSelectionModes(ActorSelection);\r
715   if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))\r
716     aViewWindow->SetSelectionMode(ActorSelection);\r
717 \r
718   if (myType == Type_2d) {\r
719     mySelectionMgr->installFilter(new SMESH_NumberFilter\r
720       ("SMESH", TopAbs_SHAPE, -1, TopAbs_FACE));\r
721   } else {\r
722     TColStd_MapOfInteger aTypes;\r
723     aTypes.Add(TopAbs_SHELL);\r
724     aTypes.Add(TopAbs_SOLID);\r
725     mySelectionMgr->installFilter(new SMESH_NumberFilter\r
726       ("SMESH", TopAbs_FACE, 6, aTypes, GEOM::GEOM_Object::_nil(), true));\r
727   }\r
728 }\r
729 \r
730 //=======================================================================\r
731 // function : onTypeChanged()\r
732 // purpose  : SLOT. Called when pattern type changed.\r
733 //            Change dialog's look and feel\r
734 //=======================================================================\r
735 void SMESHGUI_CreatePatternDlg::onTypeChanged (int theType)\r
736 {\r
737   if (myType == theType)\r
738     return;\r
739 \r
740   myType = theType;\r
741 \r
742   if (theType == Type_2d)\r
743     myPicture2d->show();\r
744   else\r
745     myPicture2d->hide();\r
746 }\r