X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ComputeDlg.cxx;h=2d236261798dd734b4cf79ad13ea39322fca0fcc;hp=0bb2fa5ef2bac0a06e1fdafb4cbc706ef3229c52;hb=88068fce89e10cb32b60ea51cae3440240d42e9f;hpb=bd4e115a78b52e3fbc016e5e30bb0e19b2a9e7d6 diff --git a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx index 0bb2fa5ef..2d2362617 100644 --- a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2013 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 @@ -41,6 +41,7 @@ // SALOME GEOM includes #include #include +#include // SALOME GUI includes #include @@ -58,6 +59,9 @@ // SALOME KERNEL includes #include #include +#include + +#include CORBA_SERVER_HEADER(SMESH_Group) // OCCT includes #include @@ -337,15 +341,16 @@ namespace SMESH { QString text; switch ( errCode ) { - CASE2TEXT( COMPERR_OK ); - CASE2TEXT( COMPERR_BAD_INPUT_MESH); - CASE2TEXT( COMPERR_STD_EXCEPTION ); - CASE2TEXT( COMPERR_OCC_EXCEPTION ); + CASE2TEXT( COMPERR_OK ); + CASE2TEXT( COMPERR_BAD_INPUT_MESH ); + CASE2TEXT( COMPERR_STD_EXCEPTION ); + CASE2TEXT( COMPERR_OCC_EXCEPTION ); case SMESH::COMPERR_SLM_EXCEPTION: break; // avoid double "Salome exception" - CASE2TEXT( COMPERR_EXCEPTION ); - CASE2TEXT( COMPERR_MEMORY_PB ); - CASE2TEXT( COMPERR_BAD_SHAPE ); - CASE2TEXT( COMPERR_CANCELED ); + CASE2TEXT( COMPERR_EXCEPTION ); + CASE2TEXT( COMPERR_MEMORY_PB ); + CASE2TEXT( COMPERR_BAD_SHAPE ); + CASE2TEXT( COMPERR_CANCELED ); + CASE2TEXT( COMPERR_NO_MESH_ON_SHAPE ); case SMESH::COMPERR_ALGO_FAILED: if ( strlen(comment) == 0 ) text = QObject::tr("COMPERR_ALGO_FAILED"); @@ -385,17 +390,23 @@ namespace SMESH } // ----------------------------------------------------------------------- /*! - * \brief Return sub-shape by ID + * \brief Return sub-shape by ID. WARNING: UnRegister() must be called on a result */ GEOM::GEOM_Object_ptr getSubShape( int subShapeID, GEOM::GEOM_Object_var aMainShape) { GEOM::GEOM_Object_var aSubShape; - if ( subShapeID == 1 ) + if ( subShapeID == 1 ) { aSubShape = aMainShape; - else if ( _PTR(SObject) so = getSubShapeSO( subShapeID, aMainShape )) + aSubShape->Register(); + } + else if ( _PTR(SObject) so = getSubShapeSO( subShapeID, aMainShape )) { aSubShape = SMESH::SObjectToInterface( so ); - else + aSubShape->Register(); + } + else { aSubShape = SMESH::GetSubShape( aMainShape, subShapeID ); + // future call of UnRegister() will delete a servant of this new object + } return aSubShape._retn(); } // ----------------------------------------------------------------------- @@ -432,7 +443,8 @@ namespace SMESH text = aSO->GetName().c_str(); else { text = QString("#%1").arg( subShapeID ); - QString typeName = shapeTypeName( getSubShape( subShapeID, aMainShape )); + GEOM::GEOM_Object_wrap shape = getSubShape( subShapeID, aMainShape ); + QString typeName = shapeTypeName( shape ); if ( typeName.length() ) text += QString(" (%1)").arg(typeName); } @@ -450,10 +462,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(); } @@ -543,6 +557,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 ); @@ -550,6 +565,9 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval) myTable->hideColumn( COL_SHAPEID ); myTable->hideColumn( COL_BAD_MESH ); myTable->horizontalHeader()->setResizeMode( COL_ERROR, QHeaderView::Interactive ); + myTable->setWordWrap( true ); + myTable->horizontalHeader()->setStretchLastSection( true ); + myTable->setMinimumWidth( 500 ); QStringList headers; headers << tr( "COL_ALGO_HEADER" ); @@ -564,12 +582,13 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval) QGridLayout* grpLayout = new QGridLayout(myCompErrorGroup); grpLayout->setSpacing(SPACING); grpLayout->setMargin(MARGIN); - grpLayout->addWidget( myWarningLabel, 0, 0 ); - grpLayout->addWidget( myTable, 1, 0, 4, 1 ); - grpLayout->addWidget( myShowBtn, 1, 1 ); - grpLayout->addWidget( myPublishBtn, 2, 1 ); - grpLayout->addWidget( myBadMeshBtn, 3, 1 ); - grpLayout->setRowStretch( 4, 1 ); + 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 @@ -708,24 +727,43 @@ void SMESHGUI_ComputeDlg_QThread::cancel() //================================================================================ //================================================================================ -SMESHGUI_ComputeDlg_QThreadQDialog::SMESHGUI_ComputeDlg_QThreadQDialog(QWidget *parent, - SMESH::SMESH_Gen_var gen, +SMESHGUI_ComputeDlg_QThreadQDialog::SMESHGUI_ComputeDlg_QThreadQDialog(QWidget * parent, + SMESH::SMESH_Gen_var gen, SMESH::SMESH_Mesh_var mesh, GEOM::GEOM_Object_var mainShape) - : QDialog(parent), + : QDialog(parent, + Qt::WindowSystemMenuHint | + Qt::WindowCloseButtonHint | + Qt::Dialog | + Qt::WindowMaximizeButtonHint), qthread(gen, mesh, mainShape) { // -- setWindowTitle(tr("Compute")); + setMinimumWidth( 200 ); + cancelButton = new QPushButton(tr("Cancel")); cancelButton->setDefault(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 ); + + 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); + adjustSize(); + update(); + connect(cancelButton, SIGNAL(clicked()), this, SLOT(onCancel())); - QHBoxLayout *layout = new QHBoxLayout; - layout->addWidget(cancelButton); - setLayout(layout); - resize(200, 50); // -- - startTimer(30); // 30 millisecs + startTimer(300); // millisecs qthread.start(); } @@ -745,6 +783,8 @@ void SMESHGUI_ComputeDlg_QThreadQDialog::timerEvent(QTimerEvent *event) { close(); } + nbNodesLabel->setText( QString("%1").arg( qthread.getMesh()->NbNodes() )); + nbElemsLabel->setText( QString("%1").arg( qthread.getMesh()->NbElements() )); event->accept(); } @@ -798,19 +838,15 @@ 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; } - catch(const SALOME::SALOME_Exception & S_ex){ + catch(const SALOME::SALOME_Exception & S_ex) { memoryLack = true; } try { @@ -822,7 +858,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; } @@ -948,7 +984,8 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack, { bool onlyWarnings = !theNoCompError; // == valid mesh computed but there are errors reported for ( int i = 0; i < theCompErrors->length() && onlyWarnings; ++i ) - onlyWarnings = ( theCompErrors[ i ].code == SMESH::COMPERR_WARNING ); + onlyWarnings = ( theCompErrors[ i ].code == SMESH::COMPERR_WARNING || + theCompErrors[ i ].code == SMESH::COMPERR_NO_MESH_ON_SHAPE ); // full or brief mesh info SMESH::long_array_var aRes = myMesh->GetMeshInfo(); @@ -1035,12 +1072,16 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack, } tbl->resizeColumnToContents( COL_ALGO ); 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 } @@ -1088,20 +1129,22 @@ void SMESHGUI_BaseComputeOp::onPublishShape() foreach ( row, rows ) { int curSub = table()->item(row, COL_SHAPEID)->text().toInt(); - GEOM::GEOM_Object_var shape = SMESH::getSubShape( curSub, myMainShape ); + GEOM::GEOM_Object_wrap shape = SMESH::getSubShape( curSub, myMainShape ); if ( !shape->_is_nil() && ! SMESH::getSubShapeSO( curSub, myMainShape )) { if ( !SMESH::getSubShapeSO( 1, myMainShape )) // the main shape not published { QString name = GEOMBase::GetDefaultName( SMESH::shapeTypeName( myMainShape, "MAIN_SHAPE" )); - SALOMEDS::SObject_var so = + SALOMEDS::SObject_wrap so = geomGen->AddInStudy( study, myMainShape, name.toLatin1().data(), GEOM::GEOM_Object::_nil()); // look for myMainShape in the table for ( int r = 0, nr = table()->rowCount(); r < nr; ++r ) { if ( table()->item( r, COL_SHAPEID )->text() == "1" ) { if ( so->_is_nil() ) { - table()->item( r, COL_SHAPE )->setText( so->GetName() ); - table()->item( r, COL_PUBLISHED )->setText( so->GetID() ); + CORBA::String_var name = so->GetName(); + CORBA::String_var entry = so->GetID(); + table()->item( r, COL_SHAPE )->setText( name.in() ); + table()->item( r, COL_PUBLISHED )->setText( entry.in() ); } break; } @@ -1109,10 +1152,12 @@ void SMESHGUI_BaseComputeOp::onPublishShape() if ( curSub == 1 ) continue; } QString name = GEOMBase::GetDefaultName( SMESH::shapeTypeName( shape, "ERROR_SHAPE" )); - SALOMEDS::SObject_var so = geomGen->AddInStudy( study, shape, name.toLatin1().data(), myMainShape); + SALOMEDS::SObject_wrap so = geomGen->AddInStudy( study, shape, name.toLatin1().data(), myMainShape); if ( !so->_is_nil() ) { - table()->item( row, COL_SHAPE )->setText( so->GetName() ); - table()->item( row, COL_PUBLISHED )->setText( so->GetID() ); + CORBA::String_var name = so->GetName(); + CORBA::String_var entry = so->GetID(); + table()->item( row, COL_SHAPE )->setText( name.in() ); + table()->item( row, COL_PUBLISHED )->setText( entry.in() ); } } } @@ -1140,15 +1185,52 @@ void SMESHGUI_BaseComputeOp::onShowBadMesh() if ( myBadMeshDisplayer ) delete myBadMeshDisplayer; myBadMeshDisplayer = new SMESHGUI_MeshEditPreview( view ); SMESH::MeshPreviewStruct_var aMeshData = gen->GetBadInputElements(myMesh,curSub); - vtkFloatingPointType aPointSize = SMESH::GetFloat("SMESH:node_size",3); - vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1); - // delete property !!!!!!!!!! + double aPointSize = SMESH::GetFloat("SMESH:node_size",3); + double aLineWidth = SMESH::GetFloat("SMESH:element_width",1); vtkProperty* prop = vtkProperty::New(); prop->SetLineWidth( aLineWidth * 3 ); prop->SetPointSize( aPointSize * 3 ); prop->SetColor( 250, 0, 250 ); myBadMeshDisplayer->GetActor()->SetProperty( prop ); myBadMeshDisplayer->SetData( aMeshData._retn() ); + prop->Delete(); + } + } +} + +//================================================================================ +/*! + * \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 ); + } } } } @@ -1251,9 +1333,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())); @@ -2084,6 +2167,7 @@ void SMESHGUI_BaseComputeOp::showEvaluateResult(const SMESH::long_array& theRes, } tbl->resizeColumnToContents( COL_ALGO ); tbl->resizeColumnToContents( COL_SHAPE ); + tbl->setWordWrap( true ); if ( hasBadMesh ) aCompDlg->myBadMeshBtn->show();