1 // SMESH SMESHGUI : GUI for SMESH component
\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
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
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
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
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
\r
24 // File : SMESHGUI_CreatePatternDlg.cxx
\r
25 // Author : Sergey LITONIN
\r
28 #include "SMESHGUI_CreatePatternDlg.h"
\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
38 #include "SMESH_NumberFilter.hxx"
\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
46 #include "SalomeApp_Application.h"
\r
47 #include "SalomeApp_Study.h"
\r
48 #include "LightApp_DataOwner.h"
\r
49 #include "LightApp_SelectionMgr.h"
\r
50 #include "SalomeApp_Tools.h"
\r
52 #include "SALOMEDS_SObject.hxx"
\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
61 #include <TColStd_MapOfInteger.hxx>
\r
65 #include <qlayout.h>
\r
66 #include <qlineedit.h>
\r
67 #include <qpushbutton.h>
\r
68 #include <qgroupbox.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
80 * Class : SMESHGUI_CreatePatternDlg
\r
81 * Description : Dialog to specify filters for VTK viewer
\r
84 //=======================================================================
\r
85 // function : SMESHGUI_CreatePatternDlg()
\r
86 // purpose : Constructor
\r
87 //=======================================================================
\r
88 SMESHGUI_CreatePatternDlg::SMESHGUI_CreatePatternDlg( SMESHGUI* theModule,
\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
96 setCaption(tr("CAPTION"));
\r
98 QVBoxLayout* aDlgLay = new QVBoxLayout (this, MARGIN, SPACING);
\r
100 QFrame* aMainFrame = createMainFrame (this);
\r
101 QFrame* aBtnFrame = createButtonFrame(this);
\r
103 aDlgLay->addWidget(aMainFrame);
\r
104 aDlgLay->addWidget(aBtnFrame);
\r
106 aDlgLay->setStretchFactor(aMainFrame, 1);
\r
108 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
\r
109 mySelector = aViewWindow->GetSelector();
\r
111 myHelpFileName = "pattern_mapping.htm";
\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
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
127 QGroupBox* aMainGrp = new QGroupBox(1, Qt::Horizontal, theParent);
\r
128 aMainGrp->setFrameStyle(QFrame::NoFrame);
\r
129 aMainGrp->setInsideMargin(0);
\r
131 // Pattern type group
\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
141 QGroupBox* aPatternGrp = new QGroupBox(1, Qt::Horizontal, tr("PATTERN"), aMainGrp);
\r
143 // Mesh and pattern name group
\r
145 QGroupBox* aMeshGrp = new QGroupBox(1, Qt::Vertical, aPatternGrp);
\r
146 aMeshGrp->setFrameStyle(QFrame::NoFrame);
\r
147 aMeshGrp->setInsideMargin(0);
\r
149 new QLabel(tr("MESH_OR_SUBMESH"), aMeshGrp);
\r
151 QPushButton* aSelBtn = new QPushButton(aMeshGrp);
\r
152 aSelBtn->setPixmap(iconSlct);
\r
153 myMeshEdit = new QLineEdit(aMeshGrp);
\r
154 myMeshEdit->setReadOnly(true);
\r
156 QGroupBox* aPattGrp = new QGroupBox(1, Qt::Vertical, aPatternGrp);
\r
157 aPattGrp->setFrameStyle(QFrame::NoFrame);
\r
158 aPattGrp->setInsideMargin(0);
\r
160 new QLabel(tr("PATTERN_NAME"), aPattGrp);
\r
161 myName = new QLineEdit(aPattGrp);
\r
165 myPicture2d = new SMESHGUI_PatternWidget(aPatternGrp),
\r
166 myPicture2d->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
\r
168 // Project check box
\r
170 myProjectChk = new QCheckBox(tr("PROJECT"), aPatternGrp);
\r
172 // Connect signals and slots
\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
181 //=======================================================================
\r
182 // function : createButtonFrame()
\r
183 // purpose : Create frame containing buttons
\r
184 //=======================================================================
\r
185 QFrame* SMESHGUI_CreatePatternDlg::createButtonFrame (QWidget* theParent)
\r
187 QFrame* aFrame = new QFrame(theParent);
\r
188 aFrame->setFrameStyle(QFrame::Box | QFrame::Sunken);
\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
195 QSpacerItem* aSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
\r
197 QHBoxLayout* aLay = new QHBoxLayout(aFrame, MARGIN, SPACING);
\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
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
213 //=======================================================================
\r
214 // function : ~SMESHGUI_CreatePatternDlg()
\r
215 // purpose : Destructor
\r
216 //=======================================================================
\r
217 SMESHGUI_CreatePatternDlg::~SMESHGUI_CreatePatternDlg()
\r
219 // no need to delete child widgets, Qt does it all for us
\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
229 loadFromObject(false);
\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
239 myIsLoaded = false;
\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
249 mySMESHGUI->SetActiveDialogBox((QDialog*)this);
\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
256 mySwitch2d->setEnabled(theType == Type_2d);
\r
257 mySwitch3d->setEnabled(theType == Type_3d);
\r
259 if (theType == Type_2d)
\r
260 myProjectChk->show();
\r
262 myProjectChk->hide();
\r
264 myTypeGrp->setButton(theType);
\r
265 onTypeChanged(theType);
\r
267 myName->setText(getDefaultName());
\r
268 myMeshEdit->setText("");
\r
270 setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding));
\r
271 qApp->processEvents();
\r
273 myPicture2d->updateGeometry();
\r
275 resize(minimumSize());
\r
277 activateSelection();
\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
289 myMesh = SMESH::SMESH_Mesh::_duplicate(thePtr);
\r
290 mySubMesh = SMESH::SMESH_subMesh::_nil();
\r
292 bool isValidMesh = false;
\r
293 if (!myMesh->_is_nil())
\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
300 isValidMesh = mySelectionMgr->isOk(anIObj);
\r
304 _PTR(SObject) aSO = SMESH::FindSObject(myMesh.in());
\r
305 myMeshEdit->setText(aSO->GetName().c_str());
\r
306 myGeomObj = SMESH::GetGeom(aSO);
\r
308 myMeshEdit->setText("");
\r
309 myGeomObj = GEOM::GEOM_Object::_nil();
\r
312 if (myType == Type_2d) {
\r
313 loadFromObject(false);
\r
318 //=======================================================================
\r
319 // function : isValid()
\r
320 // purpose : Verify validity of entry data
\r
321 //=======================================================================
\r
322 bool SMESHGUI_CreatePatternDlg::isValid()
\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
335 //=======================================================================
\r
336 // function : getDefaultName()
\r
337 // purpose : Get default pattern name
\r
338 //=======================================================================
\r
339 QString SMESHGUI_CreatePatternDlg::getDefaultName() const
\r
341 return myType == Type_2d ? tr("DEFAULT_2D") : tr("DEFAULT_3D");
\r
344 //=======================================================================
\r
345 // function : onSave()
\r
346 // purpose : SLOT called when "Save" button pressed. Build pattern and
\r
348 //=======================================================================
\r
349 void SMESHGUI_CreatePatternDlg::onSave()
\r
356 loadFromObject(true);
\r
358 // Load pattern from object
\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
370 if (aDlg->exec() != Accepted)
\r
373 QString fName = aDlg->selectedFile();
\r
374 if (fName.isEmpty())
\r
377 if (QFileInfo(fName).extension().isEmpty())
\r
378 fName = autoExtension(fName);
\r
380 fName = QDir::convertSeparators(fName);
\r
382 QString aData (myPattern->GetString());
\r
383 long aLen = aData.length();
\r
385 QFile aFile (fName);
\r
386 aFile.open(IO_WriteOnly);
\r
387 long aWritten = aFile.writeBlock(aData, aLen);
\r
390 if (aWritten != aLen) {
\r
391 QMessageBox::information(SMESH::GetDesktop( mySMESHGUI ), tr("SMESH_ERROR"),
\r
392 tr("ERROR_OF_SAVING"), QMessageBox::Ok);
\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
403 } catch (const SALOME::SALOME_Exception& S_ex) {
\r
404 SalomeApp_Tools::QtCatchCorbaException(S_ex);
\r
409 //=======================================================================
\r
410 // function : GetPatternName()
\r
411 // purpose : Get name of pattern
\r
412 //=======================================================================
\r
413 QString SMESHGUI_CreatePatternDlg::GetPatternName() const
\r
415 return myName->text();
\r
418 //=======================================================================
\r
419 // function : GetPattern()
\r
420 // purpose : Get result pattern
\r
421 //=======================================================================
\r
422 SMESH::SMESH_Pattern_ptr SMESHGUI_CreatePatternDlg::GetPattern()
\r
424 return myPattern.in();
\r
427 //=======================================================================
\r
428 // function : onOk()
\r
429 // purpose : SLOT called when "Ok" button pressed.
\r
430 //=======================================================================
\r
431 void SMESHGUI_CreatePatternDlg::onOk()
\r
438 loadFromObject(true);
\r
440 // Load pattern from object
\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
453 } catch (const SALOME::SALOME_Exception& S_ex) {
\r
454 SalomeApp_Tools::QtCatchCorbaException(S_ex);
\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
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
474 //=================================================================================
\r
475 // function : onHelp()
\r
477 //=================================================================================
\r
478 void SMESHGUI_CreatePatternDlg::onHelp()
\r
480 SalomeApp_Application* app = (SalomeApp_Application*)(SUIT_Session::session()->activeApplication());
\r
482 app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
\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
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
498 myIsLoaded = false;
\r
500 if (myPattern->_is_nil())
\r
501 myPattern = SMESH::GetPattern();
\r
503 if (myMesh->_is_nil() && mySubMesh->_is_nil() || myGeomObj->_is_nil())
\r
506 SMESH::SMESH_Mesh_ptr aMesh = mySubMesh->_is_nil() ? myMesh.in() : mySubMesh->GetFather();
\r
508 myIsLoaded = myType == Type_2d
\r
509 ? myPattern->LoadFromFace(aMesh, myGeomObj, myProjectChk->isChecked())
\r
510 : myPattern->LoadFrom3DBlock(aMesh, myGeomObj);
\r
512 if (!myIsLoaded && theMess) {
\r
514 SMESH::SMESH_Pattern::ErrorCode aCode = myPattern->GetErrorCode();
\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
524 QMessageBox::information(SMESH::GetDesktop( mySMESHGUI ),
\r
525 tr("SMESH_ERROR"), aMess, QMessageBox::Ok);
\r
527 } catch (const SALOME::SALOME_Exception& S_ex) {
\r
528 SalomeApp_Tools::QtCatchCorbaException(S_ex);
\r
534 //=======================================================================
\r
535 // function : onSelectionDone()
\r
536 // purpose : SLOT called when selection changed
\r
537 //=======================================================================
\r
538 void SMESHGUI_CreatePatternDlg::onSelectionDone()
\r
541 SALOME_ListIO aList;
\r
542 mySelectionMgr->selectedObjects(aList, SVTK_Viewer::Type());
\r
543 if (aList.Extent() != 1)
\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
553 // Get geom object corresponding to the mesh
\r
555 if (!aMesh->_is_nil())
\r
556 aSO = SMESH::FindSObject(aMesh.in());
\r
558 aSO = SMESH::FindSObject(aSubMesh.in());
\r
560 GEOM::GEOM_Object_var aGeomObj = SMESH::GetGeom(aSO);
\r
561 if (aGeomObj->_is_nil())
\r
564 myGeomObj = aGeomObj;
\r
566 // init class fields
\r
567 if (!aMesh->_is_nil()) {
\r
569 mySubMesh = SMESH::SMESH_subMesh::_nil();
\r
571 mySubMesh = aSubMesh;
\r
572 myMesh = SMESH::SMESH_Mesh::_nil();
\r
576 SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aName);
\r
577 myMeshEdit->setText(aName);
\r
579 if (myType == Type_2d) {
\r
580 loadFromObject(true);
\r
584 myMesh = SMESH::SMESH_Mesh::_nil();
\r
585 mySubMesh = SMESH::SMESH_subMesh::_nil();
\r
586 myGeomObj = GEOM::GEOM_Object::_nil();
\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
597 disconnect(mySelectionMgr, 0, this, 0);
\r
601 //=======================================================================
\r
602 // function : enterEvent()
\r
603 // purpose : Event filter
\r
604 //=======================================================================
\r
605 void SMESHGUI_CreatePatternDlg::enterEvent (QEvent*)
\r
607 // there is a stange problem that enterEvent() comes after onSave()
\r
608 if ( isVisible () ) {
\r
609 mySMESHGUI->EmitSignalDeactivateDialog();
\r
611 activateSelection();
\r
612 connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));
\r
616 //=================================================================================
\r
617 // function : closeEvent()
\r
618 // purpose : Close dialog box
\r
619 //=================================================================================
\r
620 void SMESHGUI_CreatePatternDlg::closeEvent (QCloseEvent*)
\r
625 //=======================================================================
\r
626 // function : onSelBtnClicked()
\r
627 // purpose : SLOT. Called when -> button clicked.
\r
628 //=======================================================================
\r
629 void SMESHGUI_CreatePatternDlg::onSelBtnClicked()
\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
640 QString anExt = theFileName.section('.', -1);
\r
641 return anExt != "smp" && anExt != "SMP" ? theFileName + ".smp" : theFileName;
\r
644 //=======================================================================
\r
645 // function : displayPreview()
\r
646 // purpose : Display preview
\r
647 //=======================================================================
\r
648 void SMESHGUI_CreatePatternDlg::displayPreview()
\r
650 // Redisplay preview in dialog
\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
659 if (pnts->length() == 0 ||
\r
660 keyPoints->length() == 0 ||
\r
661 elemPoints->length() == 0) {
\r
662 myIsLoaded = false;
\r
667 PointVector aPoints (pnts->length());
\r
668 QValueVector<int> aKeyPoints (keyPoints->length());
\r
669 ConnectivityVector anElemPoints (elemPoints->length());
\r
671 for (int i = 0, n = pnts->length(); i < n; i++)
\r
672 aPoints[ i ] = pnts[ i ];
\r
674 for (int i2 = 0, n2 = keyPoints->length(); i2 < n2; i2++)
\r
675 aKeyPoints[ i2 ] = keyPoints[ i2 ];
\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
682 anElemPoints[ i3 ] = aVec;
\r
685 myPicture2d->SetPoints(aPoints, aKeyPoints, anElemPoints);
\r
690 } catch (const SALOME::SALOME_Exception& S_ex) {
\r
691 SalomeApp_Tools::QtCatchCorbaException(S_ex);
\r
697 //=======================================================================
\r
698 // function : erasePreview()
\r
699 // purpose : Erase preview
\r
700 //=======================================================================
\r
701 void SMESHGUI_CreatePatternDlg::erasePreview()
\r
703 // Erase preview in 2D viewer
\r
704 myPicture2d->SetPoints(PointVector(), QValueVector<int>(), ConnectivityVector());
\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
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
718 if (myType == Type_2d) {
\r
719 mySelectionMgr->installFilter(new SMESH_NumberFilter
\r
720 ("SMESH", TopAbs_SHAPE, -1, TopAbs_FACE));
\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
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
737 if (myType == theType)
\r
742 if (theType == Type_2d)
\r
743 myPicture2d->show();
\r
745 myPicture2d->hide();
\r