00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "SMESHGUI_GroupOnShapeDlg.h"
00028
00029 #include "SMESH_TypeFilter.hxx"
00030 #include "SMESHGUI.h"
00031 #include "SMESHGUI_Utils.h"
00032 #include "SMESHGUI_GEOMGenUtils.h"
00033
00034 #include <GeometryGUI.h>
00035 #include <GEOM_SelectionFilter.h>
00036
00037 #include <SUIT_Session.h>
00038 #include <SUIT_OverrideCursor.h>
00039 #include <LightApp_Application.h>
00040 #include <LightApp_UpdateFlags.h>
00041 #include <SUIT_ResourceMgr.h>
00042
00043 #include <SALOMEconfig.h>
00044 #include CORBA_SERVER_HEADER(SMESH_Mesh)
00045 #include CORBA_SERVER_HEADER(SMESH_Group)
00046
00047 #include <QGroupBox>
00048 #include <QLayout>
00049 #include <QFrame>
00050 #include <QLabel>
00051 #include <QPushButton>
00052 #include <QListWidget>
00053 #include <QLineEdit>
00054
00055 #define SPACING 6
00056 #define MARGIN 11
00057
00058 enum { _MESH, _ELEM_GEOM, _NODE_GEOM };
00059
00060 SMESHGUI_GroupOnShapeDlg::SMESHGUI_GroupOnShapeDlg()
00061 : SMESHGUI_Dialog( 0, false, true )
00062 {
00063 QPixmap image (resourceMgr()->loadPixmap("SMESH", tr("ICON_SELECT")));
00064
00065
00066
00067
00068
00069
00070 QLabel* meshLabel = new QLabel( tr( "SMESH_OBJECT_MESH" ), mainFrame() );
00071 myMeshBtn = new QPushButton( mainFrame() );
00072 myMeshBtn->setCheckable(true);
00073 myMeshBtn->setIcon(image);
00074 myMeshLine = new QLineEdit( mainFrame() );
00075 myMeshLine->setReadOnly(true);
00076
00077
00078
00079 QGroupBox* elemsGrp = new QGroupBox( tr( "SMESH_ELEMENTS" ), mainFrame() );
00080 QLabel* label = new QLabel( tr( "SMESH_GEOM" ), elemsGrp );
00081 myElemGeomBtn = new QPushButton( elemsGrp );
00082 myElemGeomBtn->setCheckable(true);
00083 myElemGeomBtn->setIcon(image);
00084 myElemGeomList = new QListWidget( elemsGrp );
00085 myElemGeomList->setSelectionMode(QListWidget::NoSelection);
00086
00087 QGridLayout* elemLay = new QGridLayout(elemsGrp);
00088 elemLay->setSpacing( SPACING );
00089 elemLay->setMargin( MARGIN );
00090 elemLay->setRowStretch( 1, 1 );
00091 elemLay->addWidget( label, 0, 0 );
00092 elemLay->addWidget( myElemGeomBtn, 0, 1 );
00093 elemLay->addWidget( myElemGeomList, 0, 2, 2, 1);
00094
00095
00096
00097 QGroupBox* nodesGrp = new QGroupBox( tr( "SMESH_NODES" ), mainFrame() );
00098
00099 label = new QLabel( tr( "SMESH_GEOM" ), nodesGrp );
00100 myNodeGeomBtn = new QPushButton( nodesGrp );
00101 myNodeGeomBtn->setCheckable(true);
00102 myNodeGeomBtn->setIcon(image);
00103 myNodeGeomList = new QListWidget( nodesGrp );
00104 myNodeGeomList->setSelectionMode(QListWidget::NoSelection);
00105
00106 QGridLayout* nodeLay = new QGridLayout(nodesGrp);
00107 nodeLay->setSpacing( SPACING );
00108 nodeLay->setMargin( MARGIN );
00109 nodeLay->setRowStretch( 1, 1 );
00110 nodeLay->addWidget( label, 0, 0 );
00111 nodeLay->addWidget( myNodeGeomBtn, 0, 1 );
00112 nodeLay->addWidget(myNodeGeomList, 0, 2, 2, 1);
00113
00114
00115 QGridLayout* aLay = new QGridLayout( mainFrame());
00116 aLay->setSpacing( SPACING );
00117 aLay->setMargin( MARGIN );
00118
00119
00120 aLay->addWidget( meshLabel, 1, 0 );
00121 aLay->addWidget( myMeshBtn, 1, 1 );
00122 aLay->addWidget( myMeshLine,1, 2 );
00123 aLay->addWidget( elemsGrp, 2, 1, 1, 3 );
00124 aLay->addWidget( nodesGrp, 3, 1, 1, 3 );
00125
00126 setWindowTitle( tr( "SMESH_CREATE_GROUP_FROM_GEOM" ) );
00127 }
00128
00129 SMESHGUI_GroupOnShapeDlg::~SMESHGUI_GroupOnShapeDlg()
00130 {
00131 }
00132
00133
00137
00138
00139 void SMESHGUI_GroupOnShapeDlg::updateButtons()
00140 {
00141 bool enable = myElemGeomList->count() + myNodeGeomList->count();
00143
00144 button(Apply)->setEnabled( enable );
00145 button(OK)->setEnabled( enable );
00146 }
00147
00148
00152
00153
00154 void SMESHGUI_GroupOnShapeDlg::init()
00155 {
00156
00157
00158 myMeshBtn->setChecked( true );
00159 myMeshLine->setText("");
00160
00161 myElemGeomBtn->setChecked(false);
00162 myElemGeomBtn->setEnabled(false);
00163 myElemGeomList->clear();
00164 myNodeGeomBtn->setChecked(false);
00165 myNodeGeomBtn->setEnabled(false);
00166 myNodeGeomList->clear();
00167
00168 updateButtons();
00169 }
00170
00171
00175
00176
00177 SMESHGUI_GroupOnShapeOp::SMESHGUI_GroupOnShapeOp()
00178 : SMESHGUI_SelectionOp(ActorSelection),
00179 myDlg( 0 )
00180 {
00181 myHelpFileName = "create_groups_from_geometry_page.html";
00182 }
00183
00184 SMESHGUI_GroupOnShapeOp::~SMESHGUI_GroupOnShapeOp()
00185 {
00186 if ( myDlg )
00187 delete myDlg;
00188 }
00189
00194
00195
00196 LightApp_Dialog* SMESHGUI_GroupOnShapeOp::dlg() const
00197 {
00198 return myDlg;
00199 }
00200
00201
00205
00206
00207 static SMESH::ElementType elementType(GEOM::GEOM_Object_var& geom)
00208 {
00209 if ( !geom->_is_nil() ) {
00210 switch ( geom->GetShapeType() ) {
00211 case GEOM::VERTEX: return SMESH::NODE;
00212 case GEOM::EDGE: return SMESH::EDGE;
00213 case GEOM::WIRE: return SMESH::EDGE;
00214 case GEOM::FACE: return SMESH::FACE;
00215 case GEOM::SHELL: return SMESH::FACE;
00216 case GEOM::SOLID: return SMESH::VOLUME;
00217 case GEOM::COMPSOLID:return SMESH::VOLUME;
00218 case GEOM::COMPOUND: break;
00219 default: return SMESH::ALL;
00220 }
00221 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
00222 GEOM::GEOM_IShapesOperations_var aShapeOp =
00223 SMESH::GetGEOMGen()->GetIShapesOperations(aStudy->StudyId());
00224
00225 if ( geom->GetType() == 37 ) {
00226 GEOM::GEOM_IGroupOperations_var aGroupOp =
00227 SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId());
00228 if ( !aGroupOp->_is_nil() ) {
00229 GEOM::GEOM_Object_var mainShape = aGroupOp->GetMainShape( geom );
00230 GEOM::ListOfLong_var ids = aGroupOp->GetObjects( geom );
00231 if ( ids->length() && !mainShape->_is_nil() && !aShapeOp->_is_nil() ) {
00232 GEOM::GEOM_Object_var member = aShapeOp->GetSubShape( mainShape, ids[0] );
00233 return elementType( member );
00234 }
00235 }
00236 }
00237 else if ( !aShapeOp->_is_nil() ) {
00238 GEOM::ListOfLong_var ids = aShapeOp->SubShapeAllIDs( geom, GEOM::SHAPE, false );
00239 if ( ids->length() ) {
00240 GEOM::GEOM_Object_var member = aShapeOp->GetSubShape( geom, ids[0] );
00241 return elementType( member );
00242 }
00243 }
00244 }
00245 return SMESH::ALL;
00246 }
00247
00248
00252
00253
00254 void SMESHGUI_GroupOnShapeOp::init()
00255 {
00256 myMeshID="";
00257 myElemGeoIDs.clear();
00258 myNodeGeoIDs.clear();
00259
00260 myDlg->init();
00261 removeCustomFilters();
00262 onActivateObject( _MESH );
00263 }
00264
00265
00269
00270
00271 void SMESHGUI_GroupOnShapeOp::startOperation()
00272 {
00273 if (!myDlg)
00274 {
00275 myDlg = new SMESHGUI_GroupOnShapeDlg();
00276 connect(myDlg->myMeshBtn, SIGNAL(clicked()), this, SLOT(onButtonClick()));
00277 connect(myDlg->myElemGeomBtn, SIGNAL(clicked()), this, SLOT(onButtonClick()));
00278 connect(myDlg->myNodeGeomBtn, SIGNAL(clicked()), this, SLOT(onButtonClick()));
00279
00280 }
00281 SMESHGUI_SelectionOp::startOperation();
00282
00283 init();
00284 myDlg->show();
00285 }
00286
00287
00291
00292
00293 bool SMESHGUI_GroupOnShapeOp::onApply()
00294 {
00295 SUIT_OverrideCursor aWaitCursor;
00296
00297 if (isStudyLocked())
00298 return false;
00299
00300
00301 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
00302 if ( !aStudy ) return false;
00303
00304
00305 _PTR(SObject) meshSO = aStudy->FindObjectID( myMeshID.toLatin1().data() );
00306 SMESH::SMESH_Mesh_var mesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( meshSO );
00307 if ( mesh->_is_nil() ) return false;
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321 SMESH::SMESH_GroupOnGeom_var group;
00322 QStringList anEntryList;
00323 for ( int isNode = 0; isNode < 2; ++isNode )
00324 {
00325 QStringList::iterator geomID = isNode ? myNodeGeoIDs.begin() : myElemGeoIDs.begin();
00326 QStringList::iterator geomEnd = isNode ? myNodeGeoIDs.end() : myElemGeoIDs.end();
00327
00328 for ( int i = 0; geomID != geomEnd; ++geomID, ++i )
00329 {
00330
00331 _PTR(SObject) geomSO = aStudy->FindObjectID( geomID->toLatin1().data() );
00332 GEOM::GEOM_Object_var geom = SMESH::SObjectToInterface<GEOM::GEOM_Object>(geomSO);
00333 if ( geom->_is_nil() ) continue;
00334
00335
00336 SMESH::ElementType elemType = isNode ? SMESH::NODE : elementType( geom );
00337 if ( elemType == SMESH::ALL )
00338 continue;
00339
00340
00341 QString name =
00342 isNode ? myDlg->myNodeGeomList->item(i)->text() : myDlg->myElemGeomList->item(i)->text();
00343
00344
00345
00346
00347
00348
00349
00350 group = mesh->CreateGroupFromGEOM( elemType, name.toLatin1().data(), geom );
00351 if( !group->_is_nil() )
00352 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( group ) )
00353 anEntryList.append( aSObject->GetID().c_str() );
00354 }
00355 }
00356 SMESHGUI::Modified();
00357
00358 update( UF_ObjBrowser | UF_Model );
00359
00360
00361 myElemGeoIDs.clear();
00362 myNodeGeoIDs.clear();
00363 removeCustomFilters();
00364 myDlg->myNodeGeomList->clear();
00365 myDlg->myElemGeomList->clear();
00366 myDlg->myElemGeomBtn->setChecked(false);
00367 myDlg->myNodeGeomBtn->setChecked(false);
00368 myDlg->updateButtons();
00369
00370 if( LightApp_Application* anApp =
00371 dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
00372 anApp->browseObjects( anEntryList, isApplyAndClose() );
00373
00374 return !group->_is_nil();
00375 }
00376
00377
00381
00382
00383 void SMESHGUI_GroupOnShapeOp::onButtonClick()
00384 {
00385 removeCustomFilters();
00386
00387 if ( sender() == myDlg->myMeshBtn && myDlg->myMeshBtn->isChecked() )
00388 {
00389 myDlg->myElemGeomBtn->setChecked(false);
00390 myDlg->myNodeGeomBtn->setChecked(false);
00391 onActivateObject( _MESH );
00392 }
00393 else if ( sender() == myDlg->myElemGeomBtn && myDlg->myElemGeomBtn->isChecked() )
00394 {
00395 myDlg->myMeshBtn->setChecked(false);
00396 myDlg->myNodeGeomBtn->setChecked(false);
00397 onActivateObject( _ELEM_GEOM );
00398 }
00399 else if ( sender() == myDlg->myNodeGeomBtn && myDlg->myNodeGeomBtn->isChecked() )
00400 {
00401 myDlg->myMeshBtn->setChecked(false);
00402 myDlg->myElemGeomBtn->setChecked(false);
00403 onActivateObject( _NODE_GEOM );
00404 }
00405
00406 }
00407
00408
00416
00417 SUIT_SelectionFilter* SMESHGUI_GroupOnShapeOp::createFilter( const int theId ) const
00418 {
00419 if ( theId == _ELEM_GEOM || theId == _NODE_GEOM )
00420 return new GEOM_SelectionFilter( (SalomeApp_Study*)study(), true );
00421 else if ( theId == _MESH )
00422 return new SMESH_TypeFilter( MESH );
00423 else
00424 return ( SUIT_SelectionFilter*) 0;
00425 }
00426
00432
00433 void SMESHGUI_GroupOnShapeOp::selectionDone()
00434 {
00435 QStringList names, ids;
00436 LightApp_Dialog::TypesList types;
00437 selected( names, types, ids );
00438 int nbSelected = names.size();
00439
00440 if ( myDlg->myMeshBtn->isChecked() )
00441 {
00442 myDlg->myMeshLine->setText("");
00443 myMeshID = "";
00444 if ( nbSelected == 1 ) {
00445 myDlg->myMeshLine->setText( names.front() );
00446 myMeshID = ids.front();
00447 }
00448 myDlg->myElemGeomList->clear();
00449 myDlg->myElemGeomBtn->setEnabled( nbSelected == 1 );
00450 myDlg->myNodeGeomList->clear();
00451 myDlg->myNodeGeomBtn->setEnabled( nbSelected == 1 );
00452 myDlg->myElemGeomBtn->click();
00453 return;
00454 }
00455
00456
00457
00458 QStringList goodNames, goodIds;
00459 if (nbSelected > 0) {
00460
00461 if (_PTR(Study) aStudy = SMESH::GetActiveStudyDocument()) {
00462
00463 if (_PTR(SObject) meshSO = aStudy->FindObjectID( myMeshID.toLatin1().data() )) {
00464
00465 _PTR(SObject) anObj, shapeToMesh;
00466 if (meshSO->FindSubObject(1, anObj) && anObj->ReferencedObject(shapeToMesh)) {
00467
00468 QStringList::iterator name = names.begin(), id = ids.begin(), idEnd = ids.end();
00469 for (; id != idEnd; ++id, ++name ) {
00470
00471 if (_PTR(SObject) shapeSO = aStudy->FindObjectID( id->toLatin1().data() )) {
00472
00473 while ( shapeSO && shapeSO->GetID() != shapeToMesh->GetID() )
00474 if ( shapeSO->Depth() < 2 )
00475 shapeSO.reset();
00476 else
00477 shapeSO = shapeSO->GetFather();
00478 if ( shapeSO ) {
00479
00480 if ( !goodIds.contains( *id )) {
00481 goodIds.append( *id );
00482 goodNames.append( *name );
00483 }
00484 }
00485 }
00486 }
00487 }
00488 }
00489 }
00490 }
00491
00492 if ( myDlg->myElemGeomBtn->isChecked() )
00493 {
00494 myDlg->myElemGeomList->clear();
00495 myDlg->myElemGeomList->addItems( goodNames );
00496 myElemGeoIDs = goodIds;
00497 }
00498 else if ( myDlg->myNodeGeomBtn->isChecked() )
00499 {
00500 myDlg->myNodeGeomList->clear();
00501 myDlg->myNodeGeomList->addItems( goodNames );
00502 myNodeGeoIDs = goodIds;
00503 }
00504
00505
00506 myDlg->updateButtons();
00507 }