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