From bf2593a23725d5128b6db0d9e4643a0dd076f6d8 Mon Sep 17 00:00:00 2001 From: eap Date: Mon, 17 Sep 2012 10:20:24 +0000 Subject: [PATCH] 0020982: EDF 1547 SMESH: Creation of non-conformal quadratic pyramids Show elements whose medium nodes were not placed on geometry --- src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx | 69 ++++++++++++++++++++++---- src/SMESHGUI/SMESHGUI_ConvToQuadOp.h | 3 ++ src/SMESHGUI/SMESH_msg_en.ts | 5 ++ 3 files changed, 68 insertions(+), 9 deletions(-) diff --git a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx index a62d0b949..a5575b879 100644 --- a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx +++ b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx @@ -29,21 +29,26 @@ #include "SMESHGUI.h" #include "SMESHGUI_ConvToQuadDlg.h" +#include "SMESHGUI_MeshEditPreview.h" #include "SMESHGUI_Utils.h" -#include "SMDSAbs_ElementType.hxx" - +#include "SMESH_ActorUtils.h" #include "SMESH_TypeFilter.hxx" +#include "SMDSAbs_ElementType.hxx" // SALOME GUI includes #include #include #include #include +#include // IDL includes #include #include CORBA_SERVER_HEADER(SMESH_MeshEditor) +// VTK includes +#include + //================================================================================ /*! * \brief Constructor @@ -53,7 +58,8 @@ //================================================================================ SMESHGUI_ConvToQuadOp::SMESHGUI_ConvToQuadOp() : SMESHGUI_SelectionOp(), - myDlg( 0 ) + myDlg( 0 ), + myBadElemsPreview(0) { } @@ -64,8 +70,8 @@ SMESHGUI_ConvToQuadOp::SMESHGUI_ConvToQuadOp() //================================================================================ SMESHGUI_ConvToQuadOp::~SMESHGUI_ConvToQuadOp() { - if ( myDlg ) - delete myDlg; + if ( myDlg ) delete myDlg; + if ( myBadElemsPreview ) delete myBadElemsPreview; } //================================================================================ @@ -237,14 +243,47 @@ bool SMESHGUI_ConvToQuadOp::onApply() SMESH::SMESH_Mesh_var sourceMesh = SMESH::SObjectToInterface( pObj ); if( !myDlg->CurrentRB() ) { - bool aParam = true; + bool force3d = true; if( myDlg->IsEnabledCheck() ) - aParam = myDlg->IsMediumNdsOnGeom(); + force3d = myDlg->IsMediumNdsOnGeom(); if ( sourceMesh->_is_nil() ) - aEditor->ConvertToQuadraticObject( aParam, idSource ); + aEditor->ConvertToQuadraticObject( force3d, idSource ); else - aEditor->ConvertToQuadratic( aParam ); + aEditor->ConvertToQuadratic( force3d ); + + if ( !force3d ) + { + SMESH::ComputeError_var error = aEditor->GetLastError(); + if ( error->hasBadMesh ) + { + if ( myBadElemsPreview ) delete myBadElemsPreview; // viewWindow may change + myBadElemsPreview = new SMESHGUI_MeshEditPreview( viewWindow() ); + + vtkFloatingPointType aPointSize = SMESH::GetFloat("SMESH:node_size",3); + vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1); + vtkProperty* prop = vtkProperty::New(); + prop->SetLineWidth( aLineWidth * 3 ); + prop->SetPointSize( aPointSize * 3 ); + prop->SetColor( 250, 0, 250 ); + myBadElemsPreview->GetActor()->SetProperty( prop ); + prop->Delete(); + + SMESH::MeshPreviewStruct_var previewData = aEditor->GetPreviewData(); + myBadElemsPreview->SetData( & previewData.in() ); + myBadElemsPreview->SetVisibility(true); + + SUIT_MessageBox* mb = new SUIT_MessageBox(SUIT_MessageBox::Warning, + tr( "SMESH_WRN_WARNING" ), + tr("EDITERR_NO_MEDIUM_ON_GEOM"), + SUIT_MessageBox::Ok, myDlg); + mb->setWindowModality( Qt::NonModal ); + mb->setAttribute( Qt::WA_DeleteOnClose ); + mb->show(); + connect ( mb, SIGNAL( finished(int) ), this, SLOT( onWarningWinFinished() )); + //connect ( mb, SIGNAL( rejected() ), this, SLOT( onWarningWinFinished() )); + } + } } else { @@ -272,6 +311,18 @@ bool SMESHGUI_ConvToQuadOp::onApply() return aResult; } +//================================================================================ +/*! + * \brief SLOT called when a warning window is closed + */ +//================================================================================ + +void SMESHGUI_ConvToQuadOp::onWarningWinFinished() +{ + if ( myBadElemsPreview ) + myBadElemsPreview->SetVisibility(false); +} + //================================================================================ /*! ConsistMesh * Determines, what elements this mesh contains. diff --git a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.h b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.h index 9e2cbb129..ba30b15e1 100644 --- a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.h +++ b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.h @@ -37,6 +37,7 @@ #include CORBA_SERVER_HEADER(SMESH_Mesh) class SMESHGUI_ConvToQuadDlg; +class SMESHGUI_MeshEditPreview; class SMESHGUI_EXPORT SMESHGUI_ConvToQuadOp : public SMESHGUI_SelectionOp { @@ -60,9 +61,11 @@ protected: protected slots: virtual bool onApply(); void ConnectRadioButtons( int ); + void onWarningWinFinished(); private: SMESHGUI_ConvToQuadDlg* myDlg; + SMESHGUI_MeshEditPreview* myBadElemsPreview; }; #endif // SMESHGUI_CONVTOQUADOP_H diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index 2c9c051ab..df96e26b4 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -131,6 +131,11 @@ COMPERR_NO_MESH_ON_SHAPE No mesh elements assigned to a Sub-shape + + EDITERR_NO_MEDIUM_ON_GEOM + Some medium nodes not placed on geometry to avoid + distorting elements shown in magenta + SMESH_GEOM Geometry