X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ComputeDlg.cxx;h=1bf5e5c8b975283865894de8afd4f48782407be9;hp=c0c296010c16c881b3f85b13eb439509fce5bf4d;hb=69f064e1222d71a85b8ac1e11d82e0480b6d6cea;hpb=ae29d465091933df101dfac6ae99d3becf4efde7 diff --git a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx index c0c296010..1bf5e5c8b 100644 --- a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 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. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -33,6 +33,7 @@ #include "SMESHGUI_MeshOrderOp.h" #include "SMESHGUI_MeshOrderDlg.h" +#include "SMESH_Actor.h" #include "SMESH_ActorUtils.h" #include @@ -61,6 +62,8 @@ #include #include +#include CORBA_SERVER_HEADER(SMESH_Group) + // OCCT includes #include #include @@ -89,6 +92,7 @@ #include #include #include +#include // VTK includes #include @@ -97,25 +101,15 @@ #include #include +#ifndef WIN32 +#include +#endif + #define SPACING 6 #define MARGIN 11 #define COLONIZE(str) (QString(str).contains(":") > 0 ? QString(str) : QString(str) + " :" ) -/* OBSOLETE -static void addSeparator( QWidget* parent ) -{ - QGridLayout* l = qobject_cast( parent->layout() ); - int row = l->rowCount(); - int cols = l->columnCount(); - for ( int i = 0; i < cols; i++ ) { - QFrame* hline = new QFrame( parent ); - hline->setFrameStyle( QFrame::HLine | QFrame::Sunken ); - l->addWidget( hline, row, i ); - } -} -*/ - enum TCol { COL_ALGO = 0, COL_SHAPE, COL_ERROR, COL_SHAPEID, COL_PUBLISHED, COL_BAD_MESH, NB_COLUMNS }; @@ -204,6 +198,7 @@ namespace SMESH void Show( int subShapeID, GEOM::GEOM_Object_var aMainShape, bool only = false) { SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( SMESHGUI::GetSMESHGUI() ); + SUIT_ResourceMgr* resMgr = SMESH::GetResourceMgr( SMESHGUI::GetSMESHGUI() ); std::string mainEntry; if ( !aMainShape->_is_nil() ) mainEntry = aMainShape->GetStudyEntry(); @@ -232,8 +227,13 @@ namespace SMESH TopAbs_ShapeEnum type( aShape.ShapeType() >= TopAbs_WIRE ? TopAbs_EDGE : TopAbs_FACE ); for ( TopExp_Explorer exp( aShape, type ); exp.More(); exp.Next() ) { //checkTriangulation( exp.Current() ); - if ( GEOM_Actor* anActor = getActor( exp.Current() )) + if ( GEOM_Actor* anActor = getActor( exp.Current() ) ) { + int UNbIsos = resMgr->integerValue( "Geometry", "iso_number_u", 1); + int VNbIsos = resMgr->integerValue( "Geometry", "iso_number_v", 1); + int aNbIsos[2] = { UNbIsos ? UNbIsos : 1, VNbIsos ? VNbIsos : 1 }; + anActor->SetNbIsos( aNbIsos ); myShownActors.push_back( anActor ); + } } if ( type == TopAbs_FACE ) { for ( TopExp_Explorer exp( aShape, TopAbs_EDGE ); exp.More(); exp.Next() ) { @@ -349,12 +349,14 @@ namespace SMESH CASE2TEXT( COMPERR_BAD_SHAPE ); CASE2TEXT( COMPERR_CANCELED ); CASE2TEXT( COMPERR_NO_MESH_ON_SHAPE ); + CASE2TEXT( COMPERR_BAD_PARMETERS ); case SMESH::COMPERR_ALGO_FAILED: if ( strlen(comment) == 0 ) text = QObject::tr("COMPERR_ALGO_FAILED"); break; case SMESH::COMPERR_WARNING: - return comment ? QString(comment) : QObject::tr("COMPERR_UNKNOWN"); + text = QObject::tr( (comment && strlen(comment)) ? "COMPERR_WARNING" : "COMPERR_UNKNOWN"); + break; default: text = QString("#%1").arg( -errCode ); } @@ -380,7 +382,11 @@ namespace SMESH if ( !geom->_is_nil() ) { GEOM::ListOfLong_var list = geom->GetSubShapeIndices(); if ( list->length() == 1 && list[0] == subShapeID ) - subSO = it->Value(); + { + GEOM::GEOM_Object_var mainGO = geom->GetMainShape(); + if ( aMainShape->IsSame( mainGO )) + subSO = it->Value(); + } } } } @@ -437,8 +443,10 @@ namespace SMESH QString shapeText(int subShapeID, GEOM::GEOM_Object_var aMainShape ) { QString text; - if ( _PTR(SObject) aSO = getSubShapeSO( subShapeID, aMainShape )) - text = aSO->GetName().c_str(); + if ( _PTR(SObject) aSO = getSubShapeSO( subShapeID, aMainShape )) { + text = aSO->GetName().c_str(); + text += QString(" (%1)").arg( aSO->GetID().c_str() ); + } else { text = QString("#%1").arg( subShapeID ); GEOM::GEOM_Object_wrap shape = getSubShape( subShapeID, aMainShape ); @@ -460,10 +468,12 @@ namespace SMESH foreach( range, selRanges ) { for ( int row = range.topRow(); row <= range.bottomRow(); ++row ) - rows.append( row ); + if ( !rows.count( row )) + rows.append( row ); } if ( rows.isEmpty() && table->currentRow() > -1 ) - rows.append( table->currentRow() ); + if ( !rows.count( table->currentRow() )) + rows.append( table->currentRow() ); return rows.count(); } @@ -553,6 +563,7 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval) myShowBtn = new QPushButton(tr("SHOW_SHAPE"), myCompErrorGroup); myPublishBtn = new QPushButton(tr("PUBLISH_SHAPE"), myCompErrorGroup); myBadMeshBtn = new QPushButton(tr("SHOW_BAD_MESH"), myCompErrorGroup); + myBadMeshToGroupBtn = new QPushButton(tr("GROUP_OF_BAD_MESH"), myCompErrorGroup); //myTable->setReadOnly( true ); // VSR: check myTable->setEditTriggers( QAbstractItemView::NoEditTriggers ); @@ -577,11 +588,12 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval) QGridLayout* grpLayout = new QGridLayout(myCompErrorGroup); grpLayout->setSpacing(SPACING); grpLayout->setMargin(MARGIN); - grpLayout->addWidget( myWarningLabel, 0, 0, 1, 4 ); - grpLayout->addWidget( myTable, 1, 0, 1, 4 ); - grpLayout->addWidget( myShowBtn, 2, 0 ); - grpLayout->addWidget( myPublishBtn, 2, 1 ); - grpLayout->addWidget( myBadMeshBtn, 2, 2 ); + grpLayout->addWidget( myWarningLabel, 0, 0, 1, 4 ); + grpLayout->addWidget( myTable, 1, 0, 1, 4 ); + grpLayout->addWidget( myShowBtn, 2, 0 ); + grpLayout->addWidget( myPublishBtn, 2, 1 ); + grpLayout->addWidget( myBadMeshBtn, 2, 2 ); + grpLayout->addWidget( myBadMeshToGroupBtn, 2, 3 ); grpLayout->setColumnStretch( 3, 1 ); // Hypothesis definition errors @@ -607,8 +619,8 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval) // add all widgets to aFrame QVBoxLayout* aLay = new QVBoxLayout(aFrame); - aLay->setMargin( 0 ); - aLay->setSpacing( 0 ); + aLay->setMargin( MARGIN ); + aLay->setSpacing( SPACING ); aLay->addWidget( aPixGrp ); aLay->addWidget( nameBox ); aLay->addWidget( myBriefInfo ); @@ -733,25 +745,39 @@ SMESHGUI_ComputeDlg_QThreadQDialog::SMESHGUI_ComputeDlg_QThreadQDialog(QWidget qthread(gen, mesh, mainShape) { // -- - setWindowTitle(tr("Compute")); + setWindowTitle(tr("TITLE")); setMinimumWidth( 200 ); - cancelButton = new QPushButton(tr("Cancel")); + cancelButton = new QPushButton(tr("CANCEL")); cancelButton->setDefault(true); + cancelButton->setCheckable(true); QLabel * nbNodesName = new QLabel(tr("SMESH_MESHINFO_NODES"), this ); QLabel * nbElemsName = new QLabel(tr("SMESH_MESHINFO_ELEMENTS"), this ); nbNodesLabel = new QLabel("0", this ); nbElemsLabel = new QLabel("0", this ); +#ifndef WIN32 + QLabel * freeRAMName = new QLabel(tr("SMESH_FREERAM"), this ); + freeRAMLabel = new QLabel("", this ); +#endif + progressBar = new QProgressBar(this); + progressBar->setMinimum( 0 ); + progressBar->setMaximum( 1000 ); QGridLayout* layout = new QGridLayout(this); layout->setMargin( MARGIN ); layout->setSpacing( SPACING ); - layout->addWidget(nbNodesName, 0, 0); - layout->addWidget(nbNodesLabel, 0, 1); - layout->addWidget(nbElemsName, 1, 0); - layout->addWidget(nbElemsLabel, 1, 1); - layout->addWidget(cancelButton, 2, 0, 1, 2); + int row = 0; + layout->addWidget(nbNodesName, row, 0); + layout->addWidget(nbNodesLabel, row++, 1); + layout->addWidget(nbElemsName, row, 0); + layout->addWidget(nbElemsLabel, row++, 1); +#ifndef WIN32 + layout->addWidget(freeRAMName, row, 0); + layout->addWidget(freeRAMLabel, row++, 1); +#endif + layout->addWidget(progressBar, row++, 0, 1, 2); + layout->addWidget(cancelButton, row++, 0, 1, 2); adjustSize(); update(); @@ -769,23 +795,40 @@ bool SMESHGUI_ComputeDlg_QThreadQDialog::result() void SMESHGUI_ComputeDlg_QThreadQDialog::onCancel() { qthread.cancel(); -} + cancelButton->setText( tr("CANCELING")); + cancelButton->setEnabled(false); +} void SMESHGUI_ComputeDlg_QThreadQDialog::timerEvent(QTimerEvent *event) { + if ( !cancelButton->isChecked() ) // not yet cancelled + progressBar->setValue( progressBar->maximum() * qthread.getMesh()->GetComputeProgress() ); + if(qthread.isFinished()) - { - close(); - } - nbNodesLabel->setText( QString("%1").arg( qthread.getMesh()->NbNodes() )); - nbElemsLabel->setText( QString("%1").arg( qthread.getMesh()->NbElements() )); + { + close(); + } + else + { + nbNodesLabel->setText( QString("%1").arg( qthread.getMesh()->NbNodes() )); + nbElemsLabel->setText( QString("%1").arg( qthread.getMesh()->NbElements() )); +#ifndef WIN32 + struct sysinfo si; + const int err = sysinfo( &si ); + if ( err ) + freeRAMLabel->setText(""); + else + freeRAMLabel->setText( tr("SMESH_GIGABYTE").arg + ( si.freeram * si.mem_unit /1024./1024./1024., 0, 'f', 2 )); +#endif + } event->accept(); } void SMESHGUI_ComputeDlg_QThreadQDialog::closeEvent(QCloseEvent *event) { if(qthread.isRunning()) - { + { event->ignore(); return; } @@ -832,19 +875,11 @@ void SMESHGUI_BaseComputeOp::computeMesh() #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 OCC_CATCH_SIGNALS; #endif - //SMESH::UpdateNulData(myIObject, true); - bool res; -#ifdef WITH_SMESH_CANCEL_COMPUTE SMESHGUI_ComputeDlg_QThreadQDialog qthreaddialog(desktop(), gen, myMesh, myMainShape); qthreaddialog.exec(); - res = qthreaddialog.result(); -#else - res = gen->Compute(myMesh, myMainShape); -#endif - if (res) - computeFailed = false; + computeFailed = !qthreaddialog.result(); } - catch(const SALOME::SALOME_Exception & S_ex){ + catch(const SALOME::SALOME_Exception & S_ex) { memoryLack = true; } try { @@ -856,7 +891,7 @@ void SMESHGUI_BaseComputeOp::computeMesh() for ( int i = 0; (i < aCompErrors->length()) && !memoryLack; ++i ) memoryLack = ( aCompErrors[ i ].code == SMESH::COMPERR_MEMORY_PB ); } - catch(const SALOME::SALOME_Exception & S_ex){ + catch(const SALOME::SALOME_Exception & S_ex) { memoryLack = true; } @@ -866,42 +901,108 @@ void SMESHGUI_BaseComputeOp::computeMesh() // NPAL16631: if ( !memoryLack ) { - SMESH::ModifiedMesh(aMeshSObj, !computeFailed, myMesh->NbNodes() == 0); + SMESH::ModifiedMesh( aMeshSObj, + !computeFailed && aHypErrors.isEmpty(), + myMesh->NbNodes() == 0); update( UF_ObjBrowser | UF_Model ); // SHOW MESH // NPAL16631: if ( getSMESHGUI()->automaticUpdate() ) SUIT_ResourceMgr* resMgr = SMESH::GetResourceMgr( SMESHGUI::GetSMESHGUI() ); - long newSize = myMesh->NbElements(); bool limitExceeded; + long limitSize = resMgr->integerValue( "SMESH", "update_limit", 500000 ); + int entities = SMESH_Actor::eAllEntity; + int hidden = 0; + long nbElements = 0; if ( !memoryLack ) { - if ( getSMESHGUI()->automaticUpdate( newSize, &limitExceeded ) ) - { - try { + // List of objects that will be updated automatically + QList< QPair< SMESH::SMESH_IDSource_var, _PTR(SObject) > > aListToUpdate; + SMESH::SMESH_IDSource_var aMeshObj = SMESH::SObjectToInterface( aMeshSObj ); + // put Mesh into list + aListToUpdate.append( QPair< SMESH::SMESH_IDSource_var, _PTR(SObject) >(aMeshObj, aMeshSObj) ); + SMESH::submesh_array_var aSubMeshes = myMesh->GetSubMeshes(); + // put SubMeshes into list + for ( int i = 0; i < aSubMeshes->length(); i++ ) { + SMESH::SMESH_subMesh_var sm = aSubMeshes[i]; + if ( CORBA::is_nil( sm ) ) continue; + _PTR(SObject) smSObj = SMESH::ObjectToSObject( sm ); + if ( !smSObj ) continue; + SMESH::SMESH_IDSource_var aSubMeshObj = SMESH::SObjectToInterface( smSObj ); + aListToUpdate.append( QPair< SMESH::SMESH_IDSource_var, _PTR(SObject) >(aSubMeshObj, smSObj) ); + } + // put Groups into list + SMESH::ListOfGroups_var aGroups = myMesh->GetGroups(); + for ( size_t i = 0; i < aGroups->length(); ++i ) { + SMESH::SMESH_GroupBase_var aGrp = aGroups[i]; + if ( CORBA::is_nil( aGrp ) ) continue; + SMESH::SMESH_Group_var aStdGroup = SMESH::SMESH_Group::_narrow( aGrp ); + SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( aGrp ); + SMESH::SMESH_GroupOnFilter_var aFltGroup = SMESH::SMESH_GroupOnFilter::_narrow( aGrp ); + if ( !aStdGroup->_is_nil() ) continue; // don't update the standalone groups + _PTR(SObject) aGroupSO = SMESH::FindSObject( aGrp ); + if ( !aGroupSO ) continue; + SMESH::SMESH_IDSource_var aGroupObj = SMESH::SObjectToInterface( aGroupSO ); + aListToUpdate.append( QPair< SMESH::SMESH_IDSource_var, _PTR(SObject) >(aGroupObj, aGroupSO) ); + } + + // update mesh, sub-mesh and groups, if it's possible + QList< QPair< SMESH::SMESH_IDSource_var, _PTR(SObject) > >::iterator anIter; + for( anIter = aListToUpdate.begin(); anIter != aListToUpdate.end(); anIter++ ) { + SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( SMESH::SObjectToObject( (*anIter).second )); + if ( getSMESHGUI()->automaticUpdate( (*anIter).first, &entities, &limitExceeded, &hidden, &nbElements ) ) + { + try { #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100 - OCC_CATCH_SIGNALS; + OCC_CATCH_SIGNALS; #endif - SMESH::Update(myIObject, true); - } - catch (...) { + bool toDisplay = false; + + if ( !aMesh->_is_nil() ) { // display a mesh only + toDisplay = true; + SMESH_Actor *anActor = SMESH::FindActorByObject( aMesh ); + if ( !anActor ) anActor = SMESH::CreateActor( (*anIter).second->GetStudy(), (*anIter).second->GetID().c_str(), true ); + if ( anActor ) // actor is not created for an empty mesh + { + anActor->SetEntityMode( entities ); + SMESH::DisplayActor( SMESH::GetActiveWindow(), anActor ); + } + } + Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject + ( (*anIter).second->GetID().c_str(), "SMESH", (*anIter).second->GetName().c_str() ); + SMESH::Update(anIO, toDisplay); + + if ( limitExceeded && !aMesh->_is_nil() ) + { + QStringList hiddenMsg; + if ( hidden & SMESH_Actor::e0DElements ) hiddenMsg << tr( "SMESH_ELEMS0D" ); + if ( hidden & SMESH_Actor::eEdges ) hiddenMsg << tr( "SMESH_EDGES" ); + if ( hidden & SMESH_Actor::eFaces ) hiddenMsg << tr( "SMESH_FACES" ); + if ( hidden & SMESH_Actor::eVolumes ) hiddenMsg << tr( "SMESH_VOLUMES" ); + if ( hidden & SMESH_Actor::eBallElem ) hiddenMsg << tr( "SMESH_BALLS" ); + SUIT_MessageBox::warning( desktop(), + tr( "SMESH_WRN_WARNING" ), + tr( "SMESH_WRN_SIZE_INC_LIMIT_EXCEEDED" ).arg( nbElements ).arg( limitSize ).arg( hiddenMsg.join(", ") ) ); + } + } + catch (...) { #ifdef _DEBUG_ - MESSAGE ( "Exception thrown during mesh visualization" ); + MESSAGE ( "Exception thrown during mesh visualization" ); #endif - if ( SMDS_Mesh::CheckMemory(true) ) { // has memory to show warning? - SMESH::OnVisuException(); - } - else { - memoryLack = true; + if ( SMDS_Mesh::CheckMemory(true) ) { // has memory to show warning? + SMESH::OnVisuException(); + } + else { + memoryLack = true; + } } } - } - else if ( limitExceeded ) - { - long limitSize = resMgr->integerValue( "SMESH", "update_limit", 500000 ); - SUIT_MessageBox::warning( desktop(), - tr( "SMESH_WRN_WARNING" ), - tr( "SMESH_WRN_SIZE_LIMIT_EXCEEDED" ).arg( newSize ).arg( limitSize ) ); + else if ( limitExceeded && !aMesh->_is_nil() ) + { + SUIT_MessageBox::warning( desktop(), + tr( "SMESH_WRN_WARNING" ), + tr( "SMESH_WRN_SIZE_LIMIT_EXCEEDED" ).arg( nbElements ).arg( limitSize ) ); + } } } LightApp_SelectionMgr *Sel = selectionMgr(); @@ -1072,11 +1173,14 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack, tbl->resizeColumnToContents( COL_SHAPE ); tbl->setWordWrap( true ); - if ( hasBadMesh ) + if ( hasBadMesh ) { aCompDlg->myBadMeshBtn->show(); - else + aCompDlg->myBadMeshToGroupBtn->show(); + } + else { aCompDlg->myBadMeshBtn->hide(); - + aCompDlg->myBadMeshToGroupBtn->hide(); + } tbl->setCurrentCell(0,0); currentCellChanged(); // to update buttons } @@ -1138,7 +1242,8 @@ void SMESHGUI_BaseComputeOp::onPublishShape() if ( so->_is_nil() ) { CORBA::String_var name = so->GetName(); CORBA::String_var entry = so->GetID(); - table()->item( r, COL_SHAPE )->setText( name.in() ); + QString shapeText = QString("%1 (%2)").arg( name.in() ).arg( entry.in() ); + table()->item( r, COL_SHAPE )->setText( shapeText ); table()->item( r, COL_PUBLISHED )->setText( entry.in() ); } break; @@ -1151,7 +1256,8 @@ void SMESHGUI_BaseComputeOp::onPublishShape() if ( !so->_is_nil() ) { CORBA::String_var name = so->GetName(); CORBA::String_var entry = so->GetID(); - table()->item( row, COL_SHAPE )->setText( name.in() ); + QString shapeText = QString("%1 (%2)").arg( name.in() ).arg( entry.in() ); + table()->item( row, COL_SHAPE )->setText( shapeText ); table()->item( row, COL_PUBLISHED )->setText( entry.in() ); } } @@ -1193,6 +1299,43 @@ void SMESHGUI_BaseComputeOp::onShowBadMesh() } } +//================================================================================ +/*! + * \brief create groups of bad mesh elements preventing computation of a submesh of current row + */ +//================================================================================ + +void SMESHGUI_BaseComputeOp::onGroupOfBadMesh() +{ + QList rows; + SMESH::getSelectedRows( table(), rows ); + int row; + foreach ( row, rows ) + { + bool hasBadMesh = ( !table()->item(row, COL_BAD_MESH)->text().isEmpty() ); + if ( hasBadMesh ) { + int curSub = table()->item(rows.front(), COL_SHAPEID)->text().toInt(); + QString grName = table()->item(rows.front(), COL_SHAPE)->text(); + if ( grName.isEmpty() ) grName = "bad mesh"; + else grName = "bad mesh of " + grName; + SMESH::SMESH_Gen_var gen = getSMESHGUI()->GetSMESHGen(); + SMESH::ListOfGroups_var groups + ( gen->MakeGroupsOfBadInputElements(myMesh,curSub,grName.toLatin1().data()) ); + update( UF_ObjBrowser | UF_Model ); + if( LightApp_Application* anApp = dynamic_cast( application() )) + { + QStringList anEntryList; + for ( size_t i = 0; i < groups->length(); ++i ) + if ( _PTR(SObject) so = SMESH::FindSObject( groups[i] )) + anEntryList.append( so->GetID().c_str() ); + + if ( !anEntryList.isEmpty()) + anApp->browseObjects( anEntryList, true, false ); + } + } + } +} + //================================================================================ /*! * \brief SLOT called when a selected cell in table() changed @@ -1232,6 +1375,7 @@ void SMESHGUI_BaseComputeOp::currentCellChanged() myCompDlg->myPublishBtn->setEnabled( publishEnable ); myCompDlg->myShowBtn ->setEnabled( showEnable ); myCompDlg->myBadMeshBtn->setEnabled( hasBadMesh && ( nbSelected == 1 )); + myCompDlg->myBadMeshToGroupBtn->setEnabled( hasBadMesh && ( nbSelected == 1 )); } //================================================================================ @@ -1291,9 +1435,10 @@ SMESHGUI_ComputeDlg* SMESHGUI_BaseComputeOp::computeDlg() const SMESHGUI_BaseComputeOp* me = (SMESHGUI_BaseComputeOp*)this; me->myCompDlg = new SMESHGUI_ComputeDlg( desktop(), false ); // connect signals and slots - connect(myCompDlg->myShowBtn, SIGNAL (clicked()), SLOT(onPreviewShape())); - connect(myCompDlg->myPublishBtn, SIGNAL (clicked()), SLOT(onPublishShape())); - connect(myCompDlg->myBadMeshBtn, SIGNAL (clicked()), SLOT(onShowBadMesh())); + connect(myCompDlg->myShowBtn, SIGNAL (clicked()), SLOT(onPreviewShape())); + connect(myCompDlg->myPublishBtn, SIGNAL (clicked()), SLOT(onPublishShape())); + connect(myCompDlg->myBadMeshBtn, SIGNAL (clicked()), SLOT(onShowBadMesh())); + connect(myCompDlg->myBadMeshToGroupBtn, SIGNAL (clicked()), SLOT(onGroupOfBadMesh())); QTableWidget* aTable = me->table(); connect(aTable, SIGNAL(itemSelectionChanged()), SLOT(currentCellChanged())); @@ -2127,10 +2272,15 @@ void SMESHGUI_BaseComputeOp::showEvaluateResult(const SMESH::long_array& theRes, tbl->setWordWrap( true ); if ( hasBadMesh ) + { aCompDlg->myBadMeshBtn->show(); + aCompDlg->myBadMeshToGroupBtn->show(); + } else + { aCompDlg->myBadMeshBtn->hide(); - + aCompDlg->myBadMeshToGroupBtn->hide(); + } tbl->setCurrentCell(0,0); currentCellChanged(); // to update buttons }