X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_FindElemByPointDlg.cxx;h=89515cad680d0f4f2ac47ea4e9d91b8e547251cf;hb=d56eabb870970121f19ef82bed08ec53d6aa8d15;hp=afb294ffdd1ab5259933b0befb5bdd4fd3813398;hpb=2c607013a23bd4e7ba07e72e0c04dee2c1209cff;p=modules%2Fsmesh.git diff --git a/src/SMESHGUI/SMESHGUI_FindElemByPointDlg.cxx b/src/SMESHGUI/SMESHGUI_FindElemByPointDlg.cxx index afb294ffd..89515cad6 100644 --- a/src/SMESHGUI/SMESHGUI_FindElemByPointDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_FindElemByPointDlg.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 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 @@ -19,8 +19,9 @@ // File : SMESHGUI_FindElemByPointDlg.cxx // Author : Edward AGAPOV, Open CASCADE S.A.S. -// SMESH includes // + +// SMESH includes #include "SMESHGUI_FindElemByPointDlg.h" #include "SMESHGUI.h" @@ -29,9 +30,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 +90,61 @@ 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; + case SMESH::BALL: + myElemTypeCombo->addItem( tr( "MEN_BALL" )); + myElemTypeCombo->setId( nbTypes++, int( SMESH::BALL )); + 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 +155,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 +206,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 +240,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 +288,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 +390,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 +458,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 +465,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 +529,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; + } } //================================================================================