Version: 6.3.1

src/SMESHGUI/SMESHGUI_FindElemByPointDlg.cxx

Go to the documentation of this file.
00001 // Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // This library is free software; you can redistribute it and/or
00004 // modify it under the terms of the GNU Lesser General Public
00005 // License as published by the Free Software Foundation; either
00006 // version 2.1 of the License.
00007 //
00008 // This library is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011 // Lesser General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU Lesser General Public
00014 // License along with this library; if not, write to the Free Software
00015 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00016 //
00017 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00018 //
00019 
00020 // File   : SMESHGUI_FindElemByPointDlg.cxx
00021 // Author : Edward AGAPOV, Open CASCADE S.A.S.
00022 // SMESH includes
00023 //
00024 #include "SMESHGUI_FindElemByPointDlg.h"
00025 
00026 #include "SMESHGUI.h"
00027 #include "SMESHGUI_MeshUtils.h"
00028 #include "SMESHGUI_VTKUtils.h"
00029 #include "SMESHGUI_SpinBox.h"
00030 #include "SMESHGUI_MeshEditPreview.h"
00031 
00032 #include <SMESH_Actor.h>
00033 #include <SMESH_ActorUtils.h>
00034 #include <SMESH_TypeFilter.hxx>
00035 
00036 // SALOME GUI includes
00037 #include <LightApp_SelectionMgr.h>
00038 #include <QtxComboBox.h>
00039 #include <SALOME_ListIO.hxx>
00040 #include <SUIT_Desktop.h>
00041 #include <SUIT_MessageBox.h>
00042 #include <SUIT_OverrideCursor.h>
00043 #include <SUIT_ResourceMgr.h>
00044 #include <SVTK_ViewModel.h>
00045 #include <SVTK_ViewWindow.h>
00046 #include <SalomeApp_Tools.h>
00047 #include <SalomeApp_TypeFilter.h>
00048 
00049 // Qt includes
00050 #include <QAbstractButton>
00051 #include <QGridLayout>
00052 #include <QGroupBox>
00053 #include <QHBoxLayout>
00054 #include <QLabel>
00055 #include <QLineEdit>
00056 #include <QListWidget>
00057 #include <QPushButton>
00058 #include <QVBoxLayout>
00059 
00060 // VTK includes
00061 #include <vtkProperty.h>
00062 
00063 // IDL includes
00064 #include <SALOMEconfig.h>
00065 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
00066 
00067 #define SPACING 6
00068 #define MARGIN  11
00069 
00070 //=======================================================================
00074 //=======================================================================
00075 
00076 SMESHGUI_FindElemByPointDlg::SMESHGUI_FindElemByPointDlg()
00077   : SMESHGUI_Dialog( 0, false, true, OK | Help )
00078 {
00079   setWindowTitle(tr("CAPTION"));
00080 
00081   QVBoxLayout* aDlgLay = new QVBoxLayout (mainFrame());
00082   aDlgLay->setMargin(0);
00083   aDlgLay->setSpacing(SPACING);
00084 
00085   QWidget* aMainFrame = createMainFrame  (mainFrame());
00086 
00087   aDlgLay->addWidget(aMainFrame);
00088   aDlgLay->setStretchFactor(aMainFrame, 1);
00089 }
00090 
00091 //=======================================================================
00092 // function : createMainFrame()
00093 // purpose  : Create frame containing dialog's input fields
00094 //=======================================================================
00095 QWidget* SMESHGUI_FindElemByPointDlg::createMainFrame (QWidget* theParent)
00096 {
00097   QWidget* aFrame = new QWidget(theParent);
00098 
00099   //mesh name
00100 
00101   QGroupBox* aMeshGrp = new QGroupBox(tr("SMESH_MESH"), aFrame);
00102   QHBoxLayout* aMeshGrpLayout = new QHBoxLayout(aMeshGrp);
00103   aMeshGrpLayout->setMargin(MARGIN);
00104   aMeshGrpLayout->setSpacing(SPACING);
00105 
00106   myMeshName = new QLineEdit(aMeshGrp);
00107   aMeshGrpLayout->addWidget(myMeshName);
00108 
00109   // coordinates
00110 
00111   QGroupBox* aCoordGrp = new QGroupBox(tr("SMESH_COORDINATES"), aFrame);
00112   QHBoxLayout* aCoordGrpLayout = new QHBoxLayout(aCoordGrp);
00113   aCoordGrpLayout->setMargin(MARGIN);
00114   aCoordGrpLayout->setSpacing(SPACING);
00115 
00116   QLabel* aXLabel = new QLabel(tr("SMESH_X"), aCoordGrp);
00117   myX = new SMESHGUI_SpinBox(aCoordGrp);
00118 
00119   QLabel* aYLabel = new QLabel(tr("SMESH_Y"), aCoordGrp);
00120   myY = new SMESHGUI_SpinBox(aCoordGrp);
00121 
00122   QLabel* aZLabel = new QLabel(tr("SMESH_Z"), aCoordGrp);
00123   myZ = new SMESHGUI_SpinBox(aCoordGrp);
00124 
00125   myX->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
00126   myY->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
00127   myZ->RangeStepAndValidator(COORD_MIN, COORD_MAX, 10.0, "length_precision");
00128   myX->SetValue(0);
00129   myY->SetValue(0);
00130   myZ->SetValue(0);
00131 
00132   aCoordGrpLayout->addWidget(aXLabel);
00133   aCoordGrpLayout->addWidget(myX);
00134   aCoordGrpLayout->addWidget(aYLabel);
00135   aCoordGrpLayout->addWidget(myY);
00136   aCoordGrpLayout->addWidget(aZLabel);
00137   aCoordGrpLayout->addWidget(myZ);
00138 
00139   // Elements
00140 
00141   QGroupBox* elementGrp = new QGroupBox(tr("Elements"), aFrame);
00142   QGridLayout* elementGrpLayout = new QGridLayout(elementGrp);
00143   elementGrpLayout->setSpacing(SPACING);
00144   elementGrpLayout->setMargin(MARGIN);
00145 
00146 
00147   myFindBtn = new QPushButton(elementGrp);
00148   myFindBtn->setText(tr("Find"));
00149   //myFindBtn->setCheckable(false);
00150 
00151   myElemTypeCombo = new QtxComboBox(elementGrp);
00152   myElemTypeCombo->addItem( tr( "MEN_ALL" ));    myElemTypeCombo->setId( 0, int( SMESH::ALL   ));
00153   myElemTypeCombo->addItem( tr( "MEN_NODE" ));   myElemTypeCombo->setId( 1, int( SMESH::NODE  ));
00154   myElemTypeCombo->addItem( tr( "MEN_EDGE" ));   myElemTypeCombo->setId( 2, int( SMESH::EDGE  ));
00155   myElemTypeCombo->addItem( tr( "MEN_FACE" ));   myElemTypeCombo->setId( 3, int( SMESH::FACE  ));
00156   myElemTypeCombo->addItem( tr("MEN_VOLUME_3D"));myElemTypeCombo->setId( 4, int( SMESH::VOLUME));
00157   myElemTypeCombo->addItem( tr( "MEN_ELEM0D" )); myElemTypeCombo->setId( 5, int( SMESH::ELEM0D));
00158 
00159   myFoundList = new QListWidget(elementGrp);
00160 
00161   elementGrpLayout->addWidget( myFindBtn,       0, 0 );
00162   elementGrpLayout->addWidget( myElemTypeCombo, 0, 1 );
00163   elementGrpLayout->addWidget( myFoundList,     1, 0, 2, 2 );
00164 
00165 
00166   QVBoxLayout* aLay = new QVBoxLayout(aFrame);
00167   aLay->setMargin( 0 );
00168   aLay->setSpacing( SPACING );
00169   aLay->addWidget(aMeshGrp);
00170   aLay->addWidget(aCoordGrp);
00171   aLay->addWidget(elementGrp);
00172 
00173   // OK instead of "Apply and Close"
00174   if ( QAbstractButton* but = button(OK) )
00175     but->setText( tr("SMESH_BUT_OK"));
00176 
00177   return aFrame;
00178 }
00179 
00180 //================================================================================
00184 //================================================================================
00185 
00186 SMESHGUI_FindElemByPointOp::SMESHGUI_FindElemByPointOp()
00187   :SMESHGUI_SelectionOp()
00188 {
00189   mySimulation = 0;
00190   myDlg = new SMESHGUI_FindElemByPointDlg;
00191   myHelpFileName = "find_element_by_point_page.html";
00192   myFilter = new SMESH_TypeFilter( MESH );
00193 
00194   myPreview = new SMESH::MeshPreviewStruct();
00195 
00196   myPreview->nodesXYZ.length(1);
00197   myPreview->nodesXYZ[0].x = myDlg->myX->GetValue();
00198   myPreview->nodesXYZ[0].y = myDlg->myY->GetValue();
00199   myPreview->nodesXYZ[0].z = myDlg->myZ->GetValue();
00200 
00201   myPreview->elementTypes.length(1);
00202   myPreview->elementTypes[0].SMDS_ElementType = SMESH::NODE;
00203   myPreview->elementTypes[0].isPoly = false;
00204   myPreview->elementTypes[0].nbNodesInElement = 1;
00205 
00206   myPreview->elementConnectivities.length(1);
00207   myPreview->elementConnectivities[0] = 0;
00208 
00209   // connect signals and slots
00210   connect(myDlg->myFindBtn,      SIGNAL(clicked()),               this, SLOT(onFind()));
00211   connect(myDlg->myX,            SIGNAL(valueChanged(double)),    this, SLOT(redisplayPreview()));
00212   connect(myDlg->myY,            SIGNAL(valueChanged(double)),    this, SLOT(redisplayPreview()));
00213   connect(myDlg->myZ,            SIGNAL(valueChanged(double)),    this, SLOT(redisplayPreview()));
00214   connect(myDlg->myFoundList,    SIGNAL(itemSelectionChanged()),  this, SLOT(onElemSelected()));
00215   connect(myDlg->myElemTypeCombo,SIGNAL(currentIndexChanged(int)),this, SLOT(onElemTypeChange(int)));
00216   connect(myDlg,                 SIGNAL(rejectedDlg()),           this, SLOT(onRejectedDlg()));
00217 }
00218 
00219 //=======================================================================
00220 // function : startOperation()
00221 // purpose  : Init dialog fields, connect signals and slots, show dialog
00222 //=======================================================================
00223 void SMESHGUI_FindElemByPointOp::startOperation()
00224 {
00225   // init simulation with a current View
00226   if ( mySimulation ) delete mySimulation;
00227   mySimulation = new SMESHGUI_MeshEditPreview(SMESH::GetViewWindow( getSMESHGUI() ));
00228   vtkProperty* aProp = vtkProperty::New();
00229   aProp->SetRepresentationToWireframe();
00230   aProp->SetColor(250, 0, 250);
00231   aProp->SetPointSize(5);
00232   aProp->SetLineWidth( SMESH::GetFloat("SMESH:element_width",1) + 1);
00233   mySimulation->GetActor()->SetProperty(aProp);
00234   aProp->Delete();
00235 
00236   myDlg->myElemTypeCombo->setCurrentId( int(SMESH::ALL));
00237 
00238   SMESHGUI_SelectionOp::startOperation();
00239   myDlg->show();
00240   redisplayPreview();
00241 
00242   onSelectionDone(); // init myMesh
00243 }
00244 
00245 //================================================================================
00249 //================================================================================
00250 
00251 void SMESHGUI_FindElemByPointOp::stopOperation()
00252 {
00253   if ( mySimulation )
00254   {
00255     mySimulation->SetVisibility(false);
00256     delete mySimulation;
00257     mySimulation = 0;
00258   }
00259   selectionMgr()->removeFilter( myFilter );
00260   SMESHGUI_SelectionOp::stopOperation();
00261 }
00262 
00263 //================================================================================
00267 //================================================================================
00268 
00269 void SMESHGUI_FindElemByPointOp::onElemSelected()
00270 {
00271   if ( !myMeshIO.IsNull() )
00272   {
00273     Selection_Mode selMode =
00274       myDlg->myElemTypeCombo->currentId() == int(SMESH::NODE) ? NodeSelection : CellSelection;
00275     if ( selectionMode() != selMode )
00276       setSelectionMode( selMode );
00277 
00278     QList<QListWidgetItem *> ids = myDlg->myFoundList->selectedItems();
00279     QList<QListWidgetItem*>::iterator id = ids.begin();
00280     TColStd_MapOfInteger idMap;
00281     for ( ; id != ids.end(); ++id )
00282       idMap.Add( (*id)->text().toInt() );
00283 
00284     addOrRemoveIndex( myMeshIO, idMap, false );
00285 
00286     SALOME_ListIO aList;
00287     aList.Append(myMeshIO);
00288     selectionMgr()->setSelectedObjects(aList,false);
00289   }
00290 }
00291 
00292 //================================================================================
00296 //================================================================================
00297 
00298 void SMESHGUI_FindElemByPointOp::onElemTypeChange(int index)
00299 {
00300   Selection_Mode newMode = (index == 1) ? NodeSelection : CellSelection;
00301   if ( selectionMode() != newMode )
00302   {
00303     selectionMgr()->clearFilters();
00304     setSelectionMode( newMode );
00305   }
00306   myDlg->myFoundList->clear();
00307 }
00308 
00309 //================================================================================
00313 //================================================================================
00314 
00315 void SMESHGUI_FindElemByPointDlg::reject()
00316 {
00317   emit rejectedDlg();
00318   QtxDialog::reject();
00319 }
00320 
00321 //================================================================================
00325 //================================================================================
00326 
00327 void SMESHGUI_FindElemByPointOp::onRejectedDlg()
00328 {
00329   myMeshIO.Nullify(); 
00330 }
00331 
00332 //================================================================================
00336 //================================================================================
00337 
00338 void SMESHGUI_FindElemByPointOp::onFind()
00339 {
00340   if ( myMesh->_is_nil() ) {
00341     return;
00342   }
00343 
00344   try {
00345     SUIT_OverrideCursor wc;
00346 
00347     SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
00348     if (aMeshEditor->_is_nil())
00349       return;
00350 
00351     SMESH::long_array_var foundIds =
00352       aMeshEditor->FindElementsByPoint( myDlg->myX->GetValue(),
00353                                         myDlg->myY->GetValue(),
00354                                         myDlg->myZ->GetValue(),
00355                                         SMESH::ElementType( myDlg->myElemTypeCombo->currentId() ));
00356     myDlg->myFoundList->clear();
00357     for ( int i = 0; i < foundIds->length(); ++i )
00358       myDlg->myFoundList->addItem( QString::number( foundIds[i] ));
00359 
00360     if ( foundIds->length() > 0 )
00361       myDlg->myFoundList->setCurrentRow(0);
00362   }
00363   catch (const SALOME::SALOME_Exception& S_ex) {
00364     SalomeApp_Tools::QtCatchCorbaException(S_ex);
00365   }
00366   catch (...) {
00367   }
00368 }
00369 
00370 //================================================================================
00374 //================================================================================
00375 
00376 bool SMESHGUI_FindElemByPointOp::onApply()
00377 {
00378   onRejectedDlg();
00379   return true;
00380 }
00381 
00382 //================================================================================
00386 //================================================================================
00387 
00388 void SMESHGUI_FindElemByPointOp::onSelectionDone()
00389 {
00390   if ( !myDlg->isVisible() || !myDlg->isEnabled() )
00391     return;
00392 
00393   QString oldMeshEntry, newMeshEntry;
00394   if ( !myMeshIO.IsNull() && myMeshIO->hasEntry() )
00395     oldMeshEntry = myMeshIO->getEntry();
00396 
00397   myDlg->myMeshName->setText("");
00398   myMeshIO.Nullify();
00399 
00400   try {
00401     SALOME_ListIO aList;
00402     selectionMgr()->selectedObjects(aList, SVTK_Viewer::Type());
00403     if (aList.Extent() == 1 && aList.First()->hasEntry())
00404     {
00405       Handle(SALOME_InteractiveObject) anIO = aList.First();
00406       _PTR(SObject) pObj = studyDS()->FindObjectID(anIO->getEntry());
00407       myMesh = SMESH::GetMeshByIO( anIO );
00408       if ( pObj && !myMesh->_is_nil() )
00409       {
00410         myMeshIO = anIO;
00411         myDlg->myMeshName->setText( pObj->GetName().c_str() );
00412         newMeshEntry = anIO->getEntry();
00413       }
00414     }
00415   }
00416   catch (...) {
00417   }
00418 
00419   if ( oldMeshEntry != newMeshEntry || newMeshEntry.isEmpty() )
00420     myDlg->myFoundList->clear();
00421 
00422   myDlg->myFindBtn->setEnabled( !myMeshIO.IsNull() );
00423 }
00424 
00425 //================================================================================
00429 //================================================================================
00430 
00431 void SMESHGUI_FindElemByPointOp::redisplayPreview()
00432 {
00433   myDlg->myFoundList->clear();
00434 
00435   myPreview->nodesXYZ[0].x = myDlg->myX->GetValue();
00436   myPreview->nodesXYZ[0].y = myDlg->myY->GetValue();
00437   myPreview->nodesXYZ[0].z = myDlg->myZ->GetValue();
00438 
00439   mySimulation->SetData(&myPreview.in());
00440 }
00441 
00442 //================================================================================
00446 //================================================================================
00447 
00448 void SMESHGUI_FindElemByPointOp::activateSelection()
00449 {
00450   selectionMgr()->clearFilters();
00451   selectionMgr()->installFilter( myFilter );
00452 }
00453 
00454 //================================================================================
00458 //================================================================================
00459 
00460 SMESHGUI_FindElemByPointOp::~SMESHGUI_FindElemByPointOp()
00461 {
00462   if ( myDlg )         { delete myDlg;        myDlg = 0; }
00463   if ( mySimulation )  { delete mySimulation; mySimulation = 0; }
00464   if ( myFilter )      { delete myFilter;     myFilter = 0; }
00465 }
00466 
00467 //================================================================================
00472 //================================================================================
00473 
00474 LightApp_Dialog* SMESHGUI_FindElemByPointOp::dlg() const
00475 {
00476   return myDlg;
00477 }
00478 
Copyright © 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
Copyright © 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS