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