00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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
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
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
00061 #include <vtkProperty.h>
00062
00063
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
00093
00094
00095 QWidget* SMESHGUI_FindElemByPointDlg::createMainFrame (QWidget* theParent)
00096 {
00097 QWidget* aFrame = new QWidget(theParent);
00098
00099
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
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
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
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
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
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
00221
00222
00223 void SMESHGUI_FindElemByPointOp::startOperation()
00224 {
00225
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();
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