X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_FindElemByPointDlg.cxx;h=329a587e88ba3fce902b9af90abda15bf492ac68;hb=f932a6abb6c38b379f501ceec12d90cce92d90c7;hp=ac6d9f3a903a8f20dd55013895e97248420050cc;hpb=b9918993a178cb487a59f51cf16d9888d1a0fc9d;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_FindElemByPointDlg.cxx b/src/SMESHGUI/SMESHGUI_FindElemByPointDlg.cxx index ac6d9f3a9..329a587e8 100644 --- a/src/SMESHGUI/SMESHGUI_FindElemByPointDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_FindElemByPointDlg.cxx @@ -1,20 +1,20 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE // -// 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 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. +// 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 +// 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 +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // File : SMESHGUI_FindElemByPointDlg.cxx @@ -29,9 +29,10 @@ #include "SMESHGUI_SpinBox.h" #include "SMESHGUI_MeshEditPreview.h" -#include -#include -#include +#include "SMESH_Actor.h" +#include "SMESH_ActorUtils.h" +#include "SMESH_TypeFilter.hxx" +#include "SMESH_LogicalFilter.hxx" // SALOME GUI includes #include @@ -88,6 +89,57 @@ SMESHGUI_FindElemByPointDlg::SMESHGUI_FindElemByPointDlg() aDlgLay->setStretchFactor(aMainFrame, 1); } +//================================================================================ +/*! + * \brief Set types of elements available for search + */ +//================================================================================ + +void SMESHGUI_FindElemByPointDlg::setTypes(SMESH::array_of_ElementType_var & types) +{ + myElemTypeCombo->blockSignals(true); + myElemTypeCombo->clear(); + int nbTypes = 0, hasNodes = 0; + for ( int i = 0; i < types->length(); ++i ) + { + switch ( types[i] ) { + case SMESH::NODE: + myElemTypeCombo->addItem( tr( "MEN_NODE" )); + myElemTypeCombo->setId( nbTypes++, int( SMESH::NODE )); + hasNodes = 1; + break; + case SMESH::EDGE: + myElemTypeCombo->addItem( tr( "MEN_EDGE" )); + myElemTypeCombo->setId( nbTypes++, int( SMESH::EDGE )); + break; + case SMESH::FACE: + myElemTypeCombo->addItem( tr( "MEN_FACE" )); + myElemTypeCombo->setId( nbTypes++, int( SMESH::FACE )); + break; + case SMESH::VOLUME: + myElemTypeCombo->addItem( tr( "MEN_VOLUME_3D" )); + myElemTypeCombo->setId( nbTypes++, int( SMESH::VOLUME )); + break; + case SMESH::ELEM0D: + myElemTypeCombo->addItem( tr( "MEN_ELEM0D" )); + myElemTypeCombo->setId( nbTypes++, int( SMESH::ELEM0D )); + break; + default:; + } + } + if ( nbTypes - hasNodes > 1 ) + { + myElemTypeCombo->addItem( tr( "MEN_ALL" )); + myElemTypeCombo->setId( nbTypes++, int( SMESH::ALL )); + } + if ( !hasNodes && nbTypes > 0 ) + { + myElemTypeCombo->addItem( tr( "MEN_NODE" )); + myElemTypeCombo->setId( nbTypes++, int( SMESH::NODE )); + } + myElemTypeCombo->blockSignals(false); +} + //======================================================================= // function : createMainFrame() // purpose : Create frame containing dialog's input fields @@ -98,7 +150,7 @@ QWidget* SMESHGUI_FindElemByPointDlg::createMainFrame (QWidget* theParent) //mesh name - QGroupBox* aMeshGrp = new QGroupBox(tr("SMESH_MESH"), aFrame); + QGroupBox* aMeshGrp = new QGroupBox(tr("MESH_GROUP"), aFrame); QHBoxLayout* aMeshGrpLayout = new QHBoxLayout(aMeshGrp); aMeshGrpLayout->setMargin(MARGIN); aMeshGrpLayout->setSpacing(SPACING); @@ -149,12 +201,6 @@ QWidget* SMESHGUI_FindElemByPointDlg::createMainFrame (QWidget* theParent) //myFindBtn->setCheckable(false); myElemTypeCombo = new QtxComboBox(elementGrp); - myElemTypeCombo->addItem( tr( "MEN_ALL" )); myElemTypeCombo->setId( 0, int( SMESH::ALL )); - myElemTypeCombo->addItem( tr( "MEN_NODE" )); myElemTypeCombo->setId( 1, int( SMESH::NODE )); - myElemTypeCombo->addItem( tr( "MEN_EDGE" )); myElemTypeCombo->setId( 2, int( SMESH::EDGE )); - myElemTypeCombo->addItem( tr( "MEN_FACE" )); myElemTypeCombo->setId( 3, int( SMESH::FACE )); - myElemTypeCombo->addItem( tr("MEN_VOLUME_3D"));myElemTypeCombo->setId( 4, int( SMESH::VOLUME)); - myElemTypeCombo->addItem( tr( "MEN_ELEM0D" )); myElemTypeCombo->setId( 5, int( SMESH::ELEM0D)); myFoundList = new QListWidget(elementGrp); @@ -189,7 +235,11 @@ SMESHGUI_FindElemByPointOp::SMESHGUI_FindElemByPointOp() mySimulation = 0; myDlg = new SMESHGUI_FindElemByPointDlg; myHelpFileName = "find_element_by_point_page.html"; - myFilter = new SMESH_TypeFilter( MESH ); + + QList filters; + filters.append( new SMESH_TypeFilter( MESH ) ); + filters.append( new SMESH_TypeFilter( GROUP ) ); + myFilter = new SMESH_LogicalFilter( filters, SMESH_LogicalFilter::LO_OR ); myPreview = new SMESH::MeshPreviewStruct(); @@ -233,13 +283,11 @@ void SMESHGUI_FindElemByPointOp::startOperation() mySimulation->GetActor()->SetProperty(aProp); aProp->Delete(); - myDlg->myElemTypeCombo->setCurrentId( int(SMESH::ALL)); - SMESHGUI_SelectionOp::startOperation(); myDlg->show(); redisplayPreview(); - onSelectionDone(); // init myMesh + onSelectionDone(); // init myMeshOrPart } //================================================================================ @@ -337,22 +385,33 @@ void SMESHGUI_FindElemByPointOp::onRejectedDlg() void SMESHGUI_FindElemByPointOp::onFind() { - if ( myMesh->_is_nil() ) { + if ( myMeshOrPart->_is_nil() ) return; - } try { SUIT_OverrideCursor wc; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); + SMESH::SMESH_Mesh_var aMesh = myMeshOrPart->GetMesh(); + if ( aMesh->_is_nil() ) + return; + SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); if (aMeshEditor->_is_nil()) return; - SMESH::long_array_var foundIds = - aMeshEditor->FindElementsByPoint( myDlg->myX->GetValue(), - myDlg->myY->GetValue(), - myDlg->myZ->GetValue(), - SMESH::ElementType( myDlg->myElemTypeCombo->currentId() )); + SMESH::long_array_var foundIds; + if ( aMesh->_is_equivalent( myMeshOrPart ) ) + foundIds = + aMeshEditor->FindElementsByPoint( myDlg->myX->GetValue(), + myDlg->myY->GetValue(), + myDlg->myZ->GetValue(), + SMESH::ElementType( myDlg->myElemTypeCombo->currentId())); + else + foundIds = + aMeshEditor->FindAmongElementsByPoint( myMeshOrPart, + myDlg->myX->GetValue(), + myDlg->myY->GetValue(), + myDlg->myZ->GetValue(), + SMESH::ElementType( myDlg->myElemTypeCombo->currentId())); myDlg->myFoundList->clear(); for ( int i = 0; i < foundIds->length(); ++i ) myDlg->myFoundList->addItem( QString::number( foundIds[i] )); @@ -394,9 +453,6 @@ void SMESHGUI_FindElemByPointOp::onSelectionDone() if ( !myMeshIO.IsNull() && myMeshIO->hasEntry() ) oldMeshEntry = myMeshIO->getEntry(); - myDlg->myMeshName->setText(""); - myMeshIO.Nullify(); - try { SALOME_ListIO aList; selectionMgr()->selectedObjects(aList, SVTK_Viewer::Type()); @@ -404,12 +460,19 @@ void SMESHGUI_FindElemByPointOp::onSelectionDone() { Handle(SALOME_InteractiveObject) anIO = aList.First(); _PTR(SObject) pObj = studyDS()->FindObjectID(anIO->getEntry()); - myMesh = SMESH::GetMeshByIO( anIO ); - if ( pObj && !myMesh->_is_nil() ) + CORBA::Object_var anObj = SMESH::IObjectToObject( anIO ); + newMeshEntry = anIO->getEntry(); + SMESH::SMESH_IDSource_var aMeshOrPart = SMESH::SMESH_IDSource::_narrow(anObj); + if ( pObj && !aMeshOrPart->_is_nil() && oldMeshEntry != newMeshEntry ) { + myMeshOrPart = aMeshOrPart; + myMeshIO.Nullify(); myMeshIO = anIO; - myDlg->myMeshName->setText( pObj->GetName().c_str() ); - newMeshEntry = anIO->getEntry(); + std::string name = pObj->GetName(); + myDlg->myMeshName->setText(""); + myDlg->myMeshName->setText( QString( name.c_str() ).trimmed() ); + SMESH::array_of_ElementType_var types = myMeshOrPart->GetTypes(); + myDlg->setTypes( types ); } } } @@ -461,7 +524,14 @@ SMESHGUI_FindElemByPointOp::~SMESHGUI_FindElemByPointOp() { if ( myDlg ) { delete myDlg; myDlg = 0; } if ( mySimulation ) { delete mySimulation; mySimulation = 0; } - if ( myFilter ) { delete myFilter; myFilter = 0; } + if ( myFilter ) + { + QList sub = ((SMESH_LogicalFilter*)myFilter)->getFilters(); + delete sub.front(); + delete sub.back(); + delete myFilter; + myFilter = 0; + } } //================================================================================