X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ComputeDlg.cxx;h=c0c296010c16c881b3f85b13eb439509fce5bf4d;hp=a8e8fd20c5fcf8b4ba9509a7650c4811714fa4bf;hb=373c03904b8e3fc5490ff4e17716f0cdcb39c03c;hpb=2c607013a23bd4e7ba07e72e0c04dee2c1209cff diff --git a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx index a8e8fd20c..c0c296010 100644 --- a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ComputeDlg.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 @@ -41,6 +41,7 @@ // SALOME GEOM includes #include #include +#include // SALOME GUI includes #include @@ -58,6 +59,7 @@ // SALOME KERNEL includes #include #include +#include // OCCT includes #include @@ -337,18 +339,22 @@ 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_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"); break; + case SMESH::COMPERR_WARNING: + return comment ? QString(comment) : QObject::tr("COMPERR_UNKNOWN"); default: text = QString("#%1").arg( -errCode ); } @@ -357,7 +363,7 @@ namespace SMESH } // ----------------------------------------------------------------------- /*! - * \brief Return SO of a subshape + * \brief Return SO of a sub-shape */ _PTR(SObject) getSubShapeSO( int subShapeID, GEOM::GEOM_Object_var aMainShape) { @@ -382,17 +388,23 @@ namespace SMESH } // ----------------------------------------------------------------------- /*! - * \brief Return subshape 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(); } // ----------------------------------------------------------------------- @@ -420,7 +432,7 @@ namespace SMESH } // ----------------------------------------------------------------------- /*! - * \brief Return text describing a subshape + * \brief Return text describing a sub-shape */ QString shapeText(int subShapeID, GEOM::GEOM_Object_var aMainShape ) { @@ -429,7 +441,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); } @@ -535,10 +548,11 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval) // Computation errors myCompErrorGroup = new QGroupBox(tr("ERRORS"), aFrame); - myTable = new QTableWidget( 1, NB_COLUMNS, myCompErrorGroup); - myShowBtn = new QPushButton(tr("SHOW_SHAPE"), myCompErrorGroup); - myPublishBtn = new QPushButton(tr("PUBLISH_SHAPE"), myCompErrorGroup); - myBadMeshBtn = new QPushButton(tr("SHOW_BAD_MESH"), myCompErrorGroup); + myWarningLabel = new QLabel(QString("%1").arg(tr("COMPUTE_WARNING")), myCompErrorGroup); + myTable = new QTableWidget( 1, NB_COLUMNS, myCompErrorGroup); + myShowBtn = new QPushButton(tr("SHOW_SHAPE"), myCompErrorGroup); + myPublishBtn = new QPushButton(tr("PUBLISH_SHAPE"), myCompErrorGroup); + myBadMeshBtn = new QPushButton(tr("SHOW_BAD_MESH"), myCompErrorGroup); //myTable->setReadOnly( true ); // VSR: check myTable->setEditTriggers( QAbstractItemView::NoEditTriggers ); @@ -546,6 +560,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" ); @@ -560,11 +577,12 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval) QGridLayout* grpLayout = new QGridLayout(myCompErrorGroup); grpLayout->setSpacing(SPACING); grpLayout->setMargin(MARGIN); - grpLayout->addWidget( myTable, 0, 0, 4, 1 ); - grpLayout->addWidget( myShowBtn, 0, 1 ); - grpLayout->addWidget( myPublishBtn, 1, 1 ); - grpLayout->addWidget( myBadMeshBtn, 2, 1 ); - grpLayout->setRowStretch( 3, 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->setColumnStretch( 3, 1 ); // Hypothesis definition errors @@ -703,24 +721,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(); } @@ -740,6 +777,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(); } @@ -941,26 +980,45 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack, } else { - QTableWidget* tbl = aCompDlg->myTable; + 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 || + theCompErrors[ i ].code == SMESH::COMPERR_NO_MESH_ON_SHAPE ); + + // full or brief mesh info SMESH::long_array_var aRes = myMesh->GetMeshInfo(); - aCompDlg->myBriefInfo->SetMeshInfo( aRes ); - aCompDlg->myBriefInfo->show(); - aCompDlg->myFullInfo->hide(); + if ( onlyWarnings ) { + aCompDlg->myFullInfo->SetMeshInfo( aRes ); + aCompDlg->myFullInfo->show(); + aCompDlg->myBriefInfo->hide(); + } else { + aCompDlg->myBriefInfo->SetMeshInfo( aRes ); + aCompDlg->myBriefInfo->show(); + aCompDlg->myFullInfo->hide(); + } + // pbs of hypo dfinitions if ( theNoHypoError ) { aCompDlg->myHypErrorGroup->hide(); - } - else { + } else { aCompDlg->myHypErrorGroup->show(); aCompDlg->myHypErrorLabel->setText( theHypErrors ); } - if ( theNoCompError ) { + // table of errors + if ( theNoCompError ) + { aCompDlg->myCompErrorGroup->hide(); } - else { + else + { aCompDlg->myCompErrorGroup->show(); + if ( onlyWarnings ) + aCompDlg->myWarningLabel->show(); + else + aCompDlg->myWarningLabel->hide(); + if ( !hasShape ) { aCompDlg->myPublishBtn->hide(); aCompDlg->myShowBtn->hide(); @@ -971,6 +1029,7 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack, } // fill table of errors + QTableWidget* tbl = aCompDlg->myTable; tbl->setRowCount( theCompErrors->length() ); if ( !hasShape ) tbl->hideColumn( COL_SHAPE ); else tbl->showColumn( COL_SHAPE ); @@ -1011,6 +1070,7 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack, } tbl->resizeColumnToContents( COL_ALGO ); tbl->resizeColumnToContents( COL_SHAPE ); + tbl->setWordWrap( true ); if ( hasBadMesh ) aCompDlg->myBadMeshBtn->show(); @@ -1049,7 +1109,7 @@ void SMESHGUI_BaseComputeOp::stopOperation() //================================================================================ /*! - * \brief publish selected subshape + * \brief publish selected sub-shape */ //================================================================================ @@ -1064,20 +1124,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; } @@ -1085,10 +1147,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() ); } } } @@ -1116,15 +1180,15 @@ 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(); } } } @@ -2060,6 +2124,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();