-// Copyright (C) 2007-2010 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
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// 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.
//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : SMESHGUI_ComputeDlg.cxx
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QButtonGroup>
+#include <QCloseEvent>
+#include <QTimerEvent>
// VTK includes
#include <vtkProperty.h>
CASE2TEXT( COMPERR_EXCEPTION );
CASE2TEXT( COMPERR_MEMORY_PB );
CASE2TEXT( COMPERR_BAD_SHAPE );
+ CASE2TEXT( COMPERR_CANCELED );
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 );
}
}
// -----------------------------------------------------------------------
/*!
- * \brief Return SO of a subshape
+ * \brief Return SO of a sub-shape
*/
_PTR(SObject) getSubShapeSO( int subShapeID, GEOM::GEOM_Object_var aMainShape)
{
}
// -----------------------------------------------------------------------
/*!
- * \brief Return subshape by ID
+ * \brief Return sub-shape by ID
*/
GEOM::GEOM_Object_ptr getSubShape( int subShapeID, GEOM::GEOM_Object_var aMainShape)
{
}
// -----------------------------------------------------------------------
/*!
- * \brief Return text describing a subshape
+ * \brief Return text describing a sub-shape
*/
QString shapeText(int subShapeID, GEOM::GEOM_Object_var aMainShape )
{
// 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("<b>%1</b>").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 );
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 );
+ 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 );
// Hypothesis definition errors
SMESHGUI_Operation::startOperation();
}
+//================================================================================
+//================================================================================
+
+SMESHGUI_ComputeDlg_QThread::SMESHGUI_ComputeDlg_QThread(SMESH::SMESH_Gen_var gen,
+ SMESH::SMESH_Mesh_var mesh,
+ GEOM::GEOM_Object_var mainShape)
+{
+ myResult = false;
+ myGen = gen;
+ myMesh = mesh;
+ myMainShape = mainShape;
+}
+
+void SMESHGUI_ComputeDlg_QThread::run()
+{
+ myResult = myGen->Compute(myMesh, myMainShape);
+}
+
+bool SMESHGUI_ComputeDlg_QThread::result()
+{
+ return myResult;
+}
+
+void SMESHGUI_ComputeDlg_QThread::cancel()
+{
+ myGen->CancelCompute(myMesh, myMainShape);
+}
+
+//================================================================================
+//================================================================================
+
+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),
+ qthread(gen, mesh, mainShape)
+{
+ // --
+ setWindowTitle(tr("Compute"));
+ cancelButton = new QPushButton(tr("Cancel"));
+ cancelButton->setDefault(true);
+ connect(cancelButton, SIGNAL(clicked()), this, SLOT(onCancel()));
+ QHBoxLayout *layout = new QHBoxLayout;
+ layout->addWidget(cancelButton);
+ setLayout(layout);
+ resize(200, 50);
+ // --
+ startTimer(30); // 30 millisecs
+ qthread.start();
+}
+
+bool SMESHGUI_ComputeDlg_QThreadQDialog::result()
+{
+ return qthread.result();
+}
+
+void SMESHGUI_ComputeDlg_QThreadQDialog::onCancel()
+{
+ qthread.cancel();
+}
+
+void SMESHGUI_ComputeDlg_QThreadQDialog::timerEvent(QTimerEvent *event)
+{
+ if(qthread.isFinished())
+ {
+ close();
+ }
+ event->accept();
+}
+
+void SMESHGUI_ComputeDlg_QThreadQDialog::closeEvent(QCloseEvent *event)
+{
+ if(qthread.isRunning())
+ {
+ event->ignore();
+ return;
+ }
+ event->accept();
+}
+
//================================================================================
/*!
* \brief computeMesh()
OCC_CATCH_SIGNALS;
#endif
//SMESH::UpdateNulData(myIObject, true);
- if (gen->Compute(myMesh, myMainShape))
+ 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){
memoryLack = true;
}
+ if ( !memoryLack && !SMDS_Mesh::CheckMemory(true) ) { // has memory to show dialog boxes?
+ memoryLack = true;
+ }
+
// NPAL16631: if ( !memoryLack )
{
SMESH::ModifiedMesh(aMeshSObj, !computeFailed, myMesh->NbNodes() == 0);
// NPAL16631: if ( getSMESHGUI()->automaticUpdate() )
SUIT_ResourceMgr* resMgr = SMESH::GetResourceMgr( SMESHGUI::GetSMESHGUI() );
long newSize = myMesh->NbElements();
- long limitSize = resMgr->integerValue( "SMESH", "update_limit", 500000 );
bool limitExceeded;
if ( !memoryLack )
{
}
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
{
- 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 );
+
+ // 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();
}
// fill table of errors
+ QTableWidget* tbl = aCompDlg->myTable;
tbl->setRowCount( theCompErrors->length() );
if ( !hasShape ) tbl->hideColumn( COL_SHAPE );
else tbl->showColumn( COL_SHAPE );
//================================================================================
/*!
- * \brief publish selected subshape
+ * \brief publish selected sub-shape
*/
//================================================================================