1 // Copyright (C) 2007-2009 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // File : SMESHGUI_MeshOrderOp.cxx
23 // Author : Pavel TELKOV, Open CASCADE S.A.S.
26 #include "SMESHGUI_MeshOrderOp.h"
29 #include "SMESHGUI_Utils.h"
30 #include "SMESHGUI_MeshUtils.h"
32 // SALOME GUI includes
33 #include <LightApp_SelectionMgr.h>
34 #include <SALOME_ListIO.hxx>
35 #include <SUIT_ResourceMgr.h>
36 #include <SUIT_OverrideCursor.h>
37 #include <SUIT_MessageBox.h>
38 #include <SUIT_Desktop.h>
40 // SALOME KERNEL includes
41 #include <SALOMEDS_SObject.hxx>
42 #include <SALOMEDSClient_SObject.hxx>
47 //================================================================================
51 //================================================================================
53 SMESHGUI_MeshOrderOp::SMESHGUI_MeshOrderOp()
54 : SMESHGUI_Operation(), myDlg(0), myMgr(0)
56 myDlg = new SMESHGUI_MeshOrderDlg( desktop() );
58 myHelpFileName = "constructing_meshes_page.html#mesh_order_anchor";
61 //================================================================================
65 //================================================================================
67 SMESHGUI_MeshOrderOp::~SMESHGUI_MeshOrderOp()
71 //================================================================================
73 * \brief Return operation dialog
75 //================================================================================
77 LightApp_Dialog* SMESHGUI_MeshOrderOp::dlg() const
82 //================================================================================
84 * \brief perform it's intention action: compute 2D mesh on 3D
86 //================================================================================
88 void SMESHGUI_MeshOrderOp::startOperation()
90 SMESHGUI_Operation::startOperation();
95 //================================================================================
97 * \brief Init dialog and mesh order box
99 //================================================================================
101 void SMESHGUI_MeshOrderOp::initDialog()
106 SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_nil();
108 LightApp_SelectionMgr *Sel = selectionMgr();
109 SALOME_ListIO selected; Sel->selectedObjects( selected );
111 if (selected.Extent() == 1)
112 aMesh = SMESH::GetMeshByIO(selected.First());
113 if (aMesh->_is_nil()) {
114 SUIT_MessageBox::warning(desktop(),
115 tr("SMESH_WRN_WARNING"),
116 tr("SMESH_WRN_NO_AVAILABLE_DATA"));
121 myMgr = new SMESHGUI_MeshOrderMgr( myDlg->GetMeshOrderBox() );
122 myMgr->SetMesh( aMesh );
123 if ( !myMgr->GetMeshOrder() ) {
124 SUIT_MessageBox::information(desktop(),
125 tr("SMESH_INFORMATION"),
126 tr("SMESH_NO_CONCURENT_MESH"));
133 //================================================================================
135 * \brief Apply changes
137 //================================================================================
139 bool SMESHGUI_MeshOrderOp::onApply()
141 SUIT_OverrideCursor aWaitCursor;
142 bool res = myMgr ? myMgr->SetMeshOrder() : false;
150 //================================================================================
152 * \brief Apply changes
154 //================================================================================
156 void SMESHGUI_MeshOrderOp::onCancel()
164 //================================================================================
168 //================================================================================
170 SMESHGUI_MeshOrderMgr::SMESHGUI_MeshOrderMgr( SMESHGUI_MeshOrderBox* theBox )
173 myMesh = SMESH::SMESH_Mesh::_nil();
176 //================================================================================
180 //================================================================================
182 SMESHGUI_MeshOrderMgr::~SMESHGUI_MeshOrderMgr()
186 //================================================================================
188 * \brief Set root mesh object
190 //================================================================================
192 void SMESHGUI_MeshOrderMgr::SetMesh(SMESH::SMESH_Mesh_var& theMesh)
194 myMesh = SMESH::SMESH_Mesh::_duplicate(theMesh);
195 _PTR(SObject) aMeshSObj = SMESH::FindSObject(theMesh);
196 if ( myBox && aMeshSObj )
197 myBox->setTitle( aMeshSObj->GetName().c_str() );
200 //================================================================================
202 * \brief Check for concurents between submesh objects
204 //================================================================================
206 bool SMESHGUI_MeshOrderMgr::GetMeshOrder()
208 ListListId idListList;
209 return GetMeshOrder(idListList);
212 //================================================================================
214 * \brief Check for concurents between submesh objects
216 //================================================================================
218 bool SMESHGUI_MeshOrderMgr::GetMeshOrder(ListListId& theIdListList)
220 if (!myBox || myMesh->_is_nil())
223 SMESH::submesh_array_array_var meshOrder = myMesh->GetMeshOrder();
224 if ( !meshOrder.operator->() || !meshOrder->length() )
226 ListListName nameListList;
227 for ( int i = 0, n = meshOrder->length(); i < n; i++ )
230 QStringList nameList;
231 const SMESH::submesh_array& aSMArray = meshOrder[i];
232 for ( int j = 0, jn = aSMArray.length(); j < jn; j++ )
234 const SMESH::SMESH_subMesh_var subMesh = aSMArray[j];
236 _PTR(SObject) aSubMeshSObj = SMESH::FindSObject(subMesh);
240 idList.append(subMesh->GetId() );
241 nameList.append( QString(aSubMeshSObj->GetName().c_str()) );
243 theIdListList.append(idList);
244 nameListList.append(nameList);
246 myBox->SetMeshes(nameListList, theIdListList);
247 return !theIdListList.isEmpty();
250 //================================================================================
252 * \brief Returns status is order changed by user
254 //================================================================================
256 bool SMESHGUI_MeshOrderMgr::IsOrderChanged() const
258 return myBox && myBox->IsOrderChanged();
261 //================================================================================
263 * \brief Store submesh priority order
265 //================================================================================
267 bool SMESHGUI_MeshOrderMgr::SetMeshOrder()
269 return myBox ? SetMeshOrder(myBox->GetMeshIds()) : false;
272 //================================================================================
274 * \brief Store submesh priority order
276 //================================================================================
278 bool SMESHGUI_MeshOrderMgr::SetMeshOrder( const ListListId& theListListIds )
280 if (theListListIds.isEmpty() || myMesh->_is_nil())
283 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
284 _PTR(SObject) aMeshSObj = SMESH::FindSObject(myMesh);
285 if ( !aStudy || !aMeshSObj )
288 std::map<int, SMESH::SMESH_subMesh_var> mapOfSubMesh;
289 for (int i = SMESH::Tag_FirstSubMesh; i <= SMESH::Tag_LastSubMesh; i++) {
290 _PTR(SObject) aSubmeshRoot;
291 if ( !aMeshSObj->FindSubObject( i, aSubmeshRoot ) )
293 _PTR(ChildIterator) smIter = aStudy->NewChildIterator( aSubmeshRoot );
294 for ( ; smIter->More(); smIter->Next() ) {
295 _PTR(SObject) aSmObj = smIter->Value();
296 SMESH::SMESH_subMesh_var sm =
297 SMESH::SObjectToInterface<SMESH::SMESH_subMesh>( aSmObj );
298 mapOfSubMesh[ sm->GetId() ] = SMESH::SMESH_subMesh::_duplicate(sm);
302 // is it enought to set modifid attribute on root mesh objects only?
303 // it is seems that modifaction flag will be set on child submeshes
304 // automatically (see SMESH::ModifiedMesh for details)
305 SMESH::ModifiedMesh( aMeshSObj, false, false );
307 SMESH::submesh_array_array_var meshOrder = new SMESH::submesh_array_array();
308 meshOrder->length(theListListIds.count() );
309 ListListId::const_iterator it = theListListIds.constBegin();
310 for ( int i = 0; it != theListListIds.constEnd(); ++it ) {
311 const QList<int>& ids = *it;
312 SMESH::submesh_array_var subMeshList = new SMESH::submesh_array();
313 subMeshList->length( ids.count() );
314 QList<int>::const_iterator subIt = ids.constBegin();
315 for( int j = 0; subIt != ids.constEnd(); ++subIt )
316 if ( mapOfSubMesh.find( *subIt ) != mapOfSubMesh.end() )
317 subMeshList[ j++ ] = mapOfSubMesh[ *subIt ];
319 meshOrder[ i++ ] = subMeshList;
321 // update object browser
322 SMESHGUI::GetSMESHGUI()->updateObjBrowser( true, 0 );
324 return myMesh->SetMeshOrder(meshOrder);