Salome HOME
PAL13409: EDF282 SMESH: Tetrahedron is added if we specify Mefisto.
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_ConvToQuadOp.cxx
1 // Copyright (C) 2005  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
3 // 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either 
7 // version 2.1 of the License.
8 // 
9 // This library is distributed in the hope that it will be useful 
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
12 // Lesser General Public License for more details.
13 //
14 // You should have received a copy of the GNU Lesser General Public  
15 // License along with this library; if not, write to the Free Software 
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 //
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 //
20 /**
21 *  SMESH SMESHGUI
22 *
23 *  Copyright (C) 2005  CEA/DEN, EDF R&D
24 *
25 *
26 *
27 *  File   : SMESHGUI_ConvToQuadOp.h
28 *  Module : SMESHGUI
29 */
30
31 #include "SMESHGUI_ConvToQuadOp.h"
32 #include "SMESHGUI_ConvToQuadDlg.h"
33
34 #include "SMESHGUI.h"
35 #include "SMESHGUI_Utils.h"
36
37 #include "SMESH_TypeFilter.hxx"
38
39 #include "SalomeApp_Tools.h"
40
41 #include "SUIT_MessageBox.h"
42
43 #include "LightApp_UpdateFlags.h"
44        
45 //================================================================================
46 /*!
47  * \brief Constructor
48  *
49  * Initialize operation
50 */
51 //================================================================================
52 SMESHGUI_ConvToQuadOp::SMESHGUI_ConvToQuadOp()
53   : SMESHGUI_SelectionOp(), 
54     myDlg( 0 )
55 {
56 }
57
58 //================================================================================
59 /*!
60  * \brief Destructor
61 */
62 //================================================================================
63 SMESHGUI_ConvToQuadOp::~SMESHGUI_ConvToQuadOp()
64 {
65   if ( myDlg )
66     delete myDlg;
67 }
68
69 //================================================================================
70 /*!
71  * \brief Gets dialog of this operation
72   * \retval LightApp_Dialog* - pointer to dialog of this operation
73 */
74 //================================================================================
75 LightApp_Dialog* SMESHGUI_ConvToQuadOp::dlg() const
76 {
77   return myDlg;
78 }
79
80 //================================================================================
81 /*!
82  * \brief Creates dialog if necessary and shows it
83  *
84  * Virtual method redefined from base class called when operation is started creates
85  * dialog if necessary and shows it, activates selection
86  */
87 //================================================================================
88 void SMESHGUI_ConvToQuadOp::startOperation()
89 {
90   if( !myDlg )
91   {
92     myDlg = new SMESHGUI_ConvToQuadDlg( );
93   }
94   connect( myDlg, SIGNAL( onClicked( int ) ), SLOT( ConnectRadioButtons( int ) ) );
95
96   myHelpFileName = "/files/convert_to_from_quadratic.htm";
97
98   SMESHGUI_SelectionOp::startOperation();
99
100   myDlg->SetMediumNdsOnGeom( false );
101   myDlg->activateObject( 0 );
102   myDlg->show();
103
104   selectionDone();
105 }
106
107 //================================================================================
108 /*!
109  * \brief Updates dialog's look and feel
110  *
111  * Virtual method redefined from the base class updates dialog's look and feel
112  */
113 //================================================================================
114 void SMESHGUI_ConvToQuadOp::selectionDone()
115 {
116   if ( !dlg()->isShown() )
117     return;
118
119   SMESHGUI_SelectionOp::selectionDone();
120   try
121   {
122     QString anMeshEntry = myDlg->selectedObject( 0 );
123     _PTR(SObject) pMesh = studyDS()->FindObjectID( anMeshEntry.latin1() );
124     if ( !pMesh ) return;
125
126     SMESH::SMESH_Mesh_var mesh =
127     SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( pMesh );  
128
129     if( mesh->_is_nil() )
130     {
131       myDlg->SetEnabledControls( false );
132     }
133     else if( ConsistMesh( mesh ) == SMESHGUI_ConvToQuadOp::Quadratic )
134     {
135       myDlg->SetEnabledRB( 0, false );
136     }
137     else if( ConsistMesh( mesh ) == SMESHGUI_ConvToQuadOp::Linear )
138     {
139       myDlg->SetEnabledRB( 1, false );
140     }
141     else 
142     {
143       myDlg->SetEnabledControls( true );
144     }
145   }
146   catch ( const SALOME::SALOME_Exception& S_ex )
147   {
148     SalomeApp_Tools::QtCatchCorbaException( S_ex );
149   }
150   catch ( ... )
151   {
152   }
153 }
154
155 //================================================================================
156 /*!
157  * \brief Creates selection filter
158   * \param theId - identifier of current selection widget
159   * \retval SUIT_SelectionFilter* - pointer to the created filter or null
160  *
161  * Creates selection filter in accordance with identifier of current selection widget
162  */
163 //================================================================================
164 SUIT_SelectionFilter* SMESHGUI_ConvToQuadOp::createFilter( const int theId ) const
165 {
166   if ( theId == 0 )
167     return new SMESH_TypeFilter( MESH );
168   else
169     return 0;
170 }
171
172 //================================================================================
173 /*!
174  * \brief Edits mesh
175  *
176  * Virtual slot redefined from the base class called when "Apply" button is clicked
177  */
178 //================================================================================
179 bool SMESHGUI_ConvToQuadOp::onApply()
180 {
181
182   QString aMess;
183
184   QString anMeshEntry = myDlg->selectedObject( 0 );
185   _PTR(SObject) pMesh = studyDS()->FindObjectID( anMeshEntry.latin1() );
186   if ( !pMesh )
187   {
188     dlg()->show();
189     SUIT_MessageBox::warn1( myDlg,
190         tr( "SMESH_WRN_WARNING" ), tr("MESH_IS_NOT_SELECTED"), tr( "SMESH_BUT_OK" ) );
191    
192     return false;
193   }
194
195   SMESH::SMESH_Mesh_var mesh =
196   SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( pMesh );  
197
198   if( CORBA::is_nil(mesh) )
199   {
200     SUIT_MessageBox::warn1( myDlg,
201         tr( "SMESH_WRN_WARNING" ), tr("REF_IS_NULL"), tr( "SMESH_BUT_OK" ) );
202
203     return false;
204   } 
205
206   bool aResult = false;
207
208   try
209   {
210     SMESH::SMESH_MeshEditor_var aEditor = mesh->GetMeshEditor();
211     if( !myDlg->CurrentRB() )
212     {
213       bool aParam = true;
214       if( myDlg->IsEnabledCheck() )
215         aParam = myDlg->IsMediumNdsOnGeom();
216
217       aEditor->ConvertToQuadratic( aParam );
218       aResult = true; 
219     }
220     else
221     {
222       aResult = aEditor->ConvertFromQuadratic();
223     }
224   }
225   catch ( const SALOME::SALOME_Exception& S_ex )
226   {
227     SalomeApp_Tools::QtCatchCorbaException( S_ex );
228     aResult = false;
229   }
230   catch ( ... )
231   {
232     aResult = false;
233   }
234   if( aResult )
235   {
236     update( UF_ObjBrowser | UF_Model | UF_Viewer );
237     selectionDone();
238   }
239   return aResult;
240 }
241
242 //================================================================================
243 /*! ConsistMesh
244  *  Determines, what elements this mesh contains. 
245  */
246 //================================================================================
247 SMESHGUI_ConvToQuadOp::MeshType SMESHGUI_ConvToQuadOp::ConsistMesh( const SMESH::SMESH_Mesh_var& mesh) const
248 {
249   int nbAllElem = 0, nbQEdges =0, nbQFaces =0, nbQVolum = 0;
250   int nbEdges = 0, nbFaces = 0, nbVolum = 0;
251
252   nbAllElem = (int)mesh->NbElements();
253   nbQEdges = (int)mesh->NbEdgesOfOrder(SMESH::ORDER_QUADRATIC);
254   nbQFaces = (int)mesh->NbFacesOfOrder(SMESH::ORDER_QUADRATIC);
255   nbQVolum = (int)mesh->NbVolumesOfOrder(SMESH::ORDER_QUADRATIC);
256
257   nbEdges = (int)mesh->NbEdgesOfOrder(SMESH::ORDER_LINEAR);
258   nbFaces = (int)mesh->NbFacesOfOrder(SMESH::ORDER_LINEAR);
259   nbVolum = (int)mesh->NbVolumesOfOrder(SMESH::ORDER_LINEAR);
260
261   if( nbAllElem == (nbQEdges+nbQFaces+nbQVolum) )
262     return SMESHGUI_ConvToQuadOp::Quadratic;
263   else if ( nbAllElem == (nbEdges+nbFaces+nbVolum) )
264     return SMESHGUI_ConvToQuadOp::Linear;
265   else 
266     return SMESHGUI_ConvToQuadOp::Comp;
267 }
268
269
270 void SMESHGUI_ConvToQuadOp::ConnectRadioButtons( int id )
271 {
272   QString anMeshEntry = myDlg->selectedObject( 0 );
273   _PTR(SObject) pMesh = studyDS()->FindObjectID( anMeshEntry.latin1() );
274   if ( !pMesh ) return;
275
276   SMESH::SMESH_Mesh_var mesh =
277     SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( pMesh );  
278
279   GEOM::GEOM_Object_var mainGeom;
280   mainGeom = mesh->GetShapeToMesh();
281
282   if( id || mainGeom->_is_nil() )
283     myDlg->SetEnabledCheck( false );
284   else
285     myDlg->SetEnabledCheck( true );
286 }
287
288