-// SMESH SMESHGUI : GUI for SMESH component\r
-//\r
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,\r
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS\r
-//\r
-// This library is free software; you can redistribute it and/or\r
-// modify it under the terms of the GNU Lesser General Public\r
-// License as published by the Free Software Foundation; either\r
-// version 2.1 of the License.\r
-//\r
-// This library is distributed in the hope that it will be useful,\r
-// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
-// Lesser General Public License for more details.\r
-//\r
-// You should have received a copy of the GNU Lesser General Public\r
-// License along with this library; if not, write to the Free Software\r
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
-//\r
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org\r
-//\r
-//\r
-//\r
-// File : SMESHGUI_CreatePatternDlg.cxx\r
-// Author : Sergey LITONIN\r
-// Module : SMESH\r
-\r
-#include "SMESHGUI_CreatePatternDlg.h"\r
-\r
-#include "SMESHGUI.h"\r
-#include "SMESHGUI_SpinBox.h"\r
-#include "SMESHGUI_PatternWidget.h"\r
-#include "SMESHGUI_Utils.h"\r
-#include "SMESHGUI_VTKUtils.h"\r
-#include "SMESHGUI_PatternUtils.h"\r
-#include "SMESHGUI_GEOMGenUtils.h"\r
-\r
-#include "SMESH_NumberFilter.hxx"\r
-\r
-#include "SUIT_ResourceMgr.h"\r
-#include "SUIT_Desktop.h"\r
-#include "SUIT_FileDlg.h"\r
-\r
-#include "SalomeApp_Study.h"\r
-#include "LightApp_DataOwner.h"\r
-#include "LightApp_SelectionMgr.h"\r
-#include "SalomeApp_Tools.h"\r
-\r
-#include "SALOMEDS_SObject.hxx"\r
-\r
-#include "SALOME_ListIO.hxx"\r
-#include "SVTK_ViewModel.h"\r
-#include "SVTK_ViewWindow.h"\r
-#include "SVTK_Selector.h"\r
-#include "SVTK_Selection.h"\r
-\r
-// OCCT Includes\r
-#include <TColStd_MapOfInteger.hxx>\r
-\r
-// QT Includes\r
-#include <qframe.h>\r
-#include <qlayout.h>\r
-#include <qlineedit.h>\r
-#include <qpushbutton.h>\r
-#include <qgroupbox.h>\r
-#include <qlabel.h>\r
-#include <qradiobutton.h>\r
-#include <qcheckbox.h>\r
-#include <qbuttongroup.h>\r
-#include <qmessagebox.h>\r
-#include <qapplication.h>\r
-\r
-#define SPACING 5\r
-#define MARGIN 10\r
-\r
-/*!\r
- * Class : SMESHGUI_CreatePatternDlg\r
- * Description : Dialog to specify filters for VTK viewer\r
- */\r
-\r
-//=======================================================================\r
-// function : SMESHGUI_CreatePatternDlg()\r
-// purpose : Constructor\r
-//=======================================================================\r
-SMESHGUI_CreatePatternDlg::SMESHGUI_CreatePatternDlg( SMESHGUI* theModule,\r
- const int theType,\r
- const char* theName)\r
- : QDialog( SMESH::GetDesktop( theModule ), theName, false,\r
- WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu),\r
- mySMESHGUI( theModule ),\r
- mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )\r
-{\r
- setCaption(tr("CAPTION"));\r
-\r
- QVBoxLayout* aDlgLay = new QVBoxLayout (this, MARGIN, SPACING);\r
-\r
- QFrame* aMainFrame = createMainFrame (this);\r
- QFrame* aBtnFrame = createButtonFrame(this);\r
-\r
- aDlgLay->addWidget(aMainFrame);\r
- aDlgLay->addWidget(aBtnFrame);\r
-\r
- aDlgLay->setStretchFactor(aMainFrame, 1);\r
-\r
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))\r
- mySelector = aViewWindow->GetSelector();\r
-\r
- Init(theType);\r
-}\r
-\r
-//=======================================================================\r
-// function : createMainFrame()\r
-// purpose : Create frame containing dialog's input fields\r
-//=======================================================================\r
-QFrame* SMESHGUI_CreatePatternDlg::createMainFrame (QWidget* theParent)\r
-{\r
- QPixmap iconSlct (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));\r
- QPixmap icon2d (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_PATTERN_2d")));\r
- QPixmap icon3d (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_PATTERN_3d")));\r
- QPixmap iconSample2d (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_PATTERN_SAMPLE_2D")));\r
-\r
- QGroupBox* aMainGrp = new QGroupBox(1, Qt::Horizontal, theParent);\r
- aMainGrp->setFrameStyle(QFrame::NoFrame);\r
- aMainGrp->setInsideMargin(0);\r
-\r
- // Pattern type group\r
-\r
- myTypeGrp = new QButtonGroup (1, Qt::Vertical, tr("PATTERN_TYPE"), aMainGrp);\r
- mySwitch2d = new QRadioButton (myTypeGrp);\r
- mySwitch3d = new QRadioButton (myTypeGrp);\r
- mySwitch2d->setPixmap(icon2d);\r
- mySwitch3d->setPixmap(icon3d);\r
- myTypeGrp->insert(mySwitch2d, Type_2d);\r
- myTypeGrp->insert(mySwitch3d, Type_3d);\r
-\r
- QGroupBox* aPatternGrp = new QGroupBox(1, Qt::Horizontal, tr("PATTERN"), aMainGrp);\r
-\r
- // Mesh and pattern name group\r
-\r
- QGroupBox* aMeshGrp = new QGroupBox(1, Qt::Vertical, aPatternGrp);\r
- aMeshGrp->setFrameStyle(QFrame::NoFrame);\r
- aMeshGrp->setInsideMargin(0);\r
-\r
- new QLabel(tr("MESH_OR_SUBMESH"), aMeshGrp);\r
-\r
- QPushButton* aSelBtn = new QPushButton(aMeshGrp);\r
- aSelBtn->setPixmap(iconSlct);\r
- myMeshEdit = new QLineEdit(aMeshGrp);\r
- myMeshEdit->setReadOnly(true);\r
-\r
- QGroupBox* aPattGrp = new QGroupBox(1, Qt::Vertical, aPatternGrp);\r
- aPattGrp->setFrameStyle(QFrame::NoFrame);\r
- aPattGrp->setInsideMargin(0);\r
-\r
- new QLabel(tr("PATTERN_NAME"), aPattGrp);\r
- myName = new QLineEdit(aPattGrp);\r
-\r
- // Picture 2d\r
-\r
- myPicture2d = new SMESHGUI_PatternWidget(aPatternGrp),\r
- myPicture2d->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));\r
-\r
- // Project check box\r
-\r
- myProjectChk = new QCheckBox(tr("PROJECT"), aPatternGrp);\r
-\r
- // Connect signals and slots\r
-\r
- connect(myTypeGrp, SIGNAL(clicked(int) ), SLOT(onTypeChanged(int)));\r
- connect(myProjectChk, SIGNAL(toggled(bool)), SLOT(onProject(bool) ));\r
- connect(aSelBtn, SIGNAL(clicked() ), SLOT(onSelBtnClicked()));\r
-\r
- return aMainGrp;\r
-}\r
-\r
-//=======================================================================\r
-// function : createButtonFrame()\r
-// purpose : Create frame containing buttons\r
-//=======================================================================\r
-QFrame* SMESHGUI_CreatePatternDlg::createButtonFrame (QWidget* theParent)\r
-{\r
- QFrame* aFrame = new QFrame(theParent);\r
- aFrame->setFrameStyle(QFrame::Box | QFrame::Sunken);\r
-\r
- myOkBtn = new QPushButton(tr("SMESH_BUT_OK" ), aFrame);\r
- mySaveBtn = new QPushButton(tr("SAVE" ), aFrame);\r
- myCloseBtn = new QPushButton(tr("SMESH_BUT_CANCEL"), aFrame);\r
-\r
- QSpacerItem* aSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);\r
-\r
- QHBoxLayout* aLay = new QHBoxLayout(aFrame, MARGIN, SPACING);\r
-\r
- aLay->addWidget(myOkBtn);\r
- aLay->addWidget(mySaveBtn);\r
- aLay->addItem(aSpacer);\r
- aLay->addWidget(myCloseBtn);\r
-\r
- connect(myOkBtn, SIGNAL(clicked()), SLOT(onOk()));\r
- connect(myCloseBtn, SIGNAL(clicked()), SLOT(onClose()));\r
- connect(mySaveBtn, SIGNAL(clicked()), SLOT(onSave()));\r
-\r
- return aFrame;\r
-}\r
-\r
-//=======================================================================\r
-// function : ~SMESHGUI_CreatePatternDlg()\r
-// purpose : Destructor\r
-//=======================================================================\r
-SMESHGUI_CreatePatternDlg::~SMESHGUI_CreatePatternDlg()\r
-{\r
- // no need to delete child widgets, Qt does it all for us\r
-}\r
-\r
-//=======================================================================\r
-// function : onProject()\r
-// purpose : SLOT. Called when state of "Project nodes on ther face"\r
-// checkbox is changed\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::onProject (bool)\r
-{\r
- loadFromObject(false);\r
- displayPreview();\r
-}\r
-\r
-//=======================================================================\r
-// function : Init()\r
-// purpose : Init dialog fields, connect signals and slots, show dialog\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::Init( const int theType )\r
-{\r
- myIsLoaded = false;\r
- myType = -1;\r
- myNbPoints = -1;\r
- mySubMesh = SMESH::SMESH_subMesh::_nil();\r
- myMesh = SMESH::SMESH_Mesh::_nil();\r
- myGeomObj = GEOM::GEOM_Object::_nil();\r
- myPattern = SMESH::SMESH_Pattern::_nil();\r
-\r
- erasePreview();\r
-\r
- mySMESHGUI->SetActiveDialogBox((QDialog*)this);\r
-\r
- // selection and SMESHGUI\r
- connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));\r
- connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate()));\r
- connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose()));\r
-\r
- mySwitch2d->setEnabled(theType == Type_2d);\r
- mySwitch3d->setEnabled(theType == Type_3d);\r
-\r
- if (theType == Type_2d)\r
- myProjectChk->show();\r
- else\r
- myProjectChk->hide();\r
-\r
- myTypeGrp->setButton(theType);\r
- onTypeChanged(theType);\r
-\r
- myName->setText(getDefaultName());\r
- myMeshEdit->setText("");\r
-\r
- setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding));\r
- qApp->processEvents();\r
- updateGeometry();\r
- myPicture2d->updateGeometry();\r
- adjustSize();\r
- resize(minimumSize());\r
-\r
- activateSelection();\r
- onSelectionDone();\r
-\r
- int x, y;\r
- mySMESHGUI->DefineDlgPosition(this, x, y);\r
- this->move(x, y);\r
- this->show();\r
-}\r
-\r
-//=======================================================================\r
-// function : SetMesh()\r
-// purpose : Set mesh to dialog\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::SetMesh (SMESH::SMESH_Mesh_ptr thePtr)\r
-{\r
- myMesh = SMESH::SMESH_Mesh::_duplicate(thePtr);\r
- mySubMesh = SMESH::SMESH_subMesh::_nil();\r
-\r
- bool isValidMesh = false;\r
- if (!myMesh->_is_nil())\r
- {\r
- _PTR(SObject) aSobj = SMESH::FindSObject(myMesh.in());\r
- //Handle(SALOME_InteractiveObject) anIObj =\r
- // new SALOME_InteractiveObject(aSobj->GetID().c_str(), "SMESH");\r
- SUIT_DataOwnerPtr anIObj (new LightApp_DataOwner(aSobj->GetID().c_str()));\r
-\r
- isValidMesh = mySelectionMgr->isOk(anIObj);\r
- }\r
-\r
- if (isValidMesh) {\r
- _PTR(SObject) aSO = SMESH::FindSObject(myMesh.in());\r
- myMeshEdit->setText(aSO->GetName().c_str());\r
- myGeomObj = SMESH::GetGeom(aSO);\r
- } else {\r
- myMeshEdit->setText("");\r
- myGeomObj = GEOM::GEOM_Object::_nil();\r
- }\r
-\r
- if (myType == Type_2d) {\r
- loadFromObject(false);\r
- displayPreview();\r
- }\r
-}\r
-\r
-//=======================================================================\r
-// function : isValid()\r
-// purpose : Verify validity of entry data\r
-//=======================================================================\r
-bool SMESHGUI_CreatePatternDlg::isValid()\r
-{\r
- if (myGeomObj->_is_nil()) {\r
- QMessageBox::information(SMESH::GetDesktop( mySMESHGUI ),\r
- tr("SMESH_INSUFFICIENT_DATA"),\r
- tr("SMESHGUI_INVALID_PARAMETERS"),\r
- QMessageBox::Ok);\r
- return false;\r
- }\r
- else\r
- return true;\r
-}\r
-\r
-//=======================================================================\r
-// function : getDefaultName()\r
-// purpose : Get default pattern name\r
-//=======================================================================\r
-QString SMESHGUI_CreatePatternDlg::getDefaultName() const\r
-{\r
- return myType == Type_2d ? tr("DEFAULT_2D") : tr("DEFAULT_3D");\r
-}\r
-\r
-//=======================================================================\r
-// function : onSave()\r
-// purpose : SLOT called when "Save" button pressed. Build pattern and\r
-// save it to disk\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::onSave()\r
-{\r
- try {\r
- if (!isValid())\r
- return;\r
-\r
- if (!myIsLoaded)\r
- loadFromObject(true);\r
-\r
- // Load pattern from object\r
- if (!myIsLoaded)\r
- return;\r
-\r
- ///////////////////////////////////////////////////////\r
- SUIT_FileDlg* aDlg = new SUIT_FileDlg (this, false);\r
- aDlg->setCaption(tr("SAVE_PATTERN"));\r
- aDlg->setMode(QFileDialog::AnyFile);\r
- aDlg->setFilters(tr("PATTERN_FILT"));\r
- if (myName->text() != "")\r
- aDlg->setSelection(myName->text());\r
-\r
- if (aDlg->exec() != Accepted)\r
- return;\r
-\r
- QString fName = aDlg->selectedFile();\r
- if (fName.isEmpty())\r
- return;\r
-\r
- if (QFileInfo(fName).extension().isEmpty())\r
- fName = autoExtension(fName);\r
-\r
- fName = QDir::convertSeparators(fName);\r
-\r
- QString aData (myPattern->GetString());\r
- long aLen = aData.length();\r
-\r
- QFile aFile (fName);\r
- aFile.open(IO_WriteOnly);\r
- long aWritten = aFile.writeBlock(aData, aLen);\r
- aFile.close();\r
-\r
- if (aWritten != aLen) {\r
- QMessageBox::information(SMESH::GetDesktop( mySMESHGUI ), tr("SMESH_ERROR"),\r
- tr("ERROR_OF_SAVING"), QMessageBox::Ok);\r
- } else {\r
- //SUIT_Application::getDesktop()->setSelectionModes(ActorSelection);\r
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))\r
- aViewWindow->SetSelectionMode(ActorSelection);\r
- //disconnect(mySelectionMgr, 0, this, 0);\r
- disconnect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onSelectionDone()));\r
- disconnect(mySMESHGUI, 0, this, 0);\r
- mySMESHGUI->ResetState();\r
- accept();\r
- emit NewPattern();\r
- }\r
- } catch (const SALOME::SALOME_Exception& S_ex) {\r
- SalomeApp_Tools::QtCatchCorbaException(S_ex);\r
- } catch (...) {\r
- }\r
-}\r
-\r
-//=======================================================================\r
-// function : GetPatternName()\r
-// purpose : Get name of pattern\r
-//=======================================================================\r
-QString SMESHGUI_CreatePatternDlg::GetPatternName() const\r
-{\r
- return myName->text();\r
-}\r
-\r
-//=======================================================================\r
-// function : GetPattern()\r
-// purpose : Get result pattern\r
-//=======================================================================\r
-SMESH::SMESH_Pattern_ptr SMESHGUI_CreatePatternDlg::GetPattern()\r
-{\r
- return myPattern.in();\r
-}\r
-\r
-//=======================================================================\r
-// function : onOk()\r
-// purpose : SLOT called when "Ok" button pressed.\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::onOk()\r
-{\r
- try {\r
- if (!isValid())\r
- return;\r
-\r
- if (!myIsLoaded)\r
- loadFromObject(true);\r
-\r
- // Load pattern from object\r
- if (!myIsLoaded) {\r
- return;\r
- } else {\r
- //SUIT_Application::getDesktop()->setSelectionModes(ActorSelection);\r
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))\r
- aViewWindow->SetSelectionMode(ActorSelection);\r
- disconnect(mySelectionMgr, 0, this, 0);\r
- disconnect(mySMESHGUI, 0, this, 0);\r
- mySMESHGUI->ResetState();\r
- accept();\r
- emit NewPattern();\r
- }\r
- } catch (const SALOME::SALOME_Exception& S_ex) {\r
- SalomeApp_Tools::QtCatchCorbaException(S_ex);\r
- } catch (...) {\r
- }\r
-}\r
-\r
-//=======================================================================\r
-// function : onClose()\r
-// purpose : SLOT called when "Close" button pressed. Close dialog\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::onClose()\r
-{\r
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))\r
- aViewWindow->SetSelectionMode(ActorSelection);\r
- disconnect(mySelectionMgr, 0, this, 0);\r
- disconnect(mySMESHGUI, 0, this, 0);\r
- mySMESHGUI->ResetState();\r
- reject();\r
- emit Close();\r
-}\r
-\r
-//=======================================================================\r
-// function : loadFromObject()\r
-// purpose : Load pattern from geom object corresponding to the mesh/submesh\r
-//=======================================================================\r
-bool SMESHGUI_CreatePatternDlg::loadFromObject (const bool theMess)\r
-{\r
- try {\r
- myIsLoaded = false;\r
-\r
- if (myPattern->_is_nil())\r
- myPattern = SMESH::GetPattern();\r
-\r
- if (myMesh->_is_nil() && mySubMesh->_is_nil() || myGeomObj->_is_nil())\r
- return false;\r
-\r
- SMESH::SMESH_Mesh_ptr aMesh = mySubMesh->_is_nil() ? myMesh.in() : mySubMesh->GetFather();\r
-\r
- myIsLoaded = myType == Type_2d\r
- ? myPattern->LoadFromFace(aMesh, myGeomObj, myProjectChk->isChecked())\r
- : myPattern->LoadFrom3DBlock(aMesh, myGeomObj);\r
-\r
- if (!myIsLoaded && theMess) {\r
- QString aMess;\r
- SMESH::SMESH_Pattern::ErrorCode aCode = myPattern->GetErrorCode();\r
-\r
- if (aCode == SMESH::SMESH_Pattern::ERR_LOAD_EMPTY_SUBMESH ) aMess = tr("ERR_LOAD_EMPTY_SUBMESH");\r
- else if (aCode == SMESH::SMESH_Pattern::ERR_LOADF_NARROW_FACE ) aMess = tr("ERR_LOADF_NARROW_FACE");\r
- else if (aCode == SMESH::SMESH_Pattern::ERR_LOADF_CLOSED_FACE ) aMess = tr("ERR_LOADF_CLOSED_FACE");\r
- else if (aCode == SMESH::SMESH_Pattern::ERR_LOADV_BAD_SHAPE ) aMess = tr("ERR_LOADV_BAD_SHAPE");\r
- else if (aCode == SMESH::SMESH_Pattern::ERR_LOADV_COMPUTE_PARAMS) aMess = tr("ERR_LOADV_COMPUTE_PARAMS");\r
- else aMess = tr("ERROR_OF_CREATION");\r
-\r
- QMessageBox::information(SMESH::GetDesktop( mySMESHGUI ),\r
- tr("SMESH_ERROR"), aMess, QMessageBox::Ok);\r
- }\r
- } catch (const SALOME::SALOME_Exception& S_ex) {\r
- SalomeApp_Tools::QtCatchCorbaException(S_ex);\r
- }\r
-\r
- return myIsLoaded;\r
-}\r
-\r
-//=======================================================================\r
-// function : onSelectionDone()\r
-// purpose : SLOT called when selection changed\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::onSelectionDone()\r
-{\r
- try {\r
- SALOME_ListIO aList;\r
- mySelectionMgr->selectedObjects(aList, SVTK_Viewer::Type());\r
- if (aList.Extent() != 1)\r
- return;\r
-\r
- // Get mesh or sub-mesh from selection\r
- Handle(SALOME_InteractiveObject) anIO = aList.First();\r
- SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIO);\r
- SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(anIO);\r
- if (aMesh->_is_nil() && aSubMesh->_is_nil())\r
- return;\r
-\r
- // Get geom object corresponding to the mesh\r
- _PTR(SObject) aSO;\r
- if (!aMesh->_is_nil())\r
- aSO = SMESH::FindSObject(aMesh.in());\r
- else\r
- aSO = SMESH::FindSObject(aSubMesh.in());\r
-\r
- GEOM::GEOM_Object_var aGeomObj = SMESH::GetGeom(aSO);\r
- if (aGeomObj->_is_nil())\r
- return;\r
-\r
- myGeomObj = aGeomObj;\r
-\r
- // init class fields\r
- if (!aMesh->_is_nil()) {\r
- myMesh = aMesh;\r
- mySubMesh = SMESH::SMESH_subMesh::_nil();\r
- } else {\r
- mySubMesh = aSubMesh;\r
- myMesh = SMESH::SMESH_Mesh::_nil();\r
- }\r
-\r
- QString aName;\r
- SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aName);\r
- myMeshEdit->setText(aName);\r
-\r
- if (myType == Type_2d) {\r
- loadFromObject(true);\r
- displayPreview();\r
- }\r
- } catch (...) {\r
- myMesh = SMESH::SMESH_Mesh::_nil();\r
- mySubMesh = SMESH::SMESH_subMesh::_nil();\r
- myGeomObj = GEOM::GEOM_Object::_nil();\r
- erasePreview();\r
- }\r
-}\r
-\r
-//=======================================================================\r
-// function : onDeactivate()\r
-// purpose : SLOT called when dialog must be deativated\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::onDeactivate()\r
-{\r
- disconnect(mySelectionMgr, 0, this, 0);\r
- setEnabled(false);\r
-}\r
-\r
-//=======================================================================\r
-// function : enterEvent()\r
-// purpose : Event filter\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::enterEvent (QEvent*)\r
-{\r
- mySMESHGUI->EmitSignalDeactivateDialog();\r
- setEnabled(true);\r
- activateSelection();\r
- connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));\r
-}\r
-\r
-//=================================================================================\r
-// function : closeEvent()\r
-// purpose : Close dialog box\r
-//=================================================================================\r
-void SMESHGUI_CreatePatternDlg::closeEvent (QCloseEvent*)\r
-{\r
- onClose();\r
-}\r
-\r
-//=======================================================================\r
-// function : onSelBtnClicked()\r
-// purpose : SLOT. Called when -> button clicked.\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::onSelBtnClicked()\r
-{\r
- onSelectionDone();\r
-}\r
-\r
-//================================================================\r
-// function : autoExtension()\r
-// purpose : Append extension to the file name\r
-//================================================================\r
-QString SMESHGUI_CreatePatternDlg::autoExtension (const QString& theFileName) const\r
-{\r
- QString anExt = theFileName.section('.', -1);\r
- return anExt != "smp" && anExt != "SMP" ? theFileName + ".smp" : theFileName;\r
-}\r
-\r
-//=======================================================================\r
-// function : displayPreview()\r
-// purpose : Display preview\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::displayPreview()\r
-{\r
- // Redisplay preview in dialog\r
- try {\r
- if (!myIsLoaded) {\r
- erasePreview();\r
- } else {\r
- SMESH::point_array_var pnts = myPattern->GetPoints();\r
- SMESH::long_array_var keyPoints = myPattern->GetKeyPoints();\r
- SMESH::array_of_long_array_var elemPoints = myPattern->GetElementPoints(false);\r
-\r
- if (pnts->length() == 0 ||\r
- keyPoints->length() == 0 ||\r
- elemPoints->length() == 0) {\r
- myIsLoaded = false;\r
- erasePreview();\r
- return;\r
- }\r
-\r
- PointVector aPoints (pnts->length());\r
- QValueVector<int> aKeyPoints (keyPoints->length());\r
- ConnectivityVector anElemPoints (elemPoints->length());\r
-\r
- for (int i = 0, n = pnts->length(); i < n; i++)\r
- aPoints[ i ] = pnts[ i ];\r
-\r
- for (int i2 = 0, n2 = keyPoints->length(); i2 < n2; i2++)\r
- aKeyPoints[ i2 ] = keyPoints[ i2 ];\r
-\r
- for (int i3 = 0, n3 = elemPoints->length(); i3 < n3; i3++) {\r
- QValueVector<int> aVec (elemPoints[ i3 ].length());\r
- for (int i4 = 0, n4 = elemPoints[ i3 ].length(); i4 < n4; i4++)\r
- aVec[ i4 ] = elemPoints[ i3 ][ i4 ];\r
-\r
- anElemPoints[ i3 ] = aVec;\r
- }\r
-\r
- myPicture2d->SetPoints(aPoints, aKeyPoints, anElemPoints);\r
- }\r
-\r
- return;\r
-\r
- } catch (const SALOME::SALOME_Exception& S_ex) {\r
- SalomeApp_Tools::QtCatchCorbaException(S_ex);\r
- } catch (...) {\r
- }\r
- erasePreview();\r
-}\r
-\r
-//=======================================================================\r
-// function : erasePreview()\r
-// purpose : Erase preview\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::erasePreview()\r
-{\r
- // Erase preview in 2D viewer\r
- myPicture2d->SetPoints(PointVector(), QValueVector<int>(), ConnectivityVector());\r
-}\r
-\r
-//=======================================================================\r
-// function : activateSelection()\r
-// purpose : Activate selection in accordance with current pattern type\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::activateSelection()\r
-{\r
- mySelectionMgr->clearFilters();\r
- //SUIT_Application::getDesktop()->setSelectionModes(ActorSelection);\r
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))\r
- aViewWindow->SetSelectionMode(ActorSelection);\r
-\r
- if (myType == Type_2d) {\r
- mySelectionMgr->installFilter(new SMESH_NumberFilter\r
- ("SMESH", TopAbs_SHAPE, -1, TopAbs_FACE));\r
- } else {\r
- TColStd_MapOfInteger aTypes;\r
- aTypes.Add(TopAbs_SHELL);\r
- aTypes.Add(TopAbs_SOLID);\r
- mySelectionMgr->installFilter(new SMESH_NumberFilter\r
- ("SMESH", TopAbs_FACE, 6, aTypes, GEOM::GEOM_Object::_nil(), true));\r
- }\r
-}\r
-\r
-//=======================================================================\r
-// function : onTypeChanged()\r
-// purpose : SLOT. Called when pattern type changed.\r
-// Change dialog's look and feel\r
-//=======================================================================\r
-void SMESHGUI_CreatePatternDlg::onTypeChanged (int theType)\r
-{\r
- if (myType == theType)\r
- return;\r
-\r
- myType = theType;\r
-\r
- if (theType == Type_2d)\r
- myPicture2d->show();\r
- else\r
- myPicture2d->hide();\r
-}\r
+// SMESH SMESHGUI : GUI for SMESH component
+//
+// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//
+//
+// File : SMESHGUI_CreatePatternDlg.cxx
+// Author : Sergey LITONIN
+// Module : SMESH
+
+#include "SMESHGUI_CreatePatternDlg.h"
+
+#include "SMESHGUI.h"
+#include "SMESHGUI_SpinBox.h"
+#include "SMESHGUI_PatternWidget.h"
+#include "SMESHGUI_Utils.h"
+#include "SMESHGUI_VTKUtils.h"
+#include "SMESHGUI_PatternUtils.h"
+#include "SMESHGUI_GEOMGenUtils.h"
+
+#include "SMESH_NumberFilter.hxx"
+
+#include "SUIT_ResourceMgr.h"
+#include "SUIT_Desktop.h"
+#include "SUIT_FileDlg.h"
+#include "SUIT_Session.h"
+#include "SUIT_MessageBox.h"
+
+#include "SalomeApp_Study.h"
+#include "LightApp_Application.h"
+#include "LightApp_DataOwner.h"
+#include "LightApp_SelectionMgr.h"
+#include "SalomeApp_Tools.h"
+
+#include "SALOMEDS_SObject.hxx"
+
+#include "SALOME_ListIO.hxx"
+#include "SVTK_ViewModel.h"
+#include "SVTK_ViewWindow.h"
+#include "SVTK_Selector.h"
+#include "SVTK_Selection.h"
+
+// OCCT Includes
+#include <TColStd_MapOfInteger.hxx>
+
+// QT Includes
+#include <qframe.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qradiobutton.h>
+#include <qcheckbox.h>
+#include <qbuttongroup.h>
+#include <qmessagebox.h>
+#include <qapplication.h>
+
+#define SPACING 5
+#define MARGIN 10
+
+/*!
+ * Class : SMESHGUI_CreatePatternDlg
+ * Description : Dialog to specify filters for VTK viewer
+ */
+
+//=======================================================================
+// function : SMESHGUI_CreatePatternDlg()
+// purpose : Constructor
+//=======================================================================
+SMESHGUI_CreatePatternDlg::SMESHGUI_CreatePatternDlg( SMESHGUI* theModule,
+ const int theType,
+ const char* theName)
+ : QDialog( SMESH::GetDesktop( theModule ), theName, false,
+ WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu),
+ mySMESHGUI( theModule ),
+ mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
+{
+ setCaption(tr("CAPTION"));
+
+ QVBoxLayout* aDlgLay = new QVBoxLayout (this, MARGIN, SPACING);
+
+ QFrame* aMainFrame = createMainFrame (this);
+ QFrame* aBtnFrame = createButtonFrame(this);
+
+ aDlgLay->addWidget(aMainFrame);
+ aDlgLay->addWidget(aBtnFrame);
+
+ aDlgLay->setStretchFactor(aMainFrame, 1);
+
+ if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+ mySelector = aViewWindow->GetSelector();
+
+ myHelpFileName = "pattern_mapping.htm";
+
+ Init(theType);
+}
+
+//=======================================================================
+// function : createMainFrame()
+// purpose : Create frame containing dialog's input fields
+//=======================================================================
+QFrame* SMESHGUI_CreatePatternDlg::createMainFrame (QWidget* theParent)
+{
+ QPixmap iconSlct (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
+ QPixmap icon2d (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_PATTERN_2d")));
+ QPixmap icon3d (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_PATTERN_3d")));
+ QPixmap iconSample2d (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_PATTERN_SAMPLE_2D")));
+
+ QGroupBox* aMainGrp = new QGroupBox(1, Qt::Horizontal, theParent);
+ aMainGrp->setFrameStyle(QFrame::NoFrame);
+ aMainGrp->setInsideMargin(0);
+
+ // Pattern type group
+
+ myTypeGrp = new QButtonGroup (1, Qt::Vertical, tr("PATTERN_TYPE"), aMainGrp);
+ mySwitch2d = new QRadioButton (myTypeGrp);
+ mySwitch3d = new QRadioButton (myTypeGrp);
+ mySwitch2d->setPixmap(icon2d);
+ mySwitch3d->setPixmap(icon3d);
+ myTypeGrp->insert(mySwitch2d, Type_2d);
+ myTypeGrp->insert(mySwitch3d, Type_3d);
+
+ QGroupBox* aPatternGrp = new QGroupBox(1, Qt::Horizontal, tr("PATTERN"), aMainGrp);
+
+ // Mesh and pattern name group
+
+ QGroupBox* aMeshGrp = new QGroupBox(1, Qt::Vertical, aPatternGrp);
+ aMeshGrp->setFrameStyle(QFrame::NoFrame);
+ aMeshGrp->setInsideMargin(0);
+
+ new QLabel(tr("MESH_OR_SUBMESH"), aMeshGrp);
+
+ QPushButton* aSelBtn = new QPushButton(aMeshGrp);
+ aSelBtn->setPixmap(iconSlct);
+ myMeshEdit = new QLineEdit(aMeshGrp);
+ myMeshEdit->setReadOnly(true);
+
+ QGroupBox* aPattGrp = new QGroupBox(1, Qt::Vertical, aPatternGrp);
+ aPattGrp->setFrameStyle(QFrame::NoFrame);
+ aPattGrp->setInsideMargin(0);
+
+ new QLabel(tr("PATTERN_NAME"), aPattGrp);
+ myName = new QLineEdit(aPattGrp);
+
+ // Picture 2d
+
+ myPicture2d = new SMESHGUI_PatternWidget(aPatternGrp),
+ myPicture2d->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
+
+ // Project check box
+
+ myProjectChk = new QCheckBox(tr("PROJECT"), aPatternGrp);
+
+ // Connect signals and slots
+
+ connect(myTypeGrp, SIGNAL(clicked(int) ), SLOT(onTypeChanged(int)));
+ connect(myProjectChk, SIGNAL(toggled(bool)), SLOT(onProject(bool) ));
+ connect(aSelBtn, SIGNAL(clicked() ), SLOT(onSelBtnClicked()));
+
+ return aMainGrp;
+}
+
+//=======================================================================
+// function : createButtonFrame()
+// purpose : Create frame containing buttons
+//=======================================================================
+QFrame* SMESHGUI_CreatePatternDlg::createButtonFrame (QWidget* theParent)
+{
+ QFrame* aFrame = new QFrame(theParent);
+ aFrame->setFrameStyle(QFrame::Box | QFrame::Sunken);
+
+ myOkBtn = new QPushButton(tr("SMESH_BUT_OK" ), aFrame);
+ mySaveBtn = new QPushButton(tr("SAVE" ), aFrame);
+ myCloseBtn = new QPushButton(tr("SMESH_BUT_CANCEL"), aFrame);
+ myHelpBtn = new QPushButton(tr("SMESH_BUT_HELP"), aFrame);
+
+ QSpacerItem* aSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
+
+ QHBoxLayout* aLay = new QHBoxLayout(aFrame, MARGIN, SPACING);
+
+ aLay->addWidget(myOkBtn);
+ aLay->addWidget(mySaveBtn);
+ aLay->addItem(aSpacer);
+ aLay->addWidget(myCloseBtn);
+ aLay->addWidget(myHelpBtn);
+
+ connect(myOkBtn, SIGNAL(clicked()), SLOT(onOk()));
+ connect(myCloseBtn, SIGNAL(clicked()), SLOT(onClose()));
+ connect(mySaveBtn, SIGNAL(clicked()), SLOT(onSave()));
+ connect(myHelpBtn, SIGNAL(clicked()), SLOT(onHelp()));
+
+ return aFrame;
+}
+
+//=======================================================================
+// function : ~SMESHGUI_CreatePatternDlg()
+// purpose : Destructor
+//=======================================================================
+SMESHGUI_CreatePatternDlg::~SMESHGUI_CreatePatternDlg()
+{
+ // no need to delete child widgets, Qt does it all for us
+}
+
+//=======================================================================
+// function : onProject()
+// purpose : SLOT. Called when state of "Project nodes on ther face"
+// checkbox is changed
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::onProject (bool)
+{
+ loadFromObject(false);
+ displayPreview();
+}
+
+//=======================================================================
+// function : Init()
+// purpose : Init dialog fields, connect signals and slots, show dialog
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::Init( const int theType )
+{
+ myIsLoaded = false;
+ myType = -1;
+ myNbPoints = -1;
+ mySubMesh = SMESH::SMESH_subMesh::_nil();
+ myMesh = SMESH::SMESH_Mesh::_nil();
+ myGeomObj = GEOM::GEOM_Object::_nil();
+ myPattern = SMESH::SMESH_Pattern::_nil();
+
+ erasePreview();
+
+ mySMESHGUI->SetActiveDialogBox((QDialog*)this);
+
+ // selection and SMESHGUI
+ connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));
+ connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate()));
+ connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose()));
+
+ mySwitch2d->setEnabled(theType == Type_2d);
+ mySwitch3d->setEnabled(theType == Type_3d);
+
+ if (theType == Type_2d)
+ myProjectChk->show();
+ else
+ myProjectChk->hide();
+
+ myTypeGrp->setButton(theType);
+ onTypeChanged(theType);
+
+ myName->setText(getDefaultName());
+ myMeshEdit->setText("");
+
+ setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding));
+ qApp->processEvents();
+ updateGeometry();
+ myPicture2d->updateGeometry();
+ adjustSize();
+ resize(minimumSize());
+
+ activateSelection();
+ onSelectionDone();
+
+ this->show();
+}
+
+//=======================================================================
+// function : SetMesh()
+// purpose : Set mesh to dialog
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::SetMesh (SMESH::SMESH_Mesh_ptr thePtr)
+{
+ myMesh = SMESH::SMESH_Mesh::_duplicate(thePtr);
+ mySubMesh = SMESH::SMESH_subMesh::_nil();
+
+ bool isValidMesh = false;
+ if (!myMesh->_is_nil())
+ {
+ _PTR(SObject) aSobj = SMESH::FindSObject(myMesh.in());
+ //Handle(SALOME_InteractiveObject) anIObj =
+ // new SALOME_InteractiveObject(aSobj->GetID().c_str(), "SMESH");
+ SUIT_DataOwnerPtr anIObj (new LightApp_DataOwner(aSobj->GetID().c_str()));
+
+ isValidMesh = mySelectionMgr->isOk(anIObj);
+ }
+
+ if (isValidMesh) {
+ _PTR(SObject) aSO = SMESH::FindSObject(myMesh.in());
+ myMeshEdit->setText(aSO->GetName().c_str());
+ myGeomObj = SMESH::GetGeom(aSO);
+ } else {
+ myMeshEdit->setText("");
+ myGeomObj = GEOM::GEOM_Object::_nil();
+ }
+
+ if (myType == Type_2d) {
+ loadFromObject(false);
+ displayPreview();
+ }
+}
+
+//=======================================================================
+// function : isValid()
+// purpose : Verify validity of entry data
+//=======================================================================
+bool SMESHGUI_CreatePatternDlg::isValid()
+{
+ if (myGeomObj->_is_nil()) {
+ QMessageBox::information(SMESH::GetDesktop( mySMESHGUI ),
+ tr("SMESH_INSUFFICIENT_DATA"),
+ tr("SMESHGUI_INVALID_PARAMETERS"),
+ QMessageBox::Ok);
+ return false;
+ }
+ else
+ return true;
+}
+
+//=======================================================================
+// function : getDefaultName()
+// purpose : Get default pattern name
+//=======================================================================
+QString SMESHGUI_CreatePatternDlg::getDefaultName() const
+{
+ return myType == Type_2d ? tr("DEFAULT_2D") : tr("DEFAULT_3D");
+}
+
+//=======================================================================
+// function : onSave()
+// purpose : SLOT called when "Save" button pressed. Build pattern and
+// save it to disk
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::onSave()
+{
+ try {
+ if (!isValid())
+ return;
+
+ if (!myIsLoaded)
+ loadFromObject(true);
+
+ // Load pattern from object
+ if (!myIsLoaded)
+ return;
+
+ ///////////////////////////////////////////////////////
+ SUIT_FileDlg* aDlg = new SUIT_FileDlg (this, false);
+ aDlg->setCaption(tr("SAVE_PATTERN"));
+ aDlg->setMode(QFileDialog::AnyFile);
+ aDlg->setFilters(tr("PATTERN_FILT"));
+ if (myName->text() != "")
+ aDlg->setSelection(myName->text());
+
+ if (aDlg->exec() != Accepted)
+ return;
+
+ QString fName = aDlg->selectedFile();
+ if (fName.isEmpty())
+ return;
+
+ if (QFileInfo(fName).extension().isEmpty())
+ fName = autoExtension(fName);
+
+ fName = QDir::convertSeparators(fName);
+
+ QString aData (myPattern->GetString());
+ long aLen = aData.length();
+
+ QFile aFile (fName);
+ aFile.open(IO_WriteOnly);
+ long aWritten = aFile.writeBlock(aData, aLen);
+ aFile.close();
+
+ if (aWritten != aLen) {
+ QMessageBox::information(SMESH::GetDesktop( mySMESHGUI ), tr("SMESH_ERROR"),
+ tr("ERROR_OF_SAVING"), QMessageBox::Ok);
+ } else {
+ //SUIT_Application::getDesktop()->setSelectionModes(ActorSelection);
+ if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+ aViewWindow->SetSelectionMode(ActorSelection);
+ disconnect(mySelectionMgr, 0, this, 0);
+ disconnect(mySMESHGUI, 0, this, 0);
+ mySMESHGUI->ResetState();
+ accept();
+ emit NewPattern();
+ }
+ } catch (const SALOME::SALOME_Exception& S_ex) {
+ SalomeApp_Tools::QtCatchCorbaException(S_ex);
+ } catch (...) {
+ }
+}
+
+//=======================================================================
+// function : GetPatternName()
+// purpose : Get name of pattern
+//=======================================================================
+QString SMESHGUI_CreatePatternDlg::GetPatternName() const
+{
+ return myName->text();
+}
+
+//=======================================================================
+// function : GetPattern()
+// purpose : Get result pattern
+//=======================================================================
+SMESH::SMESH_Pattern_ptr SMESHGUI_CreatePatternDlg::GetPattern()
+{
+ return myPattern.in();
+}
+
+//=======================================================================
+// function : onOk()
+// purpose : SLOT called when "Ok" button pressed.
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::onOk()
+{
+ try {
+ if (!isValid())
+ return;
+
+ if (!myIsLoaded)
+ loadFromObject(true);
+
+ // Load pattern from object
+ if (!myIsLoaded) {
+ return;
+ } else {
+ //SUIT_Application::getDesktop()->setSelectionModes(ActorSelection);
+ if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+ aViewWindow->SetSelectionMode(ActorSelection);
+ disconnect(mySelectionMgr, 0, this, 0);
+ disconnect(mySMESHGUI, 0, this, 0);
+ mySMESHGUI->ResetState();
+ accept();
+ emit NewPattern();
+ }
+ } catch (const SALOME::SALOME_Exception& S_ex) {
+ SalomeApp_Tools::QtCatchCorbaException(S_ex);
+ } catch (...) {
+ }
+}
+
+//=======================================================================
+// function : onClose()
+// purpose : SLOT called when "Close" button pressed. Close dialog
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::onClose()
+{
+ if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+ aViewWindow->SetSelectionMode(ActorSelection);
+ disconnect(mySelectionMgr, 0, this, 0);
+ disconnect(mySMESHGUI, 0, this, 0);
+ mySMESHGUI->ResetState();
+ reject();
+ emit Close();
+}
+
+//=================================================================================
+// function : onHelp()
+// purpose :
+//=================================================================================
+void SMESHGUI_CreatePatternDlg::onHelp()
+{
+ LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
+ if (app)
+ app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
+ else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
+ SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
+ QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(myHelpFileName),
+ QObject::tr("BUT_OK"));
+ }
+}
+
+//=======================================================================
+// function : loadFromObject()
+// purpose : Load pattern from geom object corresponding to the mesh/submesh
+//=======================================================================
+bool SMESHGUI_CreatePatternDlg::loadFromObject (const bool theMess)
+{
+ try {
+ myIsLoaded = false;
+
+ if (myPattern->_is_nil())
+ myPattern = SMESH::GetPattern();
+
+ if (myMesh->_is_nil() && mySubMesh->_is_nil() || myGeomObj->_is_nil())
+ return false;
+
+ SMESH::SMESH_Mesh_ptr aMesh = mySubMesh->_is_nil() ? myMesh.in() : mySubMesh->GetFather();
+
+ myIsLoaded = myType == Type_2d
+ ? myPattern->LoadFromFace(aMesh, myGeomObj, myProjectChk->isChecked())
+ : myPattern->LoadFrom3DBlock(aMesh, myGeomObj);
+
+ if (!myIsLoaded && theMess) {
+ QString aMess;
+ SMESH::SMESH_Pattern::ErrorCode aCode = myPattern->GetErrorCode();
+
+ if (aCode == SMESH::SMESH_Pattern::ERR_LOAD_EMPTY_SUBMESH ) aMess = tr("ERR_LOAD_EMPTY_SUBMESH");
+ else if (aCode == SMESH::SMESH_Pattern::ERR_LOADF_NARROW_FACE ) aMess = tr("ERR_LOADF_NARROW_FACE");
+ else if (aCode == SMESH::SMESH_Pattern::ERR_LOADF_CLOSED_FACE ) aMess = tr("ERR_LOADF_CLOSED_FACE");
+ else if (aCode == SMESH::SMESH_Pattern::ERR_LOADF_CANT_PROJECT ) aMess = tr("ERR_LOADF_CANT_PROJECT");
+ else if (aCode == SMESH::SMESH_Pattern::ERR_LOADV_BAD_SHAPE ) aMess = tr("ERR_LOADV_BAD_SHAPE");
+ else if (aCode == SMESH::SMESH_Pattern::ERR_LOADV_COMPUTE_PARAMS) aMess = tr("ERR_LOADV_COMPUTE_PARAMS");
+ else aMess = tr("ERROR_OF_CREATION");
+
+ QMessageBox::information(SMESH::GetDesktop( mySMESHGUI ),
+ tr("SMESH_ERROR"), aMess, QMessageBox::Ok);
+ }
+ } catch (const SALOME::SALOME_Exception& S_ex) {
+ SalomeApp_Tools::QtCatchCorbaException(S_ex);
+ }
+
+ return myIsLoaded;
+}
+
+//=======================================================================
+// function : onSelectionDone()
+// purpose : SLOT called when selection changed
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::onSelectionDone()
+{
+ try {
+ SALOME_ListIO aList;
+ mySelectionMgr->selectedObjects(aList, SVTK_Viewer::Type());
+ if (aList.Extent() != 1)
+ return;
+
+ // Get mesh or sub-mesh from selection
+ Handle(SALOME_InteractiveObject) anIO = aList.First();
+ SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIO);
+ SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(anIO);
+ if (aMesh->_is_nil() && aSubMesh->_is_nil())
+ return;
+
+ // Get geom object corresponding to the mesh
+ _PTR(SObject) aSO;
+ if (!aMesh->_is_nil())
+ aSO = SMESH::FindSObject(aMesh.in());
+ else
+ aSO = SMESH::FindSObject(aSubMesh.in());
+
+ GEOM::GEOM_Object_var aGeomObj = SMESH::GetGeom(aSO);
+ if (aGeomObj->_is_nil())
+ return;
+
+ myGeomObj = aGeomObj;
+
+ // init class fields
+ if (!aMesh->_is_nil()) {
+ myMesh = aMesh;
+ mySubMesh = SMESH::SMESH_subMesh::_nil();
+ } else {
+ mySubMesh = aSubMesh;
+ myMesh = SMESH::SMESH_Mesh::_nil();
+ }
+
+ QString aName;
+ SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aName);
+ myMeshEdit->setText(aName);
+
+ if (myType == Type_2d) {
+ loadFromObject(true);
+ displayPreview();
+ }
+ } catch (...) {
+ myMesh = SMESH::SMESH_Mesh::_nil();
+ mySubMesh = SMESH::SMESH_subMesh::_nil();
+ myGeomObj = GEOM::GEOM_Object::_nil();
+ erasePreview();
+ }
+}
+
+//=======================================================================
+// function : onDeactivate()
+// purpose : SLOT called when dialog must be deativated
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::onDeactivate()
+{
+ disconnect(mySelectionMgr, 0, this, 0);
+ setEnabled(false);
+}
+
+//=======================================================================
+// function : enterEvent()
+// purpose : Event filter
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::enterEvent (QEvent*)
+{
+ // there is a stange problem that enterEvent() comes after onSave()
+ if ( isVisible () ) {
+ mySMESHGUI->EmitSignalDeactivateDialog();
+ setEnabled(true);
+ activateSelection();
+ connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));
+ }
+}
+
+//=================================================================================
+// function : closeEvent()
+// purpose : Close dialog box
+//=================================================================================
+void SMESHGUI_CreatePatternDlg::closeEvent (QCloseEvent*)
+{
+ onClose();
+}
+
+//=======================================================================
+// function : onSelBtnClicked()
+// purpose : SLOT. Called when -> button clicked.
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::onSelBtnClicked()
+{
+ onSelectionDone();
+}
+
+//================================================================
+// function : autoExtension()
+// purpose : Append extension to the file name
+//================================================================
+QString SMESHGUI_CreatePatternDlg::autoExtension (const QString& theFileName) const
+{
+ QString anExt = theFileName.section('.', -1);
+ return anExt != "smp" && anExt != "SMP" ? theFileName + ".smp" : theFileName;
+}
+
+//=======================================================================
+// function : displayPreview()
+// purpose : Display preview
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::displayPreview()
+{
+ // Redisplay preview in dialog
+ try {
+ if (!myIsLoaded) {
+ erasePreview();
+ } else {
+ SMESH::point_array_var pnts = myPattern->GetPoints();
+ SMESH::long_array_var keyPoints = myPattern->GetKeyPoints();
+ SMESH::array_of_long_array_var elemPoints = myPattern->GetElementPoints(false);
+
+ if (pnts->length() == 0 ||
+ keyPoints->length() == 0 ||
+ elemPoints->length() == 0) {
+ myIsLoaded = false;
+ erasePreview();
+ return;
+ }
+
+ PointVector aPoints (pnts->length());
+ QValueVector<int> aKeyPoints (keyPoints->length());
+ ConnectivityVector anElemPoints (elemPoints->length());
+
+ for (int i = 0, n = pnts->length(); i < n; i++)
+ aPoints[ i ] = pnts[ i ];
+
+ for (int i2 = 0, n2 = keyPoints->length(); i2 < n2; i2++)
+ aKeyPoints[ i2 ] = keyPoints[ i2 ];
+
+ for (int i3 = 0, n3 = elemPoints->length(); i3 < n3; i3++) {
+ QValueVector<int> aVec (elemPoints[ i3 ].length());
+ for (int i4 = 0, n4 = elemPoints[ i3 ].length(); i4 < n4; i4++)
+ aVec[ i4 ] = elemPoints[ i3 ][ i4 ];
+
+ anElemPoints[ i3 ] = aVec;
+ }
+
+ myPicture2d->SetPoints(aPoints, aKeyPoints, anElemPoints);
+ }
+
+ return;
+
+ } catch (const SALOME::SALOME_Exception& S_ex) {
+ SalomeApp_Tools::QtCatchCorbaException(S_ex);
+ } catch (...) {
+ }
+ erasePreview();
+}
+
+//=======================================================================
+// function : erasePreview()
+// purpose : Erase preview
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::erasePreview()
+{
+ // Erase preview in 2D viewer
+ myPicture2d->SetPoints(PointVector(), QValueVector<int>(), ConnectivityVector());
+}
+
+//=======================================================================
+// function : activateSelection()
+// purpose : Activate selection in accordance with current pattern type
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::activateSelection()
+{
+ mySelectionMgr->clearFilters();
+ //SUIT_Application::getDesktop()->setSelectionModes(ActorSelection);
+ if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+ aViewWindow->SetSelectionMode(ActorSelection);
+
+ if (myType == Type_2d) {
+ mySelectionMgr->installFilter(new SMESH_NumberFilter
+ ("SMESH", TopAbs_SHAPE, -1, TopAbs_FACE));
+ } else {
+ TColStd_MapOfInteger aTypes;
+ aTypes.Add(TopAbs_SHELL);
+ aTypes.Add(TopAbs_SOLID);
+ mySelectionMgr->installFilter(new SMESH_NumberFilter
+ ("SMESH", TopAbs_FACE, 6, aTypes, GEOM::GEOM_Object::_nil(), true));
+ }
+}
+
+//=======================================================================
+// function : onTypeChanged()
+// purpose : SLOT. Called when pattern type changed.
+// Change dialog's look and feel
+//=======================================================================
+void SMESHGUI_CreatePatternDlg::onTypeChanged (int theType)
+{
+ if (myType == theType)
+ return;
+
+ myType = theType;
+
+ if (theType == Type_2d)
+ myPicture2d->show();
+ else
+ myPicture2d->hide();
+}
+
+//=================================================================================
+// function : keyPressEvent()
+// purpose :
+//=================================================================================
+void SMESHGUI_CreatePatternDlg::keyPressEvent( QKeyEvent* e )
+{
+ QDialog::keyPressEvent( e );
+ if ( e->isAccepted() )
+ return;
+
+ if ( e->key() == Key_F1 )
+ {
+ e->accept();
+ onHelp();
+ }
+}