1 // Copyright (C) 2007-2015 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, or (at your option) any later version.
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.cxx
23 // Author : Nicolas REJNERI, Open CASCADE S.A.S.
25 #include <Standard_math.hxx> // E.A. must be included before Python.h to fix compilation on windows
27 #undef HAVE_FINITE // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
33 #include "SMESHGUI_Add0DElemsOnAllNodesDlg.h"
34 #include "SMESHGUI_AddMeshElementDlg.h"
35 #include "SMESHGUI_AddQuadraticElementDlg.h"
36 #include "SMESHGUI_BuildCompoundDlg.h"
37 #include "SMESHGUI_ClippingDlg.h"
38 #include "SMESHGUI_ComputeDlg.h"
39 #include "SMESHGUI_ConvToQuadOp.h"
40 #include "SMESHGUI_CopyMeshDlg.h"
41 #include "SMESHGUI_CreatePolyhedralVolumeDlg.h"
42 #include "SMESHGUI_DeleteGroupDlg.h"
43 #include "SMESHGUI_Displayer.h"
44 #include "SMESHGUI_DuplicateNodesDlg.h"
45 #include "SMESHGUI_ExtrusionAlongPathDlg.h"
46 #include "SMESHGUI_ExtrusionDlg.h"
47 #include "SMESHGUI_FieldSelectorWdg.h"
48 #include "SMESHGUI_FileInfoDlg.h"
49 #include "SMESHGUI_FileValidator.h"
50 #include "SMESHGUI_FilterDlg.h"
51 #include "SMESHGUI_FilterLibraryDlg.h"
52 #include "SMESHGUI_FindElemByPointDlg.h"
53 #include "SMESHGUI_GroupDlg.h"
54 #include "SMESHGUI_GroupOnShapeDlg.h"
55 #include "SMESHGUI_GroupOpDlg.h"
56 #include "SMESHGUI_Hypotheses.h"
57 #include "SMESHGUI_Make2DFrom3DOp.h"
58 #include "SMESHGUI_MakeNodeAtPointDlg.h"
59 #include "SMESHGUI_Measurements.h"
60 #include "SMESHGUI_MergeDlg.h"
61 #include "SMESHGUI_MeshInfo.h"
62 #include "SMESHGUI_MeshOp.h"
63 #include "SMESHGUI_MeshOrderOp.h"
64 #include "SMESHGUI_MeshPatternDlg.h"
65 #include "SMESHGUI_MultiEditDlg.h"
66 #include "SMESHGUI_NodesDlg.h"
67 #include "SMESHGUI_Operations.h"
68 #include "SMESHGUI_Preferences_ScalarBarDlg.h"
69 #include "SMESHGUI_PropertiesDlg.h"
70 #include "SMESHGUI_RemoveElementsDlg.h"
71 #include "SMESHGUI_RemoveNodesDlg.h"
72 #include "SMESHGUI_RenumberingDlg.h"
73 #include "SMESHGUI_ReorientFacesDlg.h"
74 #include "SMESHGUI_RevolutionDlg.h"
75 #include "SMESHGUI_RotationDlg.h"
76 #include "SMESHGUI_ScaleDlg.h"
77 #include "SMESHGUI_Selection.h"
78 #include "SMESHGUI_SewingDlg.h"
79 #include "SMESHGUI_SingleEditDlg.h"
80 #include "SMESHGUI_SmoothingDlg.h"
81 #include "SMESHGUI_SymmetryDlg.h"
82 #include "SMESHGUI_TranslationDlg.h"
83 #include "SMESHGUI_TransparencyDlg.h"
84 #include "SMESHGUI_DisplayEntitiesDlg.h"
86 #include "SMESHGUI_FilterUtils.h"
87 #include "SMESHGUI_GEOMGenUtils.h"
88 #include "SMESHGUI_GroupUtils.h"
89 #include "SMESHGUI_HypothesesUtils.h"
90 #include "SMESHGUI_MeshUtils.h"
91 #include "SMESHGUI_PatternUtils.h"
92 #include "SMESHGUI_Utils.h"
93 #include "SMESHGUI_VTKUtils.h"
95 #include "SMESH_version.h"
97 #include "SMESH_ControlsDef.hxx"
98 #include "SMESH_Actor.h"
99 #include "SMESH_ActorUtils.h"
100 #include "SMESH_Client.hxx"
101 #include "SMESH_ScalarBarActor.h"
102 #include "SMESH_TypeFilter.hxx"
104 // SALOME GUI includes
105 #include <SalomeApp_Application.h>
106 #include <SalomeApp_CheckFileDlg.h>
107 #include <SalomeApp_DataObject.h>
108 #include <SalomeApp_Study.h>
109 #include <SalomeApp_Tools.h>
111 #include <LightApp_DataOwner.h>
112 #include <LightApp_NameDlg.h>
113 #include <LightApp_Preferences.h>
114 #include <LightApp_SelectionMgr.h>
115 #include <LightApp_UpdateFlags.h>
117 #include <SVTK_ViewManager.h>
118 #include <SVTK_ViewModel.h>
119 #include <SVTK_ViewWindow.h>
121 #include <VTKViewer_Algorithm.h>
123 #include <SUIT_Desktop.h>
124 #include <SUIT_FileDlg.h>
125 #include <SUIT_MessageBox.h>
126 #include <SUIT_OverrideCursor.h>
127 #include <SUIT_ResourceMgr.h>
128 #include <SUIT_Session.h>
130 #include <QtxPopupMgr.h>
131 #include <QtxFontEdit.h>
133 #include <SALOME_ListIO.hxx>
135 #ifndef DISABLE_PLOT2DVIEWER
136 #include <SPlot2d_ViewModel.h>
137 #include <SPlot2d_Histogram.h>
141 #include <SALOMEconfig.h>
142 #include CORBA_CLIENT_HEADER(SALOMEDS_Attributes)
143 #include CORBA_CLIENT_HEADER(SMESH_MeshEditor)
144 #include CORBA_CLIENT_HEADER(SMESH_Measurements)
147 // #define INCLUDE_MENUITEM_DEF // VSR commented ????????
148 #include <QApplication>
150 #include <QTextStream>
155 #include <boost/shared_ptr.hpp>
158 #include <vtkCallbackCommand.h>
159 #include <vtkCamera.h>
160 #include <vtkLookupTable.h>
161 #include <vtkPlane.h>
162 #include <vtkRenderer.h>
164 // SALOME KERNEL includes
165 #include <SALOMEDSClient_ClientFactory.hxx>
166 #include <SALOMEDSClient_IParameters.hxx>
167 #include <SALOMEDSClient_SComponent.hxx>
168 #include <SALOMEDSClient_StudyBuilder.hxx>
169 #include <SALOMEDS_Study.hxx>
170 #include <SALOMEDS_SObject.hxx>
171 #include "utilities.h"
174 #include <Standard_ErrorHandler.hxx>
175 #include <NCollection_DataMap.hxx>
177 #include <Basics_Utils.hxx>
179 //To disable automatic genericobj management, the following line should be commented.
180 //Otherwise, it should be uncommented.
181 //Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx
182 #define WITHGENERICOBJ
184 // Below macro, when uncommented, switches on simplified (more performant) algorithm
185 // of auto-color picking up
186 #define SIMPLE_AUTOCOLOR
191 //=============================================================
192 void ImportMeshesFromFile(SMESH::SMESH_Gen_ptr theComponentMesh,
195 void ExportMeshToFile(int theCommandID);
197 void SetDisplayMode(int theCommandID, SMESHGUI_StudyId2MarkerMap& theMarkerMap);
199 void SetDisplayEntity(int theCommandID);
201 void Control( int theCommandID );
204 //================================================================================
206 * \brief Reads meshes from file
208 //================================================================================
210 void ImportMeshesFromFile( SMESH::SMESH_Gen_ptr theComponentMesh,
214 std::string myExtension;
216 if ( theCommandID == SMESHOp::OpImportMED ) {
217 filter.append( QObject::tr( "MED_FILES_FILTER" ) + " (*.*med)" );
218 filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" );
220 else if ( theCommandID == SMESHOp::OpImportUNV ) {
221 filter.append( QObject::tr( "IDEAS_FILES_FILTER" ) + " (*.unv)" );
223 else if ( theCommandID == SMESHOp::OpImportDAT ) {
224 filter.append( QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)" );
226 else if ( theCommandID == SMESHOp::OpImportSTL ) {
227 filter.append( QObject::tr( "STL_FILES_FILTER" ) + " (*.stl)" );
230 else if ( theCommandID == SMESHOp::OpImportCGNS ) {
231 filter.append( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" );
234 else if ( theCommandID == SMESHOp::OpImportSAUV ) {
235 filter.append( QObject::tr( "SAUV files (*.sauv*)" ) );
236 filter.append( QObject::tr( "All files (*)" ) );
238 else if ( theCommandID == SMESHOp::OpImportGMF ) {
239 filter.append( QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)" );
240 filter.append( QObject::tr( "GMF_BINARY_FILES_FILTER") + " (*.meshb)" );
243 QString anInitialPath = "";
244 if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
245 anInitialPath = QDir::currentPath();
247 QStringList filenames;
248 bool toCreateGroups = true;
250 // if ( theCommandID == SMESHOp::OpImportGMF ) { // GMF
251 // SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg
252 // ( SMESHGUI::desktop(), true, QObject::tr("SMESH_REQUIRED_GROUPS"), true, true );
253 // fd->setWindowTitle( QObject::tr( "SMESH_IMPORT_MESH" ) );
254 // fd->setNameFilters( filter );
255 // fd->SetChecked( true );
257 // filenames << fd->selectedFile();
258 // toCreateGroups = fd->IsChecked();
264 filenames = SUIT_FileDlg::getOpenFileNames( SMESHGUI::desktop(),
267 QObject::tr( "SMESH_IMPORT_MESH" ) );
269 if ( filenames.count() > 0 ) {
270 SUIT_OverrideCursor wc;
271 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
274 QStringList anEntryList;
275 bool isEmpty = false;
276 for ( QStringList::ConstIterator it = filenames.begin(); it != filenames.end(); ++it ) {
277 QString filename = *it;
278 SMESH::mesh_array_var aMeshes = new SMESH::mesh_array;
280 switch ( theCommandID ) {
281 case SMESHOp::OpImportDAT:
283 // DAT format (currently unsupported)
284 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
285 arg( QObject::tr( "SMESH_ERR_NOT_SUPPORTED_FORMAT" ) ) );
288 case SMESHOp::OpImportUNV:
291 aMeshes->length( 1 );
292 aMeshes[0] = theComponentMesh->CreateMeshesFromUNV( filename.toUtf8().constData() );
293 if ( aMeshes[0]->_is_nil() )
294 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
295 arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) );
298 case SMESHOp::OpImportMED:
301 SMESH::DriverMED_ReadStatus res;
302 aMeshes = theComponentMesh->CreateMeshesFromMED( filename.toUtf8().constData(), res );
303 if ( res != SMESH::DRS_OK ) {
304 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
305 arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) );
309 case SMESHOp::OpImportSTL:
312 aMeshes->length( 1 );
313 aMeshes[0] = theComponentMesh->CreateMeshesFromSTL( filename.toUtf8().constData() );
314 if ( aMeshes[0]->_is_nil() ) {
315 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
316 arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) );
321 case SMESHOp::OpImportCGNS:
324 SMESH::DriverMED_ReadStatus res;
325 aMeshes = theComponentMesh->CreateMeshesFromCGNS( filename.toUtf8().constData(), res );
326 if ( res != SMESH::DRS_OK ) {
327 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
328 arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) );
333 case SMESHOp::OpImportSAUV:
336 SMESH::DriverMED_ReadStatus res;
337 aMeshes = theComponentMesh->CreateMeshesFromSAUV( filename.toUtf8().constData(), res );
338 if ( res != SMESH::DRS_OK ) {
339 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
340 arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) );
344 case SMESHOp::OpImportGMF:
347 SMESH::ComputeError_var res;
348 aMeshes->length( 1 );
349 aMeshes[0] = theComponentMesh->CreateMeshesFromGMF( filename.toUtf8().constData(),
352 if ( res->code != SMESH::DRS_OK ) {
353 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
354 arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res->code ).toLatin1().data() ) ) );
355 if ( strlen( res->comment.in() ) > 0 ) {
356 errors.back() += ": ";
357 errors.back() += res->comment.in();
364 catch ( const SALOME::SALOME_Exception& S_ex ) {
365 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
366 arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) );
369 for ( int i = 0, iEnd = aMeshes->length(); i < iEnd; i++ ) {
370 _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshes[i] );
372 _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
373 _PTR(AttributePixMap) aPixmap = aBuilder->FindOrCreateAttribute( aMeshSO, "AttributePixMap" );
374 aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_IMPORTED" );
375 if ( theCommandID == SMESHOp::OpImportUNV ) // mesh names aren't taken from the file for UNV import
376 SMESH::SetName( aMeshSO, QFileInfo(filename).fileName() );
378 anEntryList.append( aMeshSO->GetID().c_str() );
386 // update Object browser
387 SMESHGUI::GetSMESHGUI()->updateObjBrowser();
389 // browse to the published meshes
390 if( LightApp_Application* anApp =
391 dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
392 anApp->browseObjects( anEntryList );
394 // show Error message box if there were errors
395 if ( errors.count() > 0 ) {
396 SUIT_MessageBox::critical( SMESHGUI::desktop(),
397 QObject::tr( "SMESH_ERROR" ),
398 QObject::tr( "SMESH_IMPORT_ERRORS" ) + "\n" + errors.join( "\n" ) );
401 // show warning message box, if some imported mesh is empty
403 SUIT_MessageBox::warning( SMESHGUI::desktop(),
404 QObject::tr( "SMESH_WRN_WARNING" ),
405 QObject::tr( "SMESH_DRS_SOME_EMPTY" ) );
410 //================================================================================
412 * \brief Export selected meshes or groups into a file
414 //================================================================================
416 void ExportMeshToFile( int theCommandID )
418 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
419 SALOME_ListIO selected;
421 aSel->selectedObjects( selected );
423 const bool isDAT = ( theCommandID == SMESHOp::OpExportDAT || theCommandID == SMESHOp::OpPopupExportDAT );
424 const bool isMED = ( theCommandID == SMESHOp::OpExportMED || theCommandID == SMESHOp::OpPopupExportMED );
425 const bool isUNV = ( theCommandID == SMESHOp::OpExportUNV || theCommandID == SMESHOp::OpPopupExportUNV );
426 const bool isSTL = ( theCommandID == SMESHOp::OpExportSTL || theCommandID == SMESHOp::OpPopupExportSTL );
428 const bool isCGNS= ( theCommandID == SMESHOp::OpExportCGNS || theCommandID == SMESHOp::OpPopupExportCGNS );
430 const bool isCGNS= false;
432 const bool isSAUV= ( theCommandID == SMESHOp::OpExportSAUV || theCommandID == SMESHOp::OpPopupExportSAUV );
433 const bool isGMF = ( theCommandID == SMESHOp::OpExportGMF || theCommandID == SMESHOp::OpPopupExportGMF );
435 const bool multiMeshSupported = ( isMED || isCGNS ); // file can hold several meshes
436 if ( selected.Extent() == 0 || ( selected.Extent() > 1 && !multiMeshSupported ))
439 // get mesh object from selection and check duplication of their names
440 bool hasDuplicatedMeshNames = false;
441 QList< QPair< SMESH::SMESH_IDSource_var, QString > > aMeshList;
442 QList< QPair< SMESH::SMESH_IDSource_var, QString > >::iterator aMeshIter;
443 SALOME_ListIteratorOfListIO It( selected );
444 for( ; It.More(); It.Next() )
446 Handle(SALOME_InteractiveObject) anIObject = It.Value();
447 SMESH::SMESH_IDSource_var aMeshItem = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(anIObject);
448 if ( aMeshItem->_is_nil() ) {
449 SUIT_MessageBox::warning( SMESHGUI::desktop(),
450 QObject::tr( "SMESH_WRN_WARNING" ),
451 QObject::tr( "SMESH_BAD_MESH_SELECTION" ));
455 QString aMeshName = anIObject->getName();
457 // check for name duplications
458 if ( !hasDuplicatedMeshNames )
459 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
460 if( aMeshName == (*aMeshIter).second ) {
461 hasDuplicatedMeshNames = true;
466 aMeshList.append( QPair< SMESH::SMESH_IDSource_var, QString >( aMeshItem, aMeshName ) );
469 if( hasDuplicatedMeshNames && isMED ) {
470 int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
471 QObject::tr("SMESH_WRN_WARNING"),
472 QObject::tr("SMESH_EXPORT_MED_DUPLICATED_MESH_NAMES"),
473 QObject::tr("SMESH_BUT_YES"),
474 QObject::tr("SMESH_BUT_NO"), 0, 1);
479 aMeshIter = aMeshList.begin();
480 SMESH::SMESH_IDSource_var aMeshOrGroup = (*aMeshIter).first;
481 SMESH::SMESH_Mesh_var aMesh = aMeshOrGroup->GetMesh();
482 QString aMeshName = (*aMeshIter).second;
484 if ( isMED || isCGNS || isSAUV ) // formats where group names must be unique
486 // check for equal group names within each mesh
487 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
488 SMESH::SMESH_Mesh_var aMeshItem = SMESH::SMESH_Mesh::_narrow( (*aMeshIter).first );
489 if ( !aMeshItem->_is_nil() && aMeshItem->HasDuplicatedGroupNamesMED()) {
490 int aRet = SUIT_MessageBox::warning
491 (SMESHGUI::desktop(),
492 QObject::tr("SMESH_WRN_WARNING"),
493 QObject::tr("SMESH_EXPORT_MED_DUPLICATED_GRP").arg((*aMeshIter).second),
494 QObject::tr("SMESH_BUT_YES"),
495 QObject::tr("SMESH_BUT_NO"), 0, 1);
502 // Warn the user about presence of not supported elements
504 std::vector< SMESH::EntityType > notSupportedElemTypes, presentNotSupported;
508 notSupportedElemTypes.push_back( SMESH::Entity_0D );
509 notSupportedElemTypes.push_back( SMESH::Entity_Ball );
514 notSupportedElemTypes.push_back( SMESH::Entity_Polygon );
515 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polygon );
516 notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra );
517 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polyhedra );
518 notSupportedElemTypes.push_back( SMESH::Entity_Pyramid );
519 notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism );
520 notSupportedElemTypes.push_back( SMESH::Entity_0D );
521 notSupportedElemTypes.push_back( SMESH::Entity_Ball );
526 notSupportedElemTypes.push_back( SMESH::Entity_Edge );
527 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Edge );
528 notSupportedElemTypes.push_back( SMESH::Entity_0D );
529 notSupportedElemTypes.push_back( SMESH::Entity_Ball );
534 notSupportedElemTypes.push_back( SMESH::Entity_Ball );
539 notSupportedElemTypes.push_back( SMESH::Entity_Ball );
540 notSupportedElemTypes.push_back( SMESH::Entity_BiQuad_Triangle );
541 notSupportedElemTypes.push_back( SMESH::Entity_BiQuad_Quadrangle );
542 notSupportedElemTypes.push_back( SMESH::Entity_TriQuad_Hexa );
543 notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism );
544 notSupportedElemTypes.push_back( SMESH::Entity_Polygon );
545 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polygon );
546 notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra );
551 notSupportedElemTypes.push_back( SMESH::Entity_0D );
552 notSupportedElemTypes.push_back( SMESH::Entity_Polygon );
553 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polygon );
554 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Pyramid );
555 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Penta );
556 notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism );
557 notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra );
558 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polyhedra );
559 notSupportedElemTypes.push_back( SMESH::Entity_Ball );
561 if ( ! notSupportedElemTypes.empty() )
563 SMESH::long_array_var nbElems = aMeshOrGroup->GetMeshInfo();
564 for ( size_t iType = 0; iType < notSupportedElemTypes.size(); ++iType )
565 if ( nbElems[ notSupportedElemTypes[ iType ]] > 0 )
566 presentNotSupported.push_back( notSupportedElemTypes[ iType ]);
568 if ( !presentNotSupported.empty() )
571 const char* typeMsg[SMESH::Entity_Last] = {
572 "SMESH_NODES", "SMESH_ELEMS0D","SMESH_EDGES","SMESH_QUADRATIC_EDGES",
573 "SMESH_TRIANGLES", "SMESH_QUADRATIC_TRIANGLES", "SMESH_BIQUADRATIC_TRIANGLES",
574 "SMESH_QUADRANGLES","SMESH_QUADRATIC_QUADRANGLES", "SMESH_BIQUADRATIC_QUADRANGLES",
575 "SMESH_POLYGONS","SMESH_QUADRATIC_POLYGONS",
576 "SMESH_TETRAHEDRA","SMESH_QUADRATIC_TETRAHEDRONS","SMESH_PYRAMIDS",
577 "SMESH_QUADRATIC_PYRAMIDS","SMESH_HEXAHEDRA","SMESH_QUADRATIC_HEXAHEDRONS",
578 "SMESH_TRIQUADRATIC_HEXAHEDRONS","SMESH_PENTAHEDRA","SMESH_QUADRATIC_PENTAHEDRONS",
579 "SMESH_OCTAHEDRA","SMESH_POLYEDRONS","SMESH_QUADRATIC_POLYEDRONS","SMESH_BALLS"
581 QString andStr = " " + QObject::tr("SMESH_AND") + " ", comma(", ");
582 for ( size_t iType = 0; iType < presentNotSupported.size(); ++iType ) {
583 typeNames += QObject::tr( typeMsg[ presentNotSupported[ iType ]]);
584 if ( iType != presentNotSupported.size() - 1 )
585 typeNames += ( iType == presentNotSupported.size() - 2 ) ? andStr : comma;
587 int aRet = SUIT_MessageBox::warning
588 (SMESHGUI::desktop(),
589 QObject::tr("SMESH_WRN_WARNING"),
590 QObject::tr("EXPORT_NOT_SUPPORTED").arg(aMeshName).arg(format).arg(typeNames),
591 QObject::tr("SMESH_BUT_YES"),
592 QObject::tr("SMESH_BUT_NO"), 0, 1);
597 // Get parameters of export operation
600 SMESH::MED_VERSION aFormat;
601 // Init the parameters with the default values
602 bool aIsASCII_STL = true;
603 bool toCreateGroups = false;
604 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
606 toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false );
607 bool toOverwrite = true;
608 bool toFindOutDim = true;
610 QString aFilter, aTitle = QObject::tr("SMESH_EXPORT_MESH");
611 QString anInitialPath = "";
612 if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
613 anInitialPath = QDir::currentPath();
615 QList< QPair< GEOM::ListOfFields_var, QString > > aFieldList;
617 // Get a file name to write in and additional otions
618 if ( isUNV || isDAT || isGMF ) // Export w/o options
621 aFilter = QObject::tr( "IDEAS_FILES_FILTER" ) + " (*.unv)";
623 aFilter = QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)";
625 aFilter = QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)" +
626 ";;" + QObject::tr( "GMF_BINARY_FILES_FILTER" ) + " (*.meshb)";
627 if ( anInitialPath.isEmpty() ) anInitialPath = SUIT_FileDlg::getLastVisitedPath();
628 aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(),
629 anInitialPath + QString("/") + aMeshName,
630 aFilter, aTitle, false);
632 else if ( isCGNS )// Export to CGNS
634 SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
635 fd->setWindowTitle( aTitle );
636 fd->setNameFilter( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" );
637 if ( !anInitialPath.isEmpty() )
638 fd->setDirectory( anInitialPath );
639 fd->selectFile(aMeshName);
640 SMESHGUI_FileValidator* fv = new SMESHGUI_FileValidator( fd );
641 fd->setValidator( fv );
644 aFilename = fd->selectedFile();
645 toOverwrite = fv->isOverwrite();
649 else if ( isSTL ) // Export to STL
651 QMap<QString, int> aFilterMap;
652 aFilterMap.insert( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)", 1 );
653 aFilterMap.insert( QObject::tr( "STL_BIN_FILES_FILTER" ) + " (*.stl)", 0 );
656 QMap<QString, int>::const_iterator it = aFilterMap.begin();
657 for ( ; it != aFilterMap.end(); ++it )
658 filters.push_back( it.key() );
660 SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
661 fd->setWindowTitle( aTitle );
662 fd->setNameFilters( filters );
663 fd->selectNameFilter( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)" );
664 if ( !anInitialPath.isEmpty() )
665 fd->setDirectory( anInitialPath );
666 fd->selectFile(aMeshName);
670 aFilename = fd->selectedFile();
671 aIsASCII_STL = (aFilterMap[fd->selectedNameFilter()]) == 1 ? true: false;
676 else if ( isMED || isSAUV ) // Export to MED or SAUV
678 QMap<QString, SMESH::MED_VERSION> aFilterMap;
679 //QString v21 (aMesh->GetVersionString(SMESH::MED_V2_1, 2));
681 QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2));
682 //aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 );
683 aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 );
686 aFilterMap.insert("All files (*)", SMESH::MED_V2_1 );
687 aFilterMap.insert("SAUV files (*.sauv)", SMESH::MED_V2_2 );
688 aFilterMap.insert("SAUV files (*.sauve)", SMESH::MED_V2_1 );
692 QString aDefaultFilter;
693 QMap<QString, SMESH::MED_VERSION>::const_iterator it = aFilterMap.begin();
694 for ( ; it != aFilterMap.end(); ++it ) {
695 filters.push_back( it.key() );
696 if (it.value() == SMESH::MED_V2_2)
697 aDefaultFilter = it.key();
699 QStringList checkBoxes;
700 checkBoxes << QObject::tr("SMESH_AUTO_GROUPS") << QObject::tr("SMESH_AUTO_DIM");
702 SMESHGUI_FieldSelectorWdg* fieldSelWdg = new SMESHGUI_FieldSelectorWdg();
703 QList< QWidget* > wdgList;
704 if ( fieldSelWdg->GetAllFeilds( aMeshList, aFieldList ))
705 wdgList.append( fieldSelWdg );
707 SalomeApp_CheckFileDlg* fd =
708 new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true, wdgList );
709 fd->setWindowTitle( aTitle );
710 fd->setNameFilters( filters );
711 fd->selectNameFilter( aDefaultFilter );
712 fd->SetChecked( toCreateGroups, 0 );
713 fd->SetChecked( toFindOutDim, 1 );
714 if ( !anInitialPath.isEmpty() )
715 fd->setDirectory( anInitialPath );
716 fd->selectFile(aMeshName);
719 QListView *lview = fd->findChild<QListView*>("listView");
721 lview->setMinimumHeight(200);
723 QTreeView *tview = fd->findChild<QTreeView*>("treeView");
725 tview->setMinimumHeight(200);
728 SMESHGUI_FileValidator* fv = new SMESHGUI_FileValidator( fd );
729 fd->setValidator( fv );
734 aFilename = fd->selectedFile();
736 aFilename = QString::null;
739 aFormat = aFilterMap[fd->selectedNameFilter()];
740 toOverwrite = fv->isOverwrite();
742 if ( !aFilename.isEmpty() ) {
743 // med-2.1 does not support poly elements
744 if ( aFormat==SMESH::MED_V2_1 )
745 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
746 SMESH::SMESH_IDSource_var aMeshItem = (*aMeshIter).first;
747 SMESH::long_array_var nbElems = aMeshItem->GetMeshInfo();
748 if ( nbElems[ SMESH::Entity_Polygon ] + nbElems[ SMESH::Entity_Quad_Polygon ] +
749 nbElems[ SMESH::Entity_Polyhedra ] + nbElems[ SMESH::Entity_Quad_Polyhedra ])
751 int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
752 QObject::tr("SMESH_WRN_WARNING"),
753 QObject::tr("SMESH_EXPORT_MED_V2_1").arg((*aMeshIter).second),
754 QObject::tr("SMESH_BUT_YES"),
755 QObject::tr("SMESH_BUT_NO"), 0, 1);
763 // can't append to an existing using other format
764 SMESH::MED_VERSION aVersion = SMESH::MED_V2_1;
765 bool isVersionOk = SMESHGUI::GetSMESHGen()->GetMEDVersion( aFilename.toUtf8().constData(), aVersion );
766 if( !isVersionOk || aVersion != aFormat ) {
767 int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
768 QObject::tr("SMESH_WRN_WARNING"),
769 QObject::tr("SMESH_EXPORT_MED_VERSION_COLLISION").arg(aFilename),
770 QObject::tr("SMESH_BUT_YES"),
771 QObject::tr("SMESH_BUT_NO"), 0, 1);
778 QStringList aMeshNamesCollisionList;
779 SMESH::string_array_var aMeshNames = SMESHGUI::GetSMESHGen()->GetMeshNames( aFilename.toUtf8().constData() );
780 for( int i = 0, n = aMeshNames->length(); i < n; i++ ) {
781 QString anExistingMeshName( aMeshNames[ i ] );
782 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
783 QString anExportMeshName = (*aMeshIter).second;
784 if( anExportMeshName == anExistingMeshName ) {
785 aMeshNamesCollisionList.append( anExportMeshName );
790 if( !aMeshNamesCollisionList.isEmpty() ) {
791 QString aMeshNamesCollisionString = aMeshNamesCollisionList.join( ", " );
792 int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
793 QObject::tr("SMESH_WRN_WARNING"),
794 QObject::tr("SMESH_EXPORT_MED_MESH_NAMES_COLLISION").arg(aMeshNamesCollisionString),
795 QObject::tr("SMESH_BUT_YES"),
796 QObject::tr("SMESH_BUT_NO"),
797 QObject::tr("SMESH_BUT_CANCEL"), 0, 2);
806 toCreateGroups = fd->IsChecked(0);
807 toFindOutDim = fd->IsChecked(1);
808 fieldSelWdg->GetSelectedFeilds();
809 if ( !fieldSelWdg->parent() )
820 if ( !aFilename.isEmpty() ) {
821 // Check whether the file already exists and delete it if yes
822 QFile aFile( aFilename );
823 if ( aFile.exists() && toOverwrite )
825 SUIT_OverrideCursor wc;
828 // Renumbering is not needed since SMDS redesign in V6.2.0 (Nov 2010)
829 // bool Renumber = false;
830 // // PAL 14172 : Check of we have to renumber or not from the preferences before export
832 // Renumber= resMgr->booleanValue("renumbering");
834 // SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
835 // aMeshEditor->RenumberNodes();
836 // aMeshEditor->RenumberElements();
837 // if ( SMESHGUI::automaticUpdate() )
838 // SMESH::UpdateView();
842 aMeshIter = aMeshList.begin();
843 for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ )
845 SMESH::SMESH_IDSource_var aMeshOrGroup = (*aMeshIter).first;
846 SMESH::SMESH_Mesh_var aMeshItem = aMeshOrGroup->GetMesh();
847 const GEOM::ListOfFields& fields = aFieldList[ aMeshIndex ].first.in();
848 const QString& geoAssFields = aFieldList[ aMeshIndex ].second;
849 const bool hasFields = ( fields.length() || !geoAssFields.isEmpty() );
850 if ( !hasFields && aMeshOrGroup->_is_equivalent( aMeshItem ))
851 aMeshItem->ExportToMEDX( aFilename.toUtf8().data(), toCreateGroups,
852 aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim );
854 aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toUtf8().data(), toCreateGroups,
855 aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim,
856 fields, geoAssFields.toLatin1().data() );
861 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ )
863 SMESH::SMESH_Mesh_var aMeshItem = SMESH::SMESH_Mesh::_narrow( (*aMeshIter).first );
864 if( !aMeshItem->_is_nil() )
865 aMeshItem->ExportSAUV( aFilename.toUtf8().data(), toCreateGroups );
870 if ( aMeshOrGroup->_is_equivalent( aMesh ))
871 aMesh->ExportDAT( aFilename.toUtf8().data() );
873 aMesh->ExportPartToDAT( aMeshOrGroup, aFilename.toUtf8().data() );
877 if ( aMeshOrGroup->_is_equivalent( aMesh ))
878 aMesh->ExportUNV( aFilename.toUtf8().data() );
880 aMesh->ExportPartToUNV( aMeshOrGroup, aFilename.toUtf8().data() );
884 if ( aMeshOrGroup->_is_equivalent( aMesh ))
885 aMesh->ExportSTL( aFilename.toUtf8().data(), aIsASCII_STL );
887 aMesh->ExportPartToSTL( aMeshOrGroup, aFilename.toUtf8().data(), aIsASCII_STL );
891 aMeshIter = aMeshList.begin();
892 for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ )
894 SMESH::SMESH_IDSource_var aMeshOrGroup = (*aMeshIter).first;
895 SMESH::SMESH_Mesh_var aMeshItem = aMeshOrGroup->GetMesh();
896 aMeshItem->ExportCGNS( aMeshOrGroup,
897 aFilename.toUtf8().data(),
898 toOverwrite && aMeshIndex == 0 );
903 toCreateGroups = true;
904 aMesh->ExportGMF( aMeshOrGroup, aFilename.toUtf8().data(), toCreateGroups );
907 catch (const SALOME::SALOME_Exception& S_ex){
909 SUIT_MessageBox::warning(SMESHGUI::desktop(),
910 QObject::tr("SMESH_WRN_WARNING"),
911 QObject::tr("SMESH_EXPORT_FAILED"));
917 inline void InverseEntityMode(unsigned int& theOutputMode,
918 unsigned int theMode)
920 bool anIsNotPresent = ~theOutputMode & theMode;
922 theOutputMode |= theMode;
924 theOutputMode &= ~theMode;
927 void SetDisplayEntity(int theCommandID){
928 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
929 SALOME_ListIO selected;
931 aSel->selectedObjects( selected );
933 if(selected.Extent() >= 1){
934 SALOME_ListIteratorOfListIO It( selected );
935 for( ; It.More(); It.Next()){
936 Handle(SALOME_InteractiveObject) IObject = It.Value();
937 if(IObject->hasEntry()){
938 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
939 unsigned int aMode = anActor->GetEntityMode();
940 switch(theCommandID){
941 case SMESHOp::OpDE0DElements:
942 InverseEntityMode(aMode,SMESH_Actor::e0DElements);
944 case SMESHOp::OpDEEdges:
945 InverseEntityMode(aMode,SMESH_Actor::eEdges);
947 case SMESHOp::OpDEFaces:
948 InverseEntityMode(aMode,SMESH_Actor::eFaces);
950 case SMESHOp::OpDEVolumes:
951 InverseEntityMode(aMode,SMESH_Actor::eVolumes);
953 case SMESHOp::OpDEBalls:
954 InverseEntityMode(aMode,SMESH_Actor::eBallElem);
956 case SMESHOp::OpDEAllEntity:
957 aMode = SMESH_Actor::eAllEntity;
961 anActor->SetEntityMode(aMode);
970 SALOME_ListIO selected;
971 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
975 LightApp_SelectionMgr* aSel = app->selectionMgr();
976 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
977 if( !aSel || !appStudy )
980 aSel->selectedObjects( selected );
981 if( selected.IsEmpty() )
984 Handle(SALOME_InteractiveObject) anIObject = selected.First();
986 _PTR(Study) aStudy = appStudy->studyDS();
987 _PTR(SObject) aMainSObject( aStudy->FindObjectID( anIObject->getEntry() ) );
988 SMESH::SMESH_Mesh_var aMainObject = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
989 if( aMainObject->_is_nil() )
992 SUIT_OverrideCursor wc;
994 aMainObject->SetAutoColor( true ); // mesh groups are re-colored here
996 QList<SALOMEDS::Color> aReservedColors;
998 SMESH::ListOfGroups aListOfGroups = *aMainObject->GetGroups();
999 for( int i = 0, n = aListOfGroups.length(); i < n; i++ )
1001 SMESH::SMESH_GroupBase_var aGroupObject = aListOfGroups[i];
1002 //SALOMEDS::Color aColor = aGroupObject->GetColor();
1004 #ifdef SIMPLE_AUTOCOLOR // simplified algorithm for auto-colors
1005 SALOMEDS::Color aColor = SMESHGUI::getPredefinedUniqueColor();
1006 #else // old algorithm for auto-colors
1007 SALOMEDS::Color aColor = SMESHGUI::getUniqueColor( aReservedColors );
1008 aReservedColors.append( aColor );
1009 #endif // SIMPLE_AUTOCOLOR
1010 aGroupObject->SetColor( aColor );
1012 _PTR(SObject) aGroupSObject = SMESH::FindSObject(aGroupObject);
1013 if (aGroupSObject) {
1016 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) {
1017 switch ( aGroupObject->GetType ()) {
1019 anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break;
1021 anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break;
1023 anActor->Set0DColor( aColor.R, aColor.G, aColor.B ); break;
1025 anActor->SetBallColor( aColor.R, aColor.G, aColor.B ); break;
1027 SMESH::GetColor("SMESH", "volume_color", c, delta, "255,0,170|-100");
1028 anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, delta ); break;
1031 SMESH::GetColor("SMESH", "fill_color", c, delta, "0,170,255|-100");
1032 anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta );
1038 SMESH::RepaintCurrentView();
1041 void OverallMeshQuality() {
1042 SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
1043 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1044 SALOME_ListIO selected;
1046 aSel->selectedObjects( selected );
1048 if ( selected.IsEmpty() ) return;
1049 SALOME_ListIteratorOfListIO It( selected );
1050 for ( ; It.More(); It.Next() ) {
1051 SMESHGUI_CtrlInfoDlg* ctrlDlg = new SMESHGUI_CtrlInfoDlg( SMESHGUI::desktop() );
1052 ctrlDlg->showInfo( It.Value() );
1057 QString functorToString( SMESH::Controls::FunctorPtr f )
1059 QString type = QObject::tr( "UNKNOWN_CONTROL" );
1060 if ( dynamic_cast< SMESH::Controls::Volume* >( f.get() ) )
1061 type = QObject::tr( "VOLUME_3D_ELEMENTS" );
1062 else if ( dynamic_cast< SMESH::Controls::MaxElementLength2D* >( f.get() ) )
1063 type = QObject::tr( "MAX_ELEMENT_LENGTH_2D" );
1064 else if ( dynamic_cast< SMESH::Controls::MaxElementLength3D* >( f.get() ) )
1065 type = QObject::tr( "MAX_ELEMENT_LENGTH_3D" );
1066 else if ( dynamic_cast< SMESH::Controls::MinimumAngle* >( f.get() ) )
1067 type = QObject::tr( "MINIMUMANGLE_ELEMENTS" );
1068 else if ( dynamic_cast< SMESH::Controls::AspectRatio* >( f.get() ) )
1069 type = QObject::tr( "ASPECTRATIO_ELEMENTS" );
1070 else if ( dynamic_cast< SMESH::Controls::AspectRatio3D* >( f.get() ) )
1071 type = QObject::tr( "ASPECTRATIO_3D_ELEMENTS" );
1072 else if ( dynamic_cast< SMESH::Controls::Warping* >( f.get() ) )
1073 type = QObject::tr( "WARP_ELEMENTS" );
1074 else if ( dynamic_cast< SMESH::Controls::Taper* >( f.get() ) )
1075 type = QObject::tr( "TAPER_ELEMENTS" );
1076 else if ( dynamic_cast< SMESH::Controls::Skew* >( f.get() ) )
1077 type = QObject::tr( "SKEW_ELEMENTS" );
1078 else if ( dynamic_cast< SMESH::Controls::Area* >( f.get() ) )
1079 type = QObject::tr( "AREA_ELEMENTS" );
1080 else if ( dynamic_cast< SMESH::Controls::Length* >( f.get() ) )
1081 type = QObject::tr( "LENGTH_EDGES" );
1082 else if ( dynamic_cast< SMESH::Controls::Length2D* >( f.get() ) )
1083 type = QObject::tr( "LENGTH2D_EDGES" );
1084 else if ( dynamic_cast< SMESH::Controls::MultiConnection* >( f.get() ) )
1085 type = QObject::tr( "MULTI_BORDERS" );
1086 else if ( dynamic_cast< SMESH::Controls::MultiConnection2D* >( f.get() ) )
1087 type = QObject::tr( "MULTI2D_BORDERS" );
1088 else if ( dynamic_cast< SMESH::Controls::FreeNodes* >( f.get() ) )
1089 type = QObject::tr( "FREE_NODES" );
1090 else if ( dynamic_cast< SMESH::Controls::FreeEdges* >( f.get() ) )
1091 type = QObject::tr( "FREE_EDGES" );
1092 else if ( dynamic_cast< SMESH::Controls::FreeBorders* >( f.get() ) )
1093 type = QObject::tr( "FREE_BORDERS" );
1094 else if ( dynamic_cast< SMESH::Controls::FreeFaces* >( f.get() ) )
1095 type = QObject::tr( "FREE_FACES" );
1096 else if ( dynamic_cast< SMESH::Controls::BareBorderVolume* >( f.get() ) )
1097 type = QObject::tr( "BARE_BORDER_VOLUME" );
1098 else if ( dynamic_cast< SMESH::Controls::BareBorderFace* >( f.get() ) )
1099 type = QObject::tr( "BARE_BORDER_FACE" );
1100 else if ( dynamic_cast< SMESH::Controls::OverConstrainedVolume* >( f.get() ) )
1101 type = QObject::tr( "OVER_CONSTRAINED_VOLUME" );
1102 else if ( dynamic_cast< SMESH::Controls::OverConstrainedFace* >( f.get() ) )
1103 type = QObject::tr( "OVER_CONSTRAINED_FACE" );
1104 else if ( dynamic_cast< SMESH::Controls::CoincidentNodes* >( f.get() ) )
1105 type = QObject::tr( "EQUAL_NODE" );
1106 else if ( dynamic_cast< SMESH::Controls::CoincidentElements1D* >( f.get() ) )
1107 type = QObject::tr( "EQUAL_EDGE" );
1108 else if ( dynamic_cast< SMESH::Controls::CoincidentElements2D* >( f.get() ) )
1109 type = QObject::tr( "EQUAL_FACE" );
1110 else if ( dynamic_cast< SMESH::Controls::CoincidentElements3D* >( f.get() ) )
1111 type = QObject::tr( "EQUAL_VOLUME" );
1115 void SaveDistribution()
1117 LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
1118 SALOME_ListIO selected;
1120 aSel->selectedObjects( selected );
1122 if ( selected.Extent() == 1 ) {
1123 Handle(SALOME_InteractiveObject) anIO = selected.First();
1124 if ( anIO->hasEntry() ) {
1125 SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
1126 if ( anActor && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) {
1127 SMESH_ScalarBarActor* aScalarBarActor = anActor->GetScalarBarActor();
1128 SMESH::Controls::FunctorPtr aFunctor = anActor->GetFunctor();
1129 if ( aScalarBarActor && aFunctor ) {
1130 SMESH::Controls::NumericalFunctor* aNumFun = dynamic_cast<SMESH::Controls::NumericalFunctor*>( aFunctor.get() );
1132 std::vector<int> elements;
1133 SMESH::SMESH_Mesh_var mesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIO);
1134 if ( mesh->_is_nil() ) {
1135 SMESH::SMESH_IDSource_var idSource =
1136 SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(anIO);
1137 if ( !idSource->_is_nil() )
1139 SMESH::long_array_var ids = idSource->GetIDs();
1140 elements.resize( ids->length() );
1141 for ( unsigned i = 0; i < elements.size(); ++i )
1142 elements[i] = ids[i];
1145 int nbIntervals = aScalarBarActor->GetMaximumNumberOfColors();
1146 vtkLookupTable* lookupTable =
1147 static_cast<vtkLookupTable*>(aScalarBarActor->GetLookupTable());
1148 double * minmax = lookupTable->GetRange();
1149 bool isLogarithmic = lookupTable->GetScale() == VTK_SCALE_LOG10;
1150 std::vector<int> nbEvents;
1151 std::vector<double> funValues;
1152 aNumFun->GetHistogram( nbIntervals, nbEvents, funValues, elements, minmax, isLogarithmic );
1153 QString anInitialPath = "";
1154 if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
1155 anInitialPath = QDir::currentPath();
1156 QString aMeshName = anIO->getName();
1158 filter.append( QObject::tr( "TEXT_FILES_FILTER" ) + " (*.txt)" );
1159 filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" );
1160 QString aFilename = anInitialPath + "/" + aMeshName + "_" +
1161 functorToString( aFunctor ).toLower().simplified().replace( QRegExp( " |-" ), "_" ) + ".txt";
1162 aFilename = SUIT_FileDlg::getFileName( SMESHGUI::desktop(),
1165 QObject::tr( "SMESH_SAVE_DISTRIBUTION" ),
1167 if ( !aFilename.isEmpty() ) {
1168 QFile f( aFilename );
1169 if ( f.open( QFile::WriteOnly | QFile::Truncate ) ) {
1170 QTextStream out( &f );
1171 out << "# Mesh: " << aMeshName << endl;
1172 out << "# Control: " << functorToString( aFunctor ) << endl;
1174 out.setFieldWidth( 10 );
1175 for ( int i = 0; i < qMin( nbEvents.size(), funValues.size()-1 ); i++ )
1176 out << funValues[i] << "\t" << funValues[i+1] << "\t" << nbEvents[i] << endl;
1187 void ShowElement(int theCommandID ) {
1188 LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
1189 SALOME_ListIO selected;
1191 aSel->selectedObjects( selected );
1193 if ( selected.Extent() == 1 ) {
1194 Handle(SALOME_InteractiveObject) anIO = selected.First();
1195 if ( anIO->hasEntry() ) {
1196 SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
1197 if ( anActor && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) {
1198 SMESH_ScalarBarActor *aScalarBarActor = anActor->GetScalarBarActor();
1199 if ( theCommandID == SMESHOp::OpShowDistribution ) {
1200 aScalarBarActor->SetDistributionVisibility(!aScalarBarActor->GetDistributionVisibility());
1202 else if ( theCommandID == SMESHOp::OpShowScalarBar ) {
1203 aScalarBarActor->SetVisibility( !aScalarBarActor->GetVisibility());
1210 #ifndef DISABLE_PLOT2DVIEWER
1211 void PlotDistribution() {
1212 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
1216 LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
1217 SALOME_ListIO selected;
1219 aSel->selectedObjects( selected );
1221 if ( selected.Extent() == 1 ) {
1222 Handle(SALOME_InteractiveObject) anIO = selected.First();
1223 if ( anIO->hasEntry() ) {
1224 //Find Actor by entry before getting Plot2d viewer,
1225 //because after call getViewManager( Plot2d_Viewer::Type(), true ) active window is Plot2d Viewer
1226 SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
1228 SUIT_ViewManager* aViewManager = app->getViewManager( Plot2d_Viewer::Type(), true ); // create if necessary
1233 SPlot2d_Viewer* aView = dynamic_cast<SPlot2d_Viewer*>(aViewManager->getViewModel());
1237 Plot2d_ViewFrame* aPlot = aView->getActiveViewFrame();
1241 if ( anActor && anActor->GetControlMode() != SMESH_Actor::eNone ) {
1242 SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
1243 QString functorName = functorToString( anActor->GetFunctor());
1244 QString aHistogramName("%1 : %2");
1245 aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName);
1246 aHistogram->setName(aHistogramName);
1247 aHistogram->setHorTitle(functorName);
1248 aHistogram->setVerTitle(QObject::tr("DISTRIBUTION_NB_ENT"));
1249 aPlot->displayObject(aHistogram, true);
1254 #endif //DISABLE_PLOT2DVIEWER
1256 void DisableAutoColor(){
1257 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1258 SALOME_ListIO selected;
1260 aSel->selectedObjects( selected );
1262 if(selected.Extent()){
1263 Handle(SALOME_InteractiveObject) anIObject = selected.First();
1264 SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
1265 if ( !aMesh->_is_nil() ) {
1266 aMesh->SetAutoColor( false );
1271 void sortChildren(){
1272 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1273 SALOME_ListIO selected;
1275 aSel->selectedObjects( selected );
1277 if(selected.Extent()){
1278 Handle(SALOME_InteractiveObject) anIObject = selected.First();
1279 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
1280 _PTR(SObject) aSObj = aStudy->FindObjectID(anIObject->getEntry());
1282 if ( aStudy->GetUseCaseBuilder()->SortChildren( aSObj, true/*AscendingOrder*/ ) ) {
1283 SMESHGUI::GetSMESHGUI()->updateObjBrowser();
1290 void SetDisplayMode(int theCommandID, SMESHGUI_StudyId2MarkerMap& theMarkerMap)
1292 SALOME_ListIO selected;
1293 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
1297 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1298 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
1299 if( !aSel || !appStudy )
1302 if( theCommandID == SMESHOp::OpClipping ) { // Clipping dialog can be activated without selection
1303 if( SMESHGUI* aModule = SMESHGUI::GetSMESHGUI() ) {
1304 aModule->EmitSignalDeactivateDialog();
1305 if( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( aModule ) )
1306 (new SMESHGUI_ClippingDlg( aModule, aViewWindow ))->show();
1311 _PTR(Study) aStudy = appStudy->studyDS();
1313 aSel->selectedObjects( selected );
1315 if(selected.Extent() >= 1){
1316 switch(theCommandID){
1317 case SMESHOp::OpTransparency:{
1318 SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
1319 (new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI() ))->show();
1322 case SMESHOp::OpProperties: {
1324 QColor faceColor, edgeColor, nodeColor, elem0dColor, ballColor;
1325 QColor orientationColor, outlineColor, volumeColor;
1326 int deltaF = 0, deltaV = 0;
1329 double ballScale = 1.0;
1331 int outlineWidth = 1;
1332 double shrinkCoef = 0.0;
1333 double orientationScale = 0.0;
1334 bool orientation3d = false;
1335 VTK::MarkerType markerType = VTK::MT_NONE;
1336 VTK::MarkerScale markerScale = VTK::MS_NONE;
1338 bool hasNodes = false;
1339 int presentEntities = 0;
1340 bool firstTime = true;
1342 SALOME_ListIteratorOfListIO It( selected );
1343 for ( ; It.More(); It.Next() ) {
1344 Handle(SALOME_InteractiveObject) IObject = It.Value();
1345 if ( !IObject->hasEntry() ) continue;
1346 SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() );
1347 if ( !anActor || !anActor->GetObject() ) continue;
1350 // nodes: color, marker
1351 anActor->GetNodeColor( color[0], color[1], color[2] );
1352 nodeColor.setRgbF( color[0], color[1], color[2] );
1353 markerType = anActor->GetMarkerType();
1354 markerScale = anActor->GetMarkerScale();
1355 markerId = anActor->GetMarkerTexture();
1356 // edges: color, width
1357 anActor->GetEdgeColor( color[0], color[1], color[2] );
1358 edgeColor.setRgbF( color[0], color[1], color[2] );
1359 edgeWidth = qMax( (int)anActor->GetLineWidth(), 1 ); // minimum allowed width is 1
1360 // faces: front color, back color (delta)
1361 anActor->GetSufaceColor( color[0], color[1], color[2], deltaF );
1362 faceColor.setRgbF( color[0], color[1], color[2] );
1363 // faces: front color, back color (delta)
1364 anActor->GetVolumeColor( color[0], color[1], color[2], deltaV );
1365 volumeColor.setRgbF( color[0], color[1], color[2] );
1366 // 0d elements: color, size
1367 anActor->Get0DColor( color[0], color[1], color[2] );
1368 elem0dColor.setRgbF( color[0], color[1], color[2] );
1369 elem0dSize = qMax( (int)anActor->Get0DSize(), 1 ); // minimum allowed size is 1
1370 // balls: color, size
1371 anActor->GetBallColor( color[0], color[1], color[2] );
1372 ballColor.setRgbF( color[0], color[1], color[2] );
1373 //ballSize = qMax( (int)anActor->GetBallSize(), 1 ); // minimum allowed size is 1
1374 ballScale = qMax( (double)anActor->GetBallScale(), 1e-2 ); // minimum allowed scale is 1e-2
1376 anActor->GetOutlineColor( color[0], color[1], color[2] );
1377 outlineColor.setRgbF( color[0], color[1], color[2] );
1378 outlineWidth = qMax( (int)anActor->GetOutlineWidth(), 1 ); // minimum allowed width is 1
1379 // orientation vectors: color, scale, 3d flag
1380 anActor->GetFacesOrientationColor( color[0], color[1], color[2] );
1381 orientationColor.setRgbF( color[0], color[1], color[2] );
1382 orientationScale = anActor->GetFacesOrientationScale();
1383 orientation3d = anActor->GetFacesOrientation3DVectors();
1385 shrinkCoef = anActor->GetShrinkFactor();
1388 firstTime = false; // we only take properties from first object (for performance reasons)
1391 hasNodes = anActor->GetObject()->GetNbEntities( SMDSAbs_Node );
1392 if ( !(presentEntities & SMESH_Actor::eEdges) && anActor->GetObject()->GetNbEntities( SMDSAbs_Edge ) )
1393 presentEntities = presentEntities | SMESH_Actor::eEdges;
1394 if ( !(presentEntities & SMESH_Actor::eFaces) && anActor->GetObject()->GetNbEntities( SMDSAbs_Face ) )
1395 presentEntities = presentEntities | SMESH_Actor::eFaces;
1396 if ( !(presentEntities & SMESH_Actor::eVolumes) && anActor->GetObject()->GetNbEntities( SMDSAbs_Volume ) )
1397 presentEntities = presentEntities | SMESH_Actor::eVolumes;
1398 if ( !(presentEntities & SMESH_Actor::e0DElements) && anActor->GetObject()->GetNbEntities( SMDSAbs_0DElement ) )
1399 presentEntities = presentEntities | SMESH_Actor::e0DElements;
1400 if ( !(presentEntities & SMESH_Actor::eBallElem) && anActor->GetObject()->GetNbEntities( SMDSAbs_Ball ) )
1401 presentEntities = presentEntities | SMESH_Actor::eBallElem;
1403 // as we know that all types of elements are present, we can exit the loop
1404 if ( presentEntities == SMESH_Actor::eAllEntity )
1408 SMESHGUI_PropertiesDlg dlg( theMarkerMap[ aStudy->StudyId() ], SMESHGUI::desktop() );
1409 // nodes: color, marker
1410 dlg.setNodeColor( nodeColor );
1411 if( markerType != VTK::MT_USER )
1412 dlg.setNodeMarker( markerType, markerScale );
1414 dlg.setNodeCustomMarker( markerId );
1415 // edges: color, line width
1416 dlg.setEdgeColor( edgeColor );
1417 dlg.setEdgeWidth( edgeWidth );
1418 // faces: front color, back color
1419 dlg.setFaceColor( faceColor, deltaF );
1420 // volumes: normal color, reversed color
1421 dlg.setVolumeColor( volumeColor, deltaV );
1422 // outlines: color, line width
1423 dlg.setOutlineColor( outlineColor );
1424 dlg.setOutlineWidth( outlineWidth );
1425 // 0d elements: color, size
1426 dlg.setElem0dColor( elem0dColor );
1427 dlg.setElem0dSize( elem0dSize );
1428 // balls: color, size
1429 dlg.setBallColor( ballColor );
1430 //dlg.setBallSize( ballSize );
1431 dlg.setBallScale( ballScale );
1432 // orientation: color, scale, 3d flag
1433 dlg.setOrientationColor( orientationColor );
1434 dlg.setOrientationSize( int( orientationScale * 100. ) );
1435 dlg.setOrientation3d( orientation3d );
1436 // shrink: scale factor
1437 dlg.setShrinkCoef( int( shrinkCoef * 100. ) );
1438 // hide unused controls
1439 dlg.showControls( presentEntities, hasNodes );
1442 nodeColor = dlg.nodeColor();
1443 markerType = dlg.nodeMarkerType();
1444 markerScale = dlg.nodeMarkerScale();
1445 markerId = dlg.nodeMarkerId();
1446 edgeColor = dlg.edgeColor();
1447 edgeWidth = dlg.edgeWidth();
1448 faceColor = dlg.faceColor();
1449 deltaF = dlg.faceColorDelta();
1450 volumeColor = dlg.volumeColor();
1451 deltaV = dlg.volumeColorDelta();
1452 outlineColor = dlg.outlineColor();
1453 outlineWidth = dlg.outlineWidth();
1454 elem0dColor = dlg.elem0dColor();
1455 elem0dSize = dlg.elem0dSize();
1456 ballColor = dlg.ballColor();
1457 // ballSize = dlg.ballSize();
1458 ballScale = dlg.ballScale();
1459 orientationColor = dlg.orientationColor();
1460 orientationScale = dlg.orientationSize() / 100.;
1461 orientation3d = dlg.orientation3d();
1462 shrinkCoef = dlg.shrinkCoef() / 100.;
1464 // store point markers map that might be changed by the user
1465 theMarkerMap[ aStudy->StudyId() ] = dlg.customMarkers();
1467 // set properties from dialog box to the presentations
1468 SALOME_ListIteratorOfListIO It( selected );
1469 for ( ; It.More(); It.Next() ) {
1470 Handle(SALOME_InteractiveObject) IObject = It.Value();
1471 if ( !IObject->hasEntry() ) continue;
1472 SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() );
1473 if ( !anActor ) continue;
1475 // nodes: color, marker
1476 anActor->SetNodeColor( nodeColor.redF(), nodeColor.greenF(), nodeColor.blueF() );
1477 if ( markerType != VTK::MT_USER ) {
1478 anActor->SetMarkerStd( markerType, markerScale );
1481 const VTK::MarkerMap& markerMap = theMarkerMap[ aStudy->StudyId() ];
1482 VTK::MarkerMap::const_iterator iter = markerMap.find( markerId );
1483 if ( iter != markerMap.end() )
1484 anActor->SetMarkerTexture( markerId, iter->second.second );
1486 // volumes: normal color, reversed color (delta)
1487 anActor->SetVolumeColor( volumeColor.redF(), volumeColor.greenF(), volumeColor.blueF(), deltaV );
1488 // faces: front color, back color (delta)
1489 anActor->SetSufaceColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF );
1490 // edges: color, width
1491 anActor->SetEdgeColor( edgeColor.redF(), edgeColor.greenF(), edgeColor.blueF() );
1492 anActor->SetLineWidth( edgeWidth );
1494 anActor->SetOutlineColor( outlineColor.redF(), outlineColor.greenF(), outlineColor.blueF() );
1495 anActor->SetOutlineWidth( outlineWidth );
1496 // 0D elements: color, size
1497 anActor->Set0DColor( elem0dColor.redF(), elem0dColor.greenF(), elem0dColor.blueF() );
1498 anActor->Set0DSize( elem0dSize );
1499 // balls: color, size
1500 anActor->SetBallColor( ballColor.redF(), ballColor.greenF(), ballColor.blueF() );
1501 // anActor->SetBallSize( ballSize );
1502 anActor->SetBallScale( ballScale );
1503 // orientation: color, scale, 3d flag
1504 anActor->SetFacesOrientationColor( orientationColor.redF(), orientationColor.greenF(), orientationColor.blueF() );
1505 anActor->SetFacesOrientationScale( orientationScale );
1506 anActor->SetFacesOrientation3DVectors( orientation3d );
1508 anActor->SetShrinkFactor( shrinkCoef );
1510 // for groups, set also proper color
1511 SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
1512 if ( !aGroupObject->_is_nil() ) {
1513 SMESH::ElementType anElementType = aGroupObject->GetType();
1515 switch( anElementType ) {
1517 aColor = nodeColor; break;
1519 aColor = edgeColor; break;
1521 aColor = faceColor; break;
1523 aColor = volumeColor; break;
1525 aColor = elem0dColor; break;
1527 aColor = ballColor; break;
1531 if ( aColor.isValid() ) {
1532 SALOMEDS::Color aGroupColor;
1533 aGroupColor.R = aColor.redF();
1534 aGroupColor.G = aColor.greenF();
1535 aGroupColor.B = aColor.blueF();
1536 aGroupObject->SetColor( aGroupColor );
1538 } // if ( !aGroupObject->_is_nil() )
1539 } // for ( ; It.More(); It.Next() )
1540 SMESH::RepaintCurrentView();
1541 } // if ( dlg.exec() )
1543 } // case SMESHOp::OpProperties:
1544 } // switch(theCommandID)
1545 SALOME_ListIteratorOfListIO It( selected );
1546 for( ; It.More(); It.Next()){
1547 Handle(SALOME_InteractiveObject) IObject = It.Value();
1548 if(IObject->hasEntry()){
1549 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
1550 switch(theCommandID){
1551 case SMESHOp::OpDMWireframe:
1552 anActor->SetRepresentation(SMESH_Actor::eEdge);
1554 case SMESHOp::OpDMShading:
1555 anActor->SetRepresentation(SMESH_Actor::eSurface);
1557 case SMESHOp::OpDMShrink:
1558 if(anActor->IsShrunk())
1559 anActor->UnShrink();
1561 anActor->SetShrink();
1563 case SMESHOp::OpDMNodes:
1564 anActor->SetRepresentation(SMESH_Actor::ePoint);
1566 case SMESHOp::OpRepresentationLines:
1567 if(anActor->GetQuadratic2DRepresentation() != SMESH_Actor::eLines)
1568 anActor->SetQuadratic2DRepresentation(SMESH_Actor::eLines);
1570 case SMESHOp::OpRepresentationArcs:
1571 if(anActor->GetQuadratic2DRepresentation() != SMESH_Actor::eArcs)
1572 anActor->SetQuadratic2DRepresentation(SMESH_Actor::eArcs);
1578 SMESH::RepaintCurrentView();
1582 void Control( int theCommandID )
1584 SMESH_Actor::eControl aControl = SMESH_Actor::eNone;
1585 switch ( theCommandID ){
1586 case SMESHOp::OpFreeNode:
1587 aControl = SMESH_Actor::eFreeNodes;
1589 case SMESHOp::OpEqualNode:
1590 aControl = SMESH_Actor::eCoincidentNodes;
1592 case SMESHOp::OpFreeEdge:
1593 aControl = SMESH_Actor::eFreeEdges;
1595 case SMESHOp::OpFreeBorder:
1596 aControl = SMESH_Actor::eFreeBorders;
1598 case SMESHOp::OpLength:
1599 aControl = SMESH_Actor::eLength;
1601 case SMESHOp::OpConnection:
1602 aControl = SMESH_Actor::eMultiConnection;
1604 case SMESHOp::OpEqualEdge:
1605 aControl = SMESH_Actor::eCoincidentElems1D;
1607 case SMESHOp::OpFreeFace:
1608 aControl = SMESH_Actor::eFreeFaces;
1610 case SMESHOp::OpBareBorderFace:
1611 aControl = SMESH_Actor::eBareBorderFace;
1613 case SMESHOp::OpOverConstrainedFace:
1614 aControl = SMESH_Actor::eOverConstrainedFace;
1616 case SMESHOp::OpLength2D:
1617 aControl = SMESH_Actor::eLength2D;
1619 case SMESHOp::OpConnection2D:
1620 aControl = SMESH_Actor::eMultiConnection2D;
1622 case SMESHOp::OpArea:
1623 aControl = SMESH_Actor::eArea;
1625 case SMESHOp::OpTaper:
1626 aControl = SMESH_Actor::eTaper;
1628 case SMESHOp::OpAspectRatio:
1629 aControl = SMESH_Actor::eAspectRatio;
1631 case SMESHOp::OpMinimumAngle:
1632 aControl = SMESH_Actor::eMinimumAngle;
1634 case SMESHOp::OpWarpingAngle:
1635 aControl = SMESH_Actor::eWarping;
1637 case SMESHOp::OpSkew:
1638 aControl = SMESH_Actor::eSkew;
1640 case SMESHOp::OpMaxElementLength2D:
1641 aControl = SMESH_Actor::eMaxElementLength2D;
1643 case SMESHOp::OpEqualFace:
1644 aControl = SMESH_Actor:: eCoincidentElems2D;
1646 case SMESHOp::OpAspectRatio3D:
1647 aControl = SMESH_Actor::eAspectRatio3D;
1649 case SMESHOp::OpVolume:
1650 aControl = SMESH_Actor::eVolume3D;
1652 case SMESHOp::OpMaxElementLength3D:
1653 aControl = SMESH_Actor::eMaxElementLength3D;
1655 case SMESHOp::OpBareBorderVolume:
1656 aControl = SMESH_Actor::eBareBorderVolume;
1658 case SMESHOp::OpOverConstrainedVolume:
1659 aControl = SMESH_Actor::eOverConstrainedVolume;
1661 case SMESHOp::OpEqualVolume:
1662 aControl = SMESH_Actor::eCoincidentElems3D;
1665 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
1666 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1667 SALOME_ListIO selected;
1669 aSel->selectedObjects( selected );
1671 if( !selected.IsEmpty() ){
1672 SALOME_ListIteratorOfListIO It(selected);
1673 for ( ; It.More(); It.Next())
1675 Handle(SALOME_InteractiveObject) anIO = It.Value();
1677 _PTR(SObject) SO = aStudy->FindObjectID( It.Value()->getEntry() );
1679 CORBA::Object_var aObject = SMESH::SObjectToObject( SO );
1680 SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( aObject );
1681 SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( aObject );
1682 SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( aObject );
1683 if ( !aMesh->_is_nil() || !aSubMesh->_is_nil() || !aGroup->_is_nil() ) {
1684 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIO->getEntry())) {
1685 anActor->SetControlMode(aControl);
1686 anActor->GetScalarBarActor()->SetTitle( functorToString( anActor->GetFunctor() ).toLatin1().constData() );
1687 SMESH::RepaintCurrentView();
1688 #ifndef DISABLE_PLOT2DVIEWER
1689 if(anActor->GetPlot2Histogram()) {
1690 SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
1691 QString functorName = functorToString( anActor->GetFunctor());
1692 QString aHistogramName("%1 : %2");
1693 aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName);
1694 aHistogram->setName(aHistogramName);
1695 aHistogram->setHorTitle(functorName);
1696 SMESH::ProcessIn2DViewers(anActor);
1708 bool CheckOIType(const Handle(SALOME_InteractiveObject) & theIO,
1709 SMESH::MeshObjectType theType,
1710 const QString theInTypeName,
1711 QString & theOutTypeName)
1713 SMESH_TypeFilter aTypeFilter( theType );
1715 if( !theIO.IsNull() )
1717 entry = theIO->getEntry();
1718 LightApp_DataOwner owner( entry );
1719 if ( aTypeFilter.isOk( &owner )) {
1720 theOutTypeName = theInTypeName;
1728 QString CheckTypeObject(const Handle(SALOME_InteractiveObject) & theIO)
1730 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
1731 _PTR(SObject) aSObj = aStudy->FindObjectID(theIO->getEntry());
1733 _PTR(SComponent) aSComp = aSObj->GetFatherComponent();
1734 CORBA::String_var anID = aSComp->GetID().c_str();
1735 if (!strcmp(anID.in(),theIO->getEntry()))
1741 CheckOIType ( theIO, SMESH::HYPOTHESIS, "Hypothesis", aTypeName ) ||
1742 CheckOIType ( theIO, SMESH::ALGORITHM, "Algorithm", aTypeName ) ||
1743 CheckOIType ( theIO, SMESH::MESH, "Mesh", aTypeName ) ||
1744 CheckOIType ( theIO, SMESH::SUBMESH, "SubMesh", aTypeName ) ||
1745 CheckOIType ( theIO, SMESH::GROUP, "Group", aTypeName )
1753 QString CheckHomogeneousSelection()
1755 //SUIT_Study* aStudy = SMESH::GetActiveStudy();
1756 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1757 SALOME_ListIO selected;
1759 aSel->selectedObjects( selected );
1761 QString RefType = CheckTypeObject(selected.First());
1762 SALOME_ListIteratorOfListIO It(selected);
1763 for ( ; It.More(); It.Next())
1765 Handle(SALOME_InteractiveObject) IObject = It.Value();
1766 QString Type = CheckTypeObject(IObject);
1767 if (Type.compare(RefType) != 0)
1768 return "Heterogeneous Selection";
1774 uint randomize( uint size )
1776 static bool initialized = false;
1777 if ( !initialized ) {
1778 qsrand( QDateTime::currentDateTime().toTime_t() );
1782 v = uint( (double)( v ) / RAND_MAX * size );
1783 v = qMax( uint(0), qMin ( v, size-1 ) );
1789 void SMESHGUI::OnEditDelete()
1791 // VSR 17/11/04: check if all objects selected belong to SMESH component --> start
1792 LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
1793 SALOME_ListIO selected; aSel->selectedObjects( selected, QString::null, false );
1795 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
1796 _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder();
1797 _PTR(GenericAttribute) anAttr;
1798 _PTR(AttributeIOR) anIOR;
1800 int objectCount = 0;
1802 QString aParentComponent = QString::null;
1803 Handle(SALOME_InteractiveObject) anIO;
1804 for( SALOME_ListIteratorOfListIO anIt( selected ); anIt.More(); anIt.Next() )
1806 anIO = anIt.Value();
1807 QString cur = anIO->getComponentDataType();
1808 _PTR(SObject) aSO = aStudy->FindObjectID(anIO->getEntry());
1810 // check if object is reference
1811 _PTR(SObject) aRefSObj;
1812 aNameList.append("\n - ");
1813 if ( aSO->ReferencedObject( aRefSObj ) ) {
1814 QString aRefName = QString::fromStdString ( aRefSObj->GetName() );
1815 aNameList.append( aRefName );
1816 cur = QString::fromStdString ( aRefSObj->GetFatherComponent()->ComponentDataType() );
1819 aNameList.append(anIO->getName());
1823 if( aParentComponent.isNull() )
1824 aParentComponent = cur;
1825 else if( !aParentComponent.isEmpty() && aParentComponent!=cur )
1826 aParentComponent = "";
1829 if ( objectCount == 0 )
1830 return; // No Valid Objects Selected
1832 if ( aParentComponent != SMESHGUI::GetSMESHGUI()->name() ) {
1833 SUIT_MessageBox::warning( SMESHGUI::desktop(),
1834 QObject::tr("ERR_ERROR"),
1835 QObject::tr("NON_SMESH_OBJECTS_SELECTED").arg( SMESHGUI::GetSMESHGUI()->moduleName() ) );
1838 // VSR 17/11/04: check if all objects selected belong to SMESH component <-- finish
1839 if (SUIT_MessageBox::warning
1840 (SMESHGUI::desktop(),
1841 QObject::tr("SMESH_WRN_WARNING"),
1842 QObject::tr("SMESH_REALLY_DELETE").arg( objectCount ).arg( aNameList ),
1843 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1844 SUIT_MessageBox::Yes) != SUIT_MessageBox::Yes)
1847 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
1849 // Put the whole hierarchy of sub-objects of the selected SO's into a list and
1850 // then treat them all starting from the deepest objects (at list back)
1851 std::list< _PTR(SObject) > listSO;
1852 SALOME_ListIteratorOfListIO It(selected);
1853 for( ; It.More(); It.Next()) // loop on selected IO's
1855 Handle(SALOME_InteractiveObject) IObject = It.Value();
1856 if(IObject->hasEntry()) {
1857 _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry());
1859 // disable removal of "SMESH" component object
1860 if(aSO->FindAttribute(anAttr, "AttributeIOR")){
1862 if ( engineIOR() == anIOR->Value().c_str() )
1865 //Check the referenced object
1866 _PTR(SObject) aRefSObject;
1867 if ( aSO && aSO->ReferencedObject( aRefSObject ) )
1868 aSO = aRefSObject; // Delete main Object instead of reference
1870 listSO.push_back( aSO );
1871 std::list< _PTR(SObject) >::iterator itSO = --listSO.end();
1872 for ( ; itSO != listSO.end(); ++itSO ) {
1873 _PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO );
1874 for (it->InitEx(false); it->More(); it->Next())
1875 listSO.push_back( it->Value() );
1879 // Check if none of objects to delete is referred from outside
1880 std::list< _PTR(SObject) >::reverse_iterator ritSO;
1881 for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO )
1883 _PTR(SObject) SO = *ritSO;
1884 if ( !SO ) continue;
1885 std::vector<_PTR(SObject)> aReferences = aStudy->FindDependances( *ritSO );
1886 for (size_t i = 0; i < aReferences.size(); i++) {
1887 _PTR(SComponent) aComponent = aReferences[i]->GetFatherComponent();
1888 std::string type = aComponent->ComponentDataType();
1889 if ( type != "SMESH" )
1891 SUIT_MessageBox::warning( anApp->desktop(),
1892 QObject::tr("WRN_WARNING"),
1893 QObject::tr("DEP_OBJECT") );
1894 return; // outside SMESH, there is an object depending on a SMESH object
1899 // Call mesh->Clear() to prevent loading mesh from file caused by hypotheses removal
1900 for( It.Initialize( selected ); It.More(); It.Next()) // loop on selected IO's
1902 Handle(SALOME_InteractiveObject) IObject = It.Value();
1903 SMESH::SMESH_Mesh_var mesh = SMESH::IObjectToInterface< SMESH::SMESH_Mesh >( IObject );
1904 if ( !mesh->_is_nil() )
1908 // Treat SO's in the list starting from the back
1909 aStudyBuilder->NewCommand(); // There is a transaction
1910 for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO )
1912 _PTR(SObject) SO = *ritSO;
1913 if ( !SO ) continue;
1914 std::string anEntry = SO->GetID();
1916 /** Erase graphical object and remove all its data **/
1917 if(SO->FindAttribute(anAttr, "AttributeIOR")) {
1918 SMESH::RemoveVisualObjectWithActors( anEntry.c_str(), true);
1920 /** Remove an object from data structures **/
1921 SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO ));
1922 SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO ));
1923 if ( !aGroup->_is_nil() ) { // DELETE GROUP
1924 SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh();
1925 aMesh->RemoveGroup( aGroup );
1927 else if ( !aSubMesh->_is_nil() ) { // DELETE SUBMESH
1928 SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
1929 aMesh->RemoveSubMesh( aSubMesh );
1931 _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh);
1933 SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0);
1936 Handle(SALOME_InteractiveObject) IObject = new SALOME_InteractiveObject
1937 ( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() );
1938 QString objType = CheckTypeObject(IObject);
1939 if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS
1940 SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
1941 aStudyBuilder->RemoveObjectWithChildren( SO );
1943 else {// default action: remove SObject from the study
1944 // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH
1945 //SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy);
1947 aStudyBuilder->RemoveObjectWithChildren( SO );
1951 } /* listSO back loop */
1953 aStudyBuilder->CommitCommand();
1955 /* Clear any previous selection */
1957 aSel->setSelectedObjects( l1 );
1959 SMESHGUI::GetSMESHGUI()->updateObjBrowser();
1963 SMESHGUI_EXPORT CAM_Module* createModule()
1965 return new SMESHGUI();
1968 SMESHGUI_EXPORT char* getModuleVersion() {
1969 return (char*)SMESH_VERSION_STR;
1973 SMESH::SMESH_Gen_var SMESHGUI::myComponentSMESH = SMESH::SMESH_Gen::_nil();
1975 //=============================================================================
1979 //=============================================================================
1980 SMESHGUI::SMESHGUI() :
1981 SalomeApp_Module( "SMESH" )
1983 if ( CORBA::is_nil( myComponentSMESH ) )
1985 CORBA::Boolean anIsEmbeddedMode;
1986 myComponentSMESH = SMESH_Client::GetSMESHGen(getApp()->orb(),anIsEmbeddedMode);
1987 MESSAGE("-------------------------------> anIsEmbeddedMode=" << anIsEmbeddedMode);
1989 // 0019923: EDF 765 SMESH : default values of hypothesis
1990 SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
1991 int nbSeg = aResourceMgr->integerValue( "SMESH", "segmentation", 10 );
1992 myComponentSMESH->SetBoundaryBoxSegmentation( nbSeg );
1993 nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
1994 myComponentSMESH->SetDefaultNbSegments( nbSeg );
1996 const char* options[] = { "historical_python_dump", "forget_mesh_on_hyp_modif" };
1997 for ( size_t i = 0; i < sizeof(options)/sizeof(char*); ++i )
1998 if ( aResourceMgr->hasValue( "SMESH", options[i] ))
2000 QString val = aResourceMgr->stringValue( "SMESH", options[i] );
2001 myComponentSMESH->SetOption( options[i], val.toLatin1().constData() );
2005 myActiveDialogBox = 0;
2006 myFilterLibraryDlg = 0;
2010 myEventCallbackCommand = vtkCallbackCommand::New();
2011 myEventCallbackCommand->Delete();
2012 myEventCallbackCommand->SetClientData( this );
2013 myEventCallbackCommand->SetCallback( SMESHGUI::ProcessEvents );
2016 /* load resources for all available meshers */
2017 SMESH::InitAvailableHypotheses();
2020 //=============================================================================
2024 //=============================================================================
2025 SMESHGUI::~SMESHGUI()
2029 //=============================================================================
2033 //=============================================================================
2034 LightApp_SelectionMgr* SMESHGUI::selectionMgr()
2036 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
2038 return dynamic_cast<LightApp_SelectionMgr*>( anApp->selectionMgr() );
2043 //=============================================================================
2047 //=============================================================================
2048 bool SMESHGUI::automaticUpdate(unsigned int requestedSize, bool* limitExceeded)
2050 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2054 bool autoUpdate = resMgr->booleanValue( "SMESH", "auto_update", false );
2055 long updateLimit = resMgr->integerValue( "SMESH", "update_limit", 500000 );
2056 bool exceeded = updateLimit > 0 && requestedSize > updateLimit;
2057 if ( limitExceeded ) *limitExceeded = autoUpdate && exceeded;
2058 return autoUpdate && !exceeded;
2061 //=============================================================================
2065 //=============================================================================
2066 bool SMESHGUI::automaticUpdate( SMESH::SMESH_IDSource_ptr theMesh,
2067 int* entities, bool* limitExceeded, int* hidden, long* nbElements )
2069 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2073 bool autoUpdate = resMgr->booleanValue( "SMESH", "auto_update", false );
2074 long updateLimit = resMgr->integerValue( "SMESH", "update_limit", 500000 );
2075 bool incrementalLimit = resMgr->booleanValue( "SMESH", "incremental_limit", false );
2077 SMESH::long_array_var info = theMesh->GetMeshInfo();
2078 long nbOdElems = info[SMDSEntity_0D];
2079 long nbEdges = info[SMDSEntity_Edge] + info[SMDSEntity_Quad_Edge];
2080 long nbFaces = info[SMDSEntity_Triangle] + info[SMDSEntity_Quad_Triangle] + info[SMDSEntity_BiQuad_Triangle] +
2081 info[SMDSEntity_Quadrangle] + info[SMDSEntity_Quad_Quadrangle] + info[SMDSEntity_BiQuad_Quadrangle] +
2082 info[SMDSEntity_Polygon] + info[SMDSEntity_Quad_Polygon];
2083 long nbVolumes = info[SMDSEntity_Tetra] + info[SMDSEntity_Quad_Tetra] +
2084 info[SMDSEntity_Hexa] + info[SMDSEntity_Quad_Hexa] + info[SMDSEntity_TriQuad_Hexa] +
2085 info[SMDSEntity_Pyramid] + info[SMDSEntity_Quad_Pyramid] +
2086 info[SMDSEntity_Penta] + info[SMDSEntity_Quad_Penta] +
2087 info[SMDSEntity_Polyhedra] +
2088 info[SMDSEntity_Hexagonal_Prism];
2089 long nbBalls = info[SMDSEntity_Ball];
2091 long requestedSize = nbOdElems + nbBalls + nbEdges + nbFaces + nbVolumes;
2092 *nbElements = requestedSize;
2094 *entities = SMESH_Actor::eAllEntity;
2097 bool exceeded = updateLimit > 0 && requestedSize > updateLimit;
2099 if ( limitExceeded ) *limitExceeded = autoUpdate && exceeded;
2101 if ( incrementalLimit ) {
2104 if ( nbOdElems > 0 ) {
2105 if ( total + nbOdElems > updateLimit ) {
2106 *entities = *entities & ~SMESH_Actor::e0DElements;
2107 *hidden = *hidden | SMESH_Actor::e0DElements;
2114 if ( nbEdges > 0 ) {
2115 if ( total + nbEdges > updateLimit ) {
2116 *entities = *entities & ~SMESH_Actor::eEdges;
2117 *hidden = *hidden | SMESH_Actor::eEdges;
2124 if ( nbFaces > 0 ) {
2125 if ( total + nbFaces > updateLimit ) {
2126 *entities = *entities & ~SMESH_Actor::eFaces;
2127 *hidden = *hidden | SMESH_Actor::eFaces;
2134 if ( nbVolumes > 0 ) {
2135 if ( total + nbVolumes > updateLimit ) {
2136 *entities = *entities & ~SMESH_Actor::eVolumes;
2137 *hidden = *hidden | SMESH_Actor::eVolumes;
2144 if ( nbBalls > 0 ) {
2145 if ( total + nbBalls > updateLimit ) {
2146 *entities = *entities & ~SMESH_Actor::eBallElem;
2147 *hidden = *hidden | SMESH_Actor::eBallElem;
2155 return autoUpdate && !exceeded;
2158 //=============================================================================
2162 //=============================================================================
2163 SUIT_ResourceMgr* SMESHGUI::resourceMgr()
2165 return dynamic_cast<SUIT_ResourceMgr*>( SUIT_Session::session()->resourceMgr() );
2168 //=============================================================================
2172 //=============================================================================
2173 SMESHGUI* SMESHGUI::GetSMESHGUI()
2175 SMESHGUI* smeshMod = 0;
2176 SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
2179 CAM_Module* module = app->module( "Mesh" );
2180 smeshMod = dynamic_cast<SMESHGUI*>( module );
2183 if ( smeshMod && smeshMod->application() && smeshMod->application()->activeStudy() )
2185 SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( smeshMod->application()->activeStudy() );
2188 _PTR(Study) aStudy = study->studyDS();
2190 GetSMESHGen()->SetCurrentStudy( _CAST(Study,aStudy)->GetStudy() );
2199 Standard_EXPORT SMESHGUI* GetComponentGUI()
2201 return SMESHGUI::GetSMESHGUI();
2205 //=============================================================================
2209 //=============================================================================
2210 void SMESHGUI::SetState(int aState)
2215 //=============================================================================
2219 //=============================================================================
2220 void SMESHGUI::ResetState()
2225 //=============================================================================
2229 //=============================================================================
2230 void SMESHGUI::EmitSignalDeactivateDialog()
2232 emit SignalDeactivateActiveDialog();
2235 //=============================================================================
2239 //=============================================================================
2240 void SMESHGUI::EmitSignalStudyFrameChanged()
2242 emit SignalStudyFrameChanged();
2245 //=============================================================================
2249 //=============================================================================
2250 void SMESHGUI::EmitSignalCloseAllDialogs()
2252 emit SignalCloseAllDialogs();
2255 //=============================================================================
2259 //=============================================================================
2260 void SMESHGUI::EmitSignalVisibilityChanged()
2262 emit SignalVisibilityChanged();
2265 //=============================================================================
2269 //=============================================================================
2270 void SMESHGUI::EmitSignalCloseView()
2272 emit SignalCloseView();
2275 //=============================================================================
2279 //=============================================================================
2280 void SMESHGUI::EmitSignalActivatedViewManager()
2282 emit SignalActivatedViewManager();
2285 //=============================================================================
2289 //=============================================================================
2290 QDialog *SMESHGUI::GetActiveDialogBox()
2292 return myActiveDialogBox;
2295 //=============================================================================
2299 //=============================================================================
2300 void SMESHGUI::SetActiveDialogBox(QDialog * aDlg)
2302 myActiveDialogBox = (QDialog *) aDlg;
2306 //=============================================================================
2310 //=============================================================================
2311 SUIT_Desktop* SMESHGUI::desktop()
2313 SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
2315 return app->desktop();
2320 //=============================================================================
2324 //=============================================================================
2325 SalomeApp_Study* SMESHGUI::activeStudy()
2327 SUIT_Application* app = SUIT_Session::session()->activeApplication();
2329 return dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
2334 //=============================================================================
2338 //=============================================================================
2339 void SMESHGUI::Modified( bool theIsUpdateActions )
2341 if( SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() ) ) {
2342 if( SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) ) {
2343 appStudy->Modified();
2344 if( theIsUpdateActions )
2345 app->updateActions();
2350 //=============================================================================
2354 //=============================================================================
2355 bool SMESHGUI::DefineDlgPosition(QWidget * aDlg, int &x, int &y)
2357 /* Here the position is on the bottom right corner - 10 */
2358 // aDlg->resize(QSize().expandedTo(aDlg->minimumSizeHint()));
2360 SUIT_Desktop *PP = desktop();
2361 x = abs(PP->x() + PP->size().width() - aDlg->size().width() - 10);
2362 y = abs(PP->y() + PP->size().height() - aDlg->size().height() - 10);
2366 //=============================================================================
2370 //=============================================================================
2371 static int isStudyLocked(_PTR(Study) theStudy){
2372 return theStudy->GetProperties()->IsLocked();
2375 static bool checkLock(_PTR(Study) theStudy) {
2376 if (isStudyLocked(theStudy)) {
2377 SUIT_MessageBox::warning( SMESHGUI::desktop(),
2378 QObject::tr("WRN_WARNING"),
2379 QObject::tr("WRN_STUDY_LOCKED") );
2385 //=======================================================================
2386 //function : CheckActiveStudyLocked
2388 //=======================================================================
2390 bool SMESHGUI::isActiveStudyLocked()
2392 _PTR(Study) aStudy = activeStudy()->studyDS();
2393 return checkLock( aStudy );
2396 //=============================================================================
2400 //=============================================================================
2401 bool SMESHGUI::OnGUIEvent( int theCommandID )
2403 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
2407 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); //Document OCAF de l'etude active
2408 SUIT_ResourceMgr* mgr = resourceMgr();
2412 if (CORBA::is_nil(GetSMESHGen()->GetCurrentStudy())) {
2413 GetSMESHGen()->SetCurrentStudy(_CAST(Study,aStudy)->GetStudy());
2416 SUIT_ViewWindow* view = application()->desktop()->activeWindow();
2417 SVTK_ViewWindow* vtkwnd = dynamic_cast<SVTK_ViewWindow*>( view );
2419 //QAction* act = action( theCommandID );
2421 switch (theCommandID) {
2422 case SMESHOp::OpDelete:
2423 if(checkLock(aStudy)) break;
2426 case SMESHOp::OpImportDAT:
2427 case SMESHOp::OpImportUNV:
2428 case SMESHOp::OpImportMED:
2429 case SMESHOp::OpImportSTL:
2431 case SMESHOp::OpImportCGNS:
2433 case SMESHOp::OpImportSAUV:
2434 case SMESHOp::OpImportGMF:
2436 if(checkLock(aStudy)) break;
2437 ::ImportMeshesFromFile(GetSMESHGen(),theCommandID);
2441 case SMESHOp::OpFileInformation:
2443 SALOME_ListIO selected;
2444 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2446 aSel->selectedObjects( selected );
2447 if( selected.Extent() )
2449 Handle(SALOME_InteractiveObject) anIObject = selected.First();
2450 SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
2451 if ( !aMesh->_is_nil() )
2453 SMESHGUI_FileInfoDlg dlg( desktop(), aMesh->GetMEDFileInfo() );
2459 case SMESHOp::OpExportDAT:
2460 case SMESHOp::OpExportMED:
2461 case SMESHOp::OpExportUNV:
2462 case SMESHOp::OpExportSTL:
2464 case SMESHOp::OpExportCGNS:
2466 case SMESHOp::OpExportSAUV:
2467 case SMESHOp::OpExportGMF:
2468 case SMESHOp::OpPopupExportDAT:
2469 case SMESHOp::OpPopupExportMED:
2470 case SMESHOp::OpPopupExportUNV:
2471 case SMESHOp::OpPopupExportSTL:
2473 case SMESHOp::OpPopupExportCGNS:
2475 case SMESHOp::OpPopupExportSAUV:
2476 case SMESHOp::OpPopupExportGMF:
2478 ::ExportMeshToFile(theCommandID);
2482 case SMESHOp::OpReset: // SCALAR BAR
2484 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2485 SALOME_ListIO selected;
2487 aSel->selectedObjects( selected );
2489 if( selected.Extent() ) {
2490 Handle(SALOME_InteractiveObject) anIO = selected.First();
2491 if( anIO->hasEntry() ) {
2492 if( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) {
2493 anActor->SetControlMode( SMESH_Actor::eNone );
2494 #ifndef DISABLE_PLOT2DVIEWER
2495 SMESH::ProcessIn2DViewers(anActor,SMESH::RemoveFrom2dViewer);
2502 case SMESHOp::OpScalarBarProperties:
2504 SMESHGUI_Preferences_ScalarBarDlg::ScalarBarProperties( this );
2507 case SMESHOp::OpShowScalarBar:
2509 // show/hide scalar bar
2510 ::ShowElement(theCommandID);
2513 case SMESHOp::OpSaveDistribution:
2515 // dump control distribution data to the text file
2516 ::SaveDistribution();
2520 case SMESHOp::OpShowDistribution:
2522 // show/hide distribution
2523 ::ShowElement(theCommandID);
2527 #ifndef DISABLE_PLOT2DVIEWER
2528 case SMESHOp::OpPlotDistribution:
2530 // plot distribution
2531 ::PlotDistribution();
2537 case SMESHOp::OpAutoColor:
2541 case SMESHOp::OpDisableAutoColor:
2542 ::DisableAutoColor();
2545 case SMESHOp::OpClipping:
2546 case SMESHOp::OpTransparency:
2547 case SMESHOp::OpProperties: // Display preferences (colors, shrink size, line width, ...)
2550 case SMESHOp::OpDMWireframe:
2551 case SMESHOp::OpDMShading:
2552 case SMESHOp::OpDMNodes:
2553 case SMESHOp::OpDMShrink:
2554 ::SetDisplayMode(theCommandID, myMarkerMap);
2557 //2D quadratic representation
2558 case SMESHOp::OpRepresentationLines:
2559 case SMESHOp::OpRepresentationArcs:
2560 ::SetDisplayMode(theCommandID, myMarkerMap);
2564 case SMESHOp::OpDE0DElements:
2565 case SMESHOp::OpDEEdges:
2566 case SMESHOp::OpDEFaces:
2567 case SMESHOp::OpDEVolumes:
2568 case SMESHOp::OpDEBalls:
2569 case SMESHOp::OpDEAllEntity:
2570 ::SetDisplayEntity(theCommandID);
2573 // Choose entities to be displayed
2574 case SMESHOp::OpDEChoose:
2576 ( new SMESHGUI_DisplayEntitiesDlg( SMESHGUI::desktop() ) )->exec();
2580 case SMESHOp::OpOrientationOnFaces:
2582 LightApp_SelectionMgr* mgr = selectionMgr();
2583 SALOME_ListIO selected; mgr->selectedObjects( selected );
2585 SALOME_ListIteratorOfListIO it(selected);
2586 for( ; it.More(); it.Next()) {
2587 Handle(SALOME_InteractiveObject) anIObject = it.Value();
2588 if(anIObject->hasEntry()) {
2589 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){
2590 anActor->SetFacesOriented( !anActor->GetFacesOriented() );
2597 case SMESHOp::OpUpdate:
2599 if(checkLock(aStudy)) break;
2600 SUIT_OverrideCursor wc;
2602 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
2605 SMESH::UpdateView();
2607 catch (std::bad_alloc) { // PAL16774 (Crash after display of many groups)
2608 SMESH::OnVisuException();
2610 catch (...) { // PAL16774 (Crash after display of many groups)
2611 SMESH::OnVisuException();
2615 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2616 aSel->selectedObjects( l );
2617 aSel->setSelectedObjects( l );
2621 case SMESHOp::OpHide:
2622 case SMESHOp::OpShow:
2623 case SMESHOp::OpShowOnly:
2625 SMESH::EDisplaing anAction;
2626 switch (theCommandID) {
2627 case SMESHOp::OpHide: anAction = SMESH::eErase; break;
2628 case SMESHOp::OpShow: anAction = SMESH::eDisplay; break;
2629 case SMESHOp::OpShowOnly: anAction = SMESH::eDisplayOnly; break;
2632 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2633 SALOME_ListIO sel_objects, to_process;
2635 aSel->selectedObjects( sel_objects );
2637 if( theCommandID==SMESHOp::OpShowOnly )
2639 MESSAGE("anAction = SMESH::eDisplayOnly");
2640 startOperation( myEraseAll );
2643 extractContainers( sel_objects, to_process );
2646 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
2650 SALOME_ListIteratorOfListIO It( to_process );
2651 for ( ; It.More(); It.Next()) {
2653 Handle(SALOME_InteractiveObject) IOS = It.Value();
2654 if (IOS->hasEntry()) {
2656 if (!SMESH::UpdateView(anAction, IOS->getEntry())) {
2657 SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged();
2658 break; // PAL16774 (Crash after display of many groups)
2660 if (anAction == SMESH::eDisplayOnly)
2662 MESSAGE("anAction = SMESH::eDisplayOnly");
2663 anAction = SMESH::eDisplay;
2669 // PAL13338 + PAL15161 -->
2670 if ( ( theCommandID==SMESHOp::OpShow || theCommandID==SMESHOp::OpShowOnly ) && !checkLock(aStudy)) {
2671 MESSAGE("anAction = SMESH::eDisplayOnly");
2672 SMESH::UpdateView();
2673 SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged();
2675 // PAL13338 + PAL15161 <--
2677 catch (...) { // PAL16774 (Crash after display of many groups)
2678 SMESH::OnVisuException();
2681 if (anAction == SMESH::eErase) {
2682 MESSAGE("anAction == SMESH::eErase");
2684 aSel->setSelectedObjects( l1 );
2687 aSel->setSelectedObjects( to_process );
2692 case SMESHOp::OpNode:
2694 if(checkLock(aStudy)) break;
2697 EmitSignalDeactivateDialog();
2699 ( new SMESHGUI_NodesDlg( this ) )->show();
2702 SUIT_MessageBox::warning(desktop(),
2703 tr("SMESH_WRN_WARNING"),
2704 tr("SMESH_WRN_VIEWER_VTK"));
2709 case SMESHOp::OpCreateMesh:
2710 case SMESHOp::OpCreateSubMesh:
2711 case SMESHOp::OpEditMeshOrSubMesh:
2712 case SMESHOp::OpCompute:
2713 case SMESHOp::OpPreCompute:
2714 case SMESHOp::OpEvaluate:
2715 case SMESHOp::OpMeshOrder:
2716 startOperation( theCommandID );
2718 case SMESHOp::OpCopyMesh:
2720 if (checkLock(aStudy)) break;
2721 EmitSignalDeactivateDialog();
2722 ( new SMESHGUI_CopyMeshDlg( this ) )->show();
2725 case SMESHOp::OpBuildCompoundMesh:
2727 if (checkLock(aStudy)) break;
2728 EmitSignalDeactivateDialog();
2729 ( new SMESHGUI_BuildCompoundDlg( this ) )->show();
2733 case SMESHOp::OpDiagonalInversion:
2734 case SMESHOp::OpUnionOfTwoTriangle:
2738 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2739 tr( "NOT_A_VTK_VIEWER" ) );
2743 if ( checkLock( aStudy ) )
2746 /*Standard_Boolean aRes;
2747 SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IObject);
2748 if ( aMesh->_is_nil() )
2750 SUIT_MessageBox::warning(GetDesktop(), tr( "SMESH_WRN_WARNING" ),
2751 tr( "SMESH_BAD_SELECTION" ) );
2755 EmitSignalDeactivateDialog();
2756 if ( theCommandID == SMESHOp::OpDiagonalInversion )
2757 ( new SMESHGUI_TrianglesInversionDlg( this ) )->show();
2759 ( new SMESHGUI_UnionOfTwoTrianglesDlg( this ) )->show();
2762 case SMESHOp::OpOrientation:
2763 case SMESHOp::OpUnionOfTriangles:
2764 case SMESHOp::OpCuttingOfQuadrangles:
2765 case SMESHOp::OpSplitVolumes:
2769 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2770 tr( "NOT_A_VTK_VIEWER" ) );
2774 if ( checkLock( aStudy ) )
2777 EmitSignalDeactivateDialog();
2778 SMESHGUI_MultiEditDlg* aDlg = NULL;
2779 if ( theCommandID == SMESHOp::OpOrientation )
2780 aDlg = new SMESHGUI_ChangeOrientationDlg(this);
2781 else if ( theCommandID == SMESHOp::OpUnionOfTriangles )
2782 aDlg = new SMESHGUI_UnionOfTrianglesDlg(this);
2783 else if ( theCommandID == SMESHOp::OpSplitVolumes )
2784 aDlg = new SMESHGUI_SplitVolumesDlg(this);
2786 aDlg = new SMESHGUI_CuttingOfQuadsDlg(this);
2791 case SMESHOp::OpSmoothing:
2793 if(checkLock(aStudy)) break;
2795 EmitSignalDeactivateDialog();
2796 ( new SMESHGUI_SmoothingDlg( this ) )->show();
2799 SUIT_MessageBox::warning(desktop(),
2800 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2804 case SMESHOp::OpExtrusion:
2806 if (checkLock(aStudy)) break;
2808 EmitSignalDeactivateDialog();
2809 ( new SMESHGUI_ExtrusionDlg ( this ) )->show();
2811 SUIT_MessageBox::warning(desktop(),
2812 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2816 case SMESHOp::OpExtrusionAlongAPath:
2818 if (checkLock(aStudy)) break;
2820 EmitSignalDeactivateDialog();
2821 ( new SMESHGUI_ExtrusionAlongPathDlg( this ) )->show();
2823 SUIT_MessageBox::warning(desktop(),
2824 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2828 case SMESHOp::OpRevolution:
2830 if(checkLock(aStudy)) break;
2832 EmitSignalDeactivateDialog();
2833 ( new SMESHGUI_RevolutionDlg( this ) )->show();
2836 SUIT_MessageBox::warning(desktop(),
2837 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2841 case SMESHOp::OpPatternMapping:
2843 if ( checkLock( aStudy ) )
2847 EmitSignalDeactivateDialog();
2848 ( new SMESHGUI_MeshPatternDlg( this ) )->show();
2851 SUIT_MessageBox::warning(desktop(),
2852 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2856 case SMESHOp::OpConvertMeshToQuadratic:
2857 case SMESHOp::OpCreateBoundaryElements: // create 2D mesh from 3D
2858 case SMESHOp::OpReorientFaces:
2859 case SMESHOp::OpCreateGeometryGroup:
2861 startOperation( theCommandID );
2864 case SMESHOp::OpCreateGroup:
2868 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2869 tr( "NOT_A_VTK_VIEWER" ) );
2873 if(checkLock(aStudy)) break;
2874 EmitSignalDeactivateDialog();
2875 SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_nil();
2877 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2878 SALOME_ListIO selected;
2880 aSel->selectedObjects( selected );
2882 int nbSel = selected.Extent();
2884 // check if mesh is selected
2885 aMesh = SMESH::GetMeshByIO( selected.First() );
2887 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aMesh);
2892 case SMESHOp::OpConstructGroup:
2896 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2897 tr( "NOT_A_VTK_VIEWER" ) );
2901 if(checkLock(aStudy)) break;
2902 EmitSignalDeactivateDialog();
2904 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2905 SALOME_ListIO selected;
2907 aSel->selectedObjects( selected );
2909 int nbSel = selected.Extent();
2911 // check if submesh is selected
2912 Handle(SALOME_InteractiveObject) IObject = selected.First();
2913 if (IObject->hasEntry()) {
2914 _PTR(SObject) aSObj = aStudy->FindObjectID(IObject->getEntry());
2916 SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( aSObj ) );
2917 if (!aSubMesh->_is_nil()) {
2919 SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
2920 // get submesh elements list by types
2921 SMESH::long_array_var aNodes = aSubMesh->GetElementsByType(SMESH::NODE);
2922 SMESH::long_array_var aEdges = aSubMesh->GetElementsByType(SMESH::EDGE);
2923 SMESH::long_array_var aFaces = aSubMesh->GetElementsByType(SMESH::FACE);
2924 SMESH::long_array_var aVolumes = aSubMesh->GetElementsByType(SMESH::VOLUME);
2925 // create group for each type o elements
2926 QString aName = IObject->getName();
2927 QStringList anEntryList;
2928 if (aNodes->length() > 0) {
2929 SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::NODE, aName + "_Nodes");
2930 aGroup->Add(aNodes.inout());
2931 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( aGroup ) )
2932 anEntryList.append( aSObject->GetID().c_str() );
2934 if (aEdges->length() > 0) {
2935 SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::EDGE, aName + "_Edges");
2936 aGroup->Add(aEdges.inout());
2937 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( aGroup ) )
2938 anEntryList.append( aSObject->GetID().c_str() );
2940 if (aFaces->length() > 0) {
2941 SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::FACE, aName + "_Faces");
2942 aGroup->Add(aFaces.inout());
2943 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( aGroup ) )
2944 anEntryList.append( aSObject->GetID().c_str() );
2946 if (aVolumes->length() > 0) {
2947 SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::VOLUME, aName + "_Volumes");
2948 aGroup->Add(aVolumes.inout());
2949 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( aGroup ) )
2950 anEntryList.append( aSObject->GetID().c_str() );
2953 anApp->browseObjects( anEntryList );
2955 catch(const SALOME::SALOME_Exception & S_ex){
2956 SalomeApp_Tools::QtCatchCorbaException(S_ex);
2963 SUIT_MessageBox::warning(desktop(),
2964 tr("SMESH_WRN_WARNING"),
2965 tr("SMESH_WRN_NO_AVAILABLE_DATA"));
2970 case SMESHOp::OpEditGroup:
2974 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2975 tr( "NOT_A_VTK_VIEWER" ) );
2979 if(checkLock(aStudy)) break;
2980 EmitSignalDeactivateDialog();
2982 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2983 SALOME_ListIO selected;
2985 aSel->selectedObjects( selected );
2987 SALOME_ListIteratorOfListIO It (selected);
2988 int nbSelectedGroups = 0;
2989 for ( ; It.More(); It.Next() )
2991 SMESH::SMESH_GroupBase_var aGroup =
2992 SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(It.Value());
2993 if (!aGroup->_is_nil()) {
2995 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aGroup);
2999 if (nbSelectedGroups == 0)
3001 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, SMESH::SMESH_GroupBase::_nil());
3007 case SMESHOp::OpAddElemGroupPopup: // Add elements to group
3009 if(checkLock(aStudy)) break;
3010 if (myState == 800) {
3011 SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) myActiveDialogBox;
3012 if (aDlg) aDlg->onAdd();
3017 case SMESHOp::OpRemoveElemGroupPopup: // Remove elements from group
3019 if(checkLock(aStudy)) break;
3020 if (myState == 800) {
3021 SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) myActiveDialogBox;
3022 if (aDlg) aDlg->onRemove();
3027 case SMESHOp::OpEditGeomGroupAsGroup:
3031 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
3032 tr( "NOT_A_VTK_VIEWER" ) );
3036 if(checkLock(aStudy)) break;
3037 EmitSignalDeactivateDialog();
3039 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
3040 SALOME_ListIO selected;
3042 aSel->selectedObjects( selected );
3044 SALOME_ListIteratorOfListIO It (selected);
3045 for ( ; It.More(); It.Next() )
3047 SMESH::SMESH_GroupOnGeom_var aGroup =
3048 SMESH::IObjectToInterface<SMESH::SMESH_GroupOnGeom>(It.Value());
3049 if (!aGroup->_is_nil()) {
3050 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aGroup, true );
3055 SMESH::SMESH_GroupOnFilter_var aGroup =
3056 SMESH::IObjectToInterface<SMESH::SMESH_GroupOnFilter>(It.Value());
3057 if (!aGroup->_is_nil()) {
3058 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aGroup, true );
3066 case SMESHOp::OpUnionGroups:
3067 case SMESHOp::OpIntersectGroups:
3068 case SMESHOp::OpCutGroups:
3072 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
3073 tr( "NOT_A_VTK_VIEWER" ) );
3077 if ( checkLock( aStudy ) )
3080 EmitSignalDeactivateDialog();
3082 SMESHGUI_GroupOpDlg* aDlg = 0;
3083 if ( theCommandID == SMESHOp::OpUnionGroups )
3084 aDlg = new SMESHGUI_UnionGroupsDlg( this );
3085 else if ( theCommandID == SMESHOp::OpIntersectGroups )
3086 aDlg = new SMESHGUI_IntersectGroupsDlg( this );
3088 aDlg = new SMESHGUI_CutGroupsDlg( this );
3095 case SMESHOp::OpGroupUnderlyingElem: // Create groups of entities from existing groups of superior dimensions
3097 if ( checkLock( aStudy ) )
3100 EmitSignalDeactivateDialog();
3101 SMESHGUI_GroupOpDlg* aDlg = new SMESHGUI_DimGroupDlg( this );
3107 case SMESHOp::OpDeleteGroup: // Delete groups with their contents
3111 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
3112 tr( "NOT_A_VTK_VIEWER" ) );
3116 if ( checkLock( aStudy ) )
3119 EmitSignalDeactivateDialog();
3121 ( new SMESHGUI_DeleteGroupDlg( this ) )->show();
3125 case SMESHOp::OpMeshInformation:
3126 case SMESHOp::OpWhatIs:
3128 int page = theCommandID == SMESHOp::OpMeshInformation ? SMESHGUI_MeshInfoDlg::BaseInfo : SMESHGUI_MeshInfoDlg::ElemInfo;
3129 EmitSignalDeactivateDialog();
3130 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
3131 SALOME_ListIO selected;
3133 aSel->selectedObjects( selected );
3135 if ( selected.Extent() > 1 ) { // a dlg for each IO
3136 SALOME_ListIteratorOfListIO It( selected );
3137 for ( ; It.More(); It.Next() ) {
3138 SMESHGUI_MeshInfoDlg* dlg = new SMESHGUI_MeshInfoDlg( SMESHGUI::desktop(), page );
3139 dlg->showInfo( It.Value() );
3144 SMESHGUI_MeshInfoDlg* dlg = new SMESHGUI_MeshInfoDlg( SMESHGUI::desktop(), page );
3150 case SMESHOp::OpFindElementByPoint:
3152 startOperation( theCommandID );
3156 case SMESHOp::OpEditHypothesis:
3158 if(checkLock(aStudy)) break;
3160 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
3161 SALOME_ListIO selected;
3163 aSel->selectedObjects( selected );
3165 int nbSel = selected.Extent();
3168 Handle(SALOME_InteractiveObject) anIObject = selected.First();
3169 SMESH::SMESH_Hypothesis_var aHypothesis = SMESH::IObjectToInterface<SMESH::SMESH_Hypothesis>(anIObject);
3171 if ( !aHypothesis->_is_nil() )
3173 SMESHGUI_GenericHypothesisCreator* aCreator =
3174 SMESH::GetHypothesisCreator( SMESH::toQStr( aHypothesis->GetName() ));
3177 // set geometry of mesh and sub-mesh to aCreator
3178 aSel->selectedObjects( selected, "", /*convertReferences=*/false);
3179 if ( selected.Extent() == 1 )
3181 QString subGeomID, meshGeomID;
3182 Handle(SALOME_InteractiveObject) hypIO = selected.First();
3183 if ( SMESH::GetGeomEntries( hypIO, subGeomID, meshGeomID ))
3185 if ( subGeomID.isEmpty() ) subGeomID = meshGeomID;
3186 aCreator->setShapeEntry( subGeomID );
3187 aCreator->setMainShapeEntry( meshGeomID );
3191 aCreator->edit( aHypothesis.in(), anIObject->getName(), desktop(), this, SLOT( onHypothesisEdit( int ) ) );
3201 case SMESHOp::OpUnassign: // REMOVE HYPOTHESIS / ALGORITHMS
3203 if(checkLock(aStudy)) break;
3204 SUIT_OverrideCursor wc;
3206 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
3207 SALOME_ListIO selected;
3209 aSel->selectedObjects( selected, QString::null, false );
3211 SALOME_ListIteratorOfListIO It(selected);
3212 for (int i = 0; It.More(); It.Next(), i++) {
3213 Handle(SALOME_InteractiveObject) IObject = It.Value();
3214 SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
3217 aSel->setSelectedObjects( l1 );
3222 case SMESHOp::OpElem0D:
3223 case SMESHOp::OpBall:
3224 case SMESHOp::OpEdge:
3225 case SMESHOp::OpTriangle:
3226 case SMESHOp::OpQuadrangle:
3227 case SMESHOp::OpPolygon:
3228 case SMESHOp::OpTetrahedron:
3229 case SMESHOp::OpHexahedron:
3230 case SMESHOp::OpPentahedron:
3231 case SMESHOp::OpPyramid:
3232 case SMESHOp::OpHexagonalPrism:
3234 if(checkLock(aStudy)) break;
3236 EmitSignalDeactivateDialog();
3237 SMDSAbs_EntityType type = SMDSEntity_Edge;
3238 switch (theCommandID) {
3239 case SMESHOp::OpElem0D: type = SMDSEntity_0D; break;
3240 case SMESHOp::OpBall: type = SMDSEntity_Ball; break;
3241 case SMESHOp::OpTriangle: type = SMDSEntity_Triangle; break;
3242 case SMESHOp::OpQuadrangle: type = SMDSEntity_Quadrangle; break;
3243 case SMESHOp::OpTetrahedron: type = SMDSEntity_Tetra; break;
3244 case SMESHOp::OpPolygon: type = SMDSEntity_Polygon; break;
3245 case SMESHOp::OpHexahedron: type = SMDSEntity_Hexa; break;
3246 case SMESHOp::OpPentahedron: type = SMDSEntity_Penta; break;
3247 case SMESHOp::OpPyramid: type = SMDSEntity_Pyramid; break;
3248 case SMESHOp::OpHexagonalPrism: type = SMDSEntity_Hexagonal_Prism; break;
3251 ( new SMESHGUI_AddMeshElementDlg( this, type ) )->show();
3254 SUIT_MessageBox::warning(desktop(),
3255 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3259 case SMESHOp::OpPolyhedron:
3261 if(checkLock(aStudy)) break;
3263 EmitSignalDeactivateDialog();
3264 ( new SMESHGUI_CreatePolyhedralVolumeDlg( this ) )->show();
3267 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3268 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3272 case SMESHOp::OpQuadraticEdge:
3273 case SMESHOp::OpQuadraticTriangle:
3274 case SMESHOp::OpBiQuadraticTriangle:
3275 case SMESHOp::OpQuadraticQuadrangle:
3276 case SMESHOp::OpBiQuadraticQuadrangle:
3277 case SMESHOp::OpQuadraticPolygon:
3278 case SMESHOp::OpQuadraticTetrahedron:
3279 case SMESHOp::OpQuadraticPyramid:
3280 case SMESHOp::OpQuadraticPentahedron:
3281 case SMESHOp::OpQuadraticHexahedron:
3282 case SMESHOp::OpTriQuadraticHexahedron:
3284 if(checkLock(aStudy)) break;
3286 EmitSignalDeactivateDialog();
3287 SMDSAbs_EntityType type = SMDSEntity_Last;
3289 switch (theCommandID) {
3290 case SMESHOp::OpQuadraticEdge: type = SMDSEntity_Quad_Edge; break;
3291 case SMESHOp::OpQuadraticTriangle: type = SMDSEntity_Quad_Triangle; break;
3292 case SMESHOp::OpBiQuadraticTriangle: type = SMDSEntity_BiQuad_Triangle; break;
3293 case SMESHOp::OpQuadraticQuadrangle: type = SMDSEntity_Quad_Quadrangle; break;
3294 case SMESHOp::OpBiQuadraticQuadrangle: type = SMDSEntity_BiQuad_Quadrangle; break;
3295 case SMESHOp::OpQuadraticPolygon: type = SMDSEntity_Quad_Polygon; break;
3296 case SMESHOp::OpQuadraticTetrahedron: type = SMDSEntity_Quad_Tetra; break;
3297 case SMESHOp::OpQuadraticPyramid: type = SMDSEntity_Quad_Pyramid; break;
3298 case SMESHOp::OpQuadraticPentahedron: type = SMDSEntity_Quad_Penta; break;
3299 case SMESHOp::OpQuadraticHexahedron: type = SMDSEntity_Quad_Hexa; break;
3300 case SMESHOp::OpTriQuadraticHexahedron: type = SMDSEntity_TriQuad_Hexa; break;
3303 if ( type != SMDSEntity_Last )
3304 ( new SMESHGUI_AddQuadraticElementDlg( this, type ) )->show();
3307 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3308 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3312 case SMESHOp::OpRemoveNodes:
3314 if(checkLock(aStudy)) break;
3316 EmitSignalDeactivateDialog();
3317 ( new SMESHGUI_RemoveNodesDlg( this ) )->show();
3320 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3321 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3325 case SMESHOp::OpRemoveElements: // REMOVES ELEMENTS
3327 if(checkLock(aStudy)) break;
3329 EmitSignalDeactivateDialog();
3330 ( new SMESHGUI_RemoveElementsDlg( this ) )->show();
3334 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3335 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3339 case SMESHOp::OpClearMesh: {
3341 if(checkLock(aStudy)) break;
3343 SALOME_ListIO selected;
3344 if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
3345 aSel->selectedObjects( selected );
3347 SUIT_OverrideCursor wc;
3348 SALOME_ListIteratorOfListIO It (selected);
3349 for ( ; It.More(); It.Next() )
3351 Handle(SALOME_InteractiveObject) IOS = It.Value();
3352 SMESH::SMESH_Mesh_var aMesh =
3353 SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IOS);
3354 if ( aMesh->_is_nil()) continue;
3356 SMESH::RemoveVisualObjectWithActors(IOS->getEntry(), true);
3358 _PTR(SObject) aMeshSObj = SMESH::FindSObject(aMesh);
3359 SMESH::ModifiedMesh( aMeshSObj, false, true);
3360 // hide groups and submeshes
3361 _PTR(ChildIterator) anIter =
3362 SMESH::GetActiveStudyDocument()->NewChildIterator( aMeshSObj );
3363 for ( anIter->InitEx(true); anIter->More(); anIter->Next() )
3365 _PTR(SObject) so = anIter->Value();
3366 SMESH::RemoveVisualObjectWithActors(so->GetID().c_str(), true);
3369 catch (const SALOME::SALOME_Exception& S_ex){
3371 SalomeApp_Tools::QtCatchCorbaException(S_ex);
3375 SMESH::UpdateView();
3379 case SMESHOp::OpRemoveOrphanNodes:
3381 if(checkLock(aStudy)) break;
3382 SALOME_ListIO selected;
3383 if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
3384 aSel->selectedObjects( selected );
3385 if ( selected.Extent() == 1 ) {
3386 Handle(SALOME_InteractiveObject) anIO = selected.First();
3387 SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(anIO);
3388 if ( !aMesh->_is_nil() ) {
3389 bool confirm = SUIT_MessageBox::question( SMESHGUI::desktop(),
3390 tr( "SMESH_WARNING" ),
3391 tr( "REMOVE_ORPHAN_NODES_QUESTION"),
3392 SUIT_MessageBox::Yes |
3393 SUIT_MessageBox::No,
3394 SUIT_MessageBox::No ) == SUIT_MessageBox::Yes;
3397 SUIT_OverrideCursor wc;
3398 SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
3399 int removed = aMeshEditor->RemoveOrphanNodes();
3400 SUIT_MessageBox::information(SMESHGUI::desktop(),
3401 tr("SMESH_INFORMATION"),
3402 tr("NB_NODES_REMOVED").arg(removed));
3403 if ( removed > 0 ) {
3404 SMESH::UpdateView();
3405 SMESHGUI::Modified();
3408 catch (const SALOME::SALOME_Exception& S_ex) {
3409 SalomeApp_Tools::QtCatchCorbaException(S_ex);
3418 case SMESHOp::OpRenumberingNodes:
3420 if(checkLock(aStudy)) break;
3422 EmitSignalDeactivateDialog();
3423 ( new SMESHGUI_RenumberingDlg( this, 0 ) )->show();
3427 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3428 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3432 case SMESHOp::OpRenumberingElements:
3434 if(checkLock(aStudy)) break;
3436 EmitSignalDeactivateDialog();
3437 ( new SMESHGUI_RenumberingDlg( this, 1 ) )->show();
3441 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3442 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3446 case SMESHOp::OpTranslation:
3448 if(checkLock(aStudy)) break;
3450 EmitSignalDeactivateDialog();
3451 ( new SMESHGUI_TranslationDlg( this ) )->show();
3454 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3455 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3459 case SMESHOp::OpRotation:
3461 if(checkLock(aStudy)) break;
3463 EmitSignalDeactivateDialog();
3464 ( new SMESHGUI_RotationDlg( this ) )->show();
3467 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3468 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3472 case SMESHOp::OpSymmetry:
3474 if(checkLock(aStudy)) break;
3476 EmitSignalDeactivateDialog();
3477 ( new SMESHGUI_SymmetryDlg( this ) )->show();
3480 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3481 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3485 case SMESHOp::OpScale:
3487 if(checkLock(aStudy)) break;
3489 EmitSignalDeactivateDialog();
3490 ( new SMESHGUI_ScaleDlg( this ) )->show();
3493 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3494 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3499 case SMESHOp::OpSewing:
3501 if(checkLock(aStudy)) break;
3503 EmitSignalDeactivateDialog();
3504 ( new SMESHGUI_SewingDlg( this ) )->show();
3507 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3508 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3512 case SMESHOp::OpMergeNodes:
3514 if(checkLock(aStudy)) break;
3516 EmitSignalDeactivateDialog();
3517 ( new SMESHGUI_MergeDlg( this, 0 ) )->show();
3520 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3521 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3525 case SMESHOp::OpMergeElements:
3527 if (checkLock(aStudy)) break;
3529 EmitSignalDeactivateDialog();
3530 ( new SMESHGUI_MergeDlg( this, 1 ) )->show();
3532 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3533 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3538 case SMESHOp::OpMoveNode: // MAKE MESH PASS THROUGH POINT
3539 startOperation( SMESHOp::OpMoveNode );
3542 case SMESHOp::OpDuplicateNodes:
3544 if(checkLock(aStudy)) break;
3546 EmitSignalDeactivateDialog();
3547 ( new SMESHGUI_DuplicateNodesDlg( this ) )->show();
3550 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3551 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3556 case SMESHOp::OpElem0DOnElemNodes: // 0D_ON_ALL_NODES
3557 startOperation( SMESHOp::OpElem0DOnElemNodes );
3560 case SMESHOp::OpSelectFiltersLibrary: // Library of selection filters
3562 static QList<int> aTypes;
3563 if ( aTypes.isEmpty() )
3565 aTypes.append( SMESH::NODE );
3566 aTypes.append( SMESH::EDGE );
3567 aTypes.append( SMESH::FACE );
3568 aTypes.append( SMESH::VOLUME );
3570 if (!myFilterLibraryDlg)
3571 myFilterLibraryDlg = new SMESHGUI_FilterLibraryDlg( this, SMESH::GetDesktop( this ), aTypes, SMESHGUI_FilterLibraryDlg::EDIT );
3572 else if (myFilterLibraryDlg->isHidden())
3573 myFilterLibraryDlg->Init( aTypes, SMESHGUI_FilterLibraryDlg::EDIT );
3574 myFilterLibraryDlg->raise();
3578 case SMESHOp::OpFreeNode:
3579 case SMESHOp::OpEqualNode:
3580 case SMESHOp::OpFreeEdge:
3581 case SMESHOp::OpFreeBorder:
3582 case SMESHOp::OpLength:
3583 case SMESHOp::OpConnection:
3584 case SMESHOp::OpEqualEdge:
3585 case SMESHOp::OpFreeFace:
3586 case SMESHOp::OpBareBorderFace:
3587 case SMESHOp::OpOverConstrainedFace:
3588 case SMESHOp::OpLength2D:
3589 case SMESHOp::OpConnection2D:
3590 case SMESHOp::OpArea:
3591 case SMESHOp::OpTaper:
3592 case SMESHOp::OpAspectRatio:
3593 case SMESHOp::OpMinimumAngle:
3594 case SMESHOp::OpWarpingAngle:
3595 case SMESHOp::OpSkew:
3596 case SMESHOp::OpMaxElementLength2D:
3597 case SMESHOp::OpEqualFace:
3598 case SMESHOp::OpAspectRatio3D:
3599 case SMESHOp::OpVolume:
3600 case SMESHOp::OpMaxElementLength3D:
3601 case SMESHOp::OpBareBorderVolume:
3602 case SMESHOp::OpOverConstrainedVolume:
3603 case SMESHOp::OpEqualVolume:
3606 LightApp_SelectionMgr* mgr = selectionMgr();
3607 SALOME_ListIO selected; mgr->selectedObjects( selected );
3609 if( !selected.IsEmpty() ) {
3610 SUIT_OverrideCursor wc;
3611 ::Control( theCommandID );
3614 SUIT_MessageBox::warning(desktop(),
3615 tr( "SMESH_WRN_WARNING" ),
3616 tr( "SMESH_BAD_SELECTION" ) );
3620 SUIT_MessageBox::warning(desktop(),
3621 tr( "SMESH_WRN_WARNING" ),
3622 tr( "NOT_A_VTK_VIEWER" ) );
3625 case SMESHOp::OpOverallMeshQuality:
3626 OverallMeshQuality();
3628 case SMESHOp::OpNumberingNodes:
3630 SUIT_OverrideCursor wc;
3631 LightApp_SelectionMgr* mgr = selectionMgr();
3632 SALOME_ListIO selected; mgr->selectedObjects( selected );
3634 SALOME_ListIteratorOfListIO it(selected);
3635 for( ; it.More(); it.Next()) {
3636 Handle(SALOME_InteractiveObject) anIObject = it.Value();
3637 if(anIObject->hasEntry()) {
3638 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){
3639 anActor->SetPointsLabeled( !anActor->GetPointsLabeled() );
3645 case SMESHOp::OpNumberingElements:
3647 SUIT_OverrideCursor wc;
3648 LightApp_SelectionMgr* mgr = selectionMgr();
3649 SALOME_ListIO selected; mgr->selectedObjects( selected );
3651 SALOME_ListIteratorOfListIO it(selected);
3652 for( ; it.More(); it.Next()) {
3653 Handle(SALOME_InteractiveObject) anIObject = it.Value();
3654 if(anIObject->hasEntry())
3655 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){
3656 anActor->SetCellsLabeled( !anActor->GetCellsLabeled() );
3661 case SMESHOp::OpPropertiesLength:
3662 case SMESHOp::OpPropertiesArea:
3663 case SMESHOp::OpPropertiesVolume:
3664 case SMESHOp::OpMinimumDistance:
3665 case SMESHOp::OpBoundingBox:
3667 int page = SMESHGUI_MeasureDlg::MinDistance;
3668 if ( theCommandID == SMESHOp::OpBoundingBox )
3669 page = SMESHGUI_MeasureDlg::BoundingBox;
3670 else if ( theCommandID == SMESHOp::OpPropertiesLength )
3671 page = SMESHGUI_MeasureDlg::Length;
3672 else if ( theCommandID == SMESHOp::OpPropertiesArea )
3673 page = SMESHGUI_MeasureDlg::Area;
3674 else if ( theCommandID == SMESHOp::OpPropertiesVolume )
3675 page = SMESHGUI_MeasureDlg::Volume;
3677 EmitSignalDeactivateDialog();
3678 SMESHGUI_MeasureDlg* dlg = new SMESHGUI_MeasureDlg( SMESHGUI::desktop(), page );
3682 case SMESHOp::OpSortChild:
3688 anApp->updateActions(); //SRN: To update a Save button in the toolbar
3689 //updateObjBrowser();
3693 //=============================================================================
3697 //=============================================================================
3698 bool SMESHGUI::OnMousePress( QMouseEvent * pe, SUIT_ViewWindow * wnd )
3703 //=============================================================================
3707 //=============================================================================
3708 bool SMESHGUI::OnMouseMove( QMouseEvent * pe, SUIT_ViewWindow * wnd )
3713 //=============================================================================
3717 //=============================================================================
3718 bool SMESHGUI::OnKeyPress( QKeyEvent * pe, SUIT_ViewWindow * wnd )
3723 //=============================================================================
3724 /*! Method: BuildPresentation(const Handle(SALOME_InteractiveObject)& theIO)
3725 * Purpose: ensures that the actor for the given <theIO> exists in the active VTK view
3727 //=============================================================================
3728 void SMESHGUI::BuildPresentation( const Handle(SALOME_InteractiveObject) & theIO,
3729 SUIT_ViewWindow* wnd )
3731 if(theIO->hasEntry()){
3732 //SUIT_ViewWindow* wnd = SMESH::GetActiveWindow();
3733 SMESH::UpdateView(wnd,SMESH::eDisplay,theIO->getEntry());
3737 //=======================================================================
3738 // function : createSMESHAction
3740 //=======================================================================
3741 void SMESHGUI::createSMESHAction( const int id, const QString& po_id, const QString& icon_id,
3742 const int key, const bool toggle, const QString& shortcutAction )
3745 QWidget* parent = application()->desktop();
3746 SUIT_ResourceMgr* resMgr = resourceMgr();
3748 if ( !icon_id.isEmpty() )
3749 pix = resMgr->loadPixmap( "SMESH", tr( icon_id.toLatin1().data() ) );
3751 pix = resMgr->loadPixmap( "SMESH", tr( QString( "ICO_%1" ).arg( po_id ).toLatin1().data() ), false );
3752 if ( !pix.isNull() )
3753 icon = QIcon( pix );
3755 QString tooltip = tr( QString( "TOP_%1" ).arg( po_id ).toLatin1().data() ),
3756 menu = tr( QString( "MEN_%1" ).arg( po_id ).toLatin1().data() ),
3757 status_bar = tr( QString( "STB_%1" ).arg( po_id ).toLatin1().data() );
3759 createAction( id, tooltip, icon, menu, status_bar, key, parent,
3760 toggle, this, SLOT( OnGUIEvent() ), shortcutAction );
3763 //=======================================================================
3764 // function : createPopupItem
3766 //=======================================================================
3767 void SMESHGUI::createPopupItem( const int id,
3768 const QString& clients,
3769 const QString& types,
3770 const QString& theRule,
3773 if( !popupMgr()->contains( popupMgr()->actionId( action( id ) ) ) )
3774 popupMgr()->insert( action( id ), pId, 0 );
3776 QString lc = "$"; // VSR : instead of QtxPopupSelection::defEquality();
3777 QString dc = "selcount"; // VSR : insetad of QtxPopupSelection::defSelCountParam()
3778 QString rule = "(%1) and (%2) and (%3)";
3779 rule = rule.arg( QString( "%1>0" ).arg( dc ) );
3780 if( clients.isEmpty() )
3781 rule = rule.arg( QString( "true" ) );
3783 rule = rule.arg( QString( "%1client in {%2}" ).arg( lc ).arg( clients ) );
3784 rule = rule.arg( QString( "%1type in {%2}" ).arg( lc ).arg( types ) );
3787 bool cont = myRules.contains( id );
3789 rule = QString( "%1 or (%2)" ).arg( myRules[ id ] ).arg( rule );
3791 popupMgr()->setRule( action( id ), rule, QtxPopupMgr::VisibleRule );
3792 myRules[ id ] = QString( cont ? "%1" : "(%1)" ).arg( rule );
3795 //=======================================================================
3796 // function : initialize
3798 //=======================================================================
3799 void SMESHGUI::initialize( CAM_Application* app )
3801 SalomeApp_Module::initialize( app );
3803 // SUIT_ResourceMgr* mgr = app->resourceMgr();
3805 /* Automatic Update flag */
3806 // myAutomaticUpdate = mgr->booleanValue( "SMESH", "AutomaticUpdate", myAutomaticUpdate );
3808 // ----- create actions --------------
3810 //createSMESHAction( SMESHOp::OpImportDAT, "IMPORT_DAT", "", (Qt::CTRL+Qt::Key_B) );
3811 createSMESHAction( SMESHOp::OpImportUNV, "IMPORT_UNV", "", (Qt::CTRL+Qt::Key_I) );
3812 createSMESHAction( SMESHOp::OpImportMED, "IMPORT_MED", "", (Qt::CTRL+Qt::Key_M) );
3813 //createSMESHAction( 114, "NUM" );
3814 createSMESHAction( SMESHOp::OpImportSTL, "IMPORT_STL" );
3816 createSMESHAction( SMESHOp::OpImportCGNS, "IMPORT_CGNS" );
3818 createSMESHAction( SMESHOp::OpImportSAUV, "IMPORT_SAUV" );
3819 createSMESHAction( SMESHOp::OpImportGMF, "IMPORT_GMF" );
3820 createSMESHAction( SMESHOp::OpExportDAT, "DAT" );
3821 createSMESHAction( SMESHOp::OpExportMED, "MED" );
3822 createSMESHAction( SMESHOp::OpExportUNV, "UNV" );
3823 createSMESHAction( SMESHOp::OpExportSTL, "STL" );
3825 createSMESHAction( SMESHOp::OpExportCGNS, "CGNS");
3827 createSMESHAction( SMESHOp::OpExportSAUV, "SAUV");
3828 createSMESHAction( SMESHOp::OpExportGMF, "GMF" );
3829 createSMESHAction( SMESHOp::OpPopupExportDAT, "DAT" );
3830 createSMESHAction( SMESHOp::OpPopupExportMED, "MED" );
3831 createSMESHAction( SMESHOp::OpPopupExportUNV, "UNV" );
3832 createSMESHAction( SMESHOp::OpPopupExportSTL, "STL" );
3834 createSMESHAction( SMESHOp::OpPopupExportCGNS, "CGNS");
3836 createSMESHAction( SMESHOp::OpPopupExportSAUV, "SAUV");
3837 createSMESHAction( SMESHOp::OpPopupExportGMF, "GMF" );
3838 createSMESHAction( SMESHOp::OpFileInformation, "FILE_INFO" );
3839 createSMESHAction( SMESHOp::OpDelete, "DELETE", "ICON_DELETE", Qt::Key_Delete );
3840 createSMESHAction( SMESHOp::OpSelectFiltersLibrary, "SEL_FILTER_LIB" );
3841 createSMESHAction( SMESHOp::OpCreateMesh, "CREATE_MESH", "ICON_DLG_INIT_MESH" );
3842 createSMESHAction( SMESHOp::OpCreateSubMesh, "CREATE_SUBMESH", "ICON_DLG_ADD_SUBMESH" );
3843 createSMESHAction( SMESHOp::OpEditMeshOrSubMesh, "EDIT_MESHSUBMESH", "ICON_DLG_EDIT_MESH" );
3844 createSMESHAction( SMESHOp::OpBuildCompoundMesh, "BUILD_COMPOUND", "ICON_BUILD_COMPOUND" );
3845 createSMESHAction( SMESHOp::OpCopyMesh, "COPY_MESH", "ICON_COPY_MESH" );
3846 createSMESHAction( SMESHOp::OpCompute, "COMPUTE", "ICON_COMPUTE" );
3847 createSMESHAction( SMESHOp::OpPreCompute, "PRECOMPUTE", "ICON_PRECOMPUTE" );
3848 createSMESHAction( SMESHOp::OpEvaluate, "EVALUATE", "ICON_EVALUATE" );
3849 createSMESHAction( SMESHOp::OpMeshOrder, "MESH_ORDER", "ICON_MESH_ORDER");
3850 createSMESHAction( SMESHOp::OpCreateGroup, "CREATE_GROUP", "ICON_CREATE_GROUP" );
3851 createSMESHAction( SMESHOp::OpCreateGeometryGroup, "CREATE_GEO_GROUP", "ICON_CREATE_GEO_GROUP" );
3852 createSMESHAction( SMESHOp::OpConstructGroup, "CONSTRUCT_GROUP", "ICON_CONSTRUCT_GROUP" );
3853 createSMESHAction( SMESHOp::OpEditGroup, "EDIT_GROUP", "ICON_EDIT_GROUP" );
3854 createSMESHAction( SMESHOp::OpEditGeomGroupAsGroup, "EDIT_GEOMGROUP_AS_GROUP", "ICON_EDIT_GROUP" );
3855 createSMESHAction( SMESHOp::OpUnionGroups, "UN_GROUP", "ICON_UNION" );
3856 createSMESHAction( SMESHOp::OpIntersectGroups, "INT_GROUP", "ICON_INTERSECT" );
3857 createSMESHAction( SMESHOp::OpCutGroups, "CUT_GROUP", "ICON_CUT" );
3858 createSMESHAction( SMESHOp::OpGroupUnderlyingElem, "UNDERLYING_ELEMS", "ICON_UNDERLYING_ELEMS" );
3859 createSMESHAction( SMESHOp::OpAddElemGroupPopup, "ADD" );
3860 createSMESHAction( SMESHOp::OpRemoveElemGroupPopup, "REMOVE" );
3861 createSMESHAction( SMESHOp::OpDeleteGroup, "DEL_GROUP", "ICON_DEL_GROUP" );
3862 createSMESHAction( SMESHOp::OpMeshInformation , "ADV_INFO", "ICON_ADV_INFO" );
3863 //createSMESHAction( SMESHOp::OpStdInfo, "STD_INFO", "ICON_STD_INFO" );
3864 //createSMESHAction( SMESHOp::OpWhatIs, "WHAT_IS", "ICON_WHAT_IS" ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
3865 createSMESHAction( SMESHOp::OpFindElementByPoint, "FIND_ELEM", "ICON_FIND_ELEM" );
3867 createSMESHAction( SMESHOp::OpFreeNode, "FREE_NODE", "ICON_FREE_NODE", 0, true );
3868 createSMESHAction( SMESHOp::OpEqualNode, "EQUAL_NODE", "ICON_EQUAL_NODE", 0, true );
3869 createSMESHAction( SMESHOp::OpFreeEdge, "FREE_EDGE", "ICON_FREE_EDGE", 0, true );
3870 createSMESHAction( SMESHOp::OpFreeBorder, "FREE_BORDER", "ICON_FREE_EDGE_2D", 0, true );
3871 createSMESHAction( SMESHOp::OpLength, "LENGTH", "ICON_LENGTH", 0, true );
3872 createSMESHAction( SMESHOp::OpConnection, "CONNECTION", "ICON_CONNECTION", 0, true );
3873 createSMESHAction( SMESHOp::OpEqualEdge, "EQUAL_EDGE", "ICON_EQUAL_EDGE", 0, true );
3874 createSMESHAction( SMESHOp::OpFreeFace, "FREE_FACES", "ICON_FREE_FACES", 0, true );
3875 createSMESHAction( SMESHOp::OpBareBorderFace, "BARE_BORDER_FACE", "ICON_BARE_BORDER_FACE", 0, true );
3876 createSMESHAction( SMESHOp::OpOverConstrainedFace, "OVER_CONSTRAINED_FACE", "ICON_OVER_CONSTRAINED_FACE", 0, true );
3877 createSMESHAction( SMESHOp::OpLength2D, "LENGTH_2D", "ICON_LENGTH_2D", 0, true );
3878 createSMESHAction( SMESHOp::OpConnection2D, "CONNECTION_2D", "ICON_CONNECTION_2D", 0, true );
3879 createSMESHAction( SMESHOp::OpArea, "AREA", "ICON_AREA", 0, true );
3880 createSMESHAction( SMESHOp::OpTaper, "TAPER", "ICON_TAPER", 0, true );
3881 createSMESHAction( SMESHOp::OpAspectRatio, "ASPECT", "ICON_ASPECT", 0, true );
3882 createSMESHAction( SMESHOp::OpMinimumAngle, "MIN_ANG", "ICON_ANGLE", 0, true );
3883 createSMESHAction( SMESHOp::OpWarpingAngle, "WARP", "ICON_WARP", 0, true );
3884 createSMESHAction( SMESHOp::OpSkew, "SKEW", "ICON_SKEW", 0, true );
3885 createSMESHAction( SMESHOp::OpMaxElementLength2D, "MAX_ELEMENT_LENGTH_2D", "ICON_MAX_ELEMENT_LENGTH_2D", 0, true );
3886 createSMESHAction( SMESHOp::OpEqualFace, "EQUAL_FACE", "ICON_EQUAL_FACE", 0, true );
3887 createSMESHAction( SMESHOp::OpAspectRatio3D, "ASPECT_3D", "ICON_ASPECT_3D", 0, true );
3888 createSMESHAction( SMESHOp::OpVolume, "VOLUME_3D", "ICON_VOLUME_3D", 0, true );
3889 createSMESHAction( SMESHOp::OpMaxElementLength3D, "MAX_ELEMENT_LENGTH_3D", "ICON_MAX_ELEMENT_LENGTH_3D", 0, true );
3890 createSMESHAction( SMESHOp::OpBareBorderVolume, "BARE_BORDER_VOLUME", "ICON_BARE_BORDER_VOLUME", 0, true );
3891 createSMESHAction( SMESHOp::OpOverConstrainedVolume, "OVER_CONSTRAINED_VOLUME", "ICON_OVER_CONSTRAINED_VOLUME", 0, true );
3892 createSMESHAction( SMESHOp::OpEqualVolume, "EQUAL_VOLUME", "ICON_EQUAL_VOLUME", 0, true );
3893 createSMESHAction( SMESHOp::OpOverallMeshQuality, "OVERALL_MESH_QUALITY" );
3895 createSMESHAction( SMESHOp::OpNode, "NODE", "ICON_DLG_NODE" );
3896 createSMESHAction( SMESHOp::OpElem0D, "ELEM0D", "ICON_DLG_ELEM0D" );
3897 createSMESHAction( SMESHOp::OpElem0DOnElemNodes, "0D_ON_ALL_NODES", "ICON_0D_ON_ALL_NODES" );
3898 createSMESHAction( SMESHOp::OpBall, "BALL", "ICON_DLG_BALL" );
3899 createSMESHAction( SMESHOp::OpEdge, "EDGE", "ICON_DLG_EDGE" );
3900 createSMESHAction( SMESHOp::OpTriangle, "TRIANGLE", "ICON_DLG_TRIANGLE" );
3901 createSMESHAction( SMESHOp::OpQuadrangle, "QUAD", "ICON_DLG_QUADRANGLE" );
3902 createSMESHAction( SMESHOp::OpPolygon, "POLYGON", "ICON_DLG_POLYGON" );
3903 createSMESHAction( SMESHOp::OpTetrahedron, "TETRA", "ICON_DLG_TETRAS" );
3904 createSMESHAction( SMESHOp::OpHexahedron, "HEXA", "ICON_DLG_HEXAS" );
3905 createSMESHAction( SMESHOp::OpPentahedron, "PENTA", "ICON_DLG_PENTA" );
3906 createSMESHAction( SMESHOp::OpPyramid , "PYRAMID", "ICON_DLG_PYRAMID" );
3907 createSMESHAction( SMESHOp::OpHexagonalPrism, "OCTA", "ICON_DLG_OCTA" );
3908 createSMESHAction( SMESHOp::OpPolyhedron, "POLYHEDRON", "ICON_DLG_POLYHEDRON" );
3909 createSMESHAction( SMESHOp::OpQuadraticEdge, "QUADRATIC_EDGE", "ICON_DLG_QUADRATIC_EDGE" );
3910 createSMESHAction( SMESHOp::OpQuadraticTriangle, "QUADRATIC_TRIANGLE", "ICON_DLG_QUADRATIC_TRIANGLE" );
3911 createSMESHAction( SMESHOp::OpBiQuadraticTriangle, "BIQUADRATIC_TRIANGLE", "ICON_DLG_BIQUADRATIC_TRIANGLE" );
3912 createSMESHAction( SMESHOp::OpQuadraticQuadrangle, "QUADRATIC_QUADRANGLE", "ICON_DLG_QUADRATIC_QUADRANGLE" );
3913 createSMESHAction( SMESHOp::OpBiQuadraticQuadrangle, "BIQUADRATIC_QUADRANGLE", "ICON_DLG_BIQUADRATIC_QUADRANGLE" );
3914 createSMESHAction( SMESHOp::OpQuadraticPolygon, "QUADRATIC_POLYGON", "ICON_DLG_QUADRATIC_POLYGON" );
3915 createSMESHAction( SMESHOp::OpQuadraticTetrahedron, "QUADRATIC_TETRAHEDRON", "ICON_DLG_QUADRATIC_TETRAHEDRON" );
3916 createSMESHAction( SMESHOp::OpQuadraticPyramid, "QUADRATIC_PYRAMID", "ICON_DLG_QUADRATIC_PYRAMID" );
3917 createSMESHAction( SMESHOp::OpQuadraticPentahedron, "QUADRATIC_PENTAHEDRON", "ICON_DLG_QUADRATIC_PENTAHEDRON" );
3918 createSMESHAction( SMESHOp::OpQuadraticHexahedron, "QUADRATIC_HEXAHEDRON", "ICON_DLG_QUADRATIC_HEXAHEDRON" );
3919 createSMESHAction( SMESHOp::OpTriQuadraticHexahedron, "TRIQUADRATIC_HEXAHEDRON", "ICON_DLG_TRIQUADRATIC_HEXAHEDRON" );
3921 createSMESHAction( SMESHOp::OpRemoveNodes, "REMOVE_NODES", "ICON_DLG_REM_NODE" );
3922 createSMESHAction( SMESHOp::OpRemoveElements, "REMOVE_ELEMENTS", "ICON_DLG_REM_ELEMENT" );
3923 createSMESHAction( SMESHOp::OpRemoveOrphanNodes, "REMOVE_ORPHAN_NODES", "ICON_DLG_REM_ORPHAN_NODES" );
3924 createSMESHAction( SMESHOp::OpClearMesh, "CLEAR_MESH", "ICON_CLEAR_MESH" );
3926 //createSMESHAction( SMESHOp::OpRenumberingNodes, "RENUM_NODES", "ICON_DLG_RENUMBERING_NODES" );
3927 //createSMESHAction( SMESHOp::OpRenumberingElements, "RENUM_ELEMENTS", "ICON_DLG_RENUMBERING_ELEMENTS" );
3929 createSMESHAction( SMESHOp::OpTranslation, "TRANS", "ICON_SMESH_TRANSLATION_VECTOR" );
3930 createSMESHAction( SMESHOp::OpRotation, "ROT", "ICON_DLG_MESH_ROTATION" );
3931 createSMESHAction( SMESHOp::OpSymmetry, "SYM", "ICON_SMESH_SYMMETRY_PLANE" );
3932 createSMESHAction( SMESHOp::OpScale, "SCALE", "ICON_DLG_MESH_SCALE" );
3933 createSMESHAction( SMESHOp::OpSewing, "SEW", "ICON_SMESH_SEWING_FREEBORDERS" );
3934 createSMESHAction( SMESHOp::OpMergeNodes, "MERGE", "ICON_SMESH_MERGE_NODES" );
3935 createSMESHAction( SMESHOp::OpMergeElements, "MERGE_ELEMENTS", "ICON_DLG_MERGE_ELEMENTS" );
3936 createSMESHAction( SMESHOp::OpMoveNode, "MESH_THROU_POINT","ICON_DLG_MOVE_NODE" );
3937 createSMESHAction( SMESHOp::OpDuplicateNodes, "DUPLICATE_NODES", "ICON_SMESH_DUPLICATE_NODES" );
3938 createSMESHAction( SMESHOp::OpDiagonalInversion, "INV", "ICON_DLG_MESH_DIAGONAL" );
3939 createSMESHAction( SMESHOp::OpUnionOfTwoTriangle, "UNION2", "ICON_UNION2TRI" );
3940 createSMESHAction( SMESHOp::OpOrientation, "ORIENT", "ICON_DLG_MESH_ORIENTATION" );
3941 createSMESHAction( SMESHOp::OpReorientFaces, "REORIENT_2D", "ICON_REORIENT_2D" );
3942 createSMESHAction( SMESHOp::OpUnionOfTriangles, "UNION", "ICON_UNIONTRI" );
3943 createSMESHAction( SMESHOp::OpCuttingOfQuadrangles, "CUT", "ICON_CUTQUAD" );
3944 createSMESHAction( SMESHOp::OpSplitVolumes, "SPLIT_TO_TETRA", "ICON_SPLIT_TO_TETRA" );
3945 createSMESHAction( SMESHOp::OpSmoothing, "SMOOTH", "ICON_DLG_SMOOTHING" );
3946 createSMESHAction( SMESHOp::OpExtrusion, "EXTRUSION", "ICON_EXTRUSION" );
3947 createSMESHAction( SMESHOp::OpExtrusionAlongAPath, "EXTRUSION_ALONG", "ICON_EXTRUSION_ALONG" );
3948 createSMESHAction( SMESHOp::OpRevolution, "REVOLUTION", "ICON_REVOLUTION" );
3949 createSMESHAction( SMESHOp::OpPatternMapping, "MAP", "ICON_MAP" );
3950 createSMESHAction( SMESHOp::OpConvertMeshToQuadratic, "CONV_TO_QUAD", "ICON_CONV_TO_QUAD" );
3951 createSMESHAction( SMESHOp::OpCreateBoundaryElements, "2D_FROM_3D", "ICON_2D_FROM_3D" );
3953 createSMESHAction( SMESHOp::OpReset, "RESET" );
3954 createSMESHAction( SMESHOp::OpScalarBarProperties, "SCALAR_BAR_PROP" );
3955 createSMESHAction( SMESHOp::OpShowScalarBar, "SHOW_SCALAR_BAR","",0, true );
3956 createSMESHAction( SMESHOp::OpSaveDistribution, "SAVE_DISTRIBUTION" );
3957 createSMESHAction( SMESHOp::OpShowDistribution, "SHOW_DISTRIBUTION","",0, true );
3958 #ifndef DISABLE_PLOT2DVIEWER
3959 createSMESHAction( SMESHOp::OpPlotDistribution, "PLOT_DISTRIBUTION" );
3961 createSMESHAction( SMESHOp::OpDMWireframe, "WIRE", "ICON_WIRE", 0, true );
3962 createSMESHAction( SMESHOp::OpDMShading, "SHADE", "ICON_SHADE", 0, true );
3963 createSMESHAction( SMESHOp::OpDMNodes, "NODES", "ICON_POINTS", 0, true );
3964 createSMESHAction( SMESHOp::OpDMShrink, "SHRINK", "ICON_SHRINK", 0, true );
3965 createSMESHAction( SMESHOp::OpUpdate, "UPDATE", "ICON_UPDATE" );
3966 createSMESHAction( SMESHOp::OpDE0DElements, "ELEMS0D", "ICON_DLG_ELEM0D", 0, true );
3967 createSMESHAction( SMESHOp::OpDEEdges, "EDGES", "ICON_DLG_EDGE", 0, true );
3968 createSMESHAction( SMESHOp::OpDEFaces, "FACES", "ICON_DLG_TRIANGLE", 0, true );
3969 createSMESHAction( SMESHOp::OpDEVolumes, "VOLUMES", "ICON_DLG_TETRAS", 0, true );
3970 createSMESHAction( SMESHOp::OpDEBalls, "BALLS", "ICON_DLG_BALL", 0, true );
3971 createSMESHAction( SMESHOp::OpDEChoose, "CHOOSE", "ICON_DLG_CHOOSE", 0, false );
3972 createSMESHAction( SMESHOp::OpDEAllEntity, "ALL", "ICON_DLG_CHOOSE_ALL", 0, false );
3973 createSMESHAction( SMESHOp::OpOrientationOnFaces, "FACE_ORIENTATION", "", 0, true );
3975 createSMESHAction( SMESHOp::OpRepresentationLines, "LINE_REPRESENTATION", "", 0, true );
3976 createSMESHAction( SMESHOp::OpRepresentationArcs, "ARC_REPRESENTATION", "", 0, true );
3978 createSMESHAction( SMESHOp::OpEditHypothesis, "EDIT_HYPO" );
3979 createSMESHAction( SMESHOp::OpUnassign, "UNASSIGN" );
3980 createSMESHAction( SMESHOp::OpNumberingNodes, "NUM_NODES", "", 0, true );
3981 createSMESHAction( SMESHOp::OpNumberingElements, "NUM_ELEMENTS", "", 0, true );
3982 createSMESHAction( SMESHOp::OpProperties, "COLORS" );
3983 createSMESHAction( SMESHOp::OpTransparency, "TRANSP" );
3984 createSMESHAction( SMESHOp::OpClipping, "CLIP" );
3985 createSMESHAction( SMESHOp::OpAutoColor, "AUTO_COLOR" );
3986 createSMESHAction( SMESHOp::OpDisableAutoColor, "DISABLE_AUTO_COLOR" );
3988 createSMESHAction( SMESHOp::OpMinimumDistance, "MEASURE_MIN_DIST", "ICON_MEASURE_MIN_DIST" );
3989 createSMESHAction( SMESHOp::OpBoundingBox, "MEASURE_BND_BOX", "ICON_MEASURE_BND_BOX" );
3990 createSMESHAction( SMESHOp::OpPropertiesLength, "MEASURE_LENGTH", "ICON_MEASURE_LENGTH" );
3991 createSMESHAction( SMESHOp::OpPropertiesArea, "MEASURE_AREA", "ICON_MEASURE_AREA" );
3992 createSMESHAction( SMESHOp::OpPropertiesVolume, "MEASURE_VOLUME", "ICON_MEASURE_VOLUME" );
3994 createSMESHAction( SMESHOp::OpHide, "HIDE" );
3995 createSMESHAction( SMESHOp::OpShow, "SHOW" );
3996 createSMESHAction( SMESHOp::OpShowOnly, "DISPLAY_ONLY" );
3998 createSMESHAction( SMESHOp::OpSortChild, "SORT_CHILD_ITEMS" );
4000 QList<int> aCtrlActions;
4001 aCtrlActions << SMESHOp::OpFreeNode << SMESHOp::OpEqualNode // node controls
4002 << SMESHOp::OpFreeEdge << SMESHOp::OpFreeBorder
4003 << SMESHOp::OpLength << SMESHOp::OpConnection << SMESHOp::OpEqualEdge // edge controls
4004 << SMESHOp::OpFreeFace << SMESHOp::OpLength2D << SMESHOp::OpConnection2D
4005 << SMESHOp::OpArea << SMESHOp::OpTaper << SMESHOp::OpAspectRatio
4006 << SMESHOp::OpMinimumAngle << SMESHOp::OpWarpingAngle << SMESHOp::OpSkew
4007 << SMESHOp::OpMaxElementLength2D << SMESHOp::OpBareBorderFace
4008 << SMESHOp::OpOverConstrainedFace << SMESHOp::OpEqualFace // face controls
4009 << SMESHOp::OpAspectRatio3D << SMESHOp::OpVolume
4010 << SMESHOp::OpMaxElementLength3D << SMESHOp::OpBareBorderVolume
4011 << SMESHOp::OpOverConstrainedVolume << SMESHOp::OpEqualVolume; // volume controls
4012 QActionGroup* aCtrlGroup = new QActionGroup( application()->desktop() );
4013 aCtrlGroup->setExclusive( true );
4014 for( int i = 0; i < aCtrlActions.size(); i++ )
4015 aCtrlGroup->addAction( action( aCtrlActions[i] ) );
4017 // ----- create menu --------------
4018 int fileId = createMenu( tr( "MEN_FILE" ), -1, 1 ),
4019 editId = createMenu( tr( "MEN_EDIT" ), -1, 3 ),
4020 toolsId = createMenu( tr( "MEN_TOOLS" ), -1, 5, 50 ),
4021 meshId = createMenu( tr( "MEN_MESH" ), -1, 70, 10 ),
4022 ctrlId = createMenu( tr( "MEN_CTRL" ), -1, 60, 10 ),
4023 modifyId = createMenu( tr( "MEN_MODIFY" ), -1, 40, 10 ),
4024 measureId = createMenu( tr( "MEN_MEASURE" ), -1, 50, 10 ),
4025 viewId = createMenu( tr( "MEN_VIEW" ), -1, 2 );
4027 createMenu( separator(), fileId );
4029 int importId = createMenu( tr( "MEN_IMPORT" ), fileId, -1, 10 ),
4030 exportId = createMenu( tr( "MEN_EXPORT" ), fileId, -1, 10 ),
4031 nodeId = createMenu( tr( "MEN_NODE_CTRL" ), ctrlId, -1, 10 ),
4032 edgeId = createMenu( tr( "MEN_EDGE_CTRL" ), ctrlId, -1, 10 ),
4033 faceId = createMenu( tr( "MEN_FACE_CTRL" ), ctrlId, -1, 10 ),
4034 volumeId = createMenu( tr( "MEN_VOLUME_CTRL" ), ctrlId, -1, 10 ),
4035 addId = createMenu( tr( "MEN_ADD" ), modifyId, 402 ),
4036 removeId = createMenu( tr( "MEN_REMOVE" ), modifyId, 403 ),
4037 //renumId = createMenu( tr( "MEN_RENUM" ), modifyId, 404 ),
4038 transfId = createMenu( tr( "MEN_TRANSF" ), modifyId, 405 ),
4039 basicPropId = createMenu( tr( "MEN_BASIC_PROPERTIES" ), measureId, -1, 10 );
4041 //createMenu( SMESHOp::OpImportDAT, importId, -1 );
4042 createMenu( SMESHOp::OpImportUNV, importId, -1 );
4043 createMenu( SMESHOp::OpImportMED, importId, -1 );
4044 createMenu( SMESHOp::OpImportSTL, importId, -1 );
4046 createMenu( SMESHOp::OpImportCGNS, importId, -1 );
4048 createMenu( SMESHOp::OpImportSAUV, importId, -1 );
4049 createMenu( SMESHOp::OpImportGMF, importId, -1 );
4050 createMenu( SMESHOp::OpExportDAT, exportId, -1 );
4051 createMenu( SMESHOp::OpExportMED, exportId, -1 );
4052 createMenu( SMESHOp::OpExportUNV, exportId, -1 );
4053 createMenu( SMESHOp::OpExportSTL, exportId, -1 );
4055 createMenu( SMESHOp::OpExportCGNS, exportId, -1 );
4057 createMenu( SMESHOp::OpExportSAUV, exportId, -1 );
4058 createMenu( SMESHOp::OpExportGMF, exportId, -1 );
4059 createMenu( separator(), fileId, 10 );
4061 createMenu( SMESHOp::OpDelete, editId, -1 );
4063 createMenu( SMESHOp::OpSelectFiltersLibrary, toolsId, -1 );
4065 createMenu( SMESHOp::OpCreateMesh, meshId, -1 ); // "Mesh" menu
4066 createMenu( SMESHOp::OpCreateSubMesh, meshId, -1 );
4067 createMenu( SMESHOp::OpEditMeshOrSubMesh, meshId, -1 );
4068 createMenu( SMESHOp::OpBuildCompoundMesh, meshId, -1 );
4069 createMenu( SMESHOp::OpCopyMesh, meshId, -1 );
4070 createMenu( separator(), meshId, -1 );
4071 createMenu( SMESHOp::OpCompute, meshId, -1 );
4072 createMenu( SMESHOp::OpPreCompute, meshId, -1 );
4073 createMenu( SMESHOp::OpEvaluate, meshId, -1 );
4074 createMenu( SMESHOp::OpMeshOrder, meshId, -1 );
4075 createMenu( separator(), meshId, -1 );
4076 createMenu( SMESHOp::OpCreateGroup, meshId, -1 );
4077 createMenu( SMESHOp::OpCreateGeometryGroup, meshId, -1 );
4078 createMenu( SMESHOp::OpConstructGroup, meshId, -1 );
4079 createMenu( SMESHOp::OpEditGroup, meshId, -1 );
4080 createMenu( SMESHOp::OpEditGeomGroupAsGroup, meshId, -1 );
4081 createMenu( separator(), meshId, -1 );
4082 createMenu( SMESHOp::OpUnionGroups, meshId, -1 );
4083 createMenu( SMESHOp::OpIntersectGroups, meshId, -1 );
4084 createMenu( SMESHOp::OpCutGroups, meshId, -1 );
4085 createMenu( separator(), meshId, -1 );
4086 createMenu( SMESHOp::OpGroupUnderlyingElem, meshId, -1 );
4087 createMenu( separator(), meshId, -1 );
4088 createMenu( SMESHOp::OpMeshInformation, meshId, -1 );
4089 //createMenu( SMESHOp::OpStdInfo, meshId, -1 );
4090 //createMenu( SMESHOp::OpWhatIs, meshId, -1 ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
4091 createMenu( SMESHOp::OpFindElementByPoint, meshId, -1 );
4092 createMenu( separator(), meshId, -1 );
4094 createMenu( SMESHOp::OpFreeNode, nodeId, -1 );
4095 createMenu( SMESHOp::OpEqualNode, nodeId, -1 );
4096 createMenu( SMESHOp::OpFreeEdge, edgeId, -1 );
4097 createMenu( SMESHOp::OpFreeBorder, edgeId, -1 );
4098 createMenu( SMESHOp::OpLength, edgeId, -1 );
4099 createMenu( SMESHOp::OpConnection, edgeId, -1 );
4100 createMenu( SMESHOp::OpEqualEdge, edgeId, -1 );
4101 createMenu( SMESHOp::OpFreeFace, faceId, -1 );
4102 createMenu( SMESHOp::OpBareBorderFace, faceId, -1 );
4103 createMenu( SMESHOp::OpOverConstrainedFace, faceId, -1 );
4104 createMenu( SMESHOp::OpLength2D, faceId, -1 );
4105 createMenu( SMESHOp::OpConnection2D, faceId, -1 );
4106 createMenu( SMESHOp::OpArea, faceId, -1 );
4107 createMenu( SMESHOp::OpTaper, faceId, -1 );
4108 createMenu( SMESHOp::OpAspectRatio, faceId, -1 );
4109 createMenu( SMESHOp::OpMinimumAngle, faceId, -1 );
4110 createMenu( SMESHOp::OpWarpingAngle, faceId, -1 );
4111 createMenu( SMESHOp::OpSkew, faceId, -1 );
4112 createMenu( SMESHOp::OpMaxElementLength2D, faceId, -1 );
4113 createMenu( SMESHOp::OpEqualFace, faceId, -1 );
4114 createMenu( SMESHOp::OpAspectRatio3D, volumeId, -1 );
4115 createMenu( SMESHOp::OpVolume, volumeId, -1 );
4116 createMenu( SMESHOp::OpMaxElementLength3D, volumeId, -1 );
4117 createMenu( SMESHOp::OpBareBorderVolume, volumeId, -1 );
4118 createMenu( SMESHOp::OpOverConstrainedVolume, volumeId, -1 );
4119 createMenu( SMESHOp::OpEqualVolume, volumeId, -1 );
4120 createMenu( separator(), ctrlId, -1 );
4121 createMenu( SMESHOp::OpReset, ctrlId, -1 );
4122 createMenu( separator(), ctrlId, -1 );
4123 createMenu( SMESHOp::OpOverallMeshQuality, ctrlId, -1 );
4125 createMenu( SMESHOp::OpNode, addId, -1 );
4126 createMenu( SMESHOp::OpElem0D, addId, -1 );
4127 createMenu( SMESHOp::OpElem0DOnElemNodes, addId, -1 );
4128 createMenu( SMESHOp::OpBall, addId, -1 );
4129 createMenu( SMESHOp::OpEdge, addId, -1 );
4130 createMenu( SMESHOp::OpTriangle, addId, -1 );
4131 createMenu( SMESHOp::OpQuadrangle, addId, -1 );
4132 createMenu( SMESHOp::OpPolygon, addId, -1 );
4133 createMenu( SMESHOp::OpTetrahedron, addId, -1 );
4134 createMenu( SMESHOp::OpHexahedron, addId, -1 );
4135 createMenu( SMESHOp::OpPentahedron, addId, -1 );
4136 createMenu( SMESHOp::OpPyramid, addId, -1 );
4137 createMenu( SMESHOp::OpHexagonalPrism, addId, -1 );
4138 createMenu( SMESHOp::OpPolyhedron, addId, -1 );
4139 createMenu( separator(), addId, -1 );
4140 createMenu( SMESHOp::OpQuadraticEdge, addId, -1 );
4141 createMenu( SMESHOp::OpQuadraticTriangle, addId, -1 );
4142 createMenu( SMESHOp::OpBiQuadraticTriangle , addId, -1 );
4143 createMenu( SMESHOp::OpQuadraticQuadrangle, addId, -1 );
4144 createMenu( SMESHOp::OpBiQuadraticQuadrangle, addId, -1 );
4145 createMenu( SMESHOp::OpQuadraticPolygon, addId, -1 );
4146 createMenu( SMESHOp::OpQuadraticTetrahedron, addId, -1 );
4147 createMenu( SMESHOp::OpQuadraticPyramid, addId, -1 );
4148 createMenu( SMESHOp::OpQuadraticPentahedron, addId, -1 );
4149 createMenu( SMESHOp::OpQuadraticHexahedron, addId, -1 );
4150 createMenu( SMESHOp::OpTriQuadraticHexahedron, addId, -1 );
4152 createMenu( SMESHOp::OpRemoveNodes, removeId, -1 );
4153 createMenu( SMESHOp::OpRemoveElements, removeId, -1 );
4154 createMenu( SMESHOp::OpRemoveOrphanNodes, removeId, -1 );
4155 createMenu( separator(), removeId, -1 );
4156 createMenu( SMESHOp::OpDeleteGroup, removeId, -1 );
4157 createMenu( separator(), removeId, -1 );
4158 createMenu( SMESHOp::OpClearMesh, removeId, -1 );
4160 //createMenu( SMESHOp::OpRenumberingNodes, renumId, -1 );
4161 //createMenu( SMESHOp::OpRenumberingElements, renumId, -1 );
4163 createMenu( SMESHOp::OpTranslation, transfId, -1 );
4164 createMenu( SMESHOp::OpRotation, transfId, -1 );
4165 createMenu( SMESHOp::OpSymmetry, transfId, -1 );
4166 createMenu( SMESHOp::OpScale, transfId, -1 );
4167 createMenu( SMESHOp::OpSewing, transfId, -1 );
4168 createMenu( SMESHOp::OpMergeNodes, transfId, -1 );
4169 createMenu( SMESHOp::OpMergeElements, transfId, -1 );
4170 createMenu( SMESHOp::OpDuplicateNodes, transfId, -1 );
4172 createMenu( SMESHOp::OpMoveNode, modifyId, -1 );
4173 createMenu( SMESHOp::OpDiagonalInversion, modifyId, -1 );
4174 createMenu( SMESHOp::OpUnionOfTwoTriangle, modifyId, -1 );
4175 createMenu( SMESHOp::OpOrientation, modifyId, -1 );
4176 createMenu( SMESHOp::OpReorientFaces, modifyId, -1 );
4177 createMenu( SMESHOp::OpUnionOfTriangles, modifyId, -1 );
4178 createMenu( SMESHOp::OpCuttingOfQuadrangles, modifyId, -1 );
4179 createMenu( SMESHOp::OpSplitVolumes, modifyId, -1 );
4180 createMenu( SMESHOp::OpSmoothing, modifyId, -1 );
4181 createMenu( SMESHOp::OpExtrusion, modifyId, -1 );
4182 createMenu( SMESHOp::OpExtrusionAlongAPath , modifyId, -1 );
4183 createMenu( SMESHOp::OpRevolution, modifyId, -1 );
4184 createMenu( SMESHOp::OpPatternMapping, modifyId, -1 );
4185 createMenu( SMESHOp::OpConvertMeshToQuadratic, modifyId, -1 );
4186 createMenu( SMESHOp::OpCreateBoundaryElements, modifyId, -1 );
4188 createMenu( SMESHOp::OpMinimumDistance, measureId, -1 );
4189 createMenu( SMESHOp::OpBoundingBox, measureId, -1 );
4190 createMenu( SMESHOp::OpPropertiesLength, basicPropId, -1 );
4191 createMenu( SMESHOp::OpPropertiesArea, basicPropId, -1 );
4192 createMenu( SMESHOp::OpPropertiesVolume, basicPropId, -1 );
4193 createMenu( SMESHOp::OpUpdate, viewId, -1 );
4195 // ----- create toolbars --------------
4196 int meshTb = createTool( tr( "TB_MESH" ), QString( "SMESHMeshToolbar" ) ),
4197 info = createTool( tr( "TB_INFO" ), QString( "SMESHInformationToolbar" ) ),
4198 groupTb = createTool( tr( "TB_GROUP" ), QString( "SMESHGroupToolbar" ) ),
4199 ctrl0dTb = createTool( tr( "TB_CTRL0D" ), QString( "SMESHNodeControlsToolbar" ) ),
4200 ctrl1dTb = createTool( tr( "TB_CTRL1D" ), QString( "SMESHEdgeControlsToolbar" ) ),
4201 ctrl2dTb = createTool( tr( "TB_CTRL2D" ), QString( "SMESHFaceControlsToolbar" ) ),
4202 ctrl3dTb = createTool( tr( "TB_CTRL3D" ), QString( "SMESHVolumeControlsToolbar" ) ),
4203 addElemTb = createTool( tr( "TB_ADD" ), QString( "SMESHAddElementToolbar" ) ),
4204 addNonElemTb = createTool( tr( "TB_ADDNON" ), QString( "SMESHAddElementToolbar" ) ),
4205 remTb = createTool( tr( "TB_REM" ), QString( "SMESHRemoveToolbar" ) ),
4206 //renumbTb = createTool( tr( "TB_RENUMBER" ), QString( "SMESHRenumberingToolbar" ) ),
4207 transformTb = createTool( tr( "TB_TRANSFORM" ), QString( "SMESHTransformationToolbar" ) ),
4208 modifyTb = createTool( tr( "TB_MODIFY" ), QString( "SMESHModificationToolbar" ) ),
4209 measuremTb = createTool( tr( "TB_MEASUREM" ), QString( "SMESHMeasurementsToolbar" ) ),
4210 dispModeTb = createTool( tr( "TB_DISP_MODE" ), QString( "SMESHDisplayModeToolbar" ) );
4212 createTool( SMESHOp::OpCreateMesh, meshTb );
4213 createTool( SMESHOp::OpCreateSubMesh, meshTb );
4214 createTool( SMESHOp::OpEditMeshOrSubMesh, meshTb );
4215 createTool( SMESHOp::OpBuildCompoundMesh, meshTb );
4216 createTool( SMESHOp::OpCopyMesh, meshTb );
4217 createTool( separator(), meshTb );
4218 createTool( SMESHOp::OpCompute, meshTb );
4219 createTool( SMESHOp::OpPreCompute, meshTb );
4220 createTool( SMESHOp::OpEvaluate, meshTb );
4221 createTool( SMESHOp::OpMeshOrder, meshTb );
4223 createTool( SMESHOp::OpCreateGroup, groupTb );
4224 createTool( SMESHOp::OpCreateGeometryGroup, groupTb );
4225 createTool( SMESHOp::OpConstructGroup, groupTb );
4226 createTool( SMESHOp::OpEditGroup, groupTb );
4228 createTool( SMESHOp::OpMeshInformation, info );
4229 //createTool( SMESHOp::OpStdInfo, meshTb );
4230 //createTool( SMESHOp::OpWhatIs, meshTb ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
4231 createTool( SMESHOp::OpFindElementByPoint, info );
4233 createTool( SMESHOp::OpFreeNode, ctrl0dTb );
4234 createTool( SMESHOp::OpEqualNode, ctrl0dTb );
4236 createTool( SMESHOp::OpFreeEdge, ctrl1dTb );
4237 createTool( SMESHOp::OpFreeBorder, ctrl1dTb );
4238 createTool( SMESHOp::OpLength, ctrl1dTb );
4239 createTool( SMESHOp::OpConnection, ctrl1dTb );
4240 createTool( SMESHOp::OpEqualEdge, ctrl1dTb );
4242 createTool( SMESHOp::OpFreeFace, ctrl2dTb );
4243 createTool( SMESHOp::OpBareBorderFace, ctrl2dTb );
4244 createTool( SMESHOp::OpOverConstrainedFace, ctrl2dTb );
4245 createTool( SMESHOp::OpLength2D, ctrl2dTb );
4246 createTool( SMESHOp::OpConnection2D, ctrl2dTb );
4247 createTool( SMESHOp::OpArea, ctrl2dTb );
4248 createTool( SMESHOp::OpTaper, ctrl2dTb );
4249 createTool( SMESHOp::OpAspectRatio, ctrl2dTb );
4250 createTool( SMESHOp::OpMinimumAngle, ctrl2dTb );
4251 createTool( SMESHOp::OpWarpingAngle, ctrl2dTb );
4252 createTool( SMESHOp::OpSkew, ctrl2dTb );
4253 createTool( SMESHOp::OpMaxElementLength2D, ctrl2dTb );
4254 createTool( SMESHOp::OpEqualFace, ctrl2dTb );
4256 createTool( SMESHOp::OpAspectRatio3D, ctrl3dTb );
4257 createTool( SMESHOp::OpVolume, ctrl3dTb );
4258 createTool( SMESHOp::OpMaxElementLength3D, ctrl3dTb );
4259 createTool( SMESHOp::OpBareBorderVolume, ctrl3dTb );
4260 createTool( SMESHOp::OpOverConstrainedVolume, ctrl3dTb );
4261 createTool( SMESHOp::OpEqualVolume, ctrl3dTb );
4263 createTool( SMESHOp::OpNode, addElemTb );
4264 createTool( SMESHOp::OpElem0D, addElemTb );
4265 createTool( SMESHOp::OpElem0DOnElemNodes, addElemTb );
4266 createTool( SMESHOp::OpBall, addElemTb );
4267 createTool( SMESHOp::OpEdge, addElemTb );
4268 createTool( SMESHOp::OpTriangle, addElemTb );
4269 createTool( SMESHOp::OpQuadrangle, addElemTb );
4270 createTool( SMESHOp::OpPolygon, addElemTb );
4271 createTool( SMESHOp::OpTetrahedron, addElemTb );
4272 createTool( SMESHOp::OpHexahedron, addElemTb );
4273 createTool( SMESHOp::OpPentahedron, addElemTb );
4274 createTool( SMESHOp::OpPyramid, addElemTb );
4275 createTool( SMESHOp::OpHexagonalPrism, addElemTb );
4276 createTool( SMESHOp::OpPolyhedron, addElemTb );
4278 createTool( SMESHOp::OpQuadraticEdge, addNonElemTb );
4279 createTool( SMESHOp::OpQuadraticTriangle, addNonElemTb );
4280 createTool( SMESHOp::OpBiQuadraticTriangle, addNonElemTb );
4281 createTool( SMESHOp::OpQuadraticQuadrangle, addNonElemTb );
4282 createTool( SMESHOp::OpBiQuadraticQuadrangle, addNonElemTb );
4283 createTool( SMESHOp::OpQuadraticPolygon, addNonElemTb );
4284 createTool( SMESHOp::OpQuadraticTetrahedron, addNonElemTb );
4285 createTool( SMESHOp::OpQuadraticPyramid, addNonElemTb );
4286 createTool( SMESHOp::OpQuadraticPentahedron, addNonElemTb );
4287 createTool( SMESHOp::OpQuadraticHexahedron, addNonElemTb );
4288 createTool( SMESHOp::OpTriQuadraticHexahedron, addNonElemTb );
4290 createTool( SMESHOp::OpRemoveNodes, remTb );
4291 createTool( SMESHOp::OpRemoveElements, remTb );
4292 createTool( SMESHOp::OpRemoveOrphanNodes, remTb );
4293 createTool( SMESHOp::OpClearMesh, remTb );
4295 //createTool( SMESHOp::OpRenumberingNodes, renumbTb );
4296 //createTool( SMESHOp::OpRenumberingElements, renumbTb );
4298 createTool( SMESHOp::OpTranslation, transformTb );
4299 createTool( SMESHOp::OpRotation, transformTb );
4300 createTool( SMESHOp::OpSymmetry, transformTb );
4301 createTool( SMESHOp::OpScale, transformTb );
4302 createTool( SMESHOp::OpSewing, transformTb );
4303 createTool( SMESHOp::OpMergeNodes, transformTb );
4304 createTool( SMESHOp::OpMergeElements, transformTb );
4305 createTool( SMESHOp::OpDuplicateNodes, transformTb );
4307 createTool( SMESHOp::OpMoveNode, modifyTb );
4308 createTool( SMESHOp::OpDiagonalInversion, modifyTb );
4309 createTool( SMESHOp::OpUnionOfTwoTriangle, modifyTb );
4310 createTool( SMESHOp::OpOrientation, modifyTb );
4311 createTool( SMESHOp::OpReorientFaces, modifyTb );
4312 createTool( SMESHOp::OpUnionOfTriangles, modifyTb );
4313 createTool( SMESHOp::OpCuttingOfQuadrangles, modifyTb );
4314 createTool( SMESHOp::OpSplitVolumes, modifyTb );
4315 createTool( SMESHOp::OpSmoothing, modifyTb );
4316 createTool( SMESHOp::OpExtrusion, modifyTb );
4317 createTool( SMESHOp::OpExtrusionAlongAPath, modifyTb );
4318 createTool( SMESHOp::OpRevolution, modifyTb );
4319 createTool( SMESHOp::OpPatternMapping, modifyTb );
4320 createTool( SMESHOp::OpConvertMeshToQuadratic, modifyTb );
4321 createTool( SMESHOp::OpCreateBoundaryElements, modifyTb );
4323 createTool( SMESHOp::OpMinimumDistance, measuremTb );
4325 createTool( SMESHOp::OpUpdate, dispModeTb );
4327 QString lc = "$"; // VSR : instead of QtxPopupSelection::defEquality();
4328 QString dc = "selcount"; // VSR : instead of QtxPopupSelection::defSelCountParam()
4331 QString OB = "'ObjectBrowser'",
4332 View = "'" + SVTK_Viewer::Type() + "'",
4334 mesh = pat.arg( SMESHGUI_Selection::typeName( SMESH::MESH ) ),
4335 group = pat.arg( SMESHGUI_Selection::typeName( SMESH::GROUP ) ),
4336 hypo = pat.arg( SMESHGUI_Selection::typeName( SMESH::HYPOTHESIS ) ),
4337 algo = pat.arg( SMESHGUI_Selection::typeName( SMESH::ALGORITHM ) ),
4338 elems = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ).
4339 arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_VERTEX ) ).
4340 arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_EDGE ) ).
4341 arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_FACE ) ).
4342 arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_SOLID ) ).
4343 arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_COMPOUND ) ).
4344 arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH ) ),
4346 mesh_part = mesh + " " + subMesh + " " + group,
4347 mesh_group = mesh + " " + group,
4348 hyp_alg = hypo + " " + algo;
4350 // popup for object browser
4352 isInvisible("not( isVisible )"),
4353 isEmpty("numberOfNodes = 0"),
4354 isNotEmpty("numberOfNodes <> 0"),
4356 // has nodes, edges, etc in VISIBLE! actor
4357 hasNodes("(numberOfNodes > 0 )"),//&& isVisible)"),
4358 hasElems("(count( elemTypes ) > 0)"),
4359 hasDifferentElems("(count( elemTypes ) > 1)"),
4360 hasBalls("({'BallElem'} in elemTypes)"),
4361 hasElems0d("({'Elem0d'} in elemTypes)"),
4362 hasEdges("({'Edge'} in elemTypes)"),
4363 hasFaces("({'Face'} in elemTypes)"),
4364 hasVolumes("({'Volume'} in elemTypes)");
4366 createPopupItem( SMESHOp::OpFileInformation, OB, mesh, "&& selcount=1 && isImported" );
4367 createPopupItem( SMESHOp::OpCreateSubMesh, OB, mesh, "&& isComputable");
4368 createPopupItem( SMESHOp::OpEditMeshOrSubMesh, OB, mesh, "&& isComputable");
4369 createPopupItem( SMESHOp::OpEditMeshOrSubMesh, OB, subMesh, "&& isComputable" );
4370 createPopupItem( SMESHOp::OpEditGroup, OB, group );
4371 createPopupItem( SMESHOp::OpEditGeomGroupAsGroup, OB, group, "&& groupType != 'Group'" );
4373 popupMgr()->insert( separator(), -1, 0 );
4374 createPopupItem( SMESHOp::OpCompute, OB, mesh, "&& isComputable" );
4375 createPopupItem( SMESHOp::OpPreCompute, OB, mesh, "&& isComputable && isPreComputable" );
4376 createPopupItem( SMESHOp::OpEvaluate, OB, mesh, "&& isComputable" );
4377 createPopupItem( SMESHOp::OpMeshOrder, OB, mesh, "&& isComputable" );
4378 createPopupItem( SMESHOp::OpUpdate, OB, mesh_part );
4379 createPopupItem( SMESHOp::OpMeshInformation, OB, mesh_part );
4380 createPopupItem( SMESHOp::OpFindElementByPoint, OB, mesh_group );
4381 createPopupItem( SMESHOp::OpOverallMeshQuality, OB, mesh_part );
4382 popupMgr()->insert( separator(), -1, 0 );
4383 createPopupItem( SMESHOp::OpCreateGroup, OB, mesh );
4384 createPopupItem( SMESHOp::OpCreateGeometryGroup, OB, mesh );
4385 createPopupItem( SMESHOp::OpConstructGroup, OB, subMesh );
4386 popupMgr()->insert( separator(), -1, 0 );
4387 createPopupItem( SMESHOp::OpEditHypothesis, OB, hypo);
4388 createPopupItem( SMESHOp::OpUnassign, OB, hyp_alg ); // REMOVE HYPOTHESIS / ALGORITHMS
4389 popupMgr()->insert( separator(), -1, 0 );
4390 createPopupItem( SMESHOp::OpClearMesh, OB, mesh );
4391 popupMgr()->insert( separator(), -1, 0 );
4392 createPopupItem( SMESHOp::OpConvertMeshToQuadratic, OB, mesh + " " + subMesh ); // convert to quadratic
4393 createPopupItem( SMESHOp::OpCreateBoundaryElements, OB, mesh + " " + group, // create 2D mesh from 3D
4395 popupMgr()->insert( separator(), -1, 0 );
4397 QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( dc );
4398 QString multiple_non_empty = QString( " && %1>0 && numberOfNodes>0" ).arg( dc );
4399 QString only_one_2D = only_one_non_empty + " && dim>1";
4401 int anId = popupMgr()->insert( tr( "MEN_EXPORT" ), -1, -1 ); // EXPORT submenu
4402 createPopupItem( SMESHOp::OpPopupExportMED, OB, mesh_group, multiple_non_empty, anId );
4403 createPopupItem( SMESHOp::OpPopupExportUNV, OB, mesh_group, only_one_non_empty, anId );
4404 createPopupItem( SMESHOp::OpPopupExportSTL, OB, mesh_group, only_one_2D, anId );
4406 createPopupItem( SMESHOp::OpPopupExportCGNS, OB, mesh_group, multiple_non_empty, anId );
4408 createPopupItem( SMESHOp::OpPopupExportSAUV, OB, mesh_group, only_one_non_empty, anId );
4409 createPopupItem( SMESHOp::OpPopupExportGMF, OB, mesh_group, only_one_non_empty, anId );
4410 createPopupItem( SMESHOp::OpPopupExportDAT, OB, mesh_group, only_one_non_empty, anId );
4411 createPopupItem( SMESHOp::OpDelete, OB, mesh_part + " " + hyp_alg );
4412 createPopupItem( SMESHOp::OpDeleteGroup, OB, group );
4413 popupMgr()->insert( separator(), -1, 0 );
4416 createPopupItem( SMESHOp::OpEditGroup, View, group );
4417 createPopupItem( SMESHOp::OpAddElemGroupPopup, View, elems );
4418 createPopupItem( SMESHOp::OpRemoveElemGroupPopup, View, elems );
4420 popupMgr()->insert( separator(), -1, 0 );
4421 createPopupItem( SMESHOp::OpUpdate, View, mesh_part );
4422 createPopupItem( SMESHOp::OpMeshInformation, View, mesh_part );
4423 createPopupItem( SMESHOp::OpOverallMeshQuality, View, mesh_part );
4424 createPopupItem( SMESHOp::OpFindElementByPoint, View, mesh );
4425 popupMgr()->insert( separator(), -1, 0 );
4427 createPopupItem( SMESHOp::OpAutoColor, OB + " " + View, mesh, "&& (not isAutoColor)" );
4428 createPopupItem( SMESHOp::OpDisableAutoColor, OB + " " + View, mesh, "&& isAutoColor" );
4429 popupMgr()->insert( separator(), -1, 0 );
4431 QString aClient = QString( "%1client in {%2}" ).arg( lc ).arg( "'VTKViewer'" );
4432 QString aType = QString( "%1type in {%2}" ).arg( lc );
4433 aType = aType.arg( mesh_part );
4434 QString aMeshInVTK = aClient + "&&" + aType;
4436 aClient = "($client in {'VTKViewer' 'ObjectBrowser'})";
4437 QString anActiveVTK = QString("activeView = '%1'").arg(SVTK_Viewer::Type());
4438 QString aSelCount = QString( "%1 > 0" ).arg( dc );
4440 //-------------------------------------------------
4442 //-------------------------------------------------
4443 anId = popupMgr()->insert( tr( "MEN_NUM" ), -1, -1 );
4445 popupMgr()->insert( action( SMESHOp::OpNumberingNodes ), anId, -1 );
4446 popupMgr()->setRule( action( SMESHOp::OpNumberingNodes ), aMeshInVTK + "&& isVisible &&" + hasNodes, QtxPopupMgr::VisibleRule );
4447 popupMgr()->setRule( action( SMESHOp::OpNumberingNodes ), "{'Point'} in labeledTypes", QtxPopupMgr::ToggleRule );
4449 popupMgr()->insert( action( SMESHOp::OpNumberingElements ), anId, -1 );
4450 popupMgr()->setRule( action( SMESHOp::OpNumberingElements ), aMeshInVTK + "&& isVisible &&" + hasElems, QtxPopupMgr::VisibleRule );
4451 popupMgr()->setRule( action( SMESHOp::OpNumberingElements ), "{'Cell'} in labeledTypes", QtxPopupMgr::ToggleRule );
4453 popupMgr()->insert( separator(), -1, -1 );
4455 //-------------------------------------------------
4457 //-------------------------------------------------
4458 anId = popupMgr()->insert( tr( "MEN_DISPMODE" ), -1, -1 );
4460 popupMgr()->insert( action( SMESHOp::OpDMWireframe ), anId, -1 );
4461 popupMgr()->setRule( action( SMESHOp::OpDMWireframe ), aMeshInVTK + "&&" + hasElems, QtxPopupMgr::VisibleRule );
4462 popupMgr()->setRule( action( SMESHOp::OpDMWireframe ), "displayMode = 'eEdge'", QtxPopupMgr::ToggleRule );
4464 popupMgr()->insert( action( SMESHOp::OpDMShading ), anId, -1 );
4465 popupMgr()->setRule( action( SMESHOp::OpDMShading ),aMeshInVTK+ "&& (" + hasFaces + "||" + hasVolumes + ")", QtxPopupMgr::VisibleRule);
4466 popupMgr()->setRule( action( SMESHOp::OpDMShading ), "displayMode = 'eSurface'", QtxPopupMgr::ToggleRule );
4468 popupMgr()->insert( action( SMESHOp::OpDMNodes ), anId, -1 );
4469 popupMgr()->setRule( action( SMESHOp::OpDMNodes ), aMeshInVTK + "&&" + hasNodes, QtxPopupMgr::VisibleRule );
4470 popupMgr()->setRule( action( SMESHOp::OpDMNodes ), "displayMode = 'ePoint'", QtxPopupMgr::ToggleRule );
4472 popupMgr()->insert( separator(), anId, -1 );
4474 popupMgr()->insert( action( SMESHOp::OpDMShrink ), anId, -1 );
4475 popupMgr()->setRule( action( SMESHOp::OpDMShrink ), aMeshInVTK + "&& shrinkMode <> 'IsNotShrinkable' && displayMode <> 'ePoint'", QtxPopupMgr::VisibleRule);
4476 popupMgr()->setRule( action( SMESHOp::OpDMShrink ), "shrinkMode = 'IsShrunk'", QtxPopupMgr::ToggleRule );
4478 //-------------------------------------------------
4480 //-------------------------------------------------
4481 QString aDiffElemsInVTK = aMeshInVTK + "&&" + hasDifferentElems;
4483 anId = popupMgr()->insert( tr( "MEN_DISP_ENT" ), -1, -1 );
4485 popupMgr()->insert( action( SMESHOp::OpDE0DElements ), anId, -1 );
4486 popupMgr()->setRule( action( SMESHOp::OpDE0DElements ), aDiffElemsInVTK + "&& isVisible &&" + hasElems0d, QtxPopupMgr::VisibleRule);
4487 popupMgr()->setRule( action( SMESHOp::OpDE0DElements ), "{'Elem0d'} in entityMode", QtxPopupMgr::ToggleRule);
4489 popupMgr()->insert( action( SMESHOp::OpDEEdges ), anId, -1 );
4490 popupMgr()->setRule( action( SMESHOp::OpDEEdges ), aDiffElemsInVTK + "&& isVisible &&" + hasEdges, QtxPopupMgr::VisibleRule );
4491 popupMgr()->setRule( action( SMESHOp::OpDEEdges ), "{'Edge'} in entityMode", QtxPopupMgr::ToggleRule );
4493 popupMgr()->insert( action( SMESHOp::OpDEFaces ), anId, -1 );
4494 popupMgr()->setRule( action( SMESHOp::OpDEFaces ), aDiffElemsInVTK + "&& isVisible &&" + hasFaces, QtxPopupMgr::VisibleRule );
4495 popupMgr()->setRule( action( SMESHOp::OpDEFaces ), "{'Face'} in entityMode", QtxPopupMgr::ToggleRule );
4497 popupMgr()->insert( action( SMESHOp::OpDEVolumes ), anId, -1 );
4498 popupMgr()->setRule( action( SMESHOp::OpDEVolumes ), aDiffElemsInVTK + "&& isVisible &&" + hasVolumes, QtxPopupMgr::VisibleRule );
4499 popupMgr()->setRule( action( SMESHOp::OpDEVolumes ), "{'Volume'} in entityMode", QtxPopupMgr::ToggleRule );
4501 popupMgr()->insert( action( SMESHOp::OpDEBalls ), anId, -1 );
4502 popupMgr()->setRule( action( SMESHOp::OpDEBalls ), aDiffElemsInVTK + "&& isVisible &&" + hasBalls, QtxPopupMgr::VisibleRule );
4503 popupMgr()->setRule( action( SMESHOp::OpDEBalls ), "{'BallElem'} in entityMode", QtxPopupMgr::ToggleRule );
4505 popupMgr()->insert( separator(), anId, -1 );
4507 popupMgr()->insert( action( SMESHOp::OpDEChoose ), anId, -1 );
4508 popupMgr()->setRule( action( SMESHOp::OpDEChoose ), aClient + "&&" + aType + "&&" + isNotEmpty, QtxPopupMgr::VisibleRule );
4510 popupMgr()->insert( separator(), anId, -1 );
4512 popupMgr()->insert( action( SMESHOp::OpDEAllEntity ), anId, -1 );
4513 popupMgr()->setRule( action( SMESHOp::OpDEAllEntity ), aDiffElemsInVTK + "&& isVisible && not( elemTypes in entityMode )", QtxPopupMgr::VisibleRule );
4516 //-------------------------------------------------
4517 // Representation of the 2D Quadratic elements
4518 //-------------------------------------------------
4519 anId = popupMgr()->insert( tr( "MEN_QUADRATIC_REPRESENT" ), -1, -1 );
4520 popupMgr()->insert( action( SMESHOp::OpRepresentationLines ), anId, -1 );
4521 popupMgr()->setRule( action( SMESHOp::OpRepresentationLines ), aMeshInVTK + "and isVisible",QtxPopupMgr::VisibleRule );
4522 popupMgr()->setRule( action( SMESHOp::OpRepresentationLines ), "quadratic2DMode = 'eLines'", QtxPopupMgr::ToggleRule );
4524 popupMgr()->insert( action( SMESHOp::OpRepresentationArcs ), anId, -1 );
4525 popupMgr()->setRule( action( SMESHOp::OpRepresentationArcs ), aMeshInVTK + "and isVisible", QtxPopupMgr::VisibleRule );
4526 popupMgr()->setRule( action( SMESHOp::OpRepresentationArcs ), "quadratic2DMode = 'eArcs'", QtxPopupMgr::ToggleRule );
4528 //-------------------------------------------------
4529 // Orientation of faces
4530 //-------------------------------------------------
4531 popupMgr()->insert( action( SMESHOp::OpOrientationOnFaces ), -1, -1 );
4532 popupMgr()->setRule( action( SMESHOp::OpOrientationOnFaces ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule);
4533 popupMgr()->setRule( action( SMESHOp::OpOrientationOnFaces ), "facesOrientationMode = 'IsOriented'", QtxPopupMgr::ToggleRule );
4535 //-------------------------------------------------
4537 //-------------------------------------------------
4538 popupMgr()->insert( action( SMESHOp::OpProperties ), -1, -1 );
4539 popupMgr()->setRule( action( SMESHOp::OpProperties ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule );
4541 //-------------------------------------------------
4543 //-------------------------------------------------
4544 popupMgr()->insert( action( SMESHOp::OpTransparency ), -1, -1 );
4545 popupMgr()->setRule( action( SMESHOp::OpTransparency ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule );
4547 //-------------------------------------------------
4549 //-------------------------------------------------
4551 aMeshInVtkHasNodes = aMeshInVTK + "&&" + hasNodes,
4552 aMeshInVtkHasEdges = aMeshInVTK + "&&" + hasEdges,
4553 aMeshInVtkHasFaces = aMeshInVTK + "&&" + hasFaces,
4554 aMeshInVtkHasVolumes = aMeshInVTK + "&&" + hasVolumes;
4556 anId = popupMgr()->insert( tr( "MEN_CTRL" ), -1, -1 );
4558 popupMgr()->insert( action( SMESHOp::OpReset ), anId, -1 ); // RESET
4559 popupMgr()->setRule( action( SMESHOp::OpReset ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
4561 popupMgr()->insert( separator(), anId, -1 );
4563 int aSubId = popupMgr()->insert( tr( "MEN_NODE_CTRL" ), anId, -1 ); // NODE CONTROLS
4565 popupMgr()->insert( action( SMESHOp::OpFreeNode ), aSubId, -1 );
4566 popupMgr()->setRule( action( SMESHOp::OpFreeNode ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
4567 popupMgr()->setRule( action( SMESHOp::OpFreeNode ), "controlMode = 'eFreeNodes'", QtxPopupMgr::ToggleRule );
4569 popupMgr()->insert ( action( SMESHOp::OpEqualNode ), aSubId, -1 );
4570 popupMgr()->setRule( action( SMESHOp::OpEqualNode ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
4571 popupMgr()->setRule( action( SMESHOp::OpEqualNode ), "controlMode = 'eCoincidentNodes'", QtxPopupMgr::ToggleRule);
4573 aSubId = popupMgr()->insert( tr( "MEN_EDGE_CTRL" ), anId, -1 ); // EDGE CONTROLS
4575 popupMgr()->insert( action( SMESHOp::OpFreeEdge ), aSubId, -1 );
4576 popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
4577 popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), "controlMode = 'eFreeEdges'", QtxPopupMgr::ToggleRule );
4579 popupMgr()->insert( action( SMESHOp::OpFreeBorder ), aSubId, -1 );
4580 popupMgr()->setRule( action( SMESHOp::OpFreeBorder ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
4581 popupMgr()->setRule( action( SMESHOp::OpFreeBorder ), "controlMode = 'eFreeBorders'", QtxPopupMgr::ToggleRule );
4583 popupMgr()->insert( action( SMESHOp::OpLength ), aSubId, -1 );
4584 popupMgr()->setRule( action( SMESHOp::OpLength ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
4585 popupMgr()->setRule( action( SMESHOp::OpLength ), "controlMode = 'eLength'", QtxPopupMgr::ToggleRule );
4587 popupMgr()->insert( action( SMESHOp::OpConnection ), aSubId, -1 );
4588 popupMgr()->setRule( action( SMESHOp::OpConnection ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
4589 popupMgr()->setRule( action( SMESHOp::OpConnection ), "controlMode = 'eMultiConnection'", QtxPopupMgr::ToggleRule );
4590 popupMgr()->insert ( action( SMESHOp::OpEqualEdge ), aSubId, -1 ); // EQUAL_EDGE
4591 popupMgr()->setRule( action( SMESHOp::OpEqualEdge ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
4592 popupMgr()->setRule( action( SMESHOp::OpEqualEdge ), "controlMode = 'eCoincidentElems1D'", QtxPopupMgr::ToggleRule);
4594 aSubId = popupMgr()->insert( tr( "MEN_FACE_CTRL" ), anId, -1 ); // FACE CONTROLS
4596 popupMgr()->insert ( action( SMESHOp::OpFreeFace ), aSubId, -1 );
4597 popupMgr()->setRule( action( SMESHOp::OpFreeFace ), aMeshInVtkHasFaces /*aMeshInVtkHasVolumes*/,
4598 QtxPopupMgr::VisibleRule );
4599 popupMgr()->setRule( action( SMESHOp::OpFreeFace ), "controlMode = 'eFreeFaces'", QtxPopupMgr::ToggleRule );
4601 popupMgr()->insert ( action( SMESHOp::OpLength2D ), aSubId, -1 );
4602 popupMgr()->setRule( action( SMESHOp::OpLength2D ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4603 popupMgr()->setRule( action( SMESHOp::OpLength2D ), "controlMode = 'eLength2D'", QtxPopupMgr::ToggleRule );
4605 popupMgr()->insert ( action( SMESHOp::OpConnection2D ), aSubId, -1 );
4606 popupMgr()->setRule( action( SMESHOp::OpConnection2D ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4607 popupMgr()->setRule( action( SMESHOp::OpConnection2D ), "controlMode = 'eMultiConnection2D'", QtxPopupMgr::ToggleRule );
4609 popupMgr()->insert ( action( SMESHOp::OpArea ), aSubId, -1 );
4610 popupMgr()->setRule( action( SMESHOp::OpArea ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4611 popupMgr()->setRule( action( SMESHOp::OpArea ), "controlMode = 'eArea'", QtxPopupMgr::ToggleRule );
4613 popupMgr()->insert ( action( SMESHOp::OpTaper ), aSubId, -1 );
4614 popupMgr()->setRule( action( SMESHOp::OpTaper ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4615 popupMgr()->setRule( action( SMESHOp::OpTaper ), "controlMode = 'eTaper'", QtxPopupMgr::ToggleRule );
4617 popupMgr()->insert ( action( SMESHOp::OpAspectRatio ), aSubId, -1 );
4618 popupMgr()->setRule( action( SMESHOp::OpAspectRatio ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4619 popupMgr()->setRule( action( SMESHOp::OpAspectRatio ), "controlMode = 'eAspectRatio'", QtxPopupMgr::ToggleRule );
4621 popupMgr()->insert ( action( SMESHOp::OpMinimumAngle ), aSubId, -1 );
4622 popupMgr()->setRule( action( SMESHOp::OpMinimumAngle ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4623 popupMgr()->setRule( action( SMESHOp::OpMinimumAngle ), "controlMode = 'eMinimumAngle'", QtxPopupMgr::ToggleRule );
4625 popupMgr()->insert ( action( SMESHOp::OpWarpingAngle ), aSubId, -1 );
4626 popupMgr()->setRule( action( SMESHOp::OpWarpingAngle ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4627 popupMgr()->setRule( action( SMESHOp::OpWarpingAngle ), "controlMode = 'eWarping'", QtxPopupMgr::ToggleRule );
4629 popupMgr()->insert ( action( SMESHOp::OpSkew ), aSubId, -1 );
4630 popupMgr()->setRule( action( SMESHOp::OpSkew ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4631 popupMgr()->setRule( action( SMESHOp::OpSkew ), "controlMode = 'eSkew'", QtxPopupMgr::ToggleRule );
4633 popupMgr()->insert ( action( SMESHOp::OpMaxElementLength2D ), aSubId, -1 );
4634 popupMgr()->setRule( action( SMESHOp::OpMaxElementLength2D ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4635 popupMgr()->setRule( action( SMESHOp::OpMaxElementLength2D ), "controlMode = 'eMaxElementLength2D'", QtxPopupMgr::ToggleRule );
4637 popupMgr()->insert ( action( SMESHOp::OpBareBorderFace ), aSubId, -1 );
4638 popupMgr()->setRule( action( SMESHOp::OpBareBorderFace ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4639 popupMgr()->setRule( action( SMESHOp::OpBareBorderFace ), "controlMode = 'eBareBorderFace'", QtxPopupMgr::ToggleRule );
4641 popupMgr()->insert ( action( SMESHOp::OpOverConstrainedFace ), aSubId, -1 );
4642 popupMgr()->setRule( action( SMESHOp::OpOverConstrainedFace ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4643 popupMgr()->setRule( action( SMESHOp::OpOverConstrainedFace ), "controlMode = 'eOverConstrainedFace'", QtxPopupMgr::ToggleRule );
4644 popupMgr()->insert ( action( SMESHOp::OpEqualFace ), aSubId, -1 );
4645 popupMgr()->setRule( action( SMESHOp::OpEqualFace ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4646 popupMgr()->setRule( action( SMESHOp::OpEqualFace ), "controlMode = 'eCoincidentElems2D'", QtxPopupMgr::ToggleRule );
4648 aSubId = popupMgr()->insert( tr( "MEN_VOLUME_CTRL" ), anId, -1 ); // VOLUME CONTROLS
4650 popupMgr()->insert ( action( SMESHOp::OpAspectRatio3D ), aSubId, -1 );
4651 popupMgr()->setRule( action( SMESHOp::OpAspectRatio3D ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
4652 popupMgr()->setRule( action( SMESHOp::OpAspectRatio3D ), "controlMode = 'eAspectRatio3D'", QtxPopupMgr::ToggleRule );
4654 popupMgr()->insert ( action( SMESHOp::OpVolume ), aSubId, -1 );
4655 popupMgr()->setRule( action( SMESHOp::OpVolume ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
4656 popupMgr()->setRule( action( SMESHOp::OpVolume ), "controlMode = 'eVolume3D'", QtxPopupMgr::ToggleRule );
4658 popupMgr()->insert ( action( SMESHOp::OpMaxElementLength3D ), aSubId, -1 );
4659 popupMgr()->setRule( action( SMESHOp::OpMaxElementLength3D ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
4660 popupMgr()->setRule( action( SMESHOp::OpMaxElementLength3D ), "controlMode = 'eMaxElementLength3D'", QtxPopupMgr::ToggleRule );
4662 popupMgr()->insert ( action( SMESHOp::OpBareBorderVolume ), aSubId, -1 );
4663 popupMgr()->setRule( action( SMESHOp::OpBareBorderVolume ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
4664 popupMgr()->setRule( action( SMESHOp::OpBareBorderVolume ), "controlMode = 'eBareBorderVolume'", QtxPopupMgr::ToggleRule );
4666 popupMgr()->insert ( action( SMESHOp::OpOverConstrainedVolume ), aSubId, -1 );
4667 popupMgr()->setRule( action( SMESHOp::OpOverConstrainedVolume ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
4668 popupMgr()->setRule( action( SMESHOp::OpOverConstrainedVolume ), "controlMode = 'eOverConstrainedVolume'", QtxPopupMgr::ToggleRule );
4670 popupMgr()->insert ( action( SMESHOp::OpEqualVolume ), aSubId, -1 );
4671 popupMgr()->setRule( action( SMESHOp::OpEqualVolume ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
4672 popupMgr()->setRule( action( SMESHOp::OpEqualVolume ), "controlMode = 'eCoincidentElems3D'", QtxPopupMgr::ToggleRule );
4674 popupMgr()->insert( separator(), anId, -1 );
4676 popupMgr()->insert( action( SMESHOp::OpShowScalarBar ), anId, -1 );
4677 popupMgr()->setRule( action( SMESHOp::OpShowScalarBar ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
4678 popupMgr()->setRule( action( SMESHOp::OpShowScalarBar ), aMeshInVTK + "&& controlMode <> 'eNone' && isScalarBarVisible", QtxPopupMgr::ToggleRule );
4679 popupMgr()->insert( action( SMESHOp::OpScalarBarProperties ), anId, -1 );
4680 popupMgr()->setRule( action( SMESHOp::OpScalarBarProperties ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
4682 popupMgr()->insert( separator(), anId, -1 );
4684 aSubId = popupMgr()->insert( tr( "MEN_DISTRIBUTION_CTRL" ), anId, -1 ); // NODE CONTROLS
4686 popupMgr()->insert( action( SMESHOp::OpSaveDistribution ), aSubId, -1 );
4687 popupMgr()->setRule( action( SMESHOp::OpSaveDistribution ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
4689 popupMgr()->insert( action( SMESHOp::OpShowDistribution ), aSubId, -1 );
4690 popupMgr()->setRule( action( SMESHOp::OpShowDistribution ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
4691 popupMgr()->setRule( action( SMESHOp::OpShowDistribution ), aMeshInVTK + "&& isNumFunctor && isScalarBarVisible && isDistributionVisible", QtxPopupMgr::ToggleRule);
4693 #ifndef DISABLE_PLOT2DVIEWER
4694 popupMgr()->insert( action( SMESHOp::OpPlotDistribution ), aSubId, -1 );
4695 popupMgr()->setRule( action( SMESHOp::OpPlotDistribution ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
4698 //-------------------------------------------------
4700 //-------------------------------------------------
4701 popupMgr()->insert( separator(), -1, -1 );
4702 QString aRule = "$component={'SMESH'} and ( type='Component' or (" + aClient + " and " +
4703 aType + " and " + aSelCount + " and " + anActiveVTK + " and " + isNotEmpty + " %1 ) )";
4704 popupMgr()->insert( action( SMESHOp::OpShow ), -1, -1 );
4705 popupMgr()->setRule( action( SMESHOp::OpShow ), aRule.arg( "and (not isVisible)" ), QtxPopupMgr::VisibleRule );
4707 popupMgr()->insert( action( SMESHOp::OpHide ), -1, -1 );
4708 popupMgr()->setRule( action( SMESHOp::OpHide ), aRule.arg( "and isVisible" ), QtxPopupMgr::VisibleRule );
4710 popupMgr()->insert( action( SMESHOp::OpShowOnly ), -1, -1 );
4711 popupMgr()->setRule( action( SMESHOp::OpShowOnly ), aRule.arg( "" ), QtxPopupMgr::VisibleRule );
4713 popupMgr()->insert( separator(), -1, -1 );
4715 //-------------------------------------------------
4717 //-------------------------------------------------
4718 popupMgr()->insert( action( SMESHOp::OpClipping ), -1, -1 );
4719 popupMgr()->setRule( action( SMESHOp::OpClipping ), "client='VTKViewer'", QtxPopupMgr::VisibleRule );
4721 popupMgr()->insert( separator(), -1, -1 );
4723 popupMgr()->insert( action( SMESHOp::OpSortChild ), -1, -1 );
4724 popupMgr()->setRule( action( SMESHOp::OpSortChild ), "$component={'SMESH'} and client='ObjectBrowser' and isContainer and nbChildren>1", QtxPopupMgr::VisibleRule );
4725 popupMgr()->insert( separator(), -1, -1 );
4727 connect( application(), SIGNAL( viewManagerActivated( SUIT_ViewManager* ) ),
4728 this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) );
4730 connect( application(), SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
4731 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
4734 //================================================================================
4736 * \brief Return true if SMESH or GEOM objects are selected.
4737 * Is called form LightApp_Module::activateModule() which clear selection if
4738 * not isSelectionCompatible()
4740 //================================================================================
4742 bool SMESHGUI::isSelectionCompatible()
4744 bool isCompatible = true;
4745 SALOME_ListIO selected;
4746 if ( LightApp_SelectionMgr *Sel = selectionMgr() )
4747 Sel->selectedObjects( selected );
4749 SALOME_ListIteratorOfListIO It( selected );
4750 for ( ; isCompatible && It.More(); It.Next())
4752 ( strcmp("GEOM", It.Value()->getComponentDataType()) == 0 ) ||
4753 ( strcmp("SMESH", It.Value()->getComponentDataType()) == 0 );
4755 return isCompatible;
4759 bool SMESHGUI::reusableOperation( const int id )
4761 // compute, evaluate and precompute are not reusable operations
4762 return ( id == SMESHOp::OpCompute || id == SMESHOp::OpPreCompute || id == SMESHOp::OpEvaluate ) ? false : SalomeApp_Module::reusableOperation( id );
4765 bool SMESHGUI::activateModule( SUIT_Study* study )
4767 bool res = SalomeApp_Module::activateModule( study );
4769 setMenuShown( true );
4770 setToolShown( true );
4772 // import Python module that manages SMESH plugins (need to be here because SalomePyQt API uses active module)
4773 PyGILState_STATE gstate = PyGILState_Ensure();
4774 PyObject* pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
4775 if ( !pluginsmanager ) {
4779 PyObject* result = PyObject_CallMethod( pluginsmanager, (char*)"initialize", (char*)"isss",1,"smesh",tr("MEN_MESH").toUtf8().data(),tr("SMESH_PLUGINS_OTHER").toUtf8().data());
4784 PyGILState_Release(gstate);
4785 // end of SMESH plugins loading
4787 // Reset actions accelerator keys
4788 action(SMESHOp::OpDelete)->setEnabled(true); // Delete: Key_Delete
4790 // 0020210. Make SMESH_Gen update meshes at switching GEOM->SMESH
4791 GetSMESHGen()->SetCurrentStudy(SALOMEDS::Study::_nil());
4792 if ( SalomeApp_Study* s = dynamic_cast<SalomeApp_Study*>( study ))
4793 if ( _PTR(Study) aStudy = s->studyDS()) {
4794 GetSMESHGen()->SetCurrentStudy( _CAST(Study,aStudy)->GetStudy() );
4795 updateObjBrowser(); // objects can be removed
4798 // get all view currently opened in the study and connect their signals to
4799 // the corresponding slots of the class.
4800 SUIT_Desktop* aDesk = study->application()->desktop();
4802 QList<SUIT_ViewWindow*> wndList = aDesk->windows();
4803 SUIT_ViewWindow* wnd;
4804 foreach ( wnd, wndList )
4808 Py_XDECREF(pluginsmanager);
4812 bool SMESHGUI::deactivateModule( SUIT_Study* study )
4814 setMenuShown( false );
4815 setToolShown( false );
4817 EmitSignalCloseAllDialogs();
4819 // Unset actions accelerator keys
4820 action(SMESHOp::OpDelete)->setEnabled(false); // Delete: Key_Delete
4822 return SalomeApp_Module::deactivateModule( study );
4825 void SMESHGUI::studyClosed( SUIT_Study* s )
4829 SMESH::RemoveVisuData( s->id() );
4830 SalomeApp_Module::studyClosed( s );
4833 void SMESHGUI::OnGUIEvent()
4835 const QObject* obj = sender();
4836 if ( !obj || !obj->inherits( "QAction" ) )
4838 int id = actionId((QAction*)obj);
4843 SMESH::SMESH_Gen_var SMESHGUI::GetSMESHGen()
4845 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); //Document OCAF de l'etude active
4846 if ( CORBA::is_nil( myComponentSMESH ) )
4848 SMESHGUI aGUI; //SRN BugID: IPAL9186: Create an instance of SMESHGUI to initialize myComponentSMESH
4850 aGUI.myComponentSMESH->SetCurrentStudy(_CAST(Study,aStudy)->GetStudy());
4851 return aGUI.myComponentSMESH;
4854 myComponentSMESH->SetCurrentStudy(_CAST(Study,aStudy)->GetStudy());
4855 return myComponentSMESH;
4858 QString SMESHGUI::engineIOR() const
4860 CORBA::ORB_var anORB = getApp()->orb();
4861 CORBA::String_var anIOR = anORB->object_to_string(GetSMESHGen());
4862 return QString( anIOR.in() );
4865 void SMESHGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
4867 SalomeApp_Module::contextMenuPopup( client, menu, title );
4869 selectionMgr()->selectedObjects( lst );
4870 if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) {
4871 Handle(SALOME_InteractiveObject) io = lst.First();
4872 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
4873 _PTR(Study) study = appStudy->studyDS();
4874 _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
4876 QString aName = QString( SMESH::fromUtf8(obj->GetName()) );
4877 while ( aName.at( aName.length() - 1 ) == ' ' ) // Remove extraspaces in Name of Popup
4878 aName.remove( (aName.length() - 1), 1 );
4884 LightApp_Selection* SMESHGUI::createSelection() const
4886 return new SMESHGUI_Selection();
4889 void SMESHGUI::windows( QMap<int, int>& aMap ) const
4891 aMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
4892 aMap.insert( SalomeApp_Application::WT_NoteBook, Qt::LeftDockWidgetArea );
4893 #ifndef DISABLE_PYCONSOLE
4894 aMap.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
4898 void SMESHGUI::viewManagers( QStringList& list ) const
4900 list.append( SVTK_Viewer::Type() );
4903 void SMESHGUI::onViewManagerActivated( SUIT_ViewManager* mgr )
4905 if ( dynamic_cast<SVTK_ViewManager*>( mgr ) ) {
4906 SMESH::UpdateSelectionProp( this );
4908 QVector<SUIT_ViewWindow*> aViews = mgr->getViews();
4909 for(int i = 0; i < aViews.count() ; i++){
4910 SUIT_ViewWindow *sf = aViews[i];
4913 EmitSignalActivatedViewManager();
4917 void SMESHGUI::onViewManagerRemoved( SUIT_ViewManager* theViewManager )
4919 if( theViewManager && theViewManager->getType() == SVTK_Viewer::Type() )
4920 myClippingPlaneInfoMap.erase( theViewManager );
4923 void SMESHGUI::addActorAsObserver( SMESH_Actor* theActor )
4925 theActor->AddObserver( SMESH::DeleteActorEvent,
4926 myEventCallbackCommand.GetPointer(),
4930 void SMESHGUI::ProcessEvents( vtkObject* theObject,
4931 unsigned long theEvent,
4932 void* theClientData,
4935 if( SMESHGUI* aSMESHGUI = reinterpret_cast<SMESHGUI*>( theClientData ) ) {
4936 if( theObject && theEvent == SMESH::DeleteActorEvent ) {
4937 if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( theObject ) ) {
4938 SMESHGUI_ClippingPlaneInfoMap& aClippingPlaneInfoMap = aSMESHGUI->getClippingPlaneInfoMap();
4939 SMESHGUI_ClippingPlaneInfoMap::iterator anIter1 = aClippingPlaneInfoMap.begin();
4940 for( ; anIter1 != aClippingPlaneInfoMap.end(); anIter1++ ) {
4941 SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = anIter1->second;
4942 SMESHGUI_ClippingPlaneInfoList::iterator anIter2 = aClippingPlaneInfoList.begin();
4943 for( ; anIter2 != aClippingPlaneInfoList.end(); anIter2++ ) {
4944 SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter2;
4945 std::list<vtkActor*>& anActorList = aClippingPlaneInfo.ActorList;
4946 SMESH::TActorList::iterator anIter3 = anActorList.begin();
4947 for ( ; anIter3 != anActorList.end(); anIter3++ ) {
4948 if( anActor == *anIter3 ) {
4949 anActorList.erase( anIter3 );
4960 void SMESHGUI::createPreferences()
4962 // General tab ------------------------------------------------------------------------
4963 int genTab = addPreference( tr( "PREF_TAB_GENERAL" ) );
4965 int autoUpdate = addPreference( tr( "PREF_AUTO_UPDATE" ), genTab, LightApp_Preferences::Auto, "SMESH", "auto_update" );
4966 setPreferenceProperty( autoUpdate, "columns", 2 );
4967 int lim = addPreference( tr( "PREF_UPDATE_LIMIT" ), autoUpdate, LightApp_Preferences::IntSpin, "SMESH", "update_limit" );
4968 setPreferenceProperty( lim, "min", 0 );
4969 setPreferenceProperty( lim, "max", 100000000 );
4970 setPreferenceProperty( lim, "step", 1000 );
4971 setPreferenceProperty( lim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
4972 addPreference( tr( "PREF_INCREMENTAL_LIMIT" ), autoUpdate, LightApp_Preferences::Bool, "SMESH", "incremental_limit" );
4974 int qaGroup = addPreference( tr( "PREF_GROUP_QUALITY" ), genTab );
4975 setPreferenceProperty( qaGroup, "columns", 2 );
4976 addPreference( tr( "PREF_DISPLAY_ENTITY" ), qaGroup, LightApp_Preferences::Bool, "SMESH", "display_entity" );
4977 addPreference( tr( "PREF_PRECISION_USE" ), qaGroup, LightApp_Preferences::Bool, "SMESH", "use_precision" );
4978 int prec = addPreference( tr( "PREF_PRECISION_VALUE" ), qaGroup, LightApp_Preferences::IntSpin, "SMESH", "controls_precision" );
4979 setPreferenceProperty( prec, "min", 0 );
4980 setPreferenceProperty( prec, "max", 100 );
4981 int doubleNodesTol = addPreference( tr( "PREF_EQUAL_NODES_TOL" ), qaGroup, LightApp_Preferences::DblSpin, "SMESH", "equal_nodes_tolerance" );
4982 setPreferenceProperty( doubleNodesTol, "precision", 10 );
4983 setPreferenceProperty( doubleNodesTol, "min", 0.0000000001 );
4984 setPreferenceProperty( doubleNodesTol, "max", 1000000.0 );
4985 setPreferenceProperty( doubleNodesTol, "step", 0.0000001 );
4987 int dispgroup = addPreference( tr( "PREF_DISPLAY_MODE_GROUP" ), genTab );
4988 setPreferenceProperty( dispgroup, "columns", 2 );
4989 int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), dispgroup, LightApp_Preferences::Selector, "SMESH", "display_mode" );
4991 modes.append( tr("MEN_WIRE") );
4992 modes.append( tr("MEN_SHADE") );
4993 modes.append( tr("MEN_NODES") );
4994 modes.append( tr("MEN_SHRINK") );
4995 QList<QVariant> indices;
4996 indices.append( 0 );
4997 indices.append( 1 );
4998 indices.append( 2 );
4999 indices.append( 3 );
5000 setPreferenceProperty( dispmode, "strings", modes );
5001 setPreferenceProperty( dispmode, "indexes", indices );
5003 int arcgroup = addPreference( tr( "QUADRATIC_REPRESENT_MODE_GROUP" ), genTab );
5004 setPreferenceProperty( arcgroup, "columns", 2 );
5005 int quadraticmode = addPreference( tr( "QUADRATIC_REPRESENT_MODE" ), arcgroup, LightApp_Preferences::Selector, "SMESH", "quadratic_mode" );
5006 QStringList quadraticModes;
5007 quadraticModes.append(tr("MEN_LINE_REPRESENTATION"));
5008 quadraticModes.append(tr("MEN_ARC_REPRESENTATION"));
5010 indices.append( 0 );
5011 indices.append( 1 );
5012 setPreferenceProperty( quadraticmode, "strings", quadraticModes );
5013 setPreferenceProperty( quadraticmode, "indexes", indices );
5015 int maxAngle = addPreference( tr( "MAX_ARC_ANGLE" ), arcgroup, LightApp_Preferences::IntSpin,
5016 "SMESH", "max_angle" );
5017 setPreferenceProperty( maxAngle, "min", 1 );
5018 setPreferenceProperty( maxAngle, "max", 90 );
5022 int exportgroup = addPreference( tr( "PREF_GROUP_EXPORT" ), genTab );
5023 setPreferenceProperty( exportgroup, "columns", 2 );
5024 addPreference( tr( "PREF_AUTO_GROUPS" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "auto_groups" );
5025 //addPreference( tr( "PREF_RENUMBER" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "renumbering" );
5027 int computeGroup = addPreference( tr( "PREF_GROUP_COMPUTE" ), genTab );
5028 setPreferenceProperty( computeGroup, "columns", 2 );
5029 int notifyMode = addPreference( tr( "PREF_NOTIFY_MODE" ), computeGroup, LightApp_Preferences::Selector, "SMESH", "show_result_notification" );
5031 modes.append( tr( "PREF_NOTIFY_NEVER" ) );
5032 modes.append( tr( "PREF_NOTIFY_ERROR" ) );
5033 modes.append( tr( "PREF_NOTIFY_ALWAYS" ) );
5035 indices.append( 0 );
5036 indices.append( 1 );
5037 indices.append( 2 );
5038 setPreferenceProperty( notifyMode, "strings", modes );
5039 setPreferenceProperty( notifyMode, "indexes", indices );
5041 int infoGroup = addPreference( tr( "PREF_GROUP_INFO" ), genTab );
5042 setPreferenceProperty( infoGroup, "columns", 2 );
5043 int elemInfo = addPreference( tr( "PREF_ELEM_INFO" ), infoGroup, LightApp_Preferences::Selector, "SMESH", "mesh_elem_info" );
5045 modes.append( tr( "PREF_ELEM_INFO_SIMPLE" ) );
5046 modes.append( tr( "PREF_ELEM_INFO_TREE" ) );
5048 indices.append( 0 );
5049 indices.append( 1 );
5050 setPreferenceProperty( elemInfo, "strings", modes );
5051 setPreferenceProperty( elemInfo, "indexes", indices );
5052 int nodesLim = addPreference( tr( "PREF_GPP_NODES_LIMIT" ), infoGroup, LightApp_Preferences::IntSpin, "SMESH", "info_groups_nodes_limit" );
5053 setPreferenceProperty( nodesLim, "min", 0 );
5054 setPreferenceProperty( nodesLim, "max", 10000000 );
5055 setPreferenceProperty( nodesLim, "step", 10000 );
5056 setPreferenceProperty( nodesLim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
5057 int ctrlLim = addPreference( tr( "PREF_CTRL_LIMIT" ), infoGroup, LightApp_Preferences::IntSpin, "SMESH", "info_controls_limit" );
5058 setPreferenceProperty( ctrlLim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
5059 setPreferenceProperty( ctrlLim, "min", 0 );
5060 setPreferenceProperty( ctrlLim, "max", 10000000 );
5061 setPreferenceProperty( ctrlLim, "step", 1000 );
5062 addPreference( tr( "PREF_ELEM_INFO_GRP_DETAILS" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "elem_info_grp_details" );
5063 addPreference( tr( "PREF_DUMP_BASE_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_base" );
5064 addPreference( tr( "PREF_DUMP_ELEM_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_elem" );
5065 addPreference( tr( "PREF_DUMP_ADD_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_add" );
5066 addPreference( tr( "PREF_DUMP_CTRL_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_ctrl" );
5068 int segGroup = addPreference( tr( "PREF_GROUP_SEGMENT_LENGTH" ), genTab );
5069 setPreferenceProperty( segGroup, "columns", 2 );
5070 int segLen = addPreference( tr( "PREF_SEGMENT_LENGTH" ), segGroup, LightApp_Preferences::IntSpin,
5071 "SMESH", "segmentation" );
5072 setPreferenceProperty( segLen, "min", 1 );
5073 setPreferenceProperty( segLen, "max", 10000000 );
5074 int nbSeg = addPreference( tr( "PREF_NB_SEGMENTS" ), segGroup, LightApp_Preferences::IntSpin,
5075 "SMESH", "nb_segments_per_edge" );
5076 setPreferenceProperty( nbSeg, "min", 1 );
5077 setPreferenceProperty( nbSeg, "max", 10000000 );
5079 int loadGroup = addPreference( tr( "SMESH_PREF_MESH_LOADING" ), genTab );
5080 addPreference( tr( "PREF_FORGET_MESH_AT_HYP_MODIF" ), loadGroup, LightApp_Preferences::Bool,
5081 "SMESH", "forget_mesh_on_hyp_modif" );
5084 // Quantities with individual precision settings
5085 int precGroup = addPreference( tr( "SMESH_PREF_GROUP_PRECISION" ), genTab );
5086 setPreferenceProperty( precGroup, "columns", 2 );
5088 const int nbQuantities = 6;
5089 int precs[nbQuantities], ii = 0;
5090 precs[ii++] = addPreference( tr( "SMESH_PREF_length_precision" ), precGroup,
5091 LightApp_Preferences::IntSpin, "SMESH", "length_precision" );
5092 precs[ii++] = addPreference( tr( "SMESH_PREF_angle_precision" ), precGroup,
5093 LightApp_Preferences::IntSpin, "SMESH", "angle_precision" );
5094 precs[ii++] = addPreference( tr( "SMESH_PREF_len_tol_precision" ), precGroup,
5095 LightApp_Preferences::IntSpin, "SMESH", "len_tol_precision" );
5096 precs[ii++] = addPreference( tr( "SMESH_PREF_parametric_precision" ), precGroup,
5097 LightApp_Preferences::IntSpin, "SMESH", "parametric_precision" );
5098 precs[ii++] = addPreference( tr( "SMESH_PREF_area_precision" ), precGroup,
5099 LightApp_Preferences::IntSpin, "SMESH", "area_precision" );
5100 precs[ii ] = addPreference( tr( "SMESH_PREF_vol_precision" ), precGroup,
5101 LightApp_Preferences::IntSpin, "SMESH", "vol_precision" );
5103 // Set property for precision value for spinboxes
5104 for ( ii = 0; ii < nbQuantities; ii++ ){
5105 setPreferenceProperty( precs[ii], "min", -14 );
5106 setPreferenceProperty( precs[ii], "max", 14 );
5107 setPreferenceProperty( precs[ii], "precision", 2 );
5110 int previewGroup = addPreference( tr( "SMESH_PREF_GROUP_PREVIEW" ), genTab );
5111 setPreferenceProperty( previewGroup, "columns", 2 );
5112 int chunkSize = addPreference( tr( "PREF_PREVIEW_CHUNK_SIZE" ), previewGroup, LightApp_Preferences::IntSpin, "SMESH", "preview_actor_chunk_size" );
5113 setPreferenceProperty( chunkSize, "min", 1 );
5114 setPreferenceProperty( chunkSize, "max", 1000 );
5115 setPreferenceProperty( chunkSize, "step", 50 );
5117 int pyDumpGroup = addPreference( tr( "PREF_PYTHON_DUMP" ), genTab );
5118 addPreference( tr( "PREF_HISTORICAL_PYTHON_DUMP" ), pyDumpGroup, LightApp_Preferences::Bool, "SMESH", "historical_python_dump" );
5120 // Mesh tab ------------------------------------------------------------------------
5121 int meshTab = addPreference( tr( "PREF_TAB_MESH" ) );
5122 int nodeGroup = addPreference( tr( "PREF_GROUP_NODES" ), meshTab );
5123 setPreferenceProperty( nodeGroup, "columns", 3 );
5125 addPreference( tr( "PREF_COLOR" ), nodeGroup, LightApp_Preferences::Color, "SMESH", "node_color" );
5127 int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), nodeGroup, LightApp_Preferences::Selector, "SMESH", "type_of_marker" );
5129 SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
5130 QList<QVariant> aMarkerTypeIndicesList;
5131 QList<QVariant> aMarkerTypeIconsList;
5132 for ( int i = VTK::MT_POINT; i < VTK::MT_USER; i++ ) {
5133 QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
5134 QPixmap pixmap = aResourceMgr->loadPixmap( "VTKViewer", tr( qPrintable( icoFile ) ) );
5135 aMarkerTypeIndicesList << i;
5136 aMarkerTypeIconsList << pixmap;
5138 setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
5139 setPreferenceProperty( typeOfMarker, "icons", aMarkerTypeIconsList );
5141 int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), nodeGroup, LightApp_Preferences::Selector, "SMESH", "marker_scale" );
5143 QList<QVariant> aMarkerScaleIndicesList;
5144 QStringList aMarkerScaleValuesList;
5145 for ( int i = VTK::MS_10; i <= VTK::MS_70; i++ ) {
5146 aMarkerScaleIndicesList << i;
5147 aMarkerScaleValuesList << QString::number( (i-(int)VTK::MS_10)*0.5 + 1.0 );
5149 setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
5150 setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
5152 int elemGroup = addPreference( tr( "PREF_GROUP_ELEMENTS" ), meshTab );
5153 //setPreferenceProperty( elemGroup, "columns", 2 );
5155 int ColorId = addPreference( tr( "PREF_FILL" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "fill_color" );
5156 setPreferenceProperty( ColorId, "text", tr("PREF_BACKFACE") );
5157 ColorId = addPreference( tr( "PREF_VOLUME" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "volume_color" );
5158 setPreferenceProperty( ColorId, "text", tr("PREF_REVERSEDVOLUME") );
5159 addPreference( tr( "PREF_COLOR_0D" ), elemGroup, LightApp_Preferences::Color, "SMESH", "elem0d_color" );
5160 addPreference( tr( "PREF_BALL_COLOR" ), elemGroup, LightApp_Preferences::Color, "SMESH", "ball_elem_color" );
5161 addPreference( tr( "PREF_OUTLINE" ), elemGroup, LightApp_Preferences::Color, "SMESH", "outline_color" );
5162 addPreference( tr( "PREF_WIREFRAME" ), elemGroup, LightApp_Preferences::Color, "SMESH", "wireframe_color" );
5163 addPreference( tr( "PREF_PREVIEW_COLOR" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "preview_color" );
5166 int grpGroup = addPreference( tr( "PREF_GROUP_GROUPS" ), meshTab );
5167 setPreferenceProperty( grpGroup, "columns", 2 );
5169 addPreference( tr( "PREF_GRP_NAMES" ), grpGroup, LightApp_Preferences::Color, "SMESH", "group_name_color" );
5170 addPreference( tr( "PREF_GRP_DEF_COLOR" ), grpGroup, LightApp_Preferences::Color, "SMESH", "default_grp_color" );
5172 int size0d = addPreference(tr("PREF_SIZE_0D"), elemGroup,
5173 LightApp_Preferences::IntSpin, "SMESH", "elem0d_size");
5174 /* int ballSize = addPreference(tr("PREF_BALL_SIZE"), elemGroup,
5175 LightApp_Preferences::IntSpin, "SMESH", "ball_elem_size"); */
5176 double ballDiameter = addPreference(tr("PREF_BALL_DIAMETER"), elemGroup,
5177 LightApp_Preferences::DblSpin, "SMESH", "ball_elem_diameter");
5178 double ballScale = addPreference(tr("PREF_BALL_SCALE"), elemGroup,
5179 LightApp_Preferences::DblSpin, "SMESH", "ball_elem_scale");
5180 int elemW = addPreference(tr("PREF_WIDTH"), elemGroup,
5181 LightApp_Preferences::IntSpin, "SMESH", "element_width");
5182 int outW = addPreference(tr("PREF_OUTLINE_WIDTH"), elemGroup,
5183 LightApp_Preferences::IntSpin, "SMESH", "outline_width");
5184 int shrink = addPreference(tr("PREF_SHRINK_COEFF"), elemGroup,
5185 LightApp_Preferences::IntSpin, "SMESH", "shrink_coeff");
5187 setPreferenceProperty( size0d, "min", 1 );
5188 setPreferenceProperty( size0d, "max", 10 );
5190 // setPreferenceProperty( ballSize, "min", 1 );
5191 // setPreferenceProperty( ballSize, "max", 10 );
5193 setPreferenceProperty( ballDiameter, "min", 1e-7 );
5194 setPreferenceProperty( ballDiameter, "max", 1e9 );
5195 setPreferenceProperty( ballDiameter, "step", 0.1 );
5197 setPreferenceProperty( ballScale, "min", 1e-2 );
5198 setPreferenceProperty( ballScale, "max", 1e7 );
5199 setPreferenceProperty( ballScale, "step", 0.5 );
5201 setPreferenceProperty( elemW, "min", 1 );
5202 setPreferenceProperty( elemW, "max", 5 );
5204 setPreferenceProperty( outW, "min", 1 );
5205 setPreferenceProperty( outW, "max", 5 );
5207 setPreferenceProperty( shrink, "min", 0 );
5208 setPreferenceProperty( shrink, "max", 100 );
5210 int numGroup = addPreference( tr( "PREF_GROUP_NUMBERING" ), meshTab );
5211 setPreferenceProperty( numGroup, "columns", 2 );
5213 addPreference( tr( "PREF_NUMBERING_NODE" ), numGroup, LightApp_Preferences::Color, "SMESH", "numbering_node_color" );
5214 addVtkFontPref( tr( "PREF_NUMBERING_FONT" ), numGroup, "numbering_node_font", true );
5216 addPreference( tr( "PREF_NUMBERING_ELEM" ), numGroup, LightApp_Preferences::Color, "SMESH", "numbering_elem_color" );
5217 addVtkFontPref( tr( "PREF_NUMBERING_FONT" ), numGroup, "numbering_elem_font", true );
5219 int orientGroup = addPreference( tr( "PREF_GROUP_FACES_ORIENTATION" ), meshTab );
5220 setPreferenceProperty( orientGroup, "columns", 1 );
5222 addPreference( tr( "PREF_ORIENTATION_COLOR" ), orientGroup, LightApp_Preferences::Color, "SMESH", "orientation_color" );
5223 int orientScale = addPreference( tr( "PREF_ORIENTATION_SCALE" ), orientGroup, LightApp_Preferences::DblSpin, "SMESH", "orientation_scale" );
5225 setPreferenceProperty( orientScale, "min", 0.05 );
5226 setPreferenceProperty( orientScale, "max", 0.5 );
5227 setPreferenceProperty( orientScale, "step", 0.05 );
5229 addPreference( tr( "PREF_ORIENTATION_3D_VECTORS" ), orientGroup, LightApp_Preferences::Bool, "SMESH", "orientation_3d_vectors" );
5231 // Selection tab ------------------------------------------------------------------------
5232 int selTab = addPreference( tr( "PREF_TAB_SELECTION" ) );
5234 int selGroup = addPreference( tr( "PREF_GROUP_SELECTION" ), selTab );
5235 setPreferenceProperty( selGroup, "columns", 2 );
5237 addPreference( tr( "PREF_OBJECT_COLOR" ), selGroup, LightApp_Preferences::Color, "SMESH", "selection_object_color" );
5238 addPreference( tr( "PREF_ELEMENT_COLOR" ), selGroup, LightApp_Preferences::Color, "SMESH", "selection_element_color" );
5240 int preGroup = addPreference( tr( "PREF_GROUP_PRESELECTION" ), selTab );
5241 setPreferenceProperty( preGroup, "columns", 2 );
5243 addPreference( tr( "PREF_HIGHLIGHT_COLOR" ), preGroup, LightApp_Preferences::Color, "SMESH", "highlight_color" );
5245 int precSelGroup = addPreference( tr( "PREF_GROUP_PRECISION" ), selTab );
5246 setPreferenceProperty( precSelGroup, "columns", 2 );
5248 addPreference( tr( "PREF_NODES" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_node" );
5249 addPreference( tr( "PREF_ELEMENTS" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_element" );
5250 addPreference( tr( "PREF_OBJECTS" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_object" );
5252 // Scalar Bar tab ------------------------------------------------------------------------
5253 int sbarTab = addPreference( tr( "SMESH_SCALARBAR" ) );
5254 int fontGr = addPreference( tr( "SMESH_FONT_SCALARBAR" ), sbarTab );
5255 setPreferenceProperty( fontGr, "columns", 2 );
5257 addVtkFontPref( tr( "SMESH_TITLE" ), fontGr, "scalar_bar_title_font" );
5258 addPreference( tr( "PREF_TITLE_COLOR" ), fontGr, LightApp_Preferences::Color, "SMESH", "scalar_bar_title_color" );
5260 addVtkFontPref( tr( "SMESH_LABELS" ), fontGr, "scalar_bar_label_font" );
5261 addPreference( tr( "PREF_LABELS_COLOR" ), fontGr, LightApp_Preferences::Color, "SMESH", "scalar_bar_label_color" );
5263 int colorsLabelsGr = addPreference( tr( "SMESH_LABELS_COLORS_SCALARBAR" ), sbarTab );
5264 setPreferenceProperty( colorsLabelsGr, "columns", 2 );
5266 int numcol = addPreference( tr( "SMESH_NUMBEROFCOLORS" ), colorsLabelsGr, LightApp_Preferences::IntSpin, "SMESH", "scalar_bar_num_colors" );
5267 setPreferenceProperty( numcol, "min", 2 );
5268 setPreferenceProperty( numcol, "max", 256 );
5270 int numlab = addPreference( tr( "SMESH_NUMBEROFLABELS" ), colorsLabelsGr, LightApp_Preferences::IntSpin, "SMESH", "scalar_bar_num_labels" );
5271 setPreferenceProperty( numlab, "min", 2 );
5272 setPreferenceProperty( numlab, "max", 65 );
5274 int orientGr = addPreference( tr( "SMESH_ORIENTATION" ), sbarTab );
5275 setPreferenceProperty( orientGr, "columns", 2 );
5276 int orient = addPreference( tr( "SMESH_ORIENTATION" ), orientGr, LightApp_Preferences::Selector, "SMESH", "scalar_bar_orientation" );
5277 QStringList orients;
5278 orients.append( tr( "SMESH_VERTICAL" ) );
5279 orients.append( tr( "SMESH_HORIZONTAL" ) );
5280 indices.clear(); indices.append( 0 ); indices.append( 1 );
5281 setPreferenceProperty( orient, "strings", orients );
5282 setPreferenceProperty( orient, "indexes", indices );
5284 int posVSizeGr = addPreference( tr( "SMESH_POSITION_SIZE_SCALARBAR" ) + " " + tr( "SMESH_VERTICAL" ), sbarTab );
5285 setPreferenceProperty( posVSizeGr, "columns", 2 );
5286 int xv = addPreference( tr( "SMESH_X_SCALARBAR" ), posVSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_vertical_x" );
5287 int yv = addPreference( tr( "SMESH_Y_SCALARBAR" ), posVSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_vertical_y" );
5288 int wv = addPreference( tr( "SMESH_WIDTH" ), posVSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_vertical_width" );
5289 int hv = addPreference( tr( "SMESH_HEIGHT" ), posVSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_vertical_height" );
5290 setPreferenceProperty( xv, "step", 0.1 );
5291 setPreferenceProperty( xv, "min", 0.0 );
5292 setPreferenceProperty( xv, "max", 1.0 );
5293 setPreferenceProperty( yv, "step", 0.1 );
5294 setPreferenceProperty( yv, "min", 0.0 );
5295 setPreferenceProperty( yv, "max", 1.0 );
5296 setPreferenceProperty( wv, "step", 0.1 );
5297 setPreferenceProperty( wv, "min", 0.0 );
5298 setPreferenceProperty( wv, "max", 1.0 );
5299 setPreferenceProperty( hv, "min", 0.0 );
5300 setPreferenceProperty( hv, "max", 1.0 );
5301 setPreferenceProperty( hv, "step", 0.1 );
5303 int posHSizeGr = addPreference( tr( "SMESH_POSITION_SIZE_SCALARBAR" ) + " " + tr( "SMESH_HORIZONTAL" ), sbarTab );
5304 setPreferenceProperty( posHSizeGr, "columns", 2 );
5305 int xh = addPreference( tr( "SMESH_X_SCALARBAR" ), posHSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_horizontal_x" );
5306 int yh = addPreference( tr( "SMESH_Y_SCALARBAR" ), posHSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_horizontal_y" );
5307 int wh = addPreference( tr( "SMESH_WIDTH" ), posHSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_horizontal_width" );
5308 int hh = addPreference( tr( "SMESH_HEIGHT" ), posHSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_horizontal_height" );
5309 setPreferenceProperty( xv, "min", 0.0 );
5310 setPreferenceProperty( xv, "max", 1.0 );
5311 setPreferenceProperty( xv, "step", 0.1 );
5312 setPreferenceProperty( xh, "min", 0.0 );
5313 setPreferenceProperty( xh, "max", 1.0 );
5314 setPreferenceProperty( xh, "step", 0.1 );
5315 setPreferenceProperty( yh, "min", 0.0 );
5316 setPreferenceProperty( yh, "max", 1.0 );
5317 setPreferenceProperty( yh, "step", 0.1 );
5318 setPreferenceProperty( wh, "min", 0.0 );
5319 setPreferenceProperty( wh, "max", 1.0 );
5320 setPreferenceProperty( wh, "step", 0.1 );
5321 setPreferenceProperty( hh, "min", 0.0 );
5322 setPreferenceProperty( hh, "max", 1.0 );
5323 setPreferenceProperty( hh, "step", 0.1 );
5325 int distributionGr = addPreference( tr( "SMESH_DISTRIBUTION_SCALARBAR" ), sbarTab, LightApp_Preferences::Auto, "SMESH", "distribution_visibility" );
5326 int coloringType = addPreference( tr( "SMESH_DISTRIBUTION_COLORING_TYPE" ), distributionGr, LightApp_Preferences::Selector, "SMESH", "distribution_coloring_type" );
5327 setPreferenceProperty( distributionGr, "columns", 3 );
5329 types.append( tr( "SMESH_MONOCOLOR" ) );
5330 types.append( tr( "SMESH_MULTICOLOR" ) );
5331 indices.clear(); indices.append( 0 ); indices.append( 1 );
5332 setPreferenceProperty( coloringType, "strings", types );
5333 setPreferenceProperty( coloringType, "indexes", indices );
5334 addPreference( tr( "SMESH_DISTRIBUTION_COLOR" ), distributionGr, LightApp_Preferences::Color, "SMESH", "distribution_color" );
5338 void SMESHGUI::preferencesChanged( const QString& sect, const QString& name )
5340 if( sect=="SMESH" ) {
5341 float sbX1,sbY1,sbW,sbH;
5342 float aTol = 1.00000009999999;
5343 std::string aWarning;
5344 SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
5345 if( name=="selection_object_color" || name=="selection_element_color" ||
5346 name=="highlight_color" ||
5347 name=="selection_precision_node" || name=="selection_precision_element" ||
5348 name=="selection_precision_object")
5349 SMESH::UpdateSelectionProp( this );
5350 else if (name == QString("scalar_bar_vertical_x") || name == QString("scalar_bar_vertical_width")){
5351 sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_x", sbX1);
5352 sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_width", sbW);
5353 if(sbX1+sbW > aTol){
5354 aWarning = "Origin and Size Vertical: X+Width > 1\n";
5357 aResourceMgr->setValue("SMESH", "scalar_bar_vertical_x", sbX1);
5358 aResourceMgr->setValue("SMESH", "scalar_bar_vertical_width", sbW);
5361 else if(name == QString("scalar_bar_vertical_y") || name == QString("scalar_bar_vertical_height")){
5362 sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_y", sbY1);
5363 sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_height",sbH);
5364 if(sbY1+sbH > aTol){
5365 aWarning = "Origin and Size Vertical: Y+Height > 1\n";
5366 aResourceMgr->setValue("SMESH", "scalar_bar_vertical_y", sbY1);
5367 aResourceMgr->setValue("SMESH", "scalar_bar_vertical_height",sbH);
5370 else if(name == QString("scalar_bar_horizontal_x") || name == QString("scalar_bar_horizontal_width")){
5371 sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_x", sbX1);
5372 sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_width", sbW);
5373 if(sbX1+sbW > aTol){
5374 aWarning = "Origin and Size Horizontal: X+Width > 1\n";
5377 aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_x", sbX1);
5378 aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_width", sbW);
5381 else if(name == QString("scalar_bar_horizontal_y") || name == QString("scalar_bar_horizontal_height")){
5382 sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_y", sbY1);
5383 sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_height",sbH);
5384 if(sbY1+sbH > aTol){
5385 aWarning = "Origin and Size Horizontal: Y+Height > 1\n";
5388 aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_y", sbY1);
5389 aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_height",sbH);
5392 else if ( name == "segmentation" ) {
5393 int nbSeg = aResourceMgr->integerValue( "SMESH", "segmentation", 10 );
5394 myComponentSMESH->SetBoundaryBoxSegmentation( nbSeg );
5396 else if ( name == "nb_segments_per_edge" ) {
5397 int nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
5398 myComponentSMESH->SetDefaultNbSegments( nbSeg );
5400 else if ( name == "historical_python_dump" ||
5401 name == "forget_mesh_on_hyp_modif") {
5402 QString val = aResourceMgr->stringValue( "SMESH", name );
5403 myComponentSMESH->SetOption( name.toLatin1().constData(), val.toLatin1().constData() );
5405 else if ( name == QString( "numbering_node_color" ) || name == QString( "numbering_node_font" ) ) {
5406 SMESH::UpdateFontProp( this );
5408 else if ( name == QString( "numbering_elem_color" ) || name == QString( "numbering_elem_font" ) ) {
5409 SMESH::UpdateFontProp( this );
5412 if(aWarning.size() != 0){
5413 aWarning += "The default values are applied instead.";
5414 SUIT_MessageBox::warning(SMESHGUI::desktop(),
5415 QObject::tr("SMESH_ERR_SCALARBAR_PARAMS"),
5416 QObject::tr(aWarning.c_str()));
5421 //================================================================================
5423 * \brief Update something in accordance with update flags
5424 * \param theFlags - update flags
5426 * Update viewer or/and object browser etc. in accordance with update flags ( see
5427 * LightApp_UpdateFlags enumeration ).
5429 //================================================================================
5430 void SMESHGUI::update( const int flags )
5432 if ( (flags & UF_Viewer) | (flags & UF_Forced) )
5433 SMESH::UpdateView();
5435 SalomeApp_Module::update( flags );
5438 //================================================================================
5440 * \brief Set default selection mode
5442 * SLOT called when operation commited. Sets default selection mode
5444 //================================================================================
5445 void SMESHGUI::onOperationCommited( SUIT_Operation* )
5447 SVTK_ViewWindow* vtkWnd =
5448 dynamic_cast<SVTK_ViewWindow*>( application()->desktop()->activeWindow() );
5450 vtkWnd->SetSelectionMode( ActorSelection );
5453 //================================================================================
5455 * \brief Set default selection mode
5457 * SLOT called when operation aborted. Sets default selection mode
5459 //================================================================================
5460 void SMESHGUI::onOperationAborted( SUIT_Operation* )
5462 SVTK_ViewWindow* vtkWnd =
5463 dynamic_cast<SVTK_ViewWindow*>( application()->desktop()->activeWindow() );
5465 vtkWnd->SetSelectionMode( ActorSelection );
5468 //================================================================================
5470 * \brief Creates operation with given identifier
5471 * \param id - identifier of operation to be started
5472 * \return Pointer on created operation or NULL if operation is not created
5474 * Virtual method redefined from the base class creates operation with given id.
5475 * It is called called automatically from startOperation method of base class.
5477 //================================================================================
5478 LightApp_Operation* SMESHGUI::createOperation( const int id ) const
5480 LightApp_Operation* op = 0;
5481 // to do : create operation here
5484 case SMESHOp::OpConvertMeshToQuadratic:
5485 op = new SMESHGUI_ConvToQuadOp();
5487 case SMESHOp::OpCreateBoundaryElements: // create 2D mesh as boundary on 3D
5488 op = new SMESHGUI_Make2DFrom3DOp();
5490 case SMESHOp::OpReorientFaces:
5491 op = new SMESHGUI_ReorientFacesOp();
5493 case SMESHOp::OpCreateMesh:
5494 op = new SMESHGUI_MeshOp( true, true );
5496 case SMESHOp::OpCreateSubMesh:
5497 op = new SMESHGUI_MeshOp( true, false );
5499 case SMESHOp::OpEditMeshOrSubMesh:
5500 op = new SMESHGUI_MeshOp( false );
5502 case SMESHOp::OpCompute:
5503 op = new SMESHGUI_ComputeOp();
5505 case SMESHOp::OpPreCompute:
5506 op = new SMESHGUI_PrecomputeOp();
5508 case SMESHOp::OpEvaluate:
5509 op = new SMESHGUI_EvaluateOp();
5511 case SMESHOp::OpMeshOrder:
5512 op = new SMESHGUI_MeshOrderOp();
5514 case SMESHOp::OpCreateGeometryGroup:
5515 op = new SMESHGUI_GroupOnShapeOp();
5517 case SMESHOp::OpFindElementByPoint:
5518 op = new SMESHGUI_FindElemByPointOp();
5520 case SMESHOp::OpMoveNode: // Make mesh pass through point
5521 op = new SMESHGUI_MakeNodeAtPointOp();
5523 case SMESHOp::OpElem0DOnElemNodes: // Create 0D elements on all nodes
5524 op = new SMESHGUI_Add0DElemsOnAllNodesOp();
5531 op = SalomeApp_Module::createOperation( id );
5535 //================================================================================
5537 * \brief Stops current operations and starts a given one
5538 * \param id - The id of the operation to start
5540 //================================================================================
5542 void SMESHGUI::switchToOperation(int id)
5544 if ( _PTR(Study) aStudy = SMESH::GetActiveStudyDocument() )
5545 activeStudy()->abortAllOperations();
5546 startOperation( id );
5549 LightApp_Displayer* SMESHGUI::displayer()
5552 myDisplayer = new SMESHGUI_Displayer( getApp() );
5556 SALOMEDS::Color SMESHGUI::getUniqueColor( const QList<SALOMEDS::Color>& theReservedColors )
5559 int aTolerance = 64;
5560 int anIterations = 0;
5566 if( anIterations % aPeriod == 0 )
5569 if( aTolerance < 1 )
5573 aHue = (int)( 360.0 * rand() / RAND_MAX );
5576 QList<SALOMEDS::Color>::const_iterator it = theReservedColors.constBegin();
5577 QList<SALOMEDS::Color>::const_iterator itEnd = theReservedColors.constEnd();
5578 for( ; it != itEnd; ++it )
5580 SALOMEDS::Color anAutoColor = *it;
5581 QColor aQColor( (int)( anAutoColor.R * 255.0 ), (int)( anAutoColor.G * 255.0 ), (int)( anAutoColor.B * 255.0 ) );
5584 aQColor.getHsv( &h, &s, &v );
5585 if( abs( h - aHue ) < aTolerance )
5597 aColor.setHsv( aHue, 255, 255 );
5599 SALOMEDS::Color aSColor;
5600 aSColor.R = aColor.redF();
5601 aSColor.G = aColor.greenF();
5602 aSColor.B = aColor.blueF();
5607 const char* gSeparator = "_"; // character used to separate parameter names
5608 const char* gDigitsSep = ":"; // character used to separate numeric parameter values (color = r:g:b)
5609 const char* gPathSep = "|"; // character used to separate paths
5612 * \brief Store visual parameters
5614 * This method is called just before the study document is saved.
5615 * Store visual parameters in AttributeParameter attribue(s)
5617 void SMESHGUI::storeVisualParameters (int savePoint)
5620 Kernel_Utils::Localizer loc;
5622 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
5623 if (!appStudy || !appStudy->studyDS())
5625 _PTR(Study) studyDS = appStudy->studyDS();
5627 // componentName is used for encoding of entries when storing them in IParameters
5628 std::string componentName = myComponentSMESH->ComponentDataType();
5629 //_PTR(SComponent) aSComponent = studyDS->FindComponent("SMESH");
5630 //if (!aSComponent) return;
5633 _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
5634 componentName.c_str(),
5636 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
5638 // store map of custom markers
5639 const VTK::MarkerMap& aMarkerMap = myMarkerMap[ studyDS->StudyId() ];
5640 if( !aMarkerMap.empty() )
5642 VTK::MarkerMap::const_iterator anIter = aMarkerMap.begin();
5643 for( ; anIter != aMarkerMap.end(); anIter++ )
5645 int anId = anIter->first;
5646 VTK::MarkerData aMarkerData = anIter->second;
5647 std::string aMarkerFileName = aMarkerData.first;
5648 VTK::MarkerTexture aMarkerTexture = aMarkerData.second;
5649 if( aMarkerTexture.size() < 3 )
5650 continue; // should contain at least width, height and the first value
5652 QString aPropertyName( "texture" );
5653 aPropertyName += gSeparator;
5654 aPropertyName += QString::number( anId );
5656 QString aPropertyValue = aMarkerFileName.c_str();
5657 aPropertyValue += gPathSep;
5659 VTK::MarkerTexture::const_iterator aTextureIter = aMarkerTexture.begin();
5660 ushort aWidth = *aTextureIter++;
5661 ushort aHeight = *aTextureIter++;
5662 aPropertyValue += QString::number( aWidth ); aPropertyValue += gDigitsSep;
5663 aPropertyValue += QString::number( aHeight ); aPropertyValue += gDigitsSep;
5664 for( ; aTextureIter != aMarkerTexture.end(); aTextureIter++ )
5665 aPropertyValue += QString::number( *aTextureIter );
5667 ip->setProperty( aPropertyName.toStdString(), aPropertyValue.toStdString() );
5671 // viewers counters are used for storing view_numbers in IParameters
5674 // main cycle to store parameters of displayed objects
5675 QList<SUIT_ViewManager*> lst;
5676 QList<SUIT_ViewManager*>::Iterator it;
5677 getApp()->viewManagers(lst);
5678 for (it = lst.begin(); it != lst.end(); it++)
5680 SUIT_ViewManager* vman = *it;
5681 QString vType = vman->getType();
5683 // saving VTK actors properties
5684 if (vType == SVTK_Viewer::Type())
5686 // store the clipping planes attached to the view manager
5687 SMESHGUI_ClippingPlaneInfoList aClippingPlaneInfoList;
5688 SMESHGUI_ClippingPlaneInfoMap::const_iterator anIter = myClippingPlaneInfoMap.find( vman );
5689 if( anIter != myClippingPlaneInfoMap.end() )
5690 aClippingPlaneInfoList = anIter->second;
5692 if( !aClippingPlaneInfoList.empty() ) {
5693 SMESHGUI_ClippingPlaneInfoList::const_iterator anIter = aClippingPlaneInfoList.begin();
5694 for( int anId = 0; anIter != aClippingPlaneInfoList.end(); anIter++, anId++ )
5696 const SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter;
5697 SMESH::OrientedPlane* aPlane = aClippingPlaneInfo.Plane;
5699 QString aPropertyName( "ClippingPlane" );
5700 aPropertyName += gSeparator;
5701 aPropertyName += QString::number( vtkViewers );
5702 aPropertyName += gSeparator;
5703 aPropertyName += QString::number( anId );
5705 QString aPropertyValue = QString::number( (int)aPlane->PlaneMode ).toLatin1().constData();
5706 aPropertyValue += gDigitsSep;
5707 aPropertyValue += QString::number( aPlane->IsOpenGLClipping ).toLatin1().constData();
5708 aPropertyValue += gDigitsSep;
5709 if ( aPlane->PlaneMode == SMESH::Absolute ) {
5710 aPropertyValue += QString::number( aPlane->myAbsoluteOrientation ).toLatin1().constData();
5711 aPropertyValue += gDigitsSep;
5712 aPropertyValue += QString::number( aPlane->X ).toLatin1().constData();
5713 aPropertyValue += gDigitsSep;
5714 aPropertyValue += QString::number( aPlane->Y ).toLatin1().constData();
5715 aPropertyValue += gDigitsSep;
5716 aPropertyValue += QString::number( aPlane->Z ).toLatin1().constData();
5717 aPropertyValue += gDigitsSep;
5718 aPropertyValue += QString::number( aPlane->Dx ).toLatin1().constData();
5719 aPropertyValue += gDigitsSep;
5720 aPropertyValue += QString::number( aPlane->Dy ).toLatin1().constData();
5721 aPropertyValue += gDigitsSep;
5722 aPropertyValue += QString::number( aPlane->Dz ).toLatin1().constData();
5724 else if ( aPlane->PlaneMode == SMESH::Relative ) {
5725 aPropertyValue += QString::number( (int)aPlane->myRelativeOrientation ).toLatin1().constData();
5726 aPropertyValue += gDigitsSep;
5727 aPropertyValue += QString::number( aPlane->GetDistance() ).toLatin1().constData();
5728 aPropertyValue += gDigitsSep;
5729 aPropertyValue += QString::number( aPlane->myAngle[0] ).toLatin1().constData();
5730 aPropertyValue += gDigitsSep;
5731 aPropertyValue += QString::number( aPlane->myAngle[1] ).toLatin1().constData();
5734 ip->setProperty( aPropertyName.toStdString(), aPropertyValue.toStdString() );
5738 QVector<SUIT_ViewWindow*> views = vman->getViews();
5739 for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++)
5741 if (SVTK_ViewWindow* vtkView = dynamic_cast<SVTK_ViewWindow*>(views[i]))
5743 VTK::ActorCollectionCopy aCopy(vtkView->getRenderer()->GetActors());
5744 vtkActorCollection* allActors = aCopy.GetActors();
5745 allActors->InitTraversal();
5746 while (vtkActor* actor = allActors->GetNextActor())
5748 if (actor->GetVisibility()) // store only visible actors
5750 SMESH_Actor* aSmeshActor = 0;
5751 if (actor->IsA("SMESH_Actor"))
5752 aSmeshActor = SMESH_Actor::SafeDownCast(actor);
5753 if (aSmeshActor && aSmeshActor->hasIO())
5755 Handle(SALOME_InteractiveObject) io = aSmeshActor->getIO();
5758 // entry is "encoded" = it does NOT contain component adress,
5759 // since it is a subject to change on next component loading
5760 std::string entry = ip->encodeEntry(io->getEntry(), componentName);
5762 std::string param, vtkParam = vType.toLatin1().data();
5763 vtkParam += gSeparator;
5764 vtkParam += QString::number(vtkViewers).toLatin1().data();
5765 vtkParam += gSeparator;
5768 param = vtkParam + "Visibility";
5769 ip->setParameter(entry, param, "On");
5772 param = vtkParam + "Representation";
5773 ip->setParameter(entry, param, QString::number
5774 ((int)aSmeshActor->GetRepresentation()).toLatin1().data());
5777 param = vtkParam + "IsShrunk";
5778 ip->setParameter(entry, param, QString::number
5779 ((int)aSmeshActor->IsShrunk()).toLatin1().data());
5781 // Displayed entities
5782 unsigned int aMode = aSmeshActor->GetEntityMode();
5783 bool isE = aMode & SMESH_Actor::eEdges;
5784 bool isF = aMode & SMESH_Actor::eFaces;
5785 bool isV = aMode & SMESH_Actor::eVolumes;
5786 bool is0d = aMode & SMESH_Actor::e0DElements;
5787 bool isB = aMode & SMESH_Actor::eBallElem;
5789 QString modeStr ("e");
5790 modeStr += gDigitsSep; modeStr += QString::number(isE);
5791 modeStr += gDigitsSep; modeStr += "f";
5792 modeStr += gDigitsSep; modeStr += QString::number(isF);
5793 modeStr += gDigitsSep; modeStr += "v";
5794 modeStr += gDigitsSep; modeStr += QString::number(isV);
5795 modeStr += gDigitsSep; modeStr += "0d";
5796 modeStr += gDigitsSep; modeStr += QString::number(is0d);
5797 modeStr += gDigitsSep; modeStr += "b";
5798 modeStr += gDigitsSep; modeStr += QString::number(isB);
5800 param = vtkParam + "Entities";
5801 ip->setParameter(entry, param, modeStr.toLatin1().data());
5807 aSmeshActor->GetSufaceColor(r, g, b, delta);
5808 QStringList colorStr;
5809 colorStr << "surface";
5810 colorStr << QString::number(r);
5811 colorStr << QString::number(g);
5812 colorStr << QString::number(b);
5814 colorStr << "backsurface";
5815 colorStr << QString::number(delta);
5817 aSmeshActor->GetVolumeColor(r, g, b, delta);
5818 colorStr << "volume";
5819 colorStr << QString::number(r);
5820 colorStr << QString::number(g);
5821 colorStr << QString::number(b);
5822 colorStr << QString::number(delta);
5824 aSmeshActor->GetEdgeColor(r, g, b);
5826 colorStr << QString::number(r);
5827 colorStr << QString::number(g);
5828 colorStr << QString::number(b);
5830 aSmeshActor->GetNodeColor(r, g, b);
5832 colorStr << QString::number(r);
5833 colorStr << QString::number(g);
5834 colorStr << QString::number(b);
5836 aSmeshActor->GetOutlineColor(r, g, b);
5837 colorStr << "outline";
5838 colorStr << QString::number(r);
5839 colorStr << QString::number(g);
5840 colorStr << QString::number(b);
5842 aSmeshActor->Get0DColor(r, g, b);
5843 colorStr << "elem0d";
5844 colorStr << QString::number(r);
5845 colorStr << QString::number(g);
5846 colorStr << QString::number(b);
5848 aSmeshActor->GetBallColor(r, g, b);
5850 colorStr << QString::number(r);
5851 colorStr << QString::number(g);
5852 colorStr << QString::number(b);
5854 aSmeshActor->GetFacesOrientationColor(r, g, b);
5855 colorStr << "orientation";
5856 colorStr << QString::number(r);
5857 colorStr << QString::number(g);
5858 colorStr << QString::number(b);
5860 param = vtkParam + "Colors";
5861 ip->setParameter(entry, param, qPrintable(colorStr.join(gDigitsSep)));
5864 QStringList sizeStr;
5866 sizeStr << QString::number((int)aSmeshActor->GetLineWidth());
5867 sizeStr << "outline";
5868 sizeStr << QString::number((int)aSmeshActor->GetOutlineWidth());
5869 sizeStr << "elem0d";
5870 sizeStr << QString::number((int)aSmeshActor->Get0DSize());
5872 //sizeStr << QString::number((int)aSmeshActor->GetBallSize());
5873 sizeStr << QString::number((double)aSmeshActor->GetBallSize());
5874 sizeStr << QString::number((double)aSmeshActor->GetBallScale());
5875 sizeStr << "shrink";
5876 sizeStr << QString::number(aSmeshActor->GetShrinkFactor());
5877 sizeStr << "orientation";
5878 sizeStr << QString::number(aSmeshActor->GetFacesOrientationScale());
5879 sizeStr << QString::number(aSmeshActor->GetFacesOrientation3DVectors());
5881 param = vtkParam + "Sizes";
5882 ip->setParameter(entry, param, qPrintable(sizeStr.join(gDigitsSep)));
5887 VTK::MarkerType aMarkerType = aSmeshActor->GetMarkerType();
5888 if( aMarkerType == VTK::MT_USER ) {
5889 markerStr += "custom";
5890 markerStr += gDigitsSep;
5891 markerStr += QString::number( aSmeshActor->GetMarkerTexture() );
5895 markerStr += gDigitsSep;
5896 markerStr += QString::number( (int)aMarkerType );
5897 markerStr += gDigitsSep;
5898 markerStr += QString::number( (int)aSmeshActor->GetMarkerScale() );
5901 param = vtkParam + "PointMarker";
5902 ip->setParameter(entry, param, markerStr.toLatin1().data());
5905 param = vtkParam + "Opacity";
5906 ip->setParameter(entry, param,
5907 QString::number(aSmeshActor->GetOpacity()).toLatin1().data());
5910 param = vtkParam + "ClippingPlane";
5912 if( !aClippingPlaneInfoList.empty() ) {
5913 SMESHGUI_ClippingPlaneInfoList::const_iterator anIter1 = aClippingPlaneInfoList.begin();
5914 for( int anId = 0; anIter1 != aClippingPlaneInfoList.end(); anIter1++, anId++ )
5916 const SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter1;
5917 std::list<vtkActor*> anActorList = aClippingPlaneInfo.ActorList;
5918 SMESH::TActorList::iterator anIter2 = anActorList.begin();
5919 for ( ; anIter2 != anActorList.end(); anIter2++ ) {
5920 if( aSmeshActor == *anIter2 ) {
5921 ip->setParameter( entry, param + QString::number( ++aPlaneId ).toLatin1().constData(),
5922 QString::number( anId ).toLatin1().constData() );
5929 ip->setParameter( entry, param, "Off" );
5930 } // if (io->hasEntry())
5931 } // SMESH_Actor && hasIO
5933 } // while.. actors traversal
5937 } // if (SVTK view model)
5938 } // for (viewManagers)
5941 // data structures for clipping planes processing
5945 bool isOpenGLClipping;
5946 vtkIdType RelativeOrientation;
5949 int AbsoluteOrientation;
5950 double X, Y, Z, Dx, Dy, Dz;
5952 typedef std::list<TPlaneData> TPlaneDataList;
5953 typedef std::map<int, TPlaneDataList> TPlaneDataMap;
5955 typedef std::list<vtkActor*> TActorList;
5958 TActorList ActorList;
5959 SUIT_ViewManager* ViewManager;
5961 typedef std::list<TPlaneInfo> TPlaneInfoList;
5962 typedef std::map<int, TPlaneInfoList> TPlaneInfoMap;
5965 * \brief Restore visual parameters
5967 * This method is called after the study document is opened.
5968 * Restore visual parameters from AttributeParameter attribue(s)
5970 void SMESHGUI::restoreVisualParameters (int savePoint)
5973 Kernel_Utils::Localizer loc;
5975 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
5976 if (!appStudy || !appStudy->studyDS())
5978 _PTR(Study) studyDS = appStudy->studyDS();
5980 // componentName is used for encoding of entries when storing them in IParameters
5981 std::string componentName = myComponentSMESH->ComponentDataType();
5982 //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
5983 //if (!aSComponent) return;
5986 _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
5987 componentName.c_str(),
5989 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
5991 // restore map of custom markers and map of clipping planes
5992 VTK::MarkerMap& aMarkerMap = myMarkerMap[ studyDS->StudyId() ];
5993 TPlaneDataMap aPlaneDataMap;
5995 std::vector<std::string> properties = ip->getProperties();
5996 for (std::vector<std::string>::iterator propIt = properties.begin(); propIt != properties.end(); ++propIt)
5998 std::string property = *propIt;
5999 QString aPropertyName( property.c_str() );
6000 QString aPropertyValue( ip->getProperty( property ).c_str() );
6002 QStringList aPropertyNameList = aPropertyName.split( gSeparator, QString::SkipEmptyParts );
6003 if( aPropertyNameList.isEmpty() )
6006 QString aPropertyType = aPropertyNameList[0];
6007 if( aPropertyType == "texture" )
6009 if( aPropertyNameList.size() != 2 )
6013 int anId = aPropertyNameList[1].toInt( &ok );
6014 if( !ok || anId < 1 )
6017 QStringList aPropertyValueList = aPropertyValue.split( gPathSep, QString::SkipEmptyParts );
6018 if( aPropertyValueList.size() != 2 )
6021 std::string aMarkerFileName = aPropertyValueList[0].toStdString();
6022 QString aMarkerTextureString = aPropertyValueList[1];
6023 QStringList aMarkerTextureStringList = aMarkerTextureString.split( gDigitsSep, QString::SkipEmptyParts );
6024 if( aMarkerTextureStringList.size() != 3 )
6028 ushort aWidth = aMarkerTextureStringList[0].toUShort( &ok );
6033 ushort aHeight = aMarkerTextureStringList[1].toUShort( &ok );
6037 VTK::MarkerTexture aMarkerTexture;
6038 aMarkerTexture.push_back( aWidth );
6039 aMarkerTexture.push_back( aHeight );
6041 QString aMarkerTextureData = aMarkerTextureStringList[2];
6042 for( int i = 0, n = aMarkerTextureData.length(); i < n; i++ )
6044 QChar aChar = aMarkerTextureData.at( i );
6045 if( aChar.isDigit() )
6046 aMarkerTexture.push_back( aChar.digitValue() );
6049 aMarkerMap[ anId ] = VTK::MarkerData( aMarkerFileName, aMarkerTexture );
6051 else if( aPropertyType == "ClippingPlane" )
6053 if( aPropertyNameList.size() != 3 )
6057 int aViewId = aPropertyNameList[1].toInt( &ok );
6058 if( !ok || aViewId < 0 )
6062 int aClippingPlaneId = aPropertyNameList[2].toInt( &ok );
6063 if( !ok || aClippingPlaneId < 0 )
6066 QStringList aPropertyValueList = aPropertyValue.split( gDigitsSep, QString::SkipEmptyParts );
6067 if( aPropertyValueList.size() != 6 && aPropertyValueList.size() != 9 )
6070 TPlaneData aPlaneData;
6071 aPlaneData.Id = aClippingPlaneId;
6074 aPlaneData.Mode = aPropertyValueList[0].toInt( &ok );
6079 aPlaneData.isOpenGLClipping = aPropertyValueList[1].toInt( &ok );
6083 if ( (SMESH::Mode)aPlaneData.Mode == SMESH::Absolute )
6086 aPlaneData.AbsoluteOrientation = aPropertyValueList[2].toInt( &ok );
6091 aPlaneData.X = aPropertyValueList[3].toDouble( &ok );
6096 aPlaneData.Y = aPropertyValueList[4].toDouble( &ok );
6101 aPlaneData.Z = aPropertyValueList[5].toDouble( &ok );
6106 aPlaneData.Dx = aPropertyValueList[6].toDouble( &ok );
6111 aPlaneData.Dy = aPropertyValueList[7].toDouble( &ok );
6116 aPlaneData.Dz = aPropertyValueList[8].toDouble( &ok );
6120 else if ( (SMESH::Mode)aPlaneData.Mode == SMESH::Relative ) {
6122 aPlaneData.RelativeOrientation = aPropertyValueList[2].toInt( &ok );
6127 aPlaneData.Distance = aPropertyValueList[3].toDouble( &ok );
6132 aPlaneData.Angle[0] = aPropertyValueList[4].toDouble( &ok );
6137 aPlaneData.Angle[1] = aPropertyValueList[5].toDouble( &ok );
6142 TPlaneDataList& aPlaneDataList = aPlaneDataMap[ aViewId ];
6143 aPlaneDataList.push_back( aPlaneData );
6147 TPlaneInfoMap aPlaneInfoMap;
6149 std::vector<std::string> entries = ip->getEntries();
6151 for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
6153 // entry is a normal entry - it should be "decoded" (setting base adress of component)
6154 QString entry (ip->decodeEntry(*entIt).c_str());
6156 // Check that the entry corresponds to a real object in the Study
6157 // as the object may be deleted or modified after the visual state is saved.
6158 _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
6159 if (!so) continue; //Skip the not existent entry
6161 std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
6162 std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
6164 std::vector<std::string>::iterator namesIt = paramNames.begin();
6165 std::vector<std::string>::iterator valuesIt = paramValues.begin();
6167 // actors are stored in a map after displaying of them for
6168 // quicker access in the future: map < viewID to actor >
6169 NCollection_DataMap<int, SMESH_Actor*> vtkActors;
6171 for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
6173 // visual parameters are stored in strings as follows: ViewerType_ViewIndex_ParamName.
6174 // '_' is used as separator and should not be used in viewer type or parameter names.
6175 QStringList lst = QString((*namesIt).c_str()).split(gSeparator, QString::SkipEmptyParts);
6176 if (lst.size() != 3)
6179 QString viewerTypStr = lst[0];
6180 QString viewIndexStr = lst[1];
6181 QString paramNameStr = lst[2];
6184 int viewIndex = viewIndexStr.toUInt(&ok);
6185 if (!ok) // bad conversion of view index to integer
6189 if (viewerTypStr == SVTK_Viewer::Type())
6191 SMESH_Actor* aSmeshActor = 0;
6192 if (vtkActors.IsBound(viewIndex))
6193 aSmeshActor = vtkActors.Find(viewIndex);
6195 QList<SUIT_ViewManager*> lst;
6196 getApp()->viewManagers(viewerTypStr, lst);
6198 // SVTK ViewManager always has 1 ViewWindow, so view index is index of view manager
6199 SUIT_ViewManager* vman = NULL;
6200 if (viewIndex >= 0 && viewIndex < lst.count())
6201 vman = lst.at(viewIndex);
6203 if (paramNameStr == "Visibility")
6205 if (!aSmeshActor && displayer() && vman)
6207 SUIT_ViewModel* vmodel = vman->getViewModel();
6208 // SVTK view model can be casted to SALOME_View
6209 displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
6211 // store displayed actor in a temporary map for quicker
6212 // access later when restoring other parameters
6213 SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) vman->getActiveView();
6214 vtkRenderer* Renderer = vtkView->getRenderer();
6215 VTK::ActorCollectionCopy aCopy(Renderer->GetActors());
6216 vtkActorCollection* theActors = aCopy.GetActors();
6217 theActors->InitTraversal();
6218 bool isFound = false;
6219 vtkActor *ac = theActors->GetNextActor();
6220 for (; ac != NULL && !isFound; ac = theActors->GetNextActor()) {
6221 if (ac->IsA("SMESH_Actor")) {
6222 SMESH_Actor* aGeomAc = SMESH_Actor::SafeDownCast(ac);
6223 if (aGeomAc->hasIO()) {
6224 Handle(SALOME_InteractiveObject) io =
6225 Handle(SALOME_InteractiveObject)::DownCast(aGeomAc->getIO());
6226 if (io->hasEntry() && strcmp(io->getEntry(), entry.toLatin1().data()) == 0) {
6228 vtkActors.Bind(viewIndex, aGeomAc);
6234 } // if (paramNameStr == "Visibility")
6237 // the rest properties "work" with SMESH_Actor
6240 QString val ((*valuesIt).c_str());
6243 if (paramNameStr == "Representation") {
6244 aSmeshActor->SetRepresentation((SMESH_Actor::EReperesent)val.toInt());
6247 else if (paramNameStr == "IsShrunk") {
6249 if (!aSmeshActor->IsShrunk())
6250 aSmeshActor->SetShrink();
6253 if (aSmeshActor->IsShrunk())
6254 aSmeshActor->UnShrink();
6257 // Displayed entities
6258 else if (paramNameStr == "Entities") {
6259 QStringList mode = val.split(gDigitsSep, QString::SkipEmptyParts);
6260 int aEntityMode = SMESH_Actor::eAllEntity;
6261 for ( int i = 0; i < mode.count(); i+=2 ) {
6262 if ( i < mode.count()-1 ) {
6263 QString type = mode[i];
6264 bool val = mode[i+1].toInt();
6265 if ( type == "e" && !val )
6266 aEntityMode = aEntityMode & ~SMESH_Actor::eEdges;
6267 else if ( type == "f" && !val )
6268 aEntityMode = aEntityMode & ~SMESH_Actor::eFaces;
6269 else if ( type == "v" && !val )
6270 aEntityMode = aEntityMode & ~SMESH_Actor::eVolumes;
6271 else if ( type == "0d" && !val )
6272 aEntityMode = aEntityMode & ~SMESH_Actor::e0DElements;
6273 else if ( type == "b" && !val )
6274 aEntityMode = aEntityMode & ~SMESH_Actor::eBallElem;
6277 aSmeshActor->SetEntityMode( aEntityMode );
6280 else if (paramNameStr == "Colors") {
6281 QStringList colors = val.split(gDigitsSep, QString::SkipEmptyParts);
6288 QColor outlineColor;
6289 QColor orientationColor;
6295 // below lines are required to get default values for delta coefficients
6296 // of backface color for faces and color of reversed volumes
6297 SMESH::GetColor( "SMESH", "fill_color", c, deltaF, "0,170,255|-100" );
6298 SMESH::GetColor( "SMESH", "volume_color", c, deltaV, "255,0,170|-100" );
6299 for ( int i = 0; i < colors.count(); i++ ) {
6300 QString type = colors[i];
6301 if ( type == "surface" ) {
6302 // face color is set by 3 values r:g:b, where
6303 // - r,g,b - is rgb color components
6304 if ( i+1 >= colors.count() ) break; // format error
6305 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6306 if ( i+2 >= colors.count() ) break; // format error
6307 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6308 if ( i+3 >= colors.count() ) break; // format error
6309 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6310 faceColor.setRgbF( r, g, b );
6313 else if ( type == "backsurface" ) {
6314 // backface color can be defined in several ways
6315 // - in old versions, it is set as rgb triple r:g:b - this was is unsupported now
6316 // - in latest versions, it is set as delta coefficient
6317 bool rgbOk = false, deltaOk;
6318 if ( i+1 >= colors.count() ) break; // format error
6319 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6320 int delta = colors[i+1].toInt( &deltaOk );
6322 if ( i+1 < colors.count() ) // index is shifted to 1
6323 g = colors[i+1].toDouble( &rgbOk );
6324 if ( rgbOk ) i++; // shift index
6325 if ( rgbOk && i+1 < colors.count() ) // index is shifted to 2
6326 b = colors[i+1].toDouble( &rgbOk );
6328 // - as currently there's no way to set directly backsurface color as it was before,
6329 // we ignore old dump where r,g,b triple was set
6330 // - also we check that delta parameter is set properly
6331 if ( !rgbOk && deltaOk )
6334 else if ( type == "volume" ) {
6335 // volume color is set by 4 values r:g:b:delta, where
6336 // - r,g,b - is a normal volume rgb color components
6337 // - delta - is a reversed volume color delta coefficient
6338 if ( i+1 >= colors.count() ) break; // format error
6339 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6340 if ( i+2 >= colors.count() ) break; // format error
6341 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6342 if ( i+3 >= colors.count() ) break; // format error
6343 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6344 if ( i+4 >= colors.count() ) break; // format error
6345 int delta = colors[i+4].toInt( &bOk );
6346 if ( !bOk ) break; // format error
6347 volumeColor.setRgbF( r, g, b );
6351 else if ( type == "edge" ) {
6352 // edge color is set by 3 values r:g:b, where
6353 // - r,g,b - is rgb color components
6354 if ( i+1 >= colors.count() ) break; // format error
6355 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6356 if ( i+2 >= colors.count() ) break; // format error
6357 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6358 if ( i+3 >= colors.count() ) break; // format error
6359 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6360 edgeColor.setRgbF( r, g, b );
6363 else if ( type == "node" ) {
6364 // node color is set by 3 values r:g:b, where
6365 // - r,g,b - is rgb color components
6366 if ( i+1 >= colors.count() ) break; // format error
6367 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6368 if ( i+2 >= colors.count() ) break; // format error
6369 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6370 if ( i+3 >= colors.count() ) break; // format error
6371 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6372 nodeColor.setRgbF( r, g, b );
6375 else if ( type == "elem0d" ) {
6376 // 0d element color is set by 3 values r:g:b, where
6377 // - r,g,b - is rgb color components
6378 if ( i+1 >= colors.count() ) break; // format error
6379 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6380 if ( i+2 >= colors.count() ) break; // format error
6381 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6382 if ( i+3 >= colors.count() ) break; // format error
6383 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6384 elem0dColor.setRgbF( r, g, b );
6387 else if ( type == "ball" ) {
6388 // ball color is set by 3 values r:g:b, where
6389 // - r,g,b - is rgb color components
6390 if ( i+1 >= colors.count() ) break; // format error
6391 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6392 if ( i+2 >= colors.count() ) break; // format error
6393 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6394 if ( i+3 >= colors.count() ) break; // format error
6395 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6396 ballColor.setRgbF( r, g, b );
6399 else if ( type == "outline" ) {
6400 // outline color is set by 3 values r:g:b, where
6401 // - r,g,b - is rgb color components
6402 if ( i+1 >= colors.count() ) break; // format error
6403 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6404 if ( i+2 >= colors.count() ) break; // format error
6405 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6406 if ( i+3 >= colors.count() ) break; // format error
6407 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6408 outlineColor.setRgbF( r, g, b );
6411 else if ( type == "orientation" ) {
6412 // orientation color is set by 3 values r:g:b, where
6413 // - r,g,b - is rgb color components
6414 if ( i+1 >= colors.count() ) break; // format error
6415 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6416 if ( i+2 >= colors.count() ) break; // format error
6417 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6418 if ( i+3 >= colors.count() ) break; // format error
6419 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6420 orientationColor.setRgbF( r, g, b );
6425 if ( nodeColor.isValid() )
6426 aSmeshActor->SetNodeColor( nodeColor.redF(), nodeColor.greenF(), nodeColor.blueF() );
6428 if ( edgeColor.isValid() )
6429 aSmeshActor->SetEdgeColor( edgeColor.redF(), edgeColor.greenF(), edgeColor.blueF() );
6431 if ( faceColor.isValid() )
6432 aSmeshActor->SetSufaceColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF );
6434 if ( volumeColor.isValid() )
6435 aSmeshActor->SetVolumeColor( volumeColor.redF(), volumeColor.greenF(), volumeColor.blueF(), deltaV );
6436 else if ( faceColor.isValid() ) // backward compatibility (no separate color for volumes)
6437 aSmeshActor->SetVolumeColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF );
6439 if ( elem0dColor.isValid() )
6440 aSmeshActor->Set0DColor( elem0dColor.redF(), elem0dColor.greenF(), elem0dColor.blueF() );
6442 if ( ballColor.isValid() )
6443 aSmeshActor->SetBallColor( ballColor.redF(), ballColor.greenF(), ballColor.blueF() );
6445 if ( outlineColor.isValid() )
6446 aSmeshActor->SetOutlineColor( outlineColor.redF(), outlineColor.greenF(), outlineColor.blueF() );
6447 // orientation color
6448 if ( orientationColor.isValid() )
6449 aSmeshActor->SetFacesOrientationColor( orientationColor.redF(), orientationColor.greenF(), orientationColor.blueF() );
6452 else if (paramNameStr == "Sizes") {
6453 QStringList sizes = val.split(gDigitsSep, QString::SkipEmptyParts);
6456 int outlineWidth = -1;
6457 int elem0dSize = -1;
6458 //int ballSize = -1;
6459 double ballDiameter = -1.0;
6460 double ballScale = -1.0;
6461 double shrinkSize = -1;
6462 double orientationSize = -1;
6463 bool orientation3d = false;
6464 for ( int i = 0; i < sizes.count(); i++ ) {
6465 QString type = sizes[i];
6466 if ( type == "line" ) {
6467 // line (wireframe) width is given as single integer value
6468 if ( i+1 >= sizes.count() ) break; // format error
6469 int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
6473 if ( type == "outline" ) {
6474 // outline width is given as single integer value
6475 if ( i+1 >= sizes.count() ) break; // format error
6476 int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
6480 else if ( type == "elem0d" ) {
6481 // 0d element size is given as single integer value
6482 if ( i+1 >= sizes.count() ) break; // format error
6483 int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
6487 else if ( type == "ball" ) {
6488 // balls are specified by two values: size:scale, where
6489 // - size - is a integer value specifying size
6490 // - scale - is a double value specifying scale factor
6491 if ( i+1 >= sizes.count() ) break; // format error
6492 //int v1 = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
6493 double v1 = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
6494 if ( i+2 >= sizes.count() ) break; // format error
6495 double v2 = sizes[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6501 else if ( type == "shrink" ) {
6502 // shrink factor is given as single floating point value
6503 if ( i+1 >= sizes.count() ) break; // format error
6504 double v = sizes[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6508 else if ( type == "orientation" ) {
6509 // orientation vectors are specified by two values size:3d, where
6510 // - size - is a floating point value specifying scale factor
6511 // - 3d - is a boolean
6512 if ( i+1 >= sizes.count() ) break; // format error
6513 double v1 = sizes[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6514 if ( i+2 >= sizes.count() ) break; // format error
6515 int v2 = sizes[i+2].toInt( &bOk ); if ( !bOk ) break; // format error
6516 orientationSize = v1;
6517 orientation3d = (bool)v2;
6521 // line (wireframe) width
6522 if ( lineWidth > 0 )
6523 aSmeshActor->SetLineWidth( lineWidth );
6525 if ( outlineWidth > 0 )
6526 aSmeshActor->SetOutlineWidth( outlineWidth );
6527 else if ( lineWidth > 0 ) // backward compatibility (no separate width for outlines)
6528 aSmeshActor->SetOutlineWidth( lineWidth );
6530 if ( elem0dSize > 0 )
6531 aSmeshActor->Set0DSize( elem0dSize );
6533 /*if ( ballSize > 0 )
6534 aSmeshActor->SetBallSize( ballSize );*/
6536 if ( ballDiameter > 0 )
6537 aSmeshActor->SetBallSize( ballDiameter );
6539 if ( ballScale > 0.0 )
6540 aSmeshActor->SetBallScale( ballScale );
6542 if ( shrinkSize > 0 )
6543 aSmeshActor->SetShrinkFactor( shrinkSize );
6544 // orientation vectors
6545 if ( orientationSize > 0 ) {
6546 aSmeshActor->SetFacesOrientationScale( orientationSize );
6547 aSmeshActor->SetFacesOrientation3DVectors( orientation3d );
6551 else if (paramNameStr == "PointMarker") {
6552 QStringList data = val.split(gDigitsSep, QString::SkipEmptyParts);
6553 if( data.count() >= 2 ) {
6555 int aParam1 = data[1].toInt( &ok );
6557 if( data[0] == "std" && data.count() == 3 ) {
6558 int aParam2 = data[2].toInt( &ok );
6559 aSmeshActor->SetMarkerStd( (VTK::MarkerType)aParam1, (VTK::MarkerScale)aParam2 );
6561 else if( data[0] == "custom" ) {
6562 VTK::MarkerMap::const_iterator markerIt = aMarkerMap.find( aParam1 );
6563 if( markerIt != aMarkerMap.end() ) {
6564 VTK::MarkerData aMarkerData = markerIt->second;
6565 aSmeshActor->SetMarkerTexture( aParam1, aMarkerData.second );
6572 else if (paramNameStr == "Opacity") {
6573 aSmeshActor->SetOpacity(val.toFloat());
6576 else if (paramNameStr.startsWith("ClippingPlane")) {
6577 QStringList vals = val.split(gDigitsSep, QString::SkipEmptyParts);
6578 // old format - val looks like "Off" or "1:0:0:0.5:0:0"
6579 // (mode(relative), is OpenGL clipping plane, orientation, distance, two angles)
6580 // or "0:1:1:10.5:1.0:1.0:15.0:10.0:10.0"
6581 // (mode(absolute), is OpenGL clipping plane, orientation, base point(x, y, z), direction (dx, dy, dz))
6582 // new format - val looks like "Off" or "0" (plane id)
6583 // (note: in new format "Off" value is used only for consistency,
6584 // so it is processed together with values in old format)
6585 bool anIsOldFormat = ( vals.count() == 6 || vals.count() == 9 || val == "Off" );
6586 if( anIsOldFormat ) {
6587 if (paramNameStr == "ClippingPlane1" || val == "Off")
6588 aSmeshActor->RemoveAllClippingPlanes();
6590 QList<SUIT_ViewManager*> lst;
6591 getApp()->viewManagers(viewerTypStr, lst);
6592 // SVTK ViewManager always has 1 ViewWindow, so view index is index of view manager
6593 if (viewIndex >= 0 && viewIndex < lst.count()) {
6594 SUIT_ViewManager* vman = lst.at(viewIndex);
6595 SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) vman->getActiveView();
6597 SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = myClippingPlaneInfoMap[ vman ];
6599 SMESH::TActorList anActorList;
6600 anActorList.push_back( aSmeshActor );
6601 SMESH::OrientedPlane* aPlane = SMESH::OrientedPlane::New( vtkView );
6602 aPlane->myViewWindow = vtkView;
6603 SMESH::Mode aMode = ( SMESH::Mode )vals[0].toInt();
6604 aPlane->PlaneMode = aMode;
6605 bool isOpenGLClipping = ( bool )vals[1].toInt();
6606 aPlane->IsOpenGLClipping = isOpenGLClipping;
6607 if ( aMode == SMESH::Absolute ) {
6608 aPlane->myAbsoluteOrientation = vals[2].toInt();
6609 aPlane->X = vals[3].toFloat();
6610 aPlane->Y = vals[4].toFloat();
6611 aPlane->Z = vals[5].toFloat();
6612 aPlane->Dx = vals[6].toFloat();
6613 aPlane->Dy = vals[7].toFloat();
6614 aPlane->Dz = vals[8].toFloat();
6616 else if ( aMode == SMESH::Relative ) {
6617 aPlane->myRelativeOrientation = (SMESH::Orientation)vals[2].toInt();
6618 aPlane->myDistance = vals[3].toFloat();
6619 aPlane->myAngle[0] = vals[4].toFloat();
6620 aPlane->myAngle[1] = vals[5].toFloat();
6624 if ( SMESHGUI_ClippingDlg::AddPlane( anActorList, aPlane ) ) {
6625 SMESH::ClippingPlaneInfo aClippingPlaneInfo;
6626 aClippingPlaneInfo.Plane = aPlane;
6627 aClippingPlaneInfo.ActorList = anActorList;
6628 aClippingPlaneInfoList.push_back( aClippingPlaneInfo );
6636 int aPlaneId = val.toInt( &ok );
6637 if( ok && aPlaneId >= 0 ) {
6638 bool anIsDefinedPlane = false;
6639 TPlaneInfoList& aPlaneInfoList = aPlaneInfoMap[ viewIndex ];
6640 TPlaneInfoList::iterator anIter = aPlaneInfoList.begin();
6641 for( ; anIter != aPlaneInfoList.end(); anIter++ ) {
6642 TPlaneInfo& aPlaneInfo = *anIter;
6643 if( aPlaneInfo.PlaneId == aPlaneId ) {
6644 aPlaneInfo.ActorList.push_back( aSmeshActor );
6645 anIsDefinedPlane = true;
6649 if( !anIsDefinedPlane ) {
6650 TPlaneInfo aPlaneInfo;
6651 aPlaneInfo.PlaneId = aPlaneId;
6652 aPlaneInfo.ActorList.push_back( aSmeshActor );
6653 aPlaneInfo.ViewManager = vman;
6655 // to make the list sorted by plane id
6656 anIter = aPlaneInfoList.begin();
6657 for( ; anIter != aPlaneInfoList.end(); anIter++ ) {
6658 const TPlaneInfo& aPlaneInfoRef = *anIter;
6659 if( aPlaneInfoRef.PlaneId > aPlaneId )
6662 aPlaneInfoList.insert( anIter, aPlaneInfo );
6667 } // if (aSmeshActor)
6668 } // other parameters than Visibility
6670 } // for names/parameters iterator
6671 } // for entries iterator
6673 // take into account planes with empty list of actors referred to them
6674 QList<SUIT_ViewManager*> aVMList;
6675 getApp()->viewManagers(SVTK_Viewer::Type(), aVMList);
6677 TPlaneDataMap::const_iterator aPlaneDataIter = aPlaneDataMap.begin();
6678 for( ; aPlaneDataIter != aPlaneDataMap.end(); aPlaneDataIter++ ) {
6679 int aViewId = aPlaneDataIter->first;
6680 if( aViewId >= 0 && aViewId < aVMList.count() ) {
6681 SUIT_ViewManager* aViewManager = aVMList.at( aViewId );
6683 const TPlaneDataList& aPlaneDataList = aPlaneDataIter->second;
6685 TPlaneInfoList& aPlaneInfoList = aPlaneInfoMap[ aViewId ];
6686 TPlaneDataList::const_iterator anIter2 = aPlaneDataList.begin();
6687 for( ; anIter2 != aPlaneDataList.end(); anIter2++ ) {
6688 const TPlaneData& aPlaneData = *anIter2;
6689 int aPlaneId = aPlaneData.Id;
6691 bool anIsFound = false;
6692 TPlaneInfoList::const_iterator anIter3 = aPlaneInfoList.begin();
6693 for( ; anIter3 != aPlaneInfoList.end(); anIter3++ ) {
6694 const TPlaneInfo& aPlaneInfo = *anIter3;
6695 if( aPlaneInfo.PlaneId == aPlaneId ) {
6702 TPlaneInfo aPlaneInfo; // ActorList field is empty
6703 aPlaneInfo.PlaneId = aPlaneId;
6704 aPlaneInfo.ViewManager = aViewManager;
6706 // to make the list sorted by plane id
6707 TPlaneInfoList::iterator anIter4 = aPlaneInfoList.begin();
6708 for( ; anIter4 != aPlaneInfoList.end(); anIter4++ ) {
6709 const TPlaneInfo& aPlaneInfoRef = *anIter4;
6710 if( aPlaneInfoRef.PlaneId > aPlaneId )
6713 aPlaneInfoList.insert( anIter4, aPlaneInfo );
6719 // add clipping planes to actors according to the restored parameters
6720 // and update the clipping plane map
6721 TPlaneInfoMap::const_iterator anIter1 = aPlaneInfoMap.begin();
6722 for( ; anIter1 != aPlaneInfoMap.end(); anIter1++ ) {
6723 int aViewId = anIter1->first;
6724 const TPlaneInfoList& aPlaneInfoList = anIter1->second;
6726 TPlaneDataMap::const_iterator anIter2 = aPlaneDataMap.find( aViewId );
6727 if( anIter2 == aPlaneDataMap.end() )
6729 const TPlaneDataList& aPlaneDataList = anIter2->second;
6731 TPlaneInfoList::const_iterator anIter3 = aPlaneInfoList.begin();
6732 for( ; anIter3 != aPlaneInfoList.end(); anIter3++ ) {
6733 const TPlaneInfo& aPlaneInfo = *anIter3;
6734 int aPlaneId = aPlaneInfo.PlaneId;
6735 const TActorList& anActorList = aPlaneInfo.ActorList;
6736 SUIT_ViewManager* aViewManager = aPlaneInfo.ViewManager;
6740 SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>( aViewManager->getActiveView() );
6744 SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = myClippingPlaneInfoMap[ aViewManager ];
6746 TPlaneDataList::const_iterator anIter4 = aPlaneDataList.begin();
6747 for( ; anIter4 != aPlaneDataList.end(); anIter4++ ) {
6748 const TPlaneData& aPlaneData = *anIter4;
6749 if( aPlaneData.Id == aPlaneId ) {
6750 SMESH::OrientedPlane* aPlane = SMESH::OrientedPlane::New( aViewWindow );
6751 aPlane->myViewWindow = aViewWindow;
6752 aPlane->PlaneMode = (SMESH::Mode)aPlaneData.Mode;
6753 aPlane->IsOpenGLClipping = aPlaneData.isOpenGLClipping;
6754 if ( aPlane->PlaneMode == SMESH::Absolute ) {
6755 aPlane->myAbsoluteOrientation = aPlaneData.AbsoluteOrientation;
6756 aPlane->X = aPlaneData.X;
6757 aPlane->Y = aPlaneData.Y;
6758 aPlane->Z = aPlaneData.Z;
6759 aPlane->Dx = aPlaneData.Dx;
6760 aPlane->Dy = aPlaneData.Dy;
6761 aPlane->Dz = aPlaneData.Dz;
6763 else if ( aPlane->PlaneMode == SMESH::Relative ) {
6764 aPlane->myRelativeOrientation = (SMESH::Orientation)aPlaneData.RelativeOrientation;
6765 aPlane->myDistance = aPlaneData.Distance;
6766 aPlane->myAngle[0] = aPlaneData.Angle[0];
6767 aPlane->myAngle[1] = aPlaneData.Angle[1];
6770 if ( SMESHGUI_ClippingDlg::AddPlane( anActorList, aPlane ) ) {
6771 SMESH::ClippingPlaneInfo aClippingPlaneInfo;
6772 aClippingPlaneInfo.Plane = aPlane;
6773 aClippingPlaneInfo.ActorList = anActorList;
6774 aClippingPlaneInfoList.push_back( aClippingPlaneInfo );
6785 // update all VTK views
6786 QList<SUIT_ViewManager*> lst;
6787 getApp()->viewManagers(lst);
6788 for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
6789 SUIT_ViewModel* vmodel = (*it)->getViewModel();
6790 if (vmodel && vmodel->getType() == SVTK_Viewer::Type()) {
6791 SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
6792 // set OpenGL clipping planes
6793 VTK::ActorCollectionCopy aCopy( vtkView->getRenderer()->GetActors() );
6794 vtkActorCollection* anAllActors = aCopy.GetActors();
6795 anAllActors->InitTraversal();
6796 while( vtkActor* aVTKActor = anAllActors->GetNextActor() )
6797 if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) )
6798 anActor->SetOpenGLClippingPlane();
6800 vtkView->getRenderer()->ResetCameraClippingRange();
6807 \brief Adds preferences for dfont of VTK viewer
6809 \param pIf group identifier
6810 \param param parameter
6811 \return identifier of preferences
6813 int SMESHGUI::addVtkFontPref( const QString& label, const int pId, const QString& param, const bool needSize )
6815 int tfont = addPreference( label, pId, LightApp_Preferences::Font, "SMESH", param );
6817 setPreferenceProperty( tfont, "mode", QtxFontEdit::Custom );
6820 fam.append( tr( "SMESH_FONT_ARIAL" ) );
6821 fam.append( tr( "SMESH_FONT_COURIER" ) );
6822 fam.append( tr( "SMESH_FONT_TIMES" ) );
6824 setPreferenceProperty( tfont, "fonts", fam );
6826 int f = QtxFontEdit::Family | QtxFontEdit::Bold | QtxFontEdit::Italic | QtxFontEdit::Shadow;
6827 if ( needSize ) f = f | QtxFontEdit::Size;
6828 setPreferenceProperty( tfont, "features", f );
6834 \brief Actions after hypothesis edition
6835 Updates object browser after hypothesis edition
6837 void SMESHGUI::onHypothesisEdit( int result )
6840 SMESHGUI::Modified();
6841 updateObjBrowser( true );
6846 \brief Signal handler closing(SUIT_ViewWindow*) of a view
6847 \param pview view being closed
6849 void SMESHGUI::onViewClosed( SUIT_ViewWindow* pview ) {
6850 #ifndef DISABLE_PLOT2DVIEWER
6851 //Crear all Plot2d Viewers if need.
6852 SMESH::ClearPlot2Viewers(pview);
6854 EmitSignalCloseView();
6857 void SMESHGUI::message( const QString& msg )
6860 QStringList data = msg.split("/");
6861 if ( data.count() > 0 ) {
6862 if ( data.first() == "mesh_loading" ) {
6864 QString entry = data.count() > 1 ? data[1] : QString();
6865 if ( entry.isEmpty() )
6868 _PTR(Study) study = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() )->studyDS();
6870 _PTR(SObject) obj = study->FindObjectID( entry.toLatin1().constData() );
6873 name = SMESH::fromUtf8(obj->GetName());
6874 if ( name.isEmpty() )
6877 if ( data.last() == "stop" )
6878 application()->putInfo( tr( "MESH_LOADING_MSG_FINISHED" ).arg( name ) );
6880 application()->putInfo( tr( "MESH_LOADING_MSG" ).arg( name ) );
6881 QApplication::processEvents();
6887 \brief Connects or disconnects signals about activating and cloning view on the module slots
6888 \param pview view which is connected/disconnected
6890 void SMESHGUI::connectView( const SUIT_ViewWindow* pview ) {
6894 SUIT_ViewManager* viewMgr = pview->getViewManager();
6896 disconnect( viewMgr, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
6897 this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) );
6899 connect( viewMgr, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
6900 this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) );
6905 \brief Return \c true if object can be renamed
6907 bool SMESHGUI::renameAllowed( const QString& entry) const {
6908 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
6912 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
6916 SalomeApp_DataObject* obj = dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry));
6921 if(appStudy->isComponent(entry) || obj->isReference())
6924 // check type to prevent renaming of inappropriate objects
6925 int aType = SMESHGUI_Selection::type(qPrintable(entry), SMESH::GetActiveStudyDocument());
6926 if (aType == SMESH::MESH || aType == SMESH::GROUP ||
6927 aType == SMESH::SUBMESH || aType == SMESH::SUBMESH_COMPOUND ||
6928 aType == SMESH::SUBMESH_SOLID || aType == SMESH::SUBMESH_FACE ||
6929 aType == SMESH::SUBMESH_EDGE || aType == SMESH::SUBMESH_VERTEX ||
6930 aType == SMESH::HYPOTHESIS || aType == SMESH::ALGORITHM)
6937 Rename object by entry.
6938 \param entry entry of the object
6939 \param name new name of the object
6940 \brief Return \c true if rename operation finished successfully, \c false otherwise.
6942 bool SMESHGUI::renameObject( const QString& entry, const QString& name) {
6944 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
6948 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
6953 _PTR(Study) aStudy = appStudy->studyDS();
6958 bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
6960 SUIT_MessageBox::warning ( anApp->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
6965 _PTR(SObject) obj = aStudy->FindObjectID( qPrintable(entry) );
6966 _PTR(GenericAttribute) anAttr;
6967 _PTR(AttributeName) aName;
6969 if ( obj->FindAttribute(anAttr, "AttributeName") ) {
6971 // check type to prevent renaming of inappropriate objects
6972 int aType = SMESHGUI_Selection::type( qPrintable(entry), SMESH::GetActiveStudyDocument() );
6973 if (aType == SMESH::MESH || aType == SMESH::GROUP ||
6974 aType == SMESH::SUBMESH || aType == SMESH::SUBMESH_COMPOUND ||
6975 aType == SMESH::SUBMESH_SOLID || aType == SMESH::SUBMESH_FACE ||
6976 aType == SMESH::SUBMESH_EDGE || aType == SMESH::SUBMESH_VERTEX ||
6977 aType == SMESH::HYPOTHESIS || aType == SMESH::ALGORITHM) {
6978 if ( !name.isEmpty() ) {
6979 SMESHGUI::GetSMESHGen()->SetName(obj->GetIOR().c_str(), qPrintable(name) );
6981 // update name of group object and its actor
6982 Handle(SALOME_InteractiveObject) IObject =
6983 new SALOME_InteractiveObject ( qPrintable(entry), "SMESH", qPrintable(name) );
6985 SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
6986 if( !aGroupObject->_is_nil() ) {
6987 aGroupObject->SetName( qPrintable(name) );
6988 if ( SMESH_Actor *anActor = SMESH::FindActorByEntry( qPrintable(entry) ) )
6989 anActor->setName( qPrintable(name) );
6999 SALOMEDS::Color SMESHGUI::getPredefinedUniqueColor()
7001 static QList<QColor> colors;
7003 if ( colors.isEmpty() ) {
7005 for (int s = 0; s < 2 ; s++)
7007 for (int v = 100; v >= 40; v = v - 20)
7009 for (int h = 0; h < 359 ; h = h + 60)
7011 colors.append(QColor::fromHsv(h, 255 - s * 127, v * 255 / 100));
7016 static int currentColor = randomize( colors.size() );
7018 SALOMEDS::Color color;
7019 color.R = (double)colors[currentColor].red() / 255.0;
7020 color.G = (double)colors[currentColor].green() / 255.0;
7021 color.B = (double)colors[currentColor].blue() / 255.0;
7023 currentColor = (currentColor+1) % colors.count();