X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ConvToQuadOp.cxx;h=3b038c5ff07ca1072b4897bddd1941641b975298;hp=eac1ae86cf4903fd1670db4b1109c56fbca87ca4;hb=refs%2Ftags%2FV9_1_0;hpb=1067ffa6e7e5c394e3a1b17219d8b355a57607cd diff --git a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx index eac1ae86c..3b038c5ff 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 @@ -101,11 +101,11 @@ void SMESHGUI_ConvToQuadOp::startOperation() } connect( myDlg, SIGNAL( onClicked( int ) ), SLOT( ConnectRadioButtons( int ) ) ); - myHelpFileName = "convert_to_from_quadratic_mesh_page.html"; + myHelpFileName = "convert_to_from_quadratic_mesh.html"; SMESHGUI_SelectionOp::startOperation(); - myDlg->SetMediumNdsOnGeom( false ); + myDlg->SetMediumNdsOnGeom( true ); myDlg->activateObject( 0 ); myDlg->ShowWarning( false ); myDlg->show(); @@ -129,7 +129,7 @@ void SMESHGUI_ConvToQuadOp::selectionDone() try { QString anObjEntry = myDlg->selectedObject( 0 ); - _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); + _PTR(SObject) pObj = SMESH::getStudy()->FindObjectID( anObjEntry.toUtf8().data() ); if ( !pObj ) return; SMESH::SMESH_IDSource_var idSource = @@ -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 ); } @@ -212,7 +204,7 @@ bool SMESHGUI_ConvToQuadOp::onApply() QString aMess; QString anObjEntry = myDlg->selectedObject( 0 ); - _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); + _PTR(SObject) pObj = SMESH::getStudy()->FindObjectID( anObjEntry.toUtf8().data() ); if ( !pObj ) { dlg()->show(); @@ -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,9 +254,9 @@ bool SMESHGUI_ConvToQuadOp::onApply() { 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); + + double aPointSize = SMESH::GetFloat("SMESH:node_size",3); + double aLineWidth = SMESH::GetFloat("SMESH:element_width",1); vtkProperty* prop = vtkProperty::New(); prop->SetLineWidth( aLineWidth * 3 ); prop->SetPointSize( aPointSize * 3 ); @@ -270,7 +265,7 @@ bool SMESHGUI_ConvToQuadOp::onApply() prop->Delete(); SMESH::MeshPreviewStruct_var previewData = aEditor->GetPreviewData(); - myBadElemsPreview->SetData( & previewData.in() ); + myBadElemsPreview->SetData( previewData._retn() ); myBadElemsPreview->SetVisibility(true); SUIT_MessageBox* mb = new SUIT_MessageBox(SUIT_MessageBox::Warning, @@ -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,17 +356,34 @@ 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 ) { QString anObjEntry = myDlg->selectedObject( 0 ); - _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); + _PTR(SObject) pObj = SMESH::getStudy()->FindObjectID( anObjEntry.toUtf8().data() ); if ( !pObj ) return; SMESH::SMESH_IDSource_var idSource = @@ -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 );