Imp 19925 - Mesh preview

This commit is contained in:
ptv 2008-12-01 12:18:59 +00:00
parent d54614fd64
commit 04a0c33ea9
10 changed files with 1017 additions and 129 deletions

View File

@ -1564,21 +1564,17 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
}
case 701: // COMPUTE MESH
case 711: // PRECOMPUTE MESH
{
if (checkLock(aStudy)) break;
startOperation( 701 );
startOperation( theCommandID );
}
break;
case 702: // Create mesh
startOperation( 702 );
break;
case 703: // Create sub-mesh
startOperation( 703 );
break;
case 702: // Create mesh
case 703: // Create sub-mesh
case 704: // Edit mesh/sub-mesh
startOperation( 704 );
startOperation( theCommandID );
break;
case 710: // Build compound mesh
{
@ -2605,6 +2601,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createSMESHAction( 703, "CREATE_SUBMESH", "ICON_DLG_ADD_SUBMESH" );
createSMESHAction( 704, "EDIT_MESHSUBMESH","ICON_DLG_EDIT_MESH" );
createSMESHAction( 710, "BUILD_COMPOUND", "ICON_BUILD_COMPOUND" );
createSMESHAction( 711, "PRECOMPUTE", "ICON_PRECOMPUTE" );
createSMESHAction( 806, "CREATE_GEO_GROUP","ICON_CREATE_GEO_GROUP" );
createSMESHAction( 801, "CREATE_GROUP", "ICON_CREATE_GROUP" );
createSMESHAction( 802, "CONSTRUCT_GROUP", "ICON_CONSTRUCT_GROUP" );
@ -2741,6 +2738,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createMenu( 710, meshId, -1 );
createMenu( separator(), meshId, -1 );
createMenu( 701, meshId, -1 );
createMenu( 711, meshId, -1 );
createMenu( separator(), meshId, -1 );
createMenu( 801, meshId, -1 );
createMenu( 806, meshId, -1 );
@ -2838,6 +2836,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createTool( 710, meshTb );
createTool( separator(), meshTb );
createTool( 701, meshTb );
createTool( 711, meshTb );
createTool( separator(), meshTb );
createTool( 801, meshTb );
createTool( 806, meshTb );
@ -2947,6 +2946,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createPopupItem( 803, OB, group ); // EDIT_GROUP
popupMgr()->insert( separator(), -1, 0 );
createPopupItem( 701, OB, mesh, "&& isComputable" ); // COMPUTE
createPopupItem( 711, OB, mesh, "&& isComputable" ); // PRECOMPUTE
createPopupItem( 214, OB, mesh_group ); // UPDATE
createPopupItem( 900, OB, mesh_group ); // ADV_INFO
createPopupItem( 902, OB, mesh ); // STD_INFO
@ -3689,6 +3689,9 @@ LightApp_Operation* SMESHGUI::createOperation( const int id ) const
case 704: // Edit mesh/sub-mesh
op = new SMESHGUI_MeshOp( false );
break;
case 711: // Precompute mesh
op = new SMESHGUI_PrecomputeOp();
break;
case 806: // Create group on geom
op = new SMESHGUI_GroupOnShapeOp();
break;

View File

@ -50,8 +50,10 @@
#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>
// OCCT includes
@ -84,10 +86,6 @@
// VTK includes
#include <vtkProperty.h>
// IDL includes
#include <SALOMEconfig.h>
#include CORBA_SERVER_HEADER(SMESH_Gen)
// STL includes
#include <vector>
#include <set>
@ -790,7 +788,8 @@ void SMESHGUI_MeshInfosBox::SetInfoByMesh(SMESH::SMESH_Mesh_var mesh)
*/
//=======================================================================
SMESHGUI_ComputeDlg::SMESHGUI_ComputeDlg(): SMESHGUI_Dialog( 0, false, true, Close/* | Help*/ )
SMESHGUI_ComputeDlg::SMESHGUI_ComputeDlg( QWidget* parent )
: SMESHGUI_Dialog( parent, false, true, Close/* | Help*/ )
{
QVBoxLayout* aDlgLay = new QVBoxLayout (mainFrame());
aDlgLay->setMargin( 0 );
@ -803,6 +802,16 @@ SMESHGUI_ComputeDlg::SMESHGUI_ComputeDlg(): SMESHGUI_Dialog( 0, false, true, Clo
aDlgLay->setStretchFactor(aMainFrame, 1);
}
// =========================================================================================
/*!
* \brief Destructor
*/
//=======================================================================
SMESHGUI_ComputeDlg::~SMESHGUI_ComputeDlg()
{
}
//=======================================================================
// function : createMainFrame()
// purpose : Create frame containing dialog's fields
@ -920,37 +929,43 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent)
*/
//================================================================================
SMESHGUI_ComputeOp::SMESHGUI_ComputeOp()
SMESHGUI_BaseComputeOp::SMESHGUI_BaseComputeOp()
: SMESHGUI_Operation(),
myCompDlg( 0 )
{
myDlg = new SMESHGUI_ComputeDlg;
myTShapeDisplayer = new SMESH::TShapeDisplayer();
myBadMeshDisplayer = 0;
//myHelpFileName = "/files/about_meshes.htm"; // V3
myHelpFileName = "about_meshes_page.html"; // V4
// connect signals and slots
connect(myDlg->myShowBtn, SIGNAL (clicked()), SLOT(onPreviewShape()));
connect(myDlg->myPublishBtn, SIGNAL (clicked()), SLOT(onPublishShape()));
connect(myDlg->myBadMeshBtn, SIGNAL (clicked()), SLOT(onShowBadMesh()));
connect(table(), SIGNAL(itemSelectionChanged()), SLOT(currentCellChanged()));
connect(table(), SIGNAL(currentCellChanged(int,int,int,int)), SLOT(currentCellChanged()));
}
//=======================================================================
// function : startOperation()
// purpose : Init dialog fields, connect signals and slots, show dialog
//=======================================================================
//================================================================================
/*!
* \brief Start operation
* \purpose Init dialog fields, connect signals and slots, show dialog
*/
//================================================================================
void SMESHGUI_ComputeOp::startOperation()
void SMESHGUI_BaseComputeOp::startOperation()
{
SMESHGUI_Operation::startOperation();
if ( !myCompDlg )
{
myCompDlg = new SMESHGUI_ComputeDlg( desktop() );
// 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()));
// check selection
QTableWidget* aTable = table();
connect(aTable, SIGNAL(itemSelectionChanged()), SLOT(currentCellChanged()));
connect(aTable, SIGNAL(currentCellChanged(int,int,int,int)), SLOT(currentCellChanged()));
}
myMesh = SMESH::SMESH_Mesh::_nil();
myMainShape = GEOM::GEOM_Object::_nil();
// check selection
LightApp_SelectionMgr *Sel = selectionMgr();
SALOME_ListIO selected; Sel->selectedObjects( selected );
@ -963,16 +978,28 @@ void SMESHGUI_ComputeOp::startOperation()
return;
}
Handle(SALOME_InteractiveObject) IObject = selected.First();
myMesh = SMESH::GetMeshByIO(IObject);
myIObject = selected.First();
myMesh = SMESH::GetMeshByIO(myIObject);
if (myMesh->_is_nil()) {
SUIT_MessageBox::warning(desktop(),
tr("SMESH_WRN_WARNING"),
tr("SMESH_WRN_NO_AVAILABLE_DATA"));
onCancel();
return;
}
}
myMainShape = myMesh->GetShapeToMesh();
SMESHGUI_Operation::startOperation();
}
//================================================================================
/*!
* \brief computeMesh()
*/
//================================================================================
void SMESHGUI_BaseComputeOp::computeMesh()
{
// COMPUTE MESH
SMESH::MemoryReserve aMemoryReserve;
@ -983,12 +1010,11 @@ void SMESHGUI_ComputeOp::startOperation()
bool computeFailed = true, memoryLack = false;
_PTR(SObject) aMeshSObj = SMESH::FindSObject(myMesh);
myMainShape = myMesh->GetShapeToMesh();
bool hasShape = myMesh->HasShapeToMesh();
bool shapeOK = myMainShape->_is_nil() ? !hasShape : hasShape;
if ( shapeOK && aMeshSObj )
{
myDlg->myMeshName->setText( aMeshSObj->GetName().c_str() );
myCompDlg->myMeshName->setText( aMeshSObj->GetName().c_str() );
SMESH::SMESH_Gen_var gen = getSMESHGUI()->GetSMESHGen();
SMESH::algo_error_array_var errors = gen->GetAlgoState(myMesh,myMainShape);
if ( errors->length() > 0 ) {
@ -1031,7 +1057,7 @@ void SMESHGUI_ComputeOp::startOperation()
#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
OCC_CATCH_SIGNALS;
#endif
SMESH::Update(IObject, true);
SMESH::Update(myIObject, true);
}
catch (...) {
#ifdef _DEBUG_
@ -1045,77 +1071,119 @@ void SMESHGUI_ComputeOp::startOperation()
}
}
}
Sel->setSelectedObjects( selected );
LightApp_SelectionMgr *Sel = selectionMgr();
if ( Sel )
{
SALOME_ListIO selected;
selected.Append( myIObject );
Sel->setSelectedObjects( selected );
}
}
}
if ( memoryLack )
aMemoryReserve.release();
myDlg->setWindowTitle(tr( computeFailed ? "SMESH_WRN_COMPUTE_FAILED" : "SMESH_COMPUTE_SUCCEED"));
myDlg->myMemoryLackGroup->hide();
myCompDlg->setWindowTitle(tr( computeFailed ? "SMESH_WRN_COMPUTE_FAILED" : "SMESH_COMPUTE_SUCCEED"));
// SHOW ERRORS
bool noCompError = ( !aCompErrors.operator->() || aCompErrors->length() == 0 );
bool noHypoError = ( aHypErrors.isEmpty() );
if ( memoryLack )
{
myDlg->myMemoryLackGroup->show();
myDlg->myFullInfo->hide();
myDlg->myBriefInfo->hide();
myDlg->myHypErrorGroup->hide();
myDlg->myCompErrorGroup->hide();
SUIT_ResourceMgr* resMgr = SMESH::GetResourceMgr( SMESHGUI::GetSMESHGUI() );
int aNotifyMode = resMgr->integerValue( "SMESH", "show_result_notification" );
bool isShowResultDlg = true;
switch( aNotifyMode ) {
case 0: // show the mesh computation result dialog NEVER
isShowResultDlg = false;
commit();
break;
case 1: // show the mesh computation result dialog if there are some errors
if ( memoryLack || !noCompError || !noHypoError )
isShowResultDlg = true;
else
{
isShowResultDlg = false;
commit();
}
break;
default: // show the result dialog after each mesh computation
isShowResultDlg = true;
}
else if ( noCompError && noHypoError )
// SHOW RESULTS
if ( isShowResultDlg )
showComputeResult( memoryLack, noCompError,aCompErrors, noHypoError, aHypErrors );
}
void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack,
const bool theNoCompError,
SMESH::compute_error_array_var& theCompErrors,
const bool theNoHypoError,
const QString& theHypErrors )
{
bool hasShape = myMesh->HasShapeToMesh();
SMESHGUI_ComputeDlg* aCompDlg = computeDlg();
aCompDlg->myMemoryLackGroup->hide();
if ( theMemoryLack )
{
myDlg->myFullInfo->SetInfoByMesh( myMesh );
myDlg->myFullInfo->show();
myDlg->myBriefInfo->hide();
myDlg->myHypErrorGroup->hide();
myDlg->myCompErrorGroup->hide();
aCompDlg->myMemoryLackGroup->show();
aCompDlg->myFullInfo->hide();
aCompDlg->myBriefInfo->hide();
aCompDlg->myHypErrorGroup->hide();
aCompDlg->myCompErrorGroup->hide();
}
else if ( theNoCompError && theNoHypoError )
{
aCompDlg->myFullInfo->SetInfoByMesh( myMesh );
aCompDlg->myFullInfo->show();
aCompDlg->myBriefInfo->hide();
aCompDlg->myHypErrorGroup->hide();
aCompDlg->myCompErrorGroup->hide();
}
else
{
QTableWidget* tbl = myDlg->myTable;
myDlg->myBriefInfo->SetInfoByMesh( myMesh );
myDlg->myBriefInfo->show();
myDlg->myFullInfo->hide();
QTableWidget* tbl = aCompDlg->myTable;
aCompDlg->myBriefInfo->SetInfoByMesh( myMesh );
aCompDlg->myBriefInfo->show();
aCompDlg->myFullInfo->hide();
if ( noHypoError ) {
myDlg->myHypErrorGroup->hide();
if ( theNoHypoError ) {
aCompDlg->myHypErrorGroup->hide();
}
else {
myDlg->myHypErrorGroup->show();
myDlg->myHypErrorLabel->setText( aHypErrors );
aCompDlg->myHypErrorGroup->show();
aCompDlg->myHypErrorLabel->setText( theHypErrors );
}
if ( noCompError ) {
myDlg->myCompErrorGroup->hide();
if ( theNoCompError ) {
aCompDlg->myCompErrorGroup->hide();
}
else {
myDlg->myCompErrorGroup->show();
aCompDlg->myCompErrorGroup->show();
if ( !hasShape ) {
myDlg->myPublishBtn->hide();
myDlg->myShowBtn->hide();
aCompDlg->myPublishBtn->hide();
aCompDlg->myShowBtn->hide();
}
else {
myDlg->myPublishBtn->show();
myDlg->myShowBtn->show();
aCompDlg->myPublishBtn->show();
aCompDlg->myShowBtn->show();
}
// fill table of errors
tbl->setRowCount( aCompErrors->length() );
tbl->setRowCount( theCompErrors->length() );
if ( !hasShape ) tbl->hideColumn( COL_SHAPE );
else tbl->showColumn( COL_SHAPE );
tbl->setColumnWidth( COL_ERROR, 200 );
bool hasBadMesh = false;
for ( int row = 0; row < aCompErrors->length(); ++row )
for ( int row = 0; row < theCompErrors->length(); ++row )
{
SMESH::ComputeError & err = aCompErrors[ row ];
SMESH::ComputeError & err = theCompErrors[ row ];
QString text = err.algoName.in();
if ( !tbl->item( row, COL_ALGO ) ) tbl->setItem( row, COL_ALGO, new QTableWidgetItem( text ) );
@ -1149,31 +1217,15 @@ void SMESHGUI_ComputeOp::startOperation()
tbl->resizeColumnToContents( COL_SHAPE );
if ( hasBadMesh )
myDlg->myBadMeshBtn->show();
aCompDlg->myBadMeshBtn->show();
else
myDlg->myBadMeshBtn->hide();
aCompDlg->myBadMeshBtn->hide();
tbl->setCurrentCell(0,0);
currentCellChanged(); // to update buttons
}
}
SUIT_ResourceMgr* resMgr = SMESH::GetResourceMgr( SMESHGUI::GetSMESHGUI() );
int aNotifyMode = resMgr->integerValue( "SMESH", "show_result_notification" );
switch( aNotifyMode ) {
case 0: // show the mesh computation result dialog NEVER
commit();
break;
case 1: // show the mesh computation result dialog if there are some errors
if ( memoryLack || !noCompError || !noHypoError )
myDlg->show();
else
commit();
break;
default: // show the result dialog after each mesh computation
myDlg->show();
}
aCompDlg->show();
}
//================================================================================
@ -1182,10 +1234,11 @@ void SMESHGUI_ComputeOp::startOperation()
*/
//================================================================================
void SMESHGUI_ComputeOp::stopOperation()
void SMESHGUI_BaseComputeOp::stopOperation()
{
SMESHGUI_Operation::stopOperation();
myTShapeDisplayer->SetVisibility( false );
if ( myTShapeDisplayer )
myTShapeDisplayer->SetVisibility( false );
if ( myBadMeshDisplayer ) {
myBadMeshDisplayer->SetVisibility( false );
// delete it in order not to have problems at its destruction when the viewer
@ -1193,6 +1246,7 @@ void SMESHGUI_ComputeOp::stopOperation()
delete myBadMeshDisplayer;
myBadMeshDisplayer = 0;
}
myIObject.Nullify();
}
//================================================================================
@ -1201,7 +1255,7 @@ void SMESHGUI_ComputeOp::stopOperation()
*/
//================================================================================
void SMESHGUI_ComputeOp::onPublishShape()
void SMESHGUI_BaseComputeOp::onPublishShape()
{
GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen();
SALOMEDS::Study_var study = SMESHGUI::GetSMESHGen()->GetCurrentStudy();
@ -1250,7 +1304,7 @@ void SMESHGUI_ComputeOp::onPublishShape()
*/
//================================================================================
void SMESHGUI_ComputeOp::onShowBadMesh()
void SMESHGUI_BaseComputeOp::onShowBadMesh()
{
myTShapeDisplayer->SetVisibility( false );
QList<int> rows;
@ -1283,7 +1337,7 @@ void SMESHGUI_ComputeOp::onShowBadMesh()
*/
//================================================================================
void SMESHGUI_ComputeOp::currentCellChanged()
void SMESHGUI_BaseComputeOp::currentCellChanged()
{
myTShapeDisplayer->SetVisibility( false );
if ( myBadMeshDisplayer )
@ -1313,9 +1367,9 @@ void SMESHGUI_ComputeOp::currentCellChanged()
if ( !table()->item(row, COL_BAD_MESH)->text().isEmpty() )
hasBadMesh = true;
}
myDlg->myPublishBtn->setEnabled( publishEnable );
myDlg->myShowBtn ->setEnabled( showEnable );
myDlg->myBadMeshBtn->setEnabled( hasBadMesh && ( nbSelected == 1 ));
myCompDlg->myPublishBtn->setEnabled( publishEnable );
myCompDlg->myShowBtn ->setEnabled( showEnable );
myCompDlg->myBadMeshBtn->setEnabled( hasBadMesh && ( nbSelected == 1 ));
}
//================================================================================
@ -1324,7 +1378,7 @@ void SMESHGUI_ComputeOp::currentCellChanged()
*/
//================================================================================
void SMESHGUI_ComputeOp::onPreviewShape()
void SMESHGUI_BaseComputeOp::onPreviewShape()
{
if ( myTShapeDisplayer )
{
@ -1352,8 +1406,10 @@ void SMESHGUI_ComputeOp::onPreviewShape()
*/
//================================================================================
SMESHGUI_ComputeOp::~SMESHGUI_ComputeOp()
SMESHGUI_BaseComputeOp::~SMESHGUI_BaseComputeOp()
{
delete myCompDlg;
myCompDlg = 0;
delete myTShapeDisplayer;
if ( myBadMeshDisplayer )
delete myBadMeshDisplayer;
@ -1361,14 +1417,60 @@ SMESHGUI_ComputeOp::~SMESHGUI_ComputeOp()
//================================================================================
/*!
* \brief Gets dialog of this operation
* \retval LightApp_Dialog* - pointer to dialog of this operation
* \brief Gets dialog of compute operation
* \retval SMESHGUI_ComputeDlg* - pointer to dialog of this operation
*/
//================================================================================
LightApp_Dialog* SMESHGUI_ComputeOp::dlg() const
SMESHGUI_ComputeDlg* SMESHGUI_BaseComputeOp::computeDlg() const
{
return myDlg;
return myCompDlg;
}
//================================================================================
/*!
* \brief Return a table
*/
//================================================================================
QTableWidget* SMESHGUI_BaseComputeOp::table()
{
return myCompDlg->myTable;
}
//================================================================================
/*!
* \brief Constructor
*/
//================================================================================
SMESHGUI_ComputeOp::SMESHGUI_ComputeOp()
: SMESHGUI_BaseComputeOp()
{
}
//================================================================================
/*!
* \brief Desctructor
*/
//================================================================================
SMESHGUI_ComputeOp::~SMESHGUI_ComputeOp()
{
}
//================================================================================
/*!
* \brief perform it's intention action: compute mesh
*/
//================================================================================
void SMESHGUI_ComputeOp::startOperation()
{
SMESHGUI_BaseComputeOp::startOperation();
computeMesh();
}
//================================================================================
@ -1384,11 +1486,420 @@ bool SMESHGUI_ComputeOp::onApply()
//================================================================================
/*!
* \brief Return a table
* \brief Gets dialog of this operation
* \retval LightApp_Dialog* - pointer to dialog of this operation
*/
//================================================================================
QTableWidget* SMESHGUI_ComputeOp::table()
LightApp_Dialog* SMESHGUI_ComputeOp::dlg() const
{
return myDlg->myTable;
return computeDlg();
}
//================================================================================
/*!
* \brief Constructor
*/
//================================================================================
SMESHGUI_PrecomputeOp::SMESHGUI_PrecomputeOp()
: SMESHGUI_BaseComputeOp(),
myDlg( 0 ),
myActiveDlg( 0 ),
myPreviewDisplayer( 0 )
{
myHelpFileName = "preview_meshes_page.html"; // V4
}
//================================================================================
/*!
* \brief Destructor
*/
//================================================================================
SMESHGUI_PrecomputeOp::~SMESHGUI_PrecomputeOp()
{
delete myDlg;
myDlg = 0;
myActiveDlg = 0;
if ( myPreviewDisplayer )
delete myPreviewDisplayer;
myPreviewDisplayer = 0;
}
//================================================================================
/*!
* \brief Gets current dialog of this operation
* \retval LightApp_Dialog* - pointer to dialog of this operation
*/
//================================================================================
LightApp_Dialog* SMESHGUI_PrecomputeOp::dlg() const
{
return myActiveDlg;
}
//================================================================================
/*!
* \brief perform it's intention action: prepare data
*/
//================================================================================
void SMESHGUI_PrecomputeOp::startOperation()
{
if ( !myDlg )
{
myDlg = new SMESHGUI_PrecomputeDlg( desktop() );
// connect signals
connect( myDlg, SIGNAL( preview() ), this, SLOT( onPreview() ) );
}
myActiveDlg = myDlg;
// connect signal to compute dialog. which will be shown after Compute mesh operation
SMESHGUI_ComputeDlg* cmpDlg = computeDlg();
if ( cmpDlg )
{
// disconnect signals
disconnect( cmpDlg, SIGNAL( dlgOk() ), this, SLOT( onOk() ) );
disconnect( cmpDlg, SIGNAL( dlgApply() ), this, SLOT( onApply() ) );
disconnect( cmpDlg, SIGNAL( dlgCancel() ), this, SLOT( onCancel() ) );
disconnect( cmpDlg, SIGNAL( dlgClose() ), this, SLOT( onCancel() ) );
disconnect( cmpDlg, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) );
// connect signals
if( cmpDlg->testButtonFlags( QtxDialog::OK ) )
connect( cmpDlg, SIGNAL( dlgOk() ), this, SLOT( onOk() ) );
if( cmpDlg->testButtonFlags( QtxDialog::Apply ) )
connect( cmpDlg, SIGNAL( dlgApply() ), this, SLOT( onApply() ) );
if( cmpDlg->testButtonFlags( QtxDialog::Help ) )
connect( cmpDlg, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) );
if( cmpDlg->testButtonFlags( QtxDialog::Cancel ) )
connect( cmpDlg, SIGNAL( dlgCancel() ), this, SLOT( onCancel() ) );
if( cmpDlg->testButtonFlags( QtxDialog::Close ) )
connect( cmpDlg, SIGNAL( dlgClose() ), this, SLOT( onCancel() ) );
}
SMESHGUI_BaseComputeOp::startOperation();
myDlg->show();
}
//================================================================================
/*!
* \brief Stops operation
*/
//================================================================================
void SMESHGUI_PrecomputeOp::stopOperation()
{
if ( myPreviewDisplayer )
{
myPreviewDisplayer->SetVisibility( false );
delete myPreviewDisplayer;
myPreviewDisplayer = 0;
}
myMapShapeId.clear();
SMESHGUI_BaseComputeOp::stopOperation();
}
//================================================================================
/*!
* \brief perform it's intention action: reinitialise dialog
*/
//================================================================================
void SMESHGUI_PrecomputeOp::resumeOperation()
{
if ( myActiveDlg == myDlg )
initDialog();
SMESHGUI_BaseComputeOp::resumeOperation();
}
void SMESHGUI_PrecomputeOp::initDialog()
{
QList<int> modes;
QMap<int, int> modeMap;
_PTR(SObject) aHypRoot;
_PTR(GenericAttribute) anAttr;
int aPart = SMESH::Tag_RefOnAppliedAlgorithms;
_PTR(SObject) pMesh = studyDS()->FindObjectID( myIObject->getEntry() );
if ( pMesh && pMesh->FindSubObject( aPart, aHypRoot ) )
{
_PTR(ChildIterator) anIter =
SMESH::GetActiveStudyDocument()->NewChildIterator( aHypRoot );
for ( ; anIter->More(); anIter->Next() )
{
_PTR(SObject) anObj = anIter->Value();
_PTR(SObject) aRefObj;
if ( anObj->ReferencedObject( aRefObj ) )
anObj = aRefObj;
else
continue;
if ( anObj->FindAttribute( anAttr, "AttributeName" ) )
{
CORBA::Object_var aVar = _CAST(SObject,anObj)->GetObject();
if ( CORBA::is_nil( aVar ) )
continue;
SMESH::SMESH_Algo_var algo = SMESH::SMESH_3D_Algo::_narrow( aVar );
if ( !algo->_is_nil() )
{
modeMap[ SMESH::DIM_1D ] = 0;
modeMap[ SMESH::DIM_2D ] = 0;
}
else
{
algo = SMESH::SMESH_2D_Algo::_narrow( aVar );
if ( !algo->_is_nil() )
modeMap[ SMESH::DIM_2D ] = 0;
}
}
}
}
if ( modeMap.contains( SMESH::DIM_1D ) )
modes.append( SMESH::DIM_1D );
if ( modeMap.contains( SMESH::DIM_2D ) )
modes.append( SMESH::DIM_2D );
myDlg->setPreviewModes( modes );
}
//================================================================================
/*!
* \brief perform it's intention action:
*/
//================================================================================
bool SMESHGUI_PrecomputeOp::onApply()
{
QObject* obj = sender();
if ( obj != myDlg && myActiveDlg == myDlg )
return true; // just return from error messages
if ( myActiveDlg == myDlg )
{
myDlg->hide();
myMapShapeId.clear();
myActiveDlg = computeDlg();
computeMesh();
}
return true;
}
//================================================================================
/*!
* \brief perform it's intention action: compute mesh
*/
//================================================================================
void SMESHGUI_PrecomputeOp::onCancel()
{
QObject* curDlg = sender();
if ( curDlg == computeDlg() )
{
if ( myActiveDlg == myDlg ) // return from error messages
myDlg->show();
return;
}
if ( myActiveDlg == myDlg && !myMesh->_is_nil() && myMapShapeId.count() )
{
// ask to remove already computed mesh elements
if ( SUIT_MessageBox::question( desktop(), tr( "SMESH_WARNING" ),
tr( "CLEAR_SUBMESH_QUESTION" ),
tr( "SMESH_BUT_DELETE" ), tr( "SMESH_BUT_NO" ), 0, 1 ) == 0 )
{
// remove all submeshes for collected shapes
QMap<int,int>::const_iterator it = myMapShapeId.constBegin();
for ( ; it != myMapShapeId.constEnd(); ++it )
myMesh->ClearSubMesh( *it );
}
}
myMapShapeId.clear();
SMESHGUI_BaseComputeOp::onCancel();
}
//================================================================================
/*!
* \brief perform it's intention action: preview mesh
*/
//================================================================================
void SMESHGUI_PrecomputeOp::onPreview()
{
if ( !myDlg || myMesh->_is_nil() || myMainShape->_is_nil() )
return;
_PTR(SObject) aMeshSObj = SMESH::FindSObject(myMesh);
if ( !aMeshSObj )
return;
// Compute preview of mesh,
// i.e. compute mesh till indicated dimension
int dim = myDlg->getPreviewMode();
SMESH::MemoryReserve aMemoryReserve;
SMESH::compute_error_array_var aCompErrors;
QString aHypErrors;
bool computeFailed = true, memoryLack = false;
SMESHGUI_ComputeDlg* aCompDlg = computeDlg();
aCompDlg->myMeshName->setText( aMeshSObj->GetName().c_str() );
SMESHGUI* gui = getSMESHGUI();
SMESH::SMESH_Gen_var gen = gui->GetSMESHGen();
SMESH::algo_error_array_var errors = gen->GetAlgoState(myMesh,myMainShape);
if ( errors->length() > 0 ) {
aHypErrors = SMESH::GetMessageOnAlgoStateErrors( errors.in() );
}
SUIT_OverrideCursor aWaitCursor;
SVTK_ViewWindow* view = SMESH::GetViewWindow( gui );
if ( myPreviewDisplayer ) delete myPreviewDisplayer;
myPreviewDisplayer = new SMESHGUI_MeshEditPreview( view );
SMESH::long_array_var aShapesId = new SMESH::long_array();
try {
#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
OCC_CATCH_SIGNALS;
#endif
SMESH::MeshPreviewStruct_var previewData =
gen->Precompute(myMesh, myMainShape, (SMESH::Dimension)dim, aShapesId);
if ( previewData.operator->() )
{
computeFailed = false;
myPreviewDisplayer->SetData( previewData._retn() );
// append shape indeces with computed mesh entities
for ( int i = 0, n = aShapesId->length(); i < n; i++ )
myMapShapeId[ aShapesId[ i ] ] = 0;
}
else
myPreviewDisplayer->SetVisibility(false);
}
catch(const SALOME::SALOME_Exception & S_ex){
memoryLack = true;
myPreviewDisplayer->SetVisibility(false);
}
try {
#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
OCC_CATCH_SIGNALS;
#endif
aCompErrors = gen->GetComputeErrors( myMesh, myMainShape );
// check if there are memory problems
for ( int i = 0; (i < aCompErrors->length()) && !memoryLack; ++i )
memoryLack = ( aCompErrors[ i ].code == SMESH::COMPERR_MEMORY_PB );
}
catch(const SALOME::SALOME_Exception & S_ex){
memoryLack = true;
}
if ( memoryLack )
aMemoryReserve.release();
bool noCompError = ( !aCompErrors.operator->() || aCompErrors->length() == 0 );
bool noHypoError = ( aHypErrors.isEmpty() );
SUIT_ResourceMgr* resMgr = SMESH::GetResourceMgr( gui );
int aNotifyMode = resMgr->integerValue( "SMESH", "show_result_notification" );
bool isShowError = true;
switch( aNotifyMode ) {
case 0: // show the mesh computation result dialog NEVER
isShowError = false;
break;
case 1: // show the mesh computation result dialog if there are some errors
default: // show the result dialog after each mesh computation
if ( !computeFailed && !memoryLack && noCompError && noHypoError )
isShowError = false;
break;
}
// SHOW ERRORS
if ( isShowError )
{
myDlg->hide();
aCompDlg->setWindowTitle(tr( computeFailed ? "SMESH_WRN_COMPUTE_FAILED" : "SMESH_COMPUTE_SUCCEED"));
showComputeResult( memoryLack, noCompError, aCompErrors, noHypoError, aHypErrors );
}
}
//================================================================================
/*!
* \brief Constructor
*/
//================================================================================
SMESHGUI_PrecomputeDlg::SMESHGUI_PrecomputeDlg( QWidget* parent )
: SMESHGUI_Dialog( parent, false, false, OK | Cancel | Help )
{
setWindowTitle( tr( "CAPTION" ) );
setButtonText( OK, tr( "COMPUTE" ) );
QFrame* main = mainFrame();
QVBoxLayout* layout = new QVBoxLayout( main );
QFrame* frame = new QFrame( main );
layout->setMargin(0); layout->setSpacing(0);
layout->addWidget( frame );
QHBoxLayout* frameLay = new QHBoxLayout( frame );
frameLay->setMargin(0); frameLay->setSpacing(SPACING);
myPreviewMode = new QtxComboBox( frame );
frameLay->addWidget( myPreviewMode );
myPreviewBtn = new QPushButton( tr( "PREVIEW" ), frame );
frameLay->addWidget( myPreviewBtn );
connect( myPreviewBtn, SIGNAL( clicked( bool ) ), this, SIGNAL( preview() ) );
}
//================================================================================
/*!
* \brief Destructor
*/
//================================================================================
SMESHGUI_PrecomputeDlg::~SMESHGUI_PrecomputeDlg()
{
}
//================================================================================
/*!
* \brief Sets available preview modes
*/
//================================================================================
void SMESHGUI_PrecomputeDlg::setPreviewModes( const QList<int>& theModes )
{
myPreviewMode->clear();
QList<int>::const_iterator it = theModes.constBegin();
for ( int i = 0; it != theModes.constEnd(); ++it, i++ )
{
QString mode = QString( "PREVIEW_%1" ).arg( *it );
myPreviewMode->addItem( tr( mode.toLatin1().data() ) );
myPreviewMode->setId( i, *it );
}
myPreviewBtn->setEnabled( !theModes.isEmpty() );
}
//================================================================================
/*!
* \brief Returns current preview mesh mode
*/
//================================================================================
int SMESHGUI_PrecomputeDlg::getPreviewMode() const
{
return myPreviewMode->currentId();
}

View File

@ -30,29 +30,82 @@
#include "SMESHGUI_Dialog.h"
#include "SMESHGUI_Operation.h"
// SALOME GUI includes
#include <SALOME_InteractiveObject.hxx>
// Qt includes
#include <QMap>
#include <QPointer>
#include <QGroupBox>
// IDL includes
#include <SALOMEconfig.h>
#include CORBA_SERVER_HEADER(SMESH_Gen)
#include CORBA_SERVER_HEADER(SMESH_Mesh)
class QFrame;
class QPushButton;
class QTableWidget;
class QLabel;
class QtxComboBox;
class SMESHGUI_ComputeDlg;
class SMESHGUI_PrecomputeDlg;
class SMESHGUI_MeshEditPreview;
class SMESH::compute_error_array;
namespace SMESH
{
class TShapeDisplayer;
}
/*!
* \brief Base operation to compute a mesh and show computation errors
*/
class SMESHGUI_EXPORT SMESHGUI_BaseComputeOp: public SMESHGUI_Operation
{
Q_OBJECT
public:
SMESHGUI_BaseComputeOp();
virtual ~SMESHGUI_BaseComputeOp();
protected:
virtual void startOperation();
virtual void stopOperation();
SMESHGUI_ComputeDlg* computeDlg() const;
void computeMesh();
void showComputeResult( const bool,
const bool,
SMESH::compute_error_array_var&,
const bool,
const QString& );
protected slots:
void onPreviewShape();
void onPublishShape();
void onShowBadMesh();
void currentCellChanged();
private:
QTableWidget* table();
private:
QPointer<SMESHGUI_ComputeDlg> myCompDlg;
protected:
SMESH::SMESH_Mesh_var myMesh;
GEOM::GEOM_Object_var myMainShape;
SMESH::TShapeDisplayer* myTShapeDisplayer;
SMESHGUI_MeshEditPreview* myBadMeshDisplayer;
Handle(SALOME_InteractiveObject) myIObject;
};
/*!
* \brief Operation to compute a mesh and show computation errors
*/
class SMESHGUI_EXPORT SMESHGUI_ComputeOp: public SMESHGUI_Operation
class SMESHGUI_EXPORT SMESHGUI_ComputeOp: public SMESHGUI_BaseComputeOp
{
Q_OBJECT
@ -64,26 +117,43 @@ public:
protected:
virtual void startOperation();
virtual void stopOperation();
protected slots:
virtual bool onApply();
};
/*!
* \brief Operation to preview and compute a mesh and show computation errors
*/
class SMESHGUI_EXPORT SMESHGUI_PrecomputeOp: public SMESHGUI_BaseComputeOp
{
Q_OBJECT
public:
SMESHGUI_PrecomputeOp();
virtual ~SMESHGUI_PrecomputeOp();
virtual LightApp_Dialog* dlg() const;
protected:
virtual void startOperation();
virtual void stopOperation();
virtual void resumeOperation();
virtual void initDialog();
protected slots:
virtual bool onApply();
virtual void onCancel();
private slots:
void onPreviewShape();
void onPublishShape();
void onShowBadMesh();
void currentCellChanged();
void onPreview();
private:
QTableWidget* table();
SMESHGUI_ComputeDlg* myDlg;
SMESH::SMESH_Mesh_var myMesh;
GEOM::GEOM_Object_var myMainShape;
SMESH::TShapeDisplayer* myTShapeDisplayer;
SMESHGUI_MeshEditPreview* myBadMeshDisplayer;
QMap< int, int > myMapShapeId;
QPointer<LightApp_Dialog> myActiveDlg;
QPointer<SMESHGUI_PrecomputeDlg> myDlg;
SMESHGUI_MeshEditPreview* myPreviewDisplayer;
};
/*!
@ -142,9 +212,10 @@ class SMESHGUI_EXPORT SMESHGUI_ComputeDlg : public SMESHGUI_Dialog
Q_OBJECT
public:
SMESHGUI_ComputeDlg();
SMESHGUI_ComputeDlg( QWidget* );
virtual ~SMESHGUI_ComputeDlg();
private:
protected:
QFrame* createMainFrame( QWidget* );
QLabel* myMeshName;
@ -160,7 +231,32 @@ private:
SMESHGUI_MeshInfosBox* myBriefInfo;
SMESHGUI_MeshInfosBox* myFullInfo;
friend class SMESHGUI_ComputeOp;
friend class SMESHGUI_BaseComputeOp;
friend class SMESHGUI_PrecomputeOp;
};
/*!
* \brief Dialog to preview and compute a mesh and show computation errors
*/
class SMESHGUI_EXPORT SMESHGUI_PrecomputeDlg : public SMESHGUI_Dialog
{
Q_OBJECT
public:
SMESHGUI_PrecomputeDlg( QWidget* );
virtual ~SMESHGUI_PrecomputeDlg();
void setPreviewModes( const QList<int>& );
int getPreviewMode() const;
signals:
void preview();
private:
QPushButton* myPreviewBtn;
QtxComboBox* myPreviewMode;
};
#endif // SMESHGUI_COMPUTEDLG_H

View File

@ -34,6 +34,10 @@
<source>ICON_COMPUTE</source>
<translation>mesh_compute.png</translation>
</message>
<message>
<source>ICON_PRECOMPUTE</source>
<translation>mesh_precompute.png</translation>
</message>
<message>
<source>ICON_CONNECTION</source>
<translation>mesh_multi_edges.png</translation>

View File

@ -154,6 +154,10 @@
<source>MEN_COMPUTE</source>
<translation>Compute</translation>
</message>
<message>
<source>MEN_PRECOMPUTE</source>
<translation>Preview</translation>
</message>
<message>
<source>MEN_CONNECTION</source>
<translation>Borders at Multi-Connection</translation>
@ -1916,6 +1920,10 @@ Consider saving your work before application crash</translation>
<source>STB_COMPUTE</source>
<translation>Compute</translation>
</message>
<message>
<source>STB_PRECOMPUTE</source>
<translation>Preview</translation>
</message>
<message>
<source>STB_CONNECTION</source>
<translation>Borders at Multi-Connection</translation>
@ -2380,6 +2388,10 @@ Consider saving your work before application crash</translation>
<source>TOP_COMPUTE</source>
<translation>Compute</translation>
</message>
<message>
<source>TOP_PRECOMPUTE</source>
<translation>Preview</translation>
</message>
<message>
<source>TOP_CONNECTION</source>
<translation>Borders at Multi-Connection</translation>
@ -3109,6 +3121,38 @@ Please, create VTK viewer and try again</translation>
<translation>Show bad Mesh</translation>
</message>
</context>
<context>
<name>SMESHGUI_PrecomputeDlg</name>
<message>
<source>CAPTION</source>
<translation>Preview and Compute mesh</translation>
</message>
<message>
<source>PREVIEW</source>
<translation>Preview</translation>
</message>
<message>
<source>PREVIEW_1</source>
<translation>1D Mesh</translation>
</message>
<message>
<source>PREVIEW_2</source>
<translation>2D Mesh</translation>
</message>
<message>
<source>COMPUTE</source>
<translation>Compute</translation>
</message>
</context>
<context>
<name>SMESHGUI_PrecomputeOp</name>
<message>
<source>CLEAR_SUBMESH_QUESTION</source>
<translation>A temporary submeshes on the selected geometry
created during preview operation.
Do you want to remove all this submeshes?</translation>
</message>
</context>
<context>
<name>SMESHGUI_ConvToQuadDlg</name>
<message>

View File

@ -1364,6 +1364,194 @@ CORBA::Boolean SMESH_Gen_i::Compute( SMESH::SMESH_Mesh_ptr theMesh,
return false;
}
//=============================================================================
/*!
* SMESH_Gen_i::Precompute
*
* Compute mesh as preview till indicated dimension on shape
*/
//=============================================================================
SMESH::MeshPreviewStruct* SMESH_Gen_i::Precompute( SMESH::SMESH_Mesh_ptr theMesh,
GEOM::GEOM_Object_ptr theShapeObject,
SMESH::Dimension theDimension,
SMESH::long_array& theShapesId)
throw ( SALOME::SALOME_Exception )
{
Unexpect aCatch(SALOME_SalomeException);
if(MYDEBUG) MESSAGE( "SMESH_Gen_i::Precompute" );
if ( CORBA::is_nil( theShapeObject ) && theMesh->HasShapeToMesh())
THROW_SALOME_CORBA_EXCEPTION( "bad shape object reference",
SALOME::BAD_PARAM );
if ( CORBA::is_nil( theMesh ) )
THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference",
SALOME::BAD_PARAM );
SMESH::MeshPreviewStruct_var result = 0;
try {
// get mesh servant
SMESH_Mesh_i* meshServant = dynamic_cast<SMESH_Mesh_i*>( GetServant( theMesh ).in() );
ASSERT( meshServant );
if ( meshServant ) {
// NPAL16168: "geometrical group edition from a submesh don't modifiy mesh computation"
meshServant->CheckGeomGroupModif();
// get local TopoDS_Shape
TopoDS_Shape myLocShape;
if(theMesh->HasShapeToMesh())
myLocShape = GeomObjectToShape( theShapeObject );
else
return result._retn();;
// call implementation compute
::SMESH_Mesh& myLocMesh = meshServant->GetImpl();
TSetOfInt shapeIds;
::MeshDimension aDim = (MeshDimension)theDimension;
if ( myGen.Compute( myLocMesh, myLocShape, false, aDim, &shapeIds ) )
{
int nbShapeId = shapeIds.size();
theShapesId.length( nbShapeId );
// iterates on shapes and collect mesh entities into mesh preview
result = new SMESH::MeshPreviewStruct;
TSetOfInt::const_iterator idIt = shapeIds.begin();
TSetOfInt::const_iterator idEnd = shapeIds.end();
std::map< int, int > mapOfShIdNb;
std::set< SMESH_TLink > setOfEdge;
std::list< SMDSAbs_ElementType > listOfElemType;
typedef map<const SMDS_MeshElement*, int > TNode2LocalIDMap;
typedef TNode2LocalIDMap::iterator TNodeLocalID;
TNode2LocalIDMap mapNode2LocalID;
list< TNodeLocalID > connectivity;
int i, nbConnNodes = 0;
std::set< const SMESH_subMesh* > setOfVSubMesh;
// iterates on shapes
for ( ; idIt != idEnd; idIt++ )
{
if ( mapOfShIdNb.find( *idIt ) != mapOfShIdNb.end() )
continue;
SMESH_subMesh* sm = myLocMesh.GetSubMeshContaining(*idIt);
if ( !sm || !sm->IsMeshComputed() )
continue;
const TopoDS_Shape& aSh = sm->GetSubShape();
const int shDim = myGen.GetShapeDim( aSh );
if ( shDim < 1 || shDim > theDimension )
continue;
mapOfShIdNb[ *idIt ] = 0;
theShapesId[ mapOfShIdNb.size() - 1 ] = *idIt;
SMESHDS_SubMesh* smDS = sm->GetSubMeshDS();
if ( !smDS ) continue;
if ( theDimension == SMESH::DIM_2D )
{
SMDS_ElemIteratorPtr faceIt = smDS->GetElements();
while ( faceIt->more() )
{
const SMDS_MeshElement* face = faceIt->next();
int aNbNode = face->NbNodes();
if ( aNbNode > 4 )
aNbNode /= 2; // do not take into account additional middle nodes
SMDS_MeshNode* node1 = (SMDS_MeshNode*)face->GetNode( 1 );
for ( int nIndx = 1; nIndx <= aNbNode; nIndx++ )
{
SMDS_MeshNode* node2 = (SMDS_MeshNode*)face->GetNode( nIndx < aNbNode ? nIndx+1 : 1 );
if ( setOfEdge.insert( SMESH_TLink ( node1, node2 ) ).second )
{
listOfElemType.push_back( SMDSAbs_Edge );
connectivity.push_back
( mapNode2LocalID.insert( make_pair( node1, ++nbConnNodes)).first );
connectivity.push_back
( mapNode2LocalID.insert( make_pair( node2, ++nbConnNodes)).first );
}
node1 = node2;
}
}
}
else if ( theDimension == SMESH::DIM_1D )
{
SMDS_NodeIteratorPtr nodeIt = smDS->GetNodes();
while ( nodeIt->more() )
{
listOfElemType.push_back( SMDSAbs_Node );
connectivity.push_back
( mapNode2LocalID.insert( make_pair( nodeIt->next(), ++nbConnNodes)).first );
}
// add corner nodes by first vertex from edge
SMESH_subMeshIteratorPtr edgeSmIt =
sm->getDependsOnIterator(/*includeSelf*/false,
/*complexShapeFirst*/false);
while ( edgeSmIt->more() )
{
SMESH_subMesh* vertexSM = edgeSmIt->next();
// check that vertex is not already treated
if ( !setOfVSubMesh.insert( vertexSM ).second )
continue;
if ( vertexSM->GetSubShape().ShapeType() != TopAbs_VERTEX )
continue;
const SMESHDS_SubMesh* vertexSmDS = vertexSM->GetSubMeshDS();
SMDS_NodeIteratorPtr nodeIt = vertexSmDS->GetNodes();
while ( nodeIt->more() )
{
listOfElemType.push_back( SMDSAbs_Node );
connectivity.push_back
( mapNode2LocalID.insert( make_pair( nodeIt->next(), ++nbConnNodes)).first );
}
}
}
}
// fill node coords and assign local ids to the nodes
int nbNodes = mapNode2LocalID.size();
result->nodesXYZ.length( nbNodes );
TNodeLocalID node2ID = mapNode2LocalID.begin();
for ( i = 0; i < nbNodes; ++i, ++node2ID ) {
node2ID->second = i;
const SMDS_MeshNode* node = (const SMDS_MeshNode*) node2ID->first;
result->nodesXYZ[i].x = node->X();
result->nodesXYZ[i].y = node->Y();
result->nodesXYZ[i].z = node->Z();
}
// fill connectivity
result->elementConnectivities.length( nbConnNodes );
list< TNodeLocalID >::iterator connIt = connectivity.begin();
for ( i = 0; i < nbConnNodes; ++i, ++connIt ) {
result->elementConnectivities[i] = (*connIt)->second;
}
// fill element types
result->elementTypes.length( listOfElemType.size() );
std::list< SMDSAbs_ElementType >::const_iterator typeIt = listOfElemType.begin();
std::list< SMDSAbs_ElementType >::const_iterator typeEnd = listOfElemType.end();
for ( i = 0; typeIt != typeEnd; ++i, ++typeIt )
{
SMDSAbs_ElementType elemType = *typeIt;
result->elementTypes[i].SMDS_ElementType = (SMESH::ElementType)elemType;
result->elementTypes[i].isPoly = false;
result->elementTypes[i].nbNodesInElement = elemType == SMDSAbs_Edge ? 2 : 1;
}
// correct number of shapes
theShapesId.length( mapOfShIdNb.size() );
}
}
}
catch ( std::bad_alloc ) {
INFOS( "Precompute(): lack of memory" );
}
catch ( SALOME_Exception& S_ex ) {
INFOS( "Precompute(): catch exception "<< S_ex.what() );
}
catch ( ... ) {
INFOS( "Precompute(): unknown exception " );
}
return result._retn();
}
//================================================================================
/*!
* \brief Return geometrical object the given element is built on
@ -3538,9 +3726,9 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
// "Nodes on Faces" - ID of node on face
// "Face U positions" - U parameter of node on face
// "Face V positions" - V parameter of node on face
char* aEid_DSName = "Nodes on Edges";
char* aEu_DSName = "Edge positions";
char* aFu_DSName = "Face U positions";
const char* aEid_DSName = "Nodes on Edges";
const char* aEu_DSName = "Edge positions";
const char* aFu_DSName = "Face U positions";
//char* aFid_DSName = "Nodes on Faces";
//char* aFv_DSName = "Face V positions";

View File

@ -237,6 +237,17 @@ public:
CORBA::Boolean IsReadyToCompute( SMESH::SMESH_Mesh_ptr theMesh,
GEOM::GEOM_Object_ptr theShapeObject )
throw ( SALOME::SALOME_Exception );
/*!
* Calculate Mesh as preview till indicated dimension on shape
* First, verify list of hypothesis associated with the subShape.
* Return mesh preview structure
*/
SMESH::MeshPreviewStruct* Precompute( SMESH::SMESH_Mesh_ptr theMesh,
GEOM::GEOM_Object_ptr theSubObject,
SMESH::Dimension theDimension,
SMESH::long_array& theShapesId )
throw ( SALOME::SALOME_Exception );
// Returns errors of hypotheses definintion
SMESH::algo_error_array* GetAlgoState( SMESH::SMESH_Mesh_ptr theMesh,

View File

@ -209,6 +209,24 @@ void SMESH_Mesh_i::Clear() throw (SALOME::SALOME_Exception)
TPythonDump() << _this() << ".Clear()";
}
//================================================================================
/*!
* \brief Remove all nodes and elements for indicated shape
*/
//================================================================================
void SMESH_Mesh_i::ClearSubMesh(CORBA::Long ShapeID)
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
try {
_impl->ClearSubMesh( ShapeID );
}
catch(SALOME_Exception & S_ex) {
THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
}
}
//=============================================================================
/*!
*
@ -1976,7 +1994,7 @@ void SMESH_Mesh_i::ExportToMED (const char* file,
// Perform Export
PrepareForWriting(file);
char* aMeshName = "Mesh";
const char* aMeshName = "Mesh";
SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
if ( !aStudy->_is_nil() ) {
SALOMEDS::SObject_var aMeshSO = _gen_i->ObjectToSObject( aStudy, _this() );

View File

@ -77,6 +77,9 @@ public:
void Clear()
throw (SALOME::SALOME_Exception);
void ClearSubMesh(CORBA::Long ShapeID)
throw (SALOME::SALOME_Exception);
SMESH::Hypothesis_Status AddHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
SMESH::SMESH_Hypothesis_ptr anHyp)
throw (SALOME::SALOME_Exception);

View File

@ -928,6 +928,16 @@ class Mesh:
smeshgui.SetMeshIcon( salome.ObjectToID( self.mesh ), False, True )
salome.sg.updateObjBrowser(1)
## Removes all nodes and elements of indicated shape
# @ingroup l2_construct
def ClearSubMesh(self, geomId):
self.mesh.ClearSubMesh(geomId)
if salome.sg.hasDesktop():
smeshgui = salome.ImportComponentGUI("SMESH")
smeshgui.Init(salome.myStudyId)
smeshgui.SetMeshIcon( salome.ObjectToID( self.mesh ), False, True )
salome.sg.updateObjBrowser(1)
## Computes a tetrahedral mesh using AutomaticLength + MEFISTO + NETGEN
# @param fineness [0,-1] defines mesh fineness
# @return True or False