-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2015 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
#include "SMESHGUI_MeshOrderOp.h"
#include "SMESHGUI_MeshOrderDlg.h"
+#include "SMESH_Actor.h"
#include "SMESH_ActorUtils.h"
#include <SMDS_SetIterator.hxx>
// SALOME GUI includes
#include <LightApp_SelectionMgr.h>
#include <LightApp_UpdateFlags.h>
+#include <QtxComboBox.h>
#include <SALOME_ListIO.hxx>
-#include <SVTK_ViewWindow.h>
+#include <SUIT_Desktop.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_OverrideCursor.h>
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_Session.h>
#include <SVTK_ViewModel.h>
+#include <SVTK_ViewWindow.h>
#include <SalomeApp_Application.h>
-#include <SUIT_ResourceMgr.h>
-#include <SUIT_OverrideCursor.h>
-#include <SUIT_MessageBox.h>
-#include <SUIT_Desktop.h>
-#include <QtxComboBox.h>
// SALOME KERNEL includes
#include <SALOMEDS_SObject.hxx>
#include <SALOMEDSClient_SObject.hxx>
#include <SALOMEDS_wrap.hxx>
+#include "utilities.h"
#include CORBA_SERVER_HEADER(SMESH_Group)
#include <QButtonGroup>
#include <QCloseEvent>
#include <QTimerEvent>
+#include <QProgressBar>
// VTK includes
#include <vtkProperty.h>
#include <vector>
#include <set>
+#ifndef WIN32
+#include <sys/sysinfo.h>
+#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<QGridLayout*>( 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
};
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();
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() ) {
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");
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();
+ }
}
}
}
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 );
// 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 );
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();
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;
}
#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
OCC_CATCH_SIGNALS;
#endif
- bool res;
SMESHGUI_ComputeDlg_QThreadQDialog qthreaddialog(desktop(), gen, myMesh, myMainShape);
qthreaddialog.exec();
- res = qthreaddialog.result();
- res = gen->Compute(myMesh, myMainShape);
- if (res)
- computeFailed = false;
+ computeFailed = !qthreaddialog.result();
}
catch(const SALOME::SALOME_Exception & S_ex) {
memoryLack = true;
// 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<SMESH::SMESH_IDSource>( 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<SMESH::SMESH_IDSource>( 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<SMESH::SMESH_IDSource>( 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();
GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen();
SALOMEDS::Study_var study = SMESHGUI::GetSMESHGen()->GetCurrentStudy();
+ QStringList entryList;
QList<int> rows;
SMESH::getSelectedRows( table(), rows );
int row;
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;
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() );
+ entryList.push_back( entry.in() );
}
}
}
getSMESHGUI()->getApp()->updateObjectBrowser();
+ getSMESHGUI()->getApp()->browseObjects( entryList, /*isApplyAndClose=*/true );
+
currentCellChanged(); // to update buttons
}
myCompDlg->myPublishBtn->setEnabled( publishEnable );
myCompDlg->myShowBtn ->setEnabled( showEnable );
myCompDlg->myBadMeshBtn->setEnabled( hasBadMesh && ( nbSelected == 1 ));
+ myCompDlg->myBadMeshToGroupBtn->setEnabled( hasBadMesh && ( nbSelected == 1 ));
}
//================================================================================
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
}