X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ConvToQuadOp.cxx;h=77b0a8fe67c5ff3363075ec18a53c1f2c5c973ba;hp=ff21b39e687efc1973b5af2b122e12e81e875ed4;hb=2077baef82667760cb5fdc79454203a10d457d38;hpb=ae29d465091933df101dfac6ae99d3becf4efde7 diff --git a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx index ff21b39e6..77b0a8fe6 100644 --- a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx +++ b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // 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 @@ -105,7 +105,7 @@ void SMESHGUI_ConvToQuadOp::startOperation() SMESHGUI_SelectionOp::startOperation(); - myDlg->SetMediumNdsOnGeom( false ); + myDlg->SetMediumNdsOnGeom( true ); myDlg->activateObject( 0 ); myDlg->ShowWarning( false ); myDlg->show(); @@ -142,19 +142,10 @@ void SMESHGUI_ConvToQuadOp::selectionDone() myDlg->setButtonEnabled( false, QtxDialog::OK | QtxDialog::Apply ); return; } - MeshType meshType = ConsistMesh( idSource ); - if( meshType == SMESHGUI_ConvToQuadOp::Quadratic ) - { - myDlg->SetEnabledRB( 0, false ); - } - else if( meshType == SMESHGUI_ConvToQuadOp::Linear ) - { - myDlg->SetEnabledRB( 1, false ); - } - else - { - myDlg->SetEnabledControls( true ); - } + SMESH::SMESH_Mesh_var mesh = idSource->GetMesh(); + bool hasGeom = mesh->HasShapeToMesh(); + MeshDestinationType meshTgtType = DestinationMesh( idSource ); + myDlg->SetEnabledRB( meshTgtType, hasGeom && ( meshTgtType & ( BiQuadratic | Quadratic ))); // show warning on non-conformal result mesh if ( ! idSource->_is_nil() ) @@ -166,8 +157,9 @@ void SMESHGUI_ConvToQuadOp::selectionDone() { SMESH::SMESH_Mesh_var mesh = idSource->GetMesh(); idSource = SMESH::SMESH_IDSource::_narrow( mesh ); - MeshType fullMeshType = ConsistMesh( idSource ); - toShow = ( fullMeshType != Comp ); + bool isMixOrder; + DestinationMesh( idSource, &isMixOrder ); + toShow = !isMixOrder; } myDlg->ShowWarning( toShow ); } @@ -241,17 +233,20 @@ bool SMESHGUI_ConvToQuadOp::onApply() SMESH::SMESH_MeshEditor_var aEditor = mesh->GetMeshEditor(); aResult = true; SMESH::SMESH_Mesh_var sourceMesh = SMESH::SObjectToInterface( pObj ); - if( !myDlg->CurrentRB() ) + if( myDlg->CurrentRB()==1 || myDlg->CurrentRB()==2) { bool force3d = true; if( myDlg->IsEnabledCheck() ) force3d = myDlg->IsMediumNdsOnGeom(); - - if ( sourceMesh->_is_nil() ) - aEditor->ConvertToQuadraticObject( force3d, idSource ); - else - aEditor->ConvertToQuadratic( force3d ); - + bool theToBiQuad = myDlg->IsBiQuadratic(); + if ( sourceMesh->_is_nil() ) { + if ( theToBiQuad ) aEditor->ConvertToBiQuadratic ( force3d, idSource ); + else aEditor->ConvertToQuadraticObject( force3d, idSource ); + } + else { + if ( theToBiQuad ) aEditor->ConvertToBiQuadratic( force3d, sourceMesh ); + else aEditor->ConvertToQuadratic ( force3d ); + } if ( !force3d ) { SMESH::ComputeError_var error = aEditor->GetLastError(); @@ -259,7 +254,7 @@ bool SMESHGUI_ConvToQuadOp::onApply() { if ( myBadElemsPreview ) delete myBadElemsPreview; // viewWindow may change myBadElemsPreview = new SMESHGUI_MeshEditPreview( viewWindow() ); - + double aPointSize = SMESH::GetFloat("SMESH:node_size",3); double aLineWidth = SMESH::GetFloat("SMESH:element_width",1); vtkProperty* prop = vtkProperty::New(); @@ -325,18 +320,34 @@ void SMESHGUI_ConvToQuadOp::onWarningWinFinished() //================================================================================ /*! ConsistMesh - * Determines, what elements this mesh contains. + * Determines, what elements this mesh does not contain. */ //================================================================================ -SMESHGUI_ConvToQuadOp::MeshType SMESHGUI_ConvToQuadOp::ConsistMesh( const SMESH::SMESH_IDSource_var& idSource) const + +SMESHGUI_ConvToQuadOp::MeshDestinationType +SMESHGUI_ConvToQuadOp::DestinationMesh( const SMESH::SMESH_IDSource_var& idSource, + bool* isMixOrder) { SMESH::long_array_var nbElemOfType = idSource->GetMeshInfo(); + + bool hasBiQuad = ( nbElemOfType[SMDSEntity_BiQuad_Triangle ] || + nbElemOfType[SMDSEntity_BiQuad_Quadrangle ] || + nbElemOfType[SMDSEntity_BiQuad_Penta ] || + nbElemOfType[SMDSEntity_TriQuad_Hexa ] ); + bool hasLinBiQuad = ( nbElemOfType[SMDSEntity_Triangle ] || + nbElemOfType[SMDSEntity_Quadrangle ] || + nbElemOfType[SMDSEntity_Hexa ] ); + bool hasQuadBiQuad = ( nbElemOfType[SMDSEntity_Quad_Triangle ] || + nbElemOfType[SMDSEntity_Quad_Quadrangle ] || + nbElemOfType[SMDSEntity_Quad_Hexa ] ); + bool hasQuad = ( nbElemOfType[SMDSEntity_Quad_Edge ] || nbElemOfType[SMDSEntity_Quad_Triangle ] || nbElemOfType[SMDSEntity_Quad_Quadrangle] || nbElemOfType[SMDSEntity_Quad_Tetra ] || nbElemOfType[SMDSEntity_Quad_Hexa ] || nbElemOfType[SMDSEntity_Quad_Pyramid ] || + nbElemOfType[SMDSEntity_Quad_Polygon ] || nbElemOfType[SMDSEntity_Quad_Penta ] ); bool hasLin = ( nbElemOfType[SMDSEntity_Edge ] || @@ -345,11 +356,28 @@ SMESHGUI_ConvToQuadOp::MeshType SMESHGUI_ConvToQuadOp::ConsistMesh( const SMESH: nbElemOfType[SMDSEntity_Tetra ] || nbElemOfType[SMDSEntity_Hexa ] || nbElemOfType[SMDSEntity_Pyramid ] || + nbElemOfType[SMDSEntity_Polygon ] || nbElemOfType[SMDSEntity_Penta ] ); - if ( hasQuad && hasLin ) - return Comp; - return hasQuad ? Quadratic : Linear; + int tgtType = 0; + if ( hasBiQuad ) + tgtType |= ( Quadratic | Linear ); + if ( hasLinBiQuad ) + tgtType |= ( BiQuadratic | Quadratic ); + if ( hasQuadBiQuad ) + tgtType |= ( BiQuadratic | Linear ); + if ( hasQuad ) + tgtType |= Linear; + if ( hasLin ) + tgtType |= Quadratic; + + if ( tgtType == 0 ) + tgtType = Quadratic; + + if ( isMixOrder ) + *isMixOrder = ( hasLin && ( hasQuad || hasBiQuad )); + + return MeshDestinationType( tgtType ); } void SMESHGUI_ConvToQuadOp::ConnectRadioButtons( int id ) @@ -364,7 +392,7 @@ void SMESHGUI_ConvToQuadOp::ConnectRadioButtons( int id ) bool hasGeom = mesh->HasShapeToMesh(); - if( id || !hasGeom ) + if( id==0 || !hasGeom ) myDlg->SetEnabledCheck( false ); else myDlg->SetEnabledCheck( true );