Salome HOME
*** empty log message ***
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_CreatePatternDlg.cxx
index a7990a79ac0792e8255352bf4fbefb511e1d89dd..28bb9ad0c5e05707628d1398d5994fee150ab6d1 100755 (executable)
-//  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-//  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 "SalomeApp_Study.h"
-#include "SalomeApp_DataOwner.h"
-#include "SalomeApp_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 ) ),
-     myViewWindow( SMESH::GetViewWindow( theModule ) ),
-     mySelector( myViewWindow->GetSelector() )
-{
-  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);
-
-  Init(theType);
-}
-
-//=======================================================================
-// function : createMainFrame()
-// purpose  : Create frame containing dialog's input fields
-//=======================================================================
-QFrame* SMESHGUI_CreatePatternDlg::createMainFrame (QWidget* theParent)
-{
-  QPixmap iconSlct     (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_SELECT")));
-  QPixmap icon2d       (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_PATTERN_2d")));
-  QPixmap icon3d       (SMESHGUI::resourceMgr()->loadPixmap("SMESH", tr("ICON_PATTERN_3d")));
-  QPixmap iconSample2d (SMESHGUI::resourceMgr()->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);
-
-  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);
-
-  connect(myOkBtn,    SIGNAL(clicked()), SLOT(onOk()));
-  connect(myCloseBtn, SIGNAL(clicked()), SLOT(onClose()));
-  connect(mySaveBtn, SIGNAL(clicked()), SLOT(onSave()));
-
-  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();
-
-  int x, y;
-  mySMESHGUI->DefineDlgPosition(this, x, y);
-  this->move(x, y);
-  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 SalomeApp_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);
-      myViewWindow->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);
-      myViewWindow->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()
-{
-  myViewWindow->SetSelectionMode(ActorSelection);
-  disconnect(mySelectionMgr, 0, this, 0);
-  disconnect(mySMESHGUI, 0, this, 0);
-  mySMESHGUI->ResetState();
-  reject();
-  emit Close();
-}
-
-//=======================================================================
-// 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_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*)
-{
-  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);
-  myViewWindow->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();
-}
+//  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 "SalomeApp_DataOwner.h"\r
+#include "SalomeApp_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
+     myViewWindow( SMESH::GetViewWindow( theModule ) ),\r
+     mySelector( myViewWindow->GetSelector() )\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
+  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 SalomeApp_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
+      myViewWindow->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 : 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
+      myViewWindow->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
+  myViewWindow->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
+  myViewWindow->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