1 // Copyright (C) 2007-2016 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_OffsetDlg.h"
78 #include "SMESHGUI_Selection.h"
79 #include "SMESHGUI_SewingDlg.h"
80 #include "SMESHGUI_SingleEditDlg.h"
81 #include "SMESHGUI_SmoothingDlg.h"
82 #include "SMESHGUI_SymmetryDlg.h"
83 #include "SMESHGUI_TranslationDlg.h"
84 #include "SMESHGUI_TransparencyDlg.h"
85 #include "SMESHGUI_DisplayEntitiesDlg.h"
86 #include "SMESHGUI_SplitBiQuad.h"
88 #include "SMESHGUI_FilterUtils.h"
89 #include "SMESHGUI_GEOMGenUtils.h"
90 #include "SMESHGUI_GroupUtils.h"
91 #include "SMESHGUI_HypothesesUtils.h"
92 #include "SMESHGUI_MeshUtils.h"
93 #include "SMESHGUI_PatternUtils.h"
94 #include "SMESHGUI_Utils.h"
95 #include "SMESHGUI_VTKUtils.h"
97 #include "SMESH_version.h"
99 #include "SMESH_ControlsDef.hxx"
100 #include "SMESH_Actor.h"
101 #include "SMESH_ActorUtils.h"
102 #include "SMESH_Client.hxx"
103 #include "SMESH_ScalarBarActor.h"
104 #include "SMESH_TypeFilter.hxx"
106 // SALOME GUI includes
107 #include <SalomeApp_Application.h>
108 #include <SalomeApp_CheckFileDlg.h>
109 #include <SalomeApp_DataObject.h>
110 #include <SalomeApp_Study.h>
111 #include <SalomeApp_Tools.h>
113 #include <LightApp_DataOwner.h>
114 #include <LightApp_NameDlg.h>
115 #include <LightApp_Preferences.h>
116 #include <LightApp_SelectionMgr.h>
117 #include <LightApp_UpdateFlags.h>
119 #include <SVTK_ViewManager.h>
120 #include <SVTK_ViewModel.h>
121 #include <SVTK_ViewWindow.h>
123 #include <VTKViewer_Algorithm.h>
125 #include <SUIT_Desktop.h>
126 #include <SUIT_FileDlg.h>
127 #include <SUIT_MessageBox.h>
128 #include <SUIT_OverrideCursor.h>
129 #include <SUIT_ResourceMgr.h>
130 #include <SUIT_Session.h>
132 #include <QtxPopupMgr.h>
133 #include <QtxFontEdit.h>
135 #include <SALOME_ListIO.hxx>
137 #ifndef DISABLE_PLOT2DVIEWER
138 #include <SPlot2d_ViewModel.h>
139 #include <SPlot2d_Histogram.h>
143 #include <SALOMEconfig.h>
144 #include CORBA_CLIENT_HEADER(SALOMEDS_Attributes)
145 #include CORBA_CLIENT_HEADER(SMESH_MeshEditor)
146 #include CORBA_CLIENT_HEADER(SMESH_Measurements)
147 #include CORBA_CLIENT_HEADER(SMESH_Mesh)
150 // #define INCLUDE_MENUITEM_DEF // VSR commented ????????
151 #include <QApplication>
153 #include <QTextStream>
158 #include <QDialogButtonBox>
161 #include <boost/shared_ptr.hpp>
164 #include <vtkCallbackCommand.h>
165 #include <vtkCamera.h>
166 #include <vtkLookupTable.h>
167 #include <vtkPlane.h>
168 #include <vtkRenderer.h>
170 // SALOME KERNEL includes
171 #include <SALOMEDSClient_ClientFactory.hxx>
172 #include <SALOMEDSClient_IParameters.hxx>
173 #include <SALOMEDSClient_SComponent.hxx>
174 #include <SALOMEDSClient_StudyBuilder.hxx>
175 #include <SALOMEDS_Study.hxx>
176 #include <SALOMEDS_SObject.hxx>
177 #include "utilities.h"
180 #include <Standard_ErrorHandler.hxx>
181 #include <NCollection_DataMap.hxx>
182 #include <NCollection_DoubleMap.hxx>
184 #include <Basics_Utils.hxx>
186 // Below macro, when uncommented, switches on simplified (more performant) algorithm
187 // of auto-color picking up
188 #define SIMPLE_AUTOCOLOR
193 //=============================================================
194 void ImportMeshesFromFile(SMESH::SMESH_Gen_ptr theComponentMesh,
197 void ExportMeshToFile(int theCommandID);
199 void SetDisplayMode(int theCommandID, VTK::MarkerMap& theMarkerMap);
201 void SetDisplayEntity(int theCommandID);
203 int ActionToControl( int theID, bool theReversed = false );
205 void Control( int theCommandID );
208 //================================================================================
210 * \brief Reads meshes from file
212 //================================================================================
214 void ImportMeshesFromFile( SMESH::SMESH_Gen_ptr theComponentMesh,
218 std::string myExtension;
220 if ( theCommandID == SMESHOp::OpImportMED ||
221 theCommandID == SMESHOp::OpPopupImportMED ) {
222 filter.append( QObject::tr( "MED_FILES_FILTER" ) + " (*.*med)" );
223 filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" );
225 else if ( theCommandID == SMESHOp::OpImportUNV ||
226 theCommandID == SMESHOp::OpPopupImportUNV ) {
227 filter.append( QObject::tr( "IDEAS_FILES_FILTER" ) + " (*.unv)" );
229 else if ( theCommandID == SMESHOp::OpImportDAT ||
230 theCommandID == SMESHOp::OpPopupImportDAT ) {
231 filter.append( QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)" );
233 else if ( theCommandID == SMESHOp::OpImportSTL ||
234 theCommandID == SMESHOp::OpPopupImportSTL ) {
235 filter.append( QObject::tr( "STL_FILES_FILTER" ) + " (*.stl)" );
237 else if ( theCommandID == SMESHOp::OpImportCGNS ||
238 theCommandID == SMESHOp::OpPopupImportCGNS ) {
239 filter.append( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" );
241 else if ( theCommandID == SMESHOp::OpImportSAUV ||
242 theCommandID == SMESHOp::OpPopupImportSAUV ) {
243 filter.append( QObject::tr( "SAUV_FILES_FILTER" ) + " (*.sauv *.sauve)" );
244 filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" );
246 else if ( theCommandID == SMESHOp::OpImportGMF ||
247 theCommandID == SMESHOp::OpPopupImportGMF ) {
248 filter.append( QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)" );
249 filter.append( QObject::tr( "GMF_BINARY_FILES_FILTER") + " (*.meshb)" );
252 QString anInitialPath = "";
253 if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
254 anInitialPath = QDir::currentPath();
256 QStringList filenames;
257 bool toCreateGroups = true;
259 // if ( theCommandID == SMESHOp::OpImportGMF ) { // GMF
260 // SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg
261 // ( SMESHGUI::desktop(), true, QObject::tr("SMESH_REQUIRED_GROUPS"), true, true );
262 // fd->setWindowTitle( QObject::tr( "SMESH_IMPORT_MESH" ) );
263 // fd->setNameFilters( filter );
264 // fd->SetChecked( true );
266 // filenames << fd->selectedFile();
267 // toCreateGroups = fd->IsChecked();
273 filenames = SUIT_FileDlg::getOpenFileNames( SMESHGUI::desktop(),
276 QObject::tr( "SMESH_IMPORT_MESH" ) );
278 if ( filenames.count() > 0 )
280 SUIT_OverrideCursor wc;
281 _PTR(Study) aStudy = SMESH::getStudy();
284 QStringList anEntryList;
285 bool isEmpty = false;
286 for ( QStringList::ConstIterator it = filenames.begin(); it != filenames.end(); ++it )
288 QString filename = *it;
289 SMESH::mesh_array_var aMeshes = new SMESH::mesh_array;
291 switch ( theCommandID ) {
292 case SMESHOp::OpImportDAT:
293 case SMESHOp::OpPopupImportDAT:
295 // DAT format (currently unsupported)
296 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
297 arg( QObject::tr( "SMESH_ERR_NOT_SUPPORTED_FORMAT" ) ) );
300 case SMESHOp::OpImportUNV:
301 case SMESHOp::OpPopupImportUNV:
304 aMeshes->length( 1 );
305 aMeshes[0] = theComponentMesh->CreateMeshesFromUNV( filename.toUtf8().constData() );
306 if ( aMeshes[0]->_is_nil() )
307 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
308 arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) );
311 case SMESHOp::OpImportMED:
312 case SMESHOp::OpPopupImportMED:
315 SMESH::DriverMED_ReadStatus res;
316 aMeshes = theComponentMesh->CreateMeshesFromMED( filename.toUtf8().constData(), res );
317 if ( res != SMESH::DRS_OK ) {
318 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
319 arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) );
323 case SMESHOp::OpImportSTL:
324 case SMESHOp::OpPopupImportSTL:
327 aMeshes->length( 1 );
328 aMeshes[0] = theComponentMesh->CreateMeshesFromSTL( filename.toUtf8().constData() );
329 if ( aMeshes[0]->_is_nil() ) {
330 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
331 arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) );
335 case SMESHOp::OpImportCGNS:
336 case SMESHOp::OpPopupImportCGNS:
339 SMESH::DriverMED_ReadStatus res;
340 aMeshes = theComponentMesh->CreateMeshesFromCGNS( filename.toUtf8().constData(), res );
341 if ( res != SMESH::DRS_OK ) {
342 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
343 arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) );
347 case SMESHOp::OpImportSAUV:
348 case SMESHOp::OpPopupImportSAUV:
351 SMESH::DriverMED_ReadStatus res;
352 aMeshes = theComponentMesh->CreateMeshesFromSAUV( filename.toUtf8().constData(), res );
353 if ( res != SMESH::DRS_OK ) {
354 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
355 arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) );
359 case SMESHOp::OpImportGMF:
360 case SMESHOp::OpPopupImportGMF:
363 SMESH::ComputeError_var res;
364 aMeshes->length( 1 );
365 aMeshes[0] = theComponentMesh->CreateMeshesFromGMF( filename.toUtf8().constData(),
368 if ( res->code != SMESH::DRS_OK ) {
369 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
370 arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res->code ).toLatin1().data() ) ) );
371 if ( strlen( res->comment.in() ) > 0 ) {
372 errors.back() += ": ";
373 errors.back() += res->comment.in();
380 catch ( const SALOME::SALOME_Exception& S_ex ) {
381 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
382 arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) );
385 for ( int i = 0, iEnd = aMeshes->length(); i < iEnd; i++ )
387 _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshes[i] );
389 _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
390 _PTR(AttributePixMap) aPixmap = aBuilder->FindOrCreateAttribute( aMeshSO, "AttributePixMap" );
391 aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_IMPORTED" );
392 if ( theCommandID == SMESHOp::OpImportUNV ) // mesh names aren't taken from the file for UNV import
393 SMESH::SetName( aMeshSO, QFileInfo(filename).fileName() );
395 anEntryList.append( aMeshSO->GetID().c_str() );
403 // update Object browser
404 SMESHGUI::GetSMESHGUI()->updateObjBrowser();
406 // browse to the published meshes
407 if( LightApp_Application* anApp =
408 dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
409 anApp->browseObjects( anEntryList );
411 // show Error message box if there were errors
412 if ( errors.count() > 0 ) {
413 SUIT_MessageBox::critical( SMESHGUI::desktop(),
414 QObject::tr( "SMESH_ERROR" ),
415 QObject::tr( "SMESH_IMPORT_ERRORS" ) + "\n" + errors.join( "\n" ) );
418 // show warning message box, if some imported mesh is empty
420 SUIT_MessageBox::warning( SMESHGUI::desktop(),
421 QObject::tr( "SMESH_WRN_WARNING" ),
422 QObject::tr( "SMESH_DRS_SOME_EMPTY" ) );
427 //================================================================================
429 * \brief Export selected meshes or groups into a file
431 //================================================================================
433 void ExportMeshToFile( int theCommandID )
435 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
436 SALOME_ListIO selected;
438 aSel->selectedObjects( selected );
440 const bool isDAT = ( theCommandID == SMESHOp::OpExportDAT ||
441 theCommandID == SMESHOp::OpPopupExportDAT );
442 const bool isMED = ( theCommandID == SMESHOp::OpExportMED ||
443 theCommandID == SMESHOp::OpPopupExportMED );
444 const bool isUNV = ( theCommandID == SMESHOp::OpExportUNV ||
445 theCommandID == SMESHOp::OpPopupExportUNV );
446 const bool isSTL = ( theCommandID == SMESHOp::OpExportSTL ||
447 theCommandID == SMESHOp::OpPopupExportSTL );
448 const bool isCGNS= ( theCommandID == SMESHOp::OpExportCGNS ||
449 theCommandID == SMESHOp::OpPopupExportCGNS );
450 const bool isSAUV= ( theCommandID == SMESHOp::OpExportSAUV ||
451 theCommandID == SMESHOp::OpPopupExportSAUV );
452 const bool isGMF = ( theCommandID == SMESHOp::OpExportGMF ||
453 theCommandID == SMESHOp::OpPopupExportGMF );
455 const bool multiMeshSupported = ( isMED || isCGNS ); // file can hold several meshes
456 if ( selected.Extent() == 0 || ( selected.Extent() > 1 && !multiMeshSupported ))
458 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
459 bool aCheckWarn = true;
461 aCheckWarn = resMgr->booleanValue( "SMESH", "show_warning", false );
462 // get mesh object from selection and check duplication of their names
463 bool hasDuplicatedMeshNames = false;
464 QList< QPair< SMESH::SMESH_IDSource_var, QString > > aMeshList;
465 QList< QPair< SMESH::SMESH_IDSource_var, QString > >::iterator aMeshIter;
466 SALOME_ListIteratorOfListIO It( selected );
467 for( ; It.More(); It.Next() )
469 Handle(SALOME_InteractiveObject) anIObject = It.Value();
470 SMESH::SMESH_IDSource_var aMeshItem =
471 SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(anIObject);
472 if ( aMeshItem->_is_nil() ) {
473 SUIT_MessageBox::warning( SMESHGUI::desktop(),
474 QObject::tr( "SMESH_WRN_WARNING" ),
475 QObject::tr( "SMESH_BAD_MESH_SELECTION" ));
478 SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( aMeshItem );
479 if ( aCheckWarn && !aGroup->_is_nil() )
481 QMessageBox msgBox(SUIT_MessageBox::Warning,
482 QObject::tr("SMESH_WRN_WARNING"),
483 QObject::tr("SMESH_EXPORT_ONLY_GPOUP"),
484 QMessageBox::StandardButton::NoButton,
485 SMESHGUI::desktop());
486 QCheckBox dontShowCheckBox(QObject::tr("SMESH_WRN_SHOW_DLG_CHECKBOX"));
487 msgBox.addButton(QMessageBox::Ok);
488 msgBox.addButton(QMessageBox::Cancel);
489 msgBox.setDefaultButton(QMessageBox::Cancel);
490 QGridLayout* lt = qobject_cast<QGridLayout*>(msgBox.layout());
491 QDialogButtonBox* btnbox = msgBox.findChild<QDialogButtonBox*>();
492 lt->addWidget(&dontShowCheckBox, lt->rowCount(), lt->columnCount()-1, lt->rowCount(), lt->columnCount());
493 lt->addWidget(btnbox, lt->rowCount(), 0, lt->rowCount(), lt->columnCount());
494 if(msgBox.exec() == QMessageBox::Ok)
496 if(dontShowCheckBox.checkState() == Qt::Checked)
499 resMgr->setValue( "SMESH", "show_warning", false);
507 QString aMeshName = anIObject->getName();
509 // check for name duplications
510 if ( !hasDuplicatedMeshNames )
511 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
512 if( aMeshName == (*aMeshIter).second ) {
513 hasDuplicatedMeshNames = true;
518 aMeshList.append( QPair< SMESH::SMESH_IDSource_var, QString >( aMeshItem, aMeshName ) );
521 if( hasDuplicatedMeshNames && isMED ) {
522 int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
523 QObject::tr("SMESH_WRN_WARNING"),
524 QObject::tr("SMESH_EXPORT_MED_DUPLICATED_MESH_NAMES"),
525 QObject::tr("SMESH_BUT_YES"),
526 QObject::tr("SMESH_BUT_NO"), 0, 1);
531 aMeshIter = aMeshList.begin();
532 SMESH::SMESH_IDSource_var aMeshOrGroup = (*aMeshIter).first;
533 SMESH::SMESH_Mesh_var aMesh = aMeshOrGroup->GetMesh();
534 QString aMeshName = (*aMeshIter).second;
536 if ( isMED || isCGNS || isSAUV ) // formats where group names must be unique
538 // check for equal group names within each mesh
539 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
540 SMESH::SMESH_Mesh_var aMeshItem = SMESH::SMESH_Mesh::_narrow( (*aMeshIter).first );
541 if ( !aMeshItem->_is_nil() && aMeshItem->HasDuplicatedGroupNamesMED()) {
542 int aRet = SUIT_MessageBox::warning
543 (SMESHGUI::desktop(),
544 QObject::tr("SMESH_WRN_WARNING"),
545 QObject::tr("SMESH_EXPORT_MED_DUPLICATED_GRP").arg((*aMeshIter).second),
546 QObject::tr("SMESH_BUT_YES"),
547 QObject::tr("SMESH_BUT_NO"), 0, 1);
554 // Warn the user about presence of not supported elements
556 std::vector< SMESH::EntityType > notSupportedElemTypes, presentNotSupported;
560 notSupportedElemTypes.push_back( SMESH::Entity_0D );
561 notSupportedElemTypes.push_back( SMESH::Entity_Ball );
566 notSupportedElemTypes.push_back( SMESH::Entity_Polygon );
567 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polygon );
568 notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra );
569 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polyhedra );
570 notSupportedElemTypes.push_back( SMESH::Entity_Pyramid );
571 notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism );
572 notSupportedElemTypes.push_back( SMESH::Entity_0D );
573 notSupportedElemTypes.push_back( SMESH::Entity_Ball );
578 notSupportedElemTypes.push_back( SMESH::Entity_Edge );
579 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Edge );
580 notSupportedElemTypes.push_back( SMESH::Entity_0D );
581 notSupportedElemTypes.push_back( SMESH::Entity_Ball );
586 notSupportedElemTypes.push_back( SMESH::Entity_Ball );
591 notSupportedElemTypes.push_back( SMESH::Entity_Ball );
592 notSupportedElemTypes.push_back( SMESH::Entity_BiQuad_Triangle );
593 notSupportedElemTypes.push_back( SMESH::Entity_BiQuad_Quadrangle );
594 notSupportedElemTypes.push_back( SMESH::Entity_TriQuad_Hexa );
595 notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism );
596 notSupportedElemTypes.push_back( SMESH::Entity_Polygon );
597 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polygon );
598 notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra );
603 notSupportedElemTypes.push_back( SMESH::Entity_0D );
604 notSupportedElemTypes.push_back( SMESH::Entity_Polygon );
605 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polygon );
606 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Pyramid );
607 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Penta );
608 notSupportedElemTypes.push_back( SMESH::Entity_BiQuad_Penta );
609 notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism );
610 notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra );
611 notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polyhedra );
612 notSupportedElemTypes.push_back( SMESH::Entity_Ball );
614 if ( ! notSupportedElemTypes.empty() )
616 SMESH::long_array_var nbElems = aMeshOrGroup->GetMeshInfo();
617 for ( size_t iType = 0; iType < notSupportedElemTypes.size(); ++iType )
618 if ( nbElems[ notSupportedElemTypes[ iType ]] > 0 )
619 presentNotSupported.push_back( notSupportedElemTypes[ iType ]);
621 if ( !presentNotSupported.empty() )
624 const char* typeMsg[] = {
625 "SMESH_NODES", "SMESH_ELEMS0D","SMESH_EDGES","SMESH_QUADRATIC_EDGES",
626 "SMESH_TRIANGLES", "SMESH_QUADRATIC_TRIANGLES", "SMESH_BIQUADRATIC_TRIANGLES",
627 "SMESH_QUADRANGLES","SMESH_QUADRATIC_QUADRANGLES", "SMESH_BIQUADRATIC_QUADRANGLES",
628 "SMESH_POLYGONS","SMESH_QUADRATIC_POLYGONS",
629 "SMESH_TETRAHEDRA","SMESH_QUADRATIC_TETRAHEDRONS","SMESH_PYRAMIDS",
630 "SMESH_QUADRATIC_PYRAMIDS","SMESH_HEXAHEDRA","SMESH_QUADRATIC_HEXAHEDRONS",
631 "SMESH_TRIQUADRATIC_HEXAHEDRONS","SMESH_PENTAHEDRA","SMESH_QUADRATIC_PENTAHEDRONS",
632 "SMESH_BIQUADRATIC_PENTAHEDRONS",
633 "SMESH_OCTAHEDRA","SMESH_POLYEDRONS","SMESH_QUADRATIC_POLYEDRONS","SMESH_BALLS"
635 // is typeMsg complete? (compilation failure mains that enum SMDSAbs_EntityType changed)
636 const int nbTypes = sizeof( typeMsg ) / sizeof( const char* );
637 int _assert[( nbTypes == SMESH::Entity_Last ) ? 2 : -1 ]; _assert[0]=_assert[1]=0;
639 QString andStr = " " + QObject::tr("SMESH_AND") + " ", comma(", ");
640 for ( size_t iType = 0; iType < presentNotSupported.size(); ++iType ) {
641 typeNames += QObject::tr( typeMsg[ presentNotSupported[ iType ]]);
642 if ( iType != presentNotSupported.size() - 1 )
643 typeNames += ( iType == presentNotSupported.size() - 2 ) ? andStr : comma;
645 int aRet = SUIT_MessageBox::warning
646 (SMESHGUI::desktop(),
647 QObject::tr("SMESH_WRN_WARNING"),
648 QObject::tr("EXPORT_NOT_SUPPORTED").arg(aMeshName).arg(format).arg(typeNames),
649 QObject::tr("SMESH_BUT_YES"),
650 QObject::tr("SMESH_BUT_NO"), 0, 1);
655 // Get parameters of export operation
658 int aFormat =-1; // for MED minor versions
659 bool isOkToWrite = true; // to check MED file version compatibility before adding a mesh in an existing file
661 // Init the parameters with the default values
662 bool aIsASCII_STL = true;
663 bool toCreateGroups = false;
665 toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false );
666 bool toOverwrite = true;
667 bool toFindOutDim = true;
669 QString aFilter, aTitle = QObject::tr("SMESH_EXPORT_MESH");
670 QString anInitialPath = "";
671 if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
672 anInitialPath = QDir::currentPath();
674 QList< QPair< GEOM::ListOfFields_var, QString > > aFieldList;
676 // Get a file name to write in and additional otions
677 if ( isUNV || isDAT || isGMF ) // Export w/o options
680 aFilter = QObject::tr( "IDEAS_FILES_FILTER" ) + " (*.unv)";
682 aFilter = QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)";
684 aFilter = QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)" +
685 ";;" + QObject::tr( "GMF_BINARY_FILES_FILTER" ) + " (*.meshb)";
686 if ( anInitialPath.isEmpty() ) anInitialPath = SUIT_FileDlg::getLastVisitedPath();
687 aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(),
688 anInitialPath + QString("/") + aMeshName,
689 aFilter, aTitle, false);
691 else if ( isCGNS )// Export to CGNS
693 const char* theByTypeResource = "cgns_group_elems_by_type";
694 toCreateGroups = SMESHGUI::resourceMgr()->booleanValue( "SMESH", theByTypeResource, false );
696 QStringList checkBoxes;
697 checkBoxes << QObject::tr("CGNS_EXPORT_ELEMS_BY_TYPE");
699 SalomeApp_CheckFileDlg* fd =
700 new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true );
701 fd->setWindowTitle( aTitle );
702 fd->setNameFilter( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" );
703 if ( !anInitialPath.isEmpty() )
704 fd->setDirectory( anInitialPath );
705 fd->selectFile(aMeshName);
706 SMESHGUI_FileValidator* fv = new SMESHGUI_FileValidator( fd );
707 fd->setValidator( fv );
708 fd->SetChecked( toCreateGroups, 0 );
711 aFilename = fd->selectedFile();
712 toOverwrite = fv->isOverwrite(aFilename);
713 toCreateGroups = fd->IsChecked(0);
714 SMESHGUI::resourceMgr()->setValue("SMESH", theByTypeResource, toCreateGroups );
718 else if ( isSTL ) // Export to STL
720 QMap<QString, int> aFilterMap;
721 aFilterMap.insert( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)", 1 );
722 aFilterMap.insert( QObject::tr( "STL_BIN_FILES_FILTER" ) + " (*.stl)", 0 );
725 QMap<QString, int>::const_iterator it = aFilterMap.begin();
726 for ( ; it != aFilterMap.end(); ++it )
727 filters.push_back( it.key() );
729 SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
730 fd->setWindowTitle( aTitle );
731 fd->setNameFilters( filters );
732 fd->selectNameFilter( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)" );
733 if ( !anInitialPath.isEmpty() )
734 fd->setDirectory( anInitialPath );
735 fd->selectFile(aMeshName);
739 aFilename = fd->selectedFile();
740 aIsASCII_STL = (aFilterMap[fd->selectedNameFilter()]) == 1 ? true: false;
745 else if ( isMED || isSAUV ) // Export to MED or SAUV
747 QMap<QString, int> aFilterMap;
749 //filters << QObject::tr( "MED_FILES_FILTER" ) + " (*.med)";
750 QString vmed (aMesh->GetVersionString(-1, 2));
751 //MESSAGE("MED version: " << vmed.toStdString());
752 int minor = vmed.split(".").last().toInt();
753 //MESSAGE("MED version minor: "<< minor);
754 //minor +=3; // TODO remove: test multiple minor
755 aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( vmed ) + " (*.med)", minor );
756 for (int ii=0; ii<minor; ii++)
758 QString vs = aMesh->GetVersionString(ii, 2);
759 //std::ostringstream vss; // TODO remove: test multiple minor
760 //vss << "4."; // TODO remove: test multiple minor
761 //vss << ii; // TODO remove: test multiple minor
762 //vs = vss.str().c_str(); // TODO remove: test multiple minor
763 //MESSAGE("MED version: " << vs.toStdString());
764 aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( vs ) + " (*.med)", ii);
768 aFilterMap.insert("All files (*)", -1 );
769 aFilterMap.insert("SAUV files (*.sauv)", -1 );
770 aFilterMap.insert("SAUV files (*.sauve)", -1 );
774 QString aDefaultFilter;
775 QMap<QString, int>::const_iterator it = aFilterMap.begin();
776 for ( ; it != aFilterMap.end(); ++it ) {
777 filters.push_back( it.key() );
779 aDefaultFilter = it.key();
781 QStringList checkBoxes;
782 checkBoxes << QObject::tr("SMESH_AUTO_GROUPS") << QObject::tr("SMESH_AUTO_DIM");
784 SMESHGUI_FieldSelectorWdg* fieldSelWdg = new SMESHGUI_FieldSelectorWdg();
785 QList< QWidget* > wdgList;
786 if ( fieldSelWdg->GetAllFields( aMeshList, aFieldList ))
787 wdgList.append( fieldSelWdg );
789 SalomeApp_CheckFileDlg* fd =
790 new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true, wdgList );
791 fd->setWindowTitle( aTitle );
792 fd->setNameFilters( filters );
793 fd->SetChecked( toCreateGroups, 0 );
794 fd->SetChecked( toFindOutDim, 1 );
795 if ( !anInitialPath.isEmpty() )
796 fd->setDirectory( anInitialPath );
797 fd->selectFile(aMeshName);
800 QListView *lview = fd->findChild<QListView*>("listView");
802 lview->setMinimumHeight(200);
804 QTreeView *tview = fd->findChild<QTreeView*>("treeView");
806 tview->setMinimumHeight(200);
809 SMESHGUI_FileValidator* fv = new SMESHGUI_FileValidator( fd );
810 fd->setValidator( fv );
814 MESSAGE("******* Loop on file dialog ***********");
817 aFilename = fd->selectedFile();
819 aFilename = QString::null;
822 aFormat = aFilterMap[fd->selectedNameFilter()];
823 MESSAGE("selected minor: " << aFormat << " file: " << aFilename.toUtf8().constData());
824 toOverwrite = fv->isOverwrite(aFilename);
825 MESSAGE("toOverwrite:" << toOverwrite);
827 if ( !aFilename.isEmpty() ) {
829 // can't append to an existing using other format
830 bool isVersionOk = SMESHGUI::GetSMESHGen()->CheckWriteCompatibility( aFilename.toUtf8().constData() );
831 MESSAGE("Append check, isVersionOk:" << isVersionOk);
832 if ( !isVersionOk ) {
833 int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
834 QObject::tr("SMESH_WRN_WARNING"),
835 QObject::tr("SMESH_EXPORT_MED_VERSION_COLLISION").arg(aFilename),
836 QObject::tr("SMESH_BUT_YES"),
837 QObject::tr("SMESH_BUT_NO"), 0, 1);
841 MESSAGE("incompatible MED file version for add, overwrite accepted");
847 MESSAGE("incompatible MED file version for add, overwrite refused");
850 QStringList aMeshNamesCollisionList;
851 SMESH::string_array_var aMeshNames = SMESHGUI::GetSMESHGen()->GetMeshNames( aFilename.toUtf8().constData() );
852 for( int i = 0, n = aMeshNames->length(); i < n; i++ ) {
853 QString anExistingMeshName( aMeshNames[ i ] );
854 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
855 QString anExportMeshName = (*aMeshIter).second;
856 if( anExportMeshName == anExistingMeshName ) {
857 aMeshNamesCollisionList.append( anExportMeshName );
862 if( !aMeshNamesCollisionList.isEmpty() ) {
864 QString aMeshNamesCollisionString = aMeshNamesCollisionList.join( ", " );
865 int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
866 QObject::tr("SMESH_WRN_WARNING"),
867 QObject::tr("SMESH_EXPORT_MED_MESH_NAMES_COLLISION").arg(aMeshNamesCollisionString),
868 QObject::tr("SMESH_BUT_YES"),
869 QObject::tr("SMESH_BUT_NO"),
870 QObject::tr("SMESH_BUT_CANCEL"), 0, 2);
871 MESSAGE("answer collision name " << aRet);
882 MESSAGE(" ****** end of file dialog loop, toOverwrite:" << toOverwrite << " isOkToWrite:" << isOkToWrite);
883 toCreateGroups = fd->IsChecked(0);
884 toFindOutDim = fd->IsChecked(1);
885 fieldSelWdg->GetSelectedFields();
886 if ( !fieldSelWdg->parent() )
897 if ( !aFilename.isEmpty() ) {
898 // Check whether the file already exists and delete it if yes
899 QFile aFile( aFilename );
900 if ( aFile.exists() && toOverwrite )
902 SUIT_OverrideCursor wc;
905 // Renumbering is not needed since SMDS redesign in V6.2.0 (Nov 2010)
906 // bool Renumber = false;
907 // // PAL 14172 : Check of we have to renumber or not from the preferences before export
909 // Renumber= resMgr->booleanValue("renumbering");
911 // SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
912 // aMeshEditor->RenumberNodes();
913 // aMeshEditor->RenumberElements();
914 // if ( SMESHGUI::automaticUpdate() )
915 // SMESH::UpdateView();
917 if ( isMED && isOkToWrite)
919 MESSAGE("OK to write MED file "<< aFilename.toUtf8().constData());
920 aMeshIter = aMeshList.begin();
921 for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ )
923 SMESH::SMESH_IDSource_var aMeshOrGroup = (*aMeshIter).first;
924 SMESH::SMESH_Mesh_var aMeshItem = aMeshOrGroup->GetMesh();
925 const GEOM::ListOfFields& fields = aFieldList[ aMeshIndex ].first.in();
926 const QString& geoAssFields = aFieldList[ aMeshIndex ].second;
927 const bool hasFields = ( fields.length() || !geoAssFields.isEmpty() );
928 if ( !hasFields && aMeshOrGroup->_is_equivalent( aMeshItem ))
929 aMeshItem->ExportMED( aFilename.toUtf8().data(), toCreateGroups, aFormat,
930 toOverwrite && aMeshIndex == 0, toFindOutDim );
932 aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toUtf8().data(), toCreateGroups, aFormat,
933 toOverwrite && aMeshIndex == 0, toFindOutDim,
934 fields, geoAssFields.toLatin1().data() );
939 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ )
941 SMESH::SMESH_Mesh_var aMeshItem = SMESH::SMESH_Mesh::_narrow( (*aMeshIter).first );
942 if( !aMeshItem->_is_nil() )
943 aMeshItem->ExportSAUV( aFilename.toUtf8().data(), toCreateGroups );
948 if ( aMeshOrGroup->_is_equivalent( aMesh ))
949 aMesh->ExportDAT( aFilename.toUtf8().data() );
951 aMesh->ExportPartToDAT( aMeshOrGroup, aFilename.toUtf8().data() );
955 if ( aMeshOrGroup->_is_equivalent( aMesh ))
956 aMesh->ExportUNV( aFilename.toUtf8().data() );
958 aMesh->ExportPartToUNV( aMeshOrGroup, aFilename.toUtf8().data() );
962 if ( aMeshOrGroup->_is_equivalent( aMesh ))
963 aMesh->ExportSTL( aFilename.toUtf8().data(), aIsASCII_STL );
965 aMesh->ExportPartToSTL( aMeshOrGroup, aFilename.toUtf8().data(), aIsASCII_STL );
969 aMeshIter = aMeshList.begin();
970 for( int aMeshIndex = 0; aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ )
972 SMESH::SMESH_IDSource_var aMeshOrGroup = (*aMeshIter).first;
973 SMESH::SMESH_Mesh_var aMeshItem = aMeshOrGroup->GetMesh();
974 aMeshItem->ExportCGNS( aMeshOrGroup,
975 aFilename.toUtf8().data(),
976 toOverwrite && aMeshIndex == 0,
982 toCreateGroups = true;
983 aMesh->ExportGMF( aMeshOrGroup, aFilename.toUtf8().data(), toCreateGroups );
986 catch (const SALOME::SALOME_Exception& S_ex){
988 SUIT_MessageBox::warning(SMESHGUI::desktop(),
989 QObject::tr("SMESH_WRN_WARNING"),
990 QObject::tr("SMESH_EXPORT_FAILED"));
996 inline void InverseEntityMode(unsigned int& theOutputMode,
997 unsigned int theMode)
999 bool anIsNotPresent = ~theOutputMode & theMode;
1001 theOutputMode |= theMode;
1003 theOutputMode &= ~theMode;
1006 void SetDisplayEntity(int theCommandID)
1008 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1009 SALOME_ListIO selected;
1011 aSel->selectedObjects( selected );
1013 if ( selected.Extent() >= 1 ) {
1014 SUIT_OverrideCursor wc;
1015 SALOME_ListIteratorOfListIO It( selected );
1016 for( ; It.More(); It.Next()){
1017 Handle(SALOME_InteractiveObject) IObject = It.Value();
1018 if(IObject->hasEntry()){
1019 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
1020 unsigned int aMode = anActor->GetEntityMode();
1021 switch(theCommandID){
1022 case SMESHOp::OpDE0DElements: InverseEntityMode(aMode,SMESH_Actor::e0DElements); break;
1023 case SMESHOp::OpDEEdges: InverseEntityMode(aMode,SMESH_Actor::eEdges); break;
1024 case SMESHOp::OpDEFaces: InverseEntityMode(aMode,SMESH_Actor::eFaces); break;
1025 case SMESHOp::OpDEVolumes: InverseEntityMode(aMode,SMESH_Actor::eVolumes); break;
1026 case SMESHOp::OpDEBalls: InverseEntityMode(aMode,SMESH_Actor::eBallElem); break;
1027 case SMESHOp::OpDEAllEntity: aMode = SMESH_Actor::eAllEntity; break;
1030 anActor->SetEntityMode(aMode);
1039 SalomeApp_Application* app =
1040 dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
1044 LightApp_SelectionMgr* aSel = app->selectionMgr();
1045 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
1046 if ( !aSel || !appStudy )
1049 SALOME_ListIO selected;
1050 aSel->selectedObjects( selected );
1051 if ( selected.IsEmpty() )
1054 Handle(SALOME_InteractiveObject) anIObject = selected.First();
1056 _PTR(Study) aStudy = appStudy->studyDS();
1057 _PTR(SObject) aMainSObject = aStudy->FindObjectID( anIObject->getEntry() );
1058 SMESH::SMESH_Mesh_var aMainObject = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
1059 if ( aMainObject->_is_nil() )
1062 SUIT_OverrideCursor wc;
1064 aMainObject->SetAutoColor( true ); // mesh groups are re-colored here
1066 QList<SALOMEDS::Color> aReservedColors;
1068 SMESH::ListOfGroups aListOfGroups = *aMainObject->GetGroups();
1069 for ( int i = 0, n = aListOfGroups.length(); i < n; i++ )
1071 SMESH::SMESH_GroupBase_var aGroupObject = aListOfGroups[i];
1073 #ifdef SIMPLE_AUTOCOLOR // simplified algorithm for auto-colors
1074 SALOMEDS::Color aColor = SMESHGUI::getPredefinedUniqueColor();
1075 #else // old algorithm for auto-colors
1076 SALOMEDS::Color aColor = SMESHGUI::getUniqueColor( aReservedColors );
1077 aReservedColors.append( aColor );
1078 #endif // SIMPLE_AUTOCOLOR
1079 aGroupObject->SetColor( aColor );
1081 _PTR(SObject) aGroupSObject = SMESH::FindSObject(aGroupObject);
1082 if ( aGroupSObject ) {
1085 if ( SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) {
1086 switch ( aGroupObject->GetType ()) {
1088 anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break;
1090 anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break;
1092 anActor->Set0DColor( aColor.R, aColor.G, aColor.B ); break;
1094 anActor->SetBallColor( aColor.R, aColor.G, aColor.B ); break;
1096 SMESH::GetColor("SMESH", "volume_color", c, delta, "255,0,170|-100");
1097 anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, delta ); break;
1100 SMESH::GetColor("SMESH", "fill_color", c, delta, "0,170,255|-100");
1101 anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta );
1107 SMESH::RepaintCurrentView();
1110 void OverallMeshQuality()
1112 SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
1113 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1114 SALOME_ListIO selected;
1116 aSel->selectedObjects( selected );
1118 if ( selected.IsEmpty() ) return;
1119 SALOME_ListIteratorOfListIO It( selected );
1120 for ( ; It.More(); It.Next() ) {
1121 SMESHGUI_CtrlInfoDlg* ctrlDlg = new SMESHGUI_CtrlInfoDlg( SMESHGUI::desktop() );
1122 ctrlDlg->showInfo( It.Value() );
1127 QString functorToString( SMESH::Controls::FunctorPtr f )
1129 QString type = QObject::tr( "UNKNOWN_CONTROL" );
1130 if ( dynamic_cast< SMESH::Controls::Volume* >( f.get() ) )
1131 type = QObject::tr( "VOLUME_3D_ELEMENTS" );
1132 else if ( dynamic_cast< SMESH::Controls::MaxElementLength2D* >( f.get() ) )
1133 type = QObject::tr( "MAX_ELEMENT_LENGTH_2D" );
1134 else if ( dynamic_cast< SMESH::Controls::MaxElementLength3D* >( f.get() ) )
1135 type = QObject::tr( "MAX_ELEMENT_LENGTH_3D" );
1136 else if ( dynamic_cast< SMESH::Controls::MinimumAngle* >( f.get() ) )
1137 type = QObject::tr( "MINIMUMANGLE_ELEMENTS" );
1138 else if ( dynamic_cast< SMESH::Controls::AspectRatio* >( f.get() ) )
1139 type = QObject::tr( "ASPECTRATIO_ELEMENTS" );
1140 else if ( dynamic_cast< SMESH::Controls::AspectRatio3D* >( f.get() ) )
1141 type = QObject::tr( "ASPECTRATIO_3D_ELEMENTS" );
1142 else if ( dynamic_cast< SMESH::Controls::Warping* >( f.get() ) )
1143 type = QObject::tr( "WARP_ELEMENTS" );
1144 else if ( dynamic_cast< SMESH::Controls::Taper* >( f.get() ) )
1145 type = QObject::tr( "TAPER_ELEMENTS" );
1146 else if ( dynamic_cast< SMESH::Controls::Skew* >( f.get() ) )
1147 type = QObject::tr( "SKEW_ELEMENTS" );
1148 else if ( dynamic_cast< SMESH::Controls::Area* >( f.get() ) )
1149 type = QObject::tr( "AREA_ELEMENTS" );
1150 else if ( dynamic_cast< SMESH::Controls::Length* >( f.get() ) )
1151 type = QObject::tr( "LENGTH_EDGES" );
1152 else if ( dynamic_cast< SMESH::Controls::Length2D* >( f.get() ) )
1153 type = QObject::tr( "LENGTH2D_EDGES" );
1154 else if ( dynamic_cast< SMESH::Controls::Deflection2D* >( f.get() ) )
1155 type = QObject::tr( "DEFLECTION2D_FACES" );
1156 else if ( dynamic_cast< SMESH::Controls::MultiConnection* >( f.get() ) )
1157 type = QObject::tr( "MULTI_BORDERS" );
1158 else if ( dynamic_cast< SMESH::Controls::MultiConnection2D* >( f.get() ) )
1159 type = QObject::tr( "MULTI2D_BORDERS" );
1160 else if ( dynamic_cast< SMESH::Controls::FreeNodes* >( f.get() ) )
1161 type = QObject::tr( "FREE_NODES" );
1162 else if ( dynamic_cast< SMESH::Controls::FreeEdges* >( f.get() ) )
1163 type = QObject::tr( "FREE_EDGES" );
1164 else if ( dynamic_cast< SMESH::Controls::FreeBorders* >( f.get() ) )
1165 type = QObject::tr( "FREE_BORDERS" );
1166 else if ( dynamic_cast< SMESH::Controls::FreeFaces* >( f.get() ) )
1167 type = QObject::tr( "FREE_FACES" );
1168 else if ( dynamic_cast< SMESH::Controls::BareBorderVolume* >( f.get() ) )
1169 type = QObject::tr( "BARE_BORDER_VOLUME" );
1170 else if ( dynamic_cast< SMESH::Controls::BareBorderFace* >( f.get() ) )
1171 type = QObject::tr( "BARE_BORDER_FACE" );
1172 else if ( dynamic_cast< SMESH::Controls::OverConstrainedVolume* >( f.get() ) )
1173 type = QObject::tr( "OVER_CONSTRAINED_VOLUME" );
1174 else if ( dynamic_cast< SMESH::Controls::OverConstrainedFace* >( f.get() ) )
1175 type = QObject::tr( "OVER_CONSTRAINED_FACE" );
1176 else if ( dynamic_cast< SMESH::Controls::CoincidentNodes* >( f.get() ) )
1177 type = QObject::tr( "EQUAL_NODE" );
1178 else if ( dynamic_cast< SMESH::Controls::CoincidentElements1D* >( f.get() ) )
1179 type = QObject::tr( "EQUAL_EDGE" );
1180 else if ( dynamic_cast< SMESH::Controls::CoincidentElements2D* >( f.get() ) )
1181 type = QObject::tr( "EQUAL_FACE" );
1182 else if ( dynamic_cast< SMESH::Controls::CoincidentElements3D* >( f.get() ) )
1183 type = QObject::tr( "EQUAL_VOLUME" );
1184 else if ( dynamic_cast< SMESH::Controls::NodeConnectivityNumber* >( f.get() ) )
1185 type = QObject::tr( "NODE_CONNECTIVITY_NB" );
1189 void SaveDistribution()
1191 LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
1192 SALOME_ListIO selected;
1194 aSel->selectedObjects( selected );
1196 if ( selected.Extent() == 1 ) {
1197 Handle(SALOME_InteractiveObject) anIO = selected.First();
1198 if ( anIO->hasEntry() ) {
1199 SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
1201 anActor->GetScalarBarActor() &&
1202 anActor->GetControlMode() != SMESH_Actor::eNone )
1204 SMESH_ScalarBarActor* aScalarBarActor = anActor->GetScalarBarActor();
1205 SMESH::Controls::FunctorPtr aFunctor = anActor->GetFunctor();
1206 if ( aScalarBarActor && aFunctor ) {
1207 SMESH::Controls::NumericalFunctor* aNumFun =
1208 dynamic_cast<SMESH::Controls::NumericalFunctor*>( aFunctor.get() );
1210 std::vector<int> elements;
1211 SMESH::SMESH_Mesh_var mesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIO);
1212 if ( mesh->_is_nil() ) {
1213 SMESH::SMESH_IDSource_var idSource =
1214 SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(anIO);
1215 if ( !idSource->_is_nil() )
1217 SMESH::long_array_var ids = idSource->GetIDs();
1218 elements.resize( ids->length() );
1219 for ( unsigned i = 0; i < elements.size(); ++i )
1220 elements[i] = ids[i];
1223 int nbIntervals = aScalarBarActor->GetMaximumNumberOfColors();
1224 vtkLookupTable* lookupTable =
1225 static_cast<vtkLookupTable*>(aScalarBarActor->GetLookupTable());
1226 double * minmax = lookupTable->GetRange();
1227 bool isLogarithmic = lookupTable->GetScale() == VTK_SCALE_LOG10;
1228 std::vector<int> nbEvents;
1229 std::vector<double> funValues;
1230 aNumFun->GetHistogram( nbIntervals, nbEvents, funValues,
1231 elements, minmax, isLogarithmic );
1232 QString anInitialPath = "";
1233 if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
1234 anInitialPath = QDir::currentPath();
1235 QString aMeshName = anIO->getName();
1237 filter.append( QObject::tr( "TEXT_FILES_FILTER" ) + " (*.txt)" );
1238 filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" );
1239 QString aFilename = anInitialPath + "/" + aMeshName + "_" +
1240 functorToString( aFunctor ).toLower().simplified().replace( QRegExp( " |-" ), "_" ) + ".txt";
1241 aFilename = SUIT_FileDlg::getFileName( SMESHGUI::desktop(),
1244 QObject::tr( "SMESH_SAVE_DISTRIBUTION" ),
1246 if ( !aFilename.isEmpty() ) {
1247 QFile f( aFilename );
1248 if ( f.open( QFile::WriteOnly | QFile::Truncate ) ) {
1249 QTextStream out( &f );
1250 out << "# Mesh: " << aMeshName << endl;
1251 out << "# Control: " << functorToString( aFunctor ) << endl;
1253 out.setFieldWidth( 10 );
1254 for ( int i = 0; i < (int)qMin( nbEvents.size(), funValues.size()-1 ); i++ )
1255 out << funValues[i] << "\t" << funValues[i+1] << "\t" << nbEvents[i] << endl;
1266 void ShowElement( int theCommandID )
1268 LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
1269 SALOME_ListIO selected;
1271 aSel->selectedObjects( selected );
1273 if ( selected.Extent() == 1 ) {
1274 Handle(SALOME_InteractiveObject) anIO = selected.First();
1275 if ( anIO->hasEntry() ) {
1276 SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
1278 anActor->GetScalarBarActor() &&
1279 anActor->GetControlMode() != SMESH_Actor::eNone )
1281 SMESH_ScalarBarActor *aScalarBarActor = anActor->GetScalarBarActor();
1282 if ( theCommandID == SMESHOp::OpShowDistribution ) {
1283 aScalarBarActor->SetDistributionVisibility(!aScalarBarActor->GetDistributionVisibility());
1285 else if ( theCommandID == SMESHOp::OpShowScalarBar ) {
1286 aScalarBarActor->SetVisibility( !aScalarBarActor->GetVisibility());
1293 #ifndef DISABLE_PLOT2DVIEWER
1294 void PlotDistribution()
1296 SalomeApp_Application* app =
1297 dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
1301 LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
1302 SALOME_ListIO selected;
1304 aSel->selectedObjects( selected );
1306 if ( selected.Extent() == 1 ) {
1307 Handle(SALOME_InteractiveObject) anIO = selected.First();
1308 if ( anIO->hasEntry() ) {
1309 //Find Actor by entry before getting Plot2d viewer,
1310 //because after call getViewManager( Plot2d_Viewer::Type(), true ) active window is Plot2d Viewer
1311 SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
1313 SUIT_ViewManager* aViewManager =
1314 app->getViewManager( Plot2d_Viewer::Type(), true ); // create if necessary
1318 SPlot2d_Viewer* aView = dynamic_cast<SPlot2d_Viewer*>(aViewManager->getViewModel());
1322 Plot2d_ViewFrame* aPlot = aView->getActiveViewFrame();
1326 if ( anActor && anActor->GetControlMode() != SMESH_Actor::eNone )
1328 SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
1329 QString functorName = functorToString( anActor->GetFunctor());
1330 QString aHistogramName("%1 : %2");
1331 aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName);
1332 aHistogram->setName(aHistogramName);
1333 aHistogram->setHorTitle(functorName);
1334 aHistogram->setVerTitle(QObject::tr("DISTRIBUTION_NB_ENT"));
1335 aPlot->displayObject(aHistogram, true);
1340 #endif //DISABLE_PLOT2DVIEWER
1342 void DisableAutoColor()
1344 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1345 SALOME_ListIO selected;
1347 aSel->selectedObjects( selected );
1349 if ( selected.Extent() ) {
1350 Handle(SALOME_InteractiveObject) anIObject = selected.First();
1351 SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
1352 if ( !aMesh->_is_nil() ) {
1353 aMesh->SetAutoColor( false );
1360 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1361 SALOME_ListIO selected;
1363 aSel->selectedObjects( selected );
1364 if ( selected.Extent() )
1366 Handle(SALOME_InteractiveObject) anIObject = selected.First();
1367 _PTR(Study) aStudy = SMESH::getStudy();
1368 _PTR(SObject) aSObj = aStudy->FindObjectID(anIObject->getEntry());
1370 if ( aStudy->GetUseCaseBuilder()->SortChildren( aSObj, true/*AscendingOrder*/ ) ) {
1371 SMESHGUI::GetSMESHGUI()->updateObjBrowser();
1378 void SetDisplayMode(int theCommandID, VTK::MarkerMap& theMarkerMap)
1380 SALOME_ListIO selected;
1381 SalomeApp_Application* app =
1382 dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
1386 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1387 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
1388 if ( !aSel || !appStudy )
1391 if ( theCommandID == SMESHOp::OpClipping ) { // Clipping dialog can be activated without selection
1392 if ( SMESHGUI* aModule = SMESHGUI::GetSMESHGUI() ) {
1393 aModule->EmitSignalDeactivateDialog();
1394 if( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( aModule ) )
1395 (new SMESHGUI_ClippingDlg( aModule, aViewWindow ))->show();
1400 aSel->selectedObjects( selected );
1402 if ( selected.Extent() >= 1 )
1404 switch ( theCommandID ) {
1405 case SMESHOp::OpTransparency:
1407 SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
1408 (new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI() ))->show();
1411 case SMESHOp::OpProperties:
1414 QColor faceColor, edgeColor, nodeColor, elem0dColor, ballColor;
1415 QColor orientationColor, outlineColor, volumeColor;
1416 int deltaF = 0, deltaV = 0;
1419 double ballScale = 1.0;
1421 int outlineWidth = 1;
1422 double shrinkCoef = 0.0;
1423 double orientationScale = 0.0;
1424 bool orientation3d = false;
1425 VTK::MarkerType markerType = VTK::MT_NONE;
1426 VTK::MarkerScale markerScale = VTK::MS_NONE;
1428 bool hasNodes = false;
1429 int presentEntities = 0;
1430 bool firstTime = true;
1432 SALOME_ListIteratorOfListIO It( selected );
1433 for ( ; It.More(); It.Next() ) {
1434 Handle(SALOME_InteractiveObject) IObject = It.Value();
1435 if ( !IObject->hasEntry() ) continue;
1436 SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() );
1437 if ( !anActor || !anActor->GetObject() ) continue;
1440 // nodes: color, marker
1441 anActor->GetNodeColor( color[0], color[1], color[2] );
1442 nodeColor.setRgbF( color[0], color[1], color[2] );
1443 markerType = anActor->GetMarkerType();
1444 markerScale = anActor->GetMarkerScale();
1445 markerId = anActor->GetMarkerTexture();
1446 // edges: color, width
1447 anActor->GetEdgeColor( color[0], color[1], color[2] );
1448 edgeColor.setRgbF( color[0], color[1], color[2] );
1449 edgeWidth = qMax( (int)anActor->GetLineWidth(), 1 ); // minimum allowed width is 1
1450 // faces: front color, back color (delta)
1451 anActor->GetSufaceColor( color[0], color[1], color[2], deltaF );
1452 faceColor.setRgbF( color[0], color[1], color[2] );
1453 // faces: front color, back color (delta)
1454 anActor->GetVolumeColor( color[0], color[1], color[2], deltaV );
1455 volumeColor.setRgbF( color[0], color[1], color[2] );
1456 // 0d elements: color, size
1457 anActor->Get0DColor( color[0], color[1], color[2] );
1458 elem0dColor.setRgbF( color[0], color[1], color[2] );
1459 elem0dSize = qMax( (int)anActor->Get0DSize(), 1 ); // minimum allowed size is 1
1460 // balls: color, size
1461 anActor->GetBallColor( color[0], color[1], color[2] );
1462 ballColor.setRgbF( color[0], color[1], color[2] );
1463 //ballSize = qMax( (int)anActor->GetBallSize(), 1 ); // minimum allowed size is 1
1464 ballScale = qMax( (double)anActor->GetBallScale(), 1e-2 ); // minimum allowed scale is 1e-2
1466 anActor->GetOutlineColor( color[0], color[1], color[2] );
1467 outlineColor.setRgbF( color[0], color[1], color[2] );
1468 outlineWidth = qMax( (int)anActor->GetOutlineWidth(), 1 ); // minimum allowed width is 1
1469 // orientation vectors: color, scale, 3d flag
1470 anActor->GetFacesOrientationColor( color[0], color[1], color[2] );
1471 orientationColor.setRgbF( color[0], color[1], color[2] );
1472 orientationScale = anActor->GetFacesOrientationScale();
1473 orientation3d = anActor->GetFacesOrientation3DVectors();
1475 shrinkCoef = anActor->GetShrinkFactor();
1478 firstTime = false; // we only take properties from first object (for performance reasons)
1481 hasNodes = anActor->GetObject()->GetNbEntities( SMDSAbs_Node );
1482 if ( !(presentEntities & SMESH_Actor::eEdges) && anActor->GetObject()->GetNbEntities( SMDSAbs_Edge ) )
1483 presentEntities = presentEntities | SMESH_Actor::eEdges;
1484 if ( !(presentEntities & SMESH_Actor::eFaces) && anActor->GetObject()->GetNbEntities( SMDSAbs_Face ) )
1485 presentEntities = presentEntities | SMESH_Actor::eFaces;
1486 if ( !(presentEntities & SMESH_Actor::eVolumes) && anActor->GetObject()->GetNbEntities( SMDSAbs_Volume ) )
1487 presentEntities = presentEntities | SMESH_Actor::eVolumes;
1488 if ( !(presentEntities & SMESH_Actor::e0DElements) && anActor->GetObject()->GetNbEntities( SMDSAbs_0DElement ) )
1489 presentEntities = presentEntities | SMESH_Actor::e0DElements;
1490 if ( !(presentEntities & SMESH_Actor::eBallElem) && anActor->GetObject()->GetNbEntities( SMDSAbs_Ball ) )
1491 presentEntities = presentEntities | SMESH_Actor::eBallElem;
1493 // as we know that all types of elements are present, we can exit the loop
1494 if ( presentEntities == SMESH_Actor::eAllEntity )
1498 SMESHGUI_PropertiesDlg dlg( theMarkerMap, SMESHGUI::desktop() );
1499 // nodes: color, marker
1500 dlg.setNodeColor( nodeColor );
1501 if( markerType != VTK::MT_USER )
1502 dlg.setNodeMarker( markerType, markerScale );
1504 dlg.setNodeCustomMarker( markerId );
1505 // edges: color, line width
1506 dlg.setEdgeColor( edgeColor );
1507 dlg.setEdgeWidth( edgeWidth );
1508 // faces: front color, back color
1509 dlg.setFaceColor( faceColor, deltaF );
1510 // volumes: normal color, reversed color
1511 dlg.setVolumeColor( volumeColor, deltaV );
1512 // outlines: color, line width
1513 dlg.setOutlineColor( outlineColor );
1514 dlg.setOutlineWidth( outlineWidth );
1515 // 0d elements: color, size
1516 dlg.setElem0dColor( elem0dColor );
1517 dlg.setElem0dSize( elem0dSize );
1518 // balls: color, size
1519 dlg.setBallColor( ballColor );
1520 //dlg.setBallSize( ballSize );
1521 dlg.setBallScale( ballScale );
1522 // orientation: color, scale, 3d flag
1523 dlg.setOrientationColor( orientationColor );
1524 dlg.setOrientationSize( int( orientationScale * 100. ) );
1525 dlg.setOrientation3d( orientation3d );
1526 // shrink: scale factor
1527 dlg.setShrinkCoef( int( shrinkCoef * 100. ) );
1528 // hide unused controls
1529 dlg.showControls( presentEntities, hasNodes );
1532 nodeColor = dlg.nodeColor();
1533 markerType = dlg.nodeMarkerType();
1534 markerScale = dlg.nodeMarkerScale();
1535 markerId = dlg.nodeMarkerId();
1536 edgeColor = dlg.edgeColor();
1537 edgeWidth = dlg.edgeWidth();
1538 faceColor = dlg.faceColor();
1539 deltaF = dlg.faceColorDelta();
1540 volumeColor = dlg.volumeColor();
1541 deltaV = dlg.volumeColorDelta();
1542 outlineColor = dlg.outlineColor();
1543 outlineWidth = dlg.outlineWidth();
1544 elem0dColor = dlg.elem0dColor();
1545 elem0dSize = dlg.elem0dSize();
1546 ballColor = dlg.ballColor();
1547 // ballSize = dlg.ballSize();
1548 ballScale = dlg.ballScale();
1549 orientationColor = dlg.orientationColor();
1550 orientationScale = dlg.orientationSize() / 100.;
1551 orientation3d = dlg.orientation3d();
1552 shrinkCoef = dlg.shrinkCoef() / 100.;
1554 // store point markers that might be changed by the user
1555 theMarkerMap = dlg.customMarkers();
1557 // set properties from dialog box to the presentations
1558 SALOME_ListIteratorOfListIO It( selected );
1559 for ( ; It.More(); It.Next() ) {
1560 Handle(SALOME_InteractiveObject) IObject = It.Value();
1561 if ( !IObject->hasEntry() ) continue;
1562 SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() );
1563 if ( !anActor ) continue;
1565 // nodes: color, marker
1566 anActor->SetNodeColor( nodeColor.redF(), nodeColor.greenF(), nodeColor.blueF() );
1567 if ( markerType != VTK::MT_USER ) {
1568 anActor->SetMarkerStd( markerType, markerScale );
1571 VTK::MarkerMap::const_iterator iter = theMarkerMap.find( markerId );
1572 if ( iter != theMarkerMap.end() )
1573 anActor->SetMarkerTexture( markerId, iter->second.second );
1575 // volumes: normal color, reversed color (delta)
1576 anActor->SetVolumeColor( volumeColor.redF(), volumeColor.greenF(), volumeColor.blueF(), deltaV );
1577 // faces: front color, back color (delta)
1578 anActor->SetSufaceColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF );
1579 // edges: color, width
1580 anActor->SetEdgeColor( edgeColor.redF(), edgeColor.greenF(), edgeColor.blueF() );
1581 anActor->SetLineWidth( edgeWidth );
1583 anActor->SetOutlineColor( outlineColor.redF(), outlineColor.greenF(), outlineColor.blueF() );
1584 anActor->SetOutlineWidth( outlineWidth );
1585 // 0D elements: color, size
1586 anActor->Set0DColor( elem0dColor.redF(), elem0dColor.greenF(), elem0dColor.blueF() );
1587 anActor->Set0DSize( elem0dSize );
1588 // balls: color, size
1589 anActor->SetBallColor( ballColor.redF(), ballColor.greenF(), ballColor.blueF() );
1590 // anActor->SetBallSize( ballSize );
1591 anActor->SetBallScale( ballScale );
1592 // orientation: color, scale, 3d flag
1593 anActor->SetFacesOrientationColor( orientationColor.redF(), orientationColor.greenF(), orientationColor.blueF() );
1594 anActor->SetFacesOrientationScale( orientationScale );
1595 anActor->SetFacesOrientation3DVectors( orientation3d );
1597 anActor->SetShrinkFactor( shrinkCoef );
1599 // for groups, set also proper color
1600 SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
1601 if ( !aGroupObject->_is_nil() ) {
1602 SMESH::ElementType anElementType = aGroupObject->GetType();
1604 switch( anElementType ) {
1606 aColor = nodeColor; break;
1608 aColor = edgeColor; break;
1610 aColor = faceColor; break;
1612 aColor = volumeColor; break;
1614 aColor = elem0dColor; break;
1616 aColor = ballColor; break;
1620 if ( aColor.isValid() ) {
1621 SALOMEDS::Color aGroupColor;
1622 aGroupColor.R = aColor.redF();
1623 aGroupColor.G = aColor.greenF();
1624 aGroupColor.B = aColor.blueF();
1625 aGroupObject->SetColor( aGroupColor );
1627 } // if ( !aGroupObject->_is_nil() )
1628 } // for ( ; It.More(); It.Next() )
1629 SMESH::RepaintCurrentView();
1630 } // if ( dlg.exec() )
1632 } // case SMESHOp::OpProperties:
1633 } // switch(theCommandID)
1634 SUIT_OverrideCursor wc;
1635 SALOME_ListIteratorOfListIO It( selected );
1636 for( ; It.More(); It.Next()){
1637 Handle(SALOME_InteractiveObject) IObject = It.Value();
1638 if(IObject->hasEntry()){
1639 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
1640 switch(theCommandID){
1641 case SMESHOp::OpDMWireframe:
1642 anActor->SetRepresentation(SMESH_Actor::eEdge);
1644 case SMESHOp::OpDMShading:
1645 anActor->SetRepresentation(SMESH_Actor::eSurface);
1647 case SMESHOp::OpDMShrink:
1648 if(anActor->IsShrunk())
1649 anActor->UnShrink();
1651 anActor->SetShrink();
1653 case SMESHOp::OpDMNodes:
1654 anActor->SetRepresentation(SMESH_Actor::ePoint);
1656 case SMESHOp::OpRepresentationLines:
1657 if(anActor->GetQuadratic2DRepresentation() != SMESH_Actor::eLines)
1658 anActor->SetQuadratic2DRepresentation(SMESH_Actor::eLines);
1660 case SMESHOp::OpRepresentationArcs:
1661 if(anActor->GetQuadratic2DRepresentation() != SMESH_Actor::eArcs)
1662 anActor->SetQuadratic2DRepresentation(SMESH_Actor::eArcs);
1668 SMESH::RepaintCurrentView();
1672 int ActionToControl( int theID, bool theReversed )
1674 NCollection_DoubleMap<int,int> ActionControl;
1675 ActionControl.Bind( 0, SMESH_Actor::eNone );
1676 ActionControl.Bind( SMESHOp::OpFreeNode, SMESH_Actor::eFreeNodes );
1677 ActionControl.Bind( SMESHOp::OpEqualNode, SMESH_Actor::eCoincidentNodes );
1678 ActionControl.Bind( SMESHOp::OpNodeConnectivityNb, SMESH_Actor::eNodeConnectivityNb );
1679 ActionControl.Bind( SMESHOp::OpFreeEdge, SMESH_Actor::eFreeEdges );
1680 ActionControl.Bind( SMESHOp::OpFreeBorder, SMESH_Actor::eFreeBorders );
1681 ActionControl.Bind( SMESHOp::OpLength, SMESH_Actor::eLength );
1682 ActionControl.Bind( SMESHOp::OpConnection, SMESH_Actor::eMultiConnection );
1683 ActionControl.Bind( SMESHOp::OpEqualEdge, SMESH_Actor::eCoincidentElems1D );
1684 ActionControl.Bind( SMESHOp::OpFreeFace, SMESH_Actor::eFreeFaces );
1685 ActionControl.Bind( SMESHOp::OpBareBorderFace, SMESH_Actor::eBareBorderFace );
1686 ActionControl.Bind( SMESHOp::OpOverConstrainedFace, SMESH_Actor::eOverConstrainedFace );
1687 ActionControl.Bind( SMESHOp::OpLength2D, SMESH_Actor::eLength2D );
1688 ActionControl.Bind( SMESHOp::OpDeflection2D, SMESH_Actor::eDeflection2D );
1689 ActionControl.Bind( SMESHOp::OpConnection2D, SMESH_Actor::eMultiConnection2D );
1690 ActionControl.Bind( SMESHOp::OpArea, SMESH_Actor::eArea );
1691 ActionControl.Bind( SMESHOp::OpTaper, SMESH_Actor::eTaper );
1692 ActionControl.Bind( SMESHOp::OpAspectRatio, SMESH_Actor::eAspectRatio );
1693 ActionControl.Bind( SMESHOp::OpMinimumAngle, SMESH_Actor::eMinimumAngle );
1694 ActionControl.Bind( SMESHOp::OpWarpingAngle, SMESH_Actor::eWarping );
1695 ActionControl.Bind( SMESHOp::OpSkew, SMESH_Actor::eSkew );
1696 ActionControl.Bind( SMESHOp::OpMaxElementLength2D, SMESH_Actor::eMaxElementLength2D );
1697 ActionControl.Bind( SMESHOp::OpEqualFace, SMESH_Actor::eCoincidentElems2D );
1698 ActionControl.Bind( SMESHOp::OpAspectRatio3D, SMESH_Actor::eAspectRatio3D );
1699 ActionControl.Bind( SMESHOp::OpVolume, SMESH_Actor::eVolume3D );
1700 ActionControl.Bind( SMESHOp::OpMaxElementLength3D, SMESH_Actor::eMaxElementLength3D );
1701 ActionControl.Bind( SMESHOp::OpBareBorderVolume, SMESH_Actor::eBareBorderVolume );
1702 ActionControl.Bind( SMESHOp::OpOverConstrainedVolume, SMESH_Actor::eOverConstrainedVolume );
1703 ActionControl.Bind( SMESHOp::OpEqualVolume, SMESH_Actor::eCoincidentElems3D );
1706 return ActionControl.IsBound2( theID ) ? ActionControl.Find2( theID ) : 0;
1707 return ActionControl.IsBound1( theID ) ? ActionControl.Find1( theID ) : 0;
1710 void Control( int theCommandID )
1712 SMESH_Actor::eControl aControl = SMESH_Actor::eControl( ActionToControl( theCommandID ));
1713 _PTR(Study) aStudy = SMESH::getStudy();
1715 SALOME_ListIO selected;
1716 if ( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
1717 aSel->selectedObjects( selected );
1719 if ( !selected.IsEmpty() ) {
1720 SALOME_ListIteratorOfListIO It(selected);
1721 for ( ; It.More(); It.Next())
1723 Handle(SALOME_InteractiveObject) anIO = It.Value();
1724 if ( !anIO.IsNull() ) {
1725 _PTR(SObject) SO = aStudy->FindObjectID( It.Value()->getEntry() );
1727 CORBA::Object_var aObject = SMESH::SObjectToObject( SO );
1728 SMESH::SMESH_IDSource_var anIDSrc = SMESH::SMESH_IDSource::_narrow( aObject );
1729 if ( !anIDSrc->_is_nil() ) {
1730 SMESH_Actor *anActor = SMESH::FindActorByEntry( anIO->getEntry());
1731 if (( !anActor && selected.Extent() == 1 ) &&
1732 ( anActor = SMESH::CreateActor( anIO->getEntry() )))
1734 anActor->SetControlMode( aControl );
1735 SMESH::DisplayActor( SMESH::GetCurrentVtkView(), anActor );
1736 SMESH::UpdateView ( SMESH::eDisplay, anIO->getEntry() );
1740 if ( anActor->GetControlMode() != aControl )
1741 anActor->SetControlMode( aControl );
1742 QString functorName = functorToString( anActor->GetFunctor() );
1743 int anEntitiesCount = anActor->GetNumberControlEntities();
1744 if (anEntitiesCount >= 0)
1745 functorName = functorName + ": " + QString::number(anEntitiesCount);
1746 anActor->GetScalarBarActor()->SetTitle( functorName.toLatin1().constData() );
1747 SMESH::RepaintCurrentView();
1748 #ifndef DISABLE_PLOT2DVIEWER
1749 if ( anActor->GetPlot2Histogram() ) {
1750 SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
1751 QString aHistogramName("%1 : %2");
1752 aHistogramName = aHistogramName.arg( anIO->getName() ).arg( functorName );
1753 aHistogram->setName( aHistogramName );
1754 aHistogram->setHorTitle( functorName );
1755 SMESH::ProcessIn2DViewers( anActor );
1767 bool CheckOIType(const Handle(SALOME_InteractiveObject) & theIO,
1768 SMESH::MeshObjectType theType,
1769 const QString theInTypeName,
1770 QString & theOutTypeName)
1772 SMESH_TypeFilter aTypeFilter( theType );
1774 if ( !theIO.IsNull() )
1776 entry = theIO->getEntry();
1777 LightApp_DataOwner owner( entry );
1778 if ( aTypeFilter.isOk( &owner )) {
1779 theOutTypeName = theInTypeName;
1787 QString CheckTypeObject(const Handle(SALOME_InteractiveObject) & theIO)
1789 _PTR(Study) aStudy = SMESH::getStudy();
1790 _PTR(SObject) aSObj = aStudy->FindObjectID(theIO->getEntry());
1792 _PTR(SComponent) aSComp = aSObj->GetFatherComponent();
1793 CORBA::String_var anID = aSComp->GetID().c_str();
1794 if ( !strcmp(anID.in(),theIO->getEntry()) )
1800 CheckOIType ( theIO, SMESH::HYPOTHESIS, "Hypothesis", aTypeName ) ||
1801 CheckOIType ( theIO, SMESH::ALGORITHM, "Algorithm", aTypeName ) ||
1802 CheckOIType ( theIO, SMESH::MESH, "Mesh", aTypeName ) ||
1803 CheckOIType ( theIO, SMESH::SUBMESH, "SubMesh", aTypeName ) ||
1804 CheckOIType ( theIO, SMESH::GROUP, "Group", aTypeName )
1812 // QString CheckHomogeneousSelection()
1814 // LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1815 // SALOME_ListIO selected;
1817 // aSel->selectedObjects( selected );
1819 // QString RefType = CheckTypeObject(selected.First());
1820 // SALOME_ListIteratorOfListIO It(selected);
1821 // for ( ; It.More(); It.Next())
1823 // Handle(SALOME_InteractiveObject) IObject = It.Value();
1824 // QString Type = CheckTypeObject(IObject);
1825 // if ( Type.compare(RefType) != 0 )
1826 // return "Heterogeneous Selection";
1832 uint randomize( uint size )
1834 static bool initialized = false;
1835 if ( !initialized ) {
1836 qsrand( QDateTime::currentDateTime().toTime_t() );
1840 v = uint( (double)( v ) / RAND_MAX * size );
1841 v = qMax( uint(0), qMin ( v, size-1 ) );
1847 void SMESHGUI::OnEditDelete()
1849 // VSR 17/11/04: check if all objects selected belong to SMESH component --> start
1850 LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
1851 SALOME_ListIO selected; aSel->selectedObjects( selected, QString::null, false );
1853 _PTR(Study) aStudy = SMESH::getStudy();
1854 _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder();
1855 _PTR(GenericAttribute) anAttr;
1856 _PTR(AttributeIOR) anIOR;
1858 const int objectCountLimit = 30; // PAL23599
1859 int objectCount = 0;
1861 QString aParentComponent = QString::null;
1863 for( SALOME_ListIteratorOfListIO anIt( selected ); anIt.More(); anIt.Next() )
1865 Handle(SALOME_InteractiveObject) anIO = anIt.Value();
1866 if ( anIO.IsNull() ) continue;
1868 QString father = "unknown", name;
1870 _PTR(SObject) aSO = aStudy->FindObjectID( anIO->getEntry() );
1872 father = QString::fromStdString( aSO->GetFatherComponent()->ComponentDataType() );
1873 // check if object is reference
1874 _PTR(SObject) aRefSObj;
1875 if ( aSO->ReferencedObject( aRefSObj ) ) {
1876 name = QString::fromStdString ( aRefSObj->GetName() );
1877 father = QString::fromStdString ( aRefSObj->GetFatherComponent()->ComponentDataType() );
1880 name = anIO->getName();
1883 if ( objectCount < objectCountLimit ) { // avoid occupying the whole screen
1884 aNameList.append("\n - ");
1885 aNameList.append( name );
1888 if( aParentComponent.isNull() )
1889 aParentComponent = father;
1890 else if( !aParentComponent.isEmpty() && aParentComponent!=father )
1891 aParentComponent = "";
1893 if ( objectCount >= objectCountLimit )
1894 aNameList.append("\n - ...");
1896 if ( objectCount == 0 )
1897 return; // No Valid Objects Selected
1899 if ( aParentComponent != SMESHGUI::GetSMESHGUI()->name() ) {
1900 SUIT_MessageBox::warning( SMESHGUI::desktop(),
1901 QObject::tr("ERR_ERROR"),
1902 QObject::tr("NON_SMESH_OBJECTS_SELECTED").arg( SMESHGUI::GetSMESHGUI()->moduleName() ) );
1905 // VSR 17/11/04: check if all objects selected belong to SMESH component <-- finish
1906 if (SUIT_MessageBox::warning
1907 (SMESHGUI::desktop(),
1908 QObject::tr("SMESH_WRN_WARNING"),
1909 QObject::tr("SMESH_REALLY_DELETE").arg( objectCount ).arg( aNameList ),
1910 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1911 SUIT_MessageBox::Yes) != SUIT_MessageBox::Yes)
1914 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
1916 // Put the whole hierarchy of sub-objects of the selected SO's into a list and
1917 // then treat them all starting from the deepest objects (at list back)
1918 std::list< _PTR(SObject) > listSO;
1919 SALOME_ListIteratorOfListIO It(selected);
1920 for( ; It.More(); It.Next()) // loop on selected IO's
1922 Handle(SALOME_InteractiveObject) IObject = It.Value();
1923 if(IObject->hasEntry()) {
1924 _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry());
1926 // disable removal of "SMESH" component object
1927 if(aSO->FindAttribute(anAttr, "AttributeIOR")){
1929 if ( engineIOR() == anIOR->Value().c_str() )
1932 //Check the referenced object
1933 _PTR(SObject) aRefSObject;
1934 if ( aSO && aSO->ReferencedObject( aRefSObject ) )
1935 aSO = aRefSObject; // Delete main Object instead of reference
1937 listSO.push_back( aSO );
1938 std::list< _PTR(SObject) >::iterator itSO = --listSO.end();
1939 for ( ; itSO != listSO.end(); ++itSO ) {
1940 _PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO );
1941 for (it->InitEx(false); it->More(); it->Next())
1942 listSO.push_back( it->Value() );
1946 // Check if none of objects to delete is referred from outside
1947 std::list< _PTR(SObject) >::reverse_iterator ritSO;
1948 for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO )
1950 _PTR(SObject) SO = *ritSO;
1951 if ( !SO ) continue;
1952 std::vector<_PTR(SObject)> aReferences = aStudy->FindDependances( *ritSO );
1953 for (size_t i = 0; i < aReferences.size(); i++) {
1954 _PTR(SComponent) aComponent = aReferences[i]->GetFatherComponent();
1955 std::string type = aComponent->ComponentDataType();
1956 if ( type != "SMESH" )
1958 SUIT_MessageBox::warning( anApp->desktop(),
1959 QObject::tr("WRN_WARNING"),
1960 QObject::tr("DEP_OBJECT") );
1961 return; // outside SMESH, there is an object depending on a SMESH object
1966 // Call mesh->Clear() to prevent loading mesh from file caused by hypotheses removal
1967 for( It.Initialize( selected ); It.More(); It.Next()) // loop on selected IO's
1969 Handle(SALOME_InteractiveObject) IObject = It.Value();
1970 SMESH::SMESH_Mesh_var mesh = SMESH::IObjectToInterface< SMESH::SMESH_Mesh >( IObject );
1971 if ( !mesh->_is_nil() )
1975 // Treat SO's in the list starting from the back
1976 aStudyBuilder->NewCommand(); // There is a transaction
1977 for ( ritSO = listSO.rbegin(); ritSO != listSO.rend(); ++ritSO )
1979 _PTR(SObject) SO = *ritSO;
1980 if ( !SO ) continue;
1981 std::string anEntry = SO->GetID();
1983 /** Erase graphical object and remove all its data **/
1984 if(SO->FindAttribute(anAttr, "AttributeIOR")) {
1985 SMESH::RemoveVisualObjectWithActors( anEntry.c_str(), true);
1987 /** Remove an object from data structures **/
1988 SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO ));
1989 SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO ));
1990 if ( !aGroup->_is_nil() ) { // DELETE GROUP
1991 SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh();
1992 aMesh->RemoveGroup( aGroup );
1994 else if ( !aSubMesh->_is_nil() ) { // DELETE SUBMESH
1995 SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
1996 aMesh->RemoveSubMesh( aSubMesh );
1999 Handle(SALOME_InteractiveObject) IObject = new SALOME_InteractiveObject
2000 ( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() );
2001 QString objType = CheckTypeObject(IObject);
2002 if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS
2003 SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
2004 aStudyBuilder->RemoveObjectWithChildren( SO );
2006 else {// default action: remove SObject from the study
2007 // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH
2008 //SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy);
2010 aStudyBuilder->RemoveObjectWithChildren( SO );
2014 } /* listSO back loop */
2016 aStudyBuilder->CommitCommand();
2018 /* Clear any previous selection */
2020 aSel->setSelectedObjects( l1 );
2022 SMESHGUI::GetSMESHGUI()->updateObjBrowser();
2026 SMESHGUI_EXPORT CAM_Module* createModule()
2028 return new SMESHGUI();
2031 SMESHGUI_EXPORT char* getModuleVersion() {
2032 return (char*)SMESH_VERSION_STR;
2036 SMESH::SMESH_Gen_var SMESHGUI::myComponentSMESH = SMESH::SMESH_Gen::_nil();
2038 //=============================================================================
2042 //=============================================================================
2043 SMESHGUI::SMESHGUI() :
2044 SalomeApp_Module( "SMESH" )
2046 if ( CORBA::is_nil( myComponentSMESH ) )
2048 CORBA::Boolean anIsEmbeddedMode;
2049 myComponentSMESH = SMESH_Client::GetSMESHGen(getApp()->orb(),anIsEmbeddedMode);
2050 //MESSAGE("-------------------------------> anIsEmbeddedMode=" << anIsEmbeddedMode);
2052 // 0019923: EDF 765 SMESH : default values of hypothesis
2053 SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
2054 int nbSeg = aResourceMgr->integerValue( "SMESH", "segmentation", 10 );
2055 myComponentSMESH->SetBoundaryBoxSegmentation( nbSeg );
2056 nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
2057 myComponentSMESH->SetDefaultNbSegments( nbSeg );
2059 const char* options[] = { "historical_python_dump", "forget_mesh_on_hyp_modif", "default_grp_color" };
2060 for ( size_t i = 0; i < sizeof(options)/sizeof(char*); ++i )
2061 if ( aResourceMgr->hasValue( "SMESH", options[i] ))
2063 QString val = aResourceMgr->stringValue( "SMESH", options[i] );
2064 myComponentSMESH->SetOption( options[i], val.toLatin1().constData() );
2068 myActiveDialogBox = 0;
2069 myFilterLibraryDlg = 0;
2073 myEventCallbackCommand = vtkCallbackCommand::New();
2074 myEventCallbackCommand->Delete();
2075 myEventCallbackCommand->SetClientData( this );
2076 myEventCallbackCommand->SetCallback( SMESHGUI::ProcessEvents );
2079 /* load resources for all available meshers */
2080 SMESH::InitAvailableHypotheses();
2083 //=============================================================================
2087 //=============================================================================
2088 SMESHGUI::~SMESHGUI()
2092 //=============================================================================
2096 //=============================================================================
2097 LightApp_SelectionMgr* SMESHGUI::selectionMgr()
2099 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
2101 return dynamic_cast<LightApp_SelectionMgr*>( anApp->selectionMgr() );
2106 //=============================================================================
2110 //=============================================================================
2111 bool SMESHGUI::automaticUpdate(unsigned int requestedSize, bool* limitExceeded)
2113 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2117 bool autoUpdate = resMgr->booleanValue( "SMESH", "auto_update", false );
2118 long updateLimit = resMgr->integerValue( "SMESH", "update_limit", 500000 );
2119 bool exceeded = updateLimit > 0 && requestedSize > updateLimit;
2120 if ( limitExceeded ) *limitExceeded = autoUpdate && exceeded;
2121 return autoUpdate && !exceeded;
2124 //=============================================================================
2128 //=============================================================================
2129 bool SMESHGUI::automaticUpdate( SMESH::SMESH_IDSource_ptr theMesh,
2130 int* entities, bool* limitExceeded, int* hidden, long* nbElements )
2132 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
2136 bool autoUpdate = resMgr->booleanValue( "SMESH", "auto_update", false );
2137 long updateLimit = resMgr->integerValue( "SMESH", "update_limit", 500000 );
2138 bool incrementalLimit = resMgr->booleanValue( "SMESH", "incremental_limit", false );
2140 SMESH::long_array_var info = theMesh->GetMeshInfo();
2141 long nbOdElems = info[SMDSEntity_0D];
2142 long nbEdges = info[SMDSEntity_Edge] + info[SMDSEntity_Quad_Edge];
2143 long nbFaces = info[SMDSEntity_Triangle] + info[SMDSEntity_Quad_Triangle] + info[SMDSEntity_BiQuad_Triangle] +
2144 info[SMDSEntity_Quadrangle] + info[SMDSEntity_Quad_Quadrangle] + info[SMDSEntity_BiQuad_Quadrangle] +
2145 info[SMDSEntity_Polygon] + info[SMDSEntity_Quad_Polygon];
2146 long nbVolumes = info[SMDSEntity_Tetra] + info[SMDSEntity_Quad_Tetra] +
2147 info[SMDSEntity_Hexa] + info[SMDSEntity_Quad_Hexa] + info[SMDSEntity_TriQuad_Hexa] +
2148 info[SMDSEntity_Pyramid] + info[SMDSEntity_Quad_Pyramid] +
2149 info[SMDSEntity_Penta] + info[SMDSEntity_Quad_Penta] + info[SMDSEntity_BiQuad_Penta] +
2150 info[SMDSEntity_Polyhedra] +
2151 info[SMDSEntity_Hexagonal_Prism];
2152 long nbBalls = info[SMDSEntity_Ball];
2154 long requestedSize = nbOdElems + nbBalls + nbEdges + nbFaces + nbVolumes;
2155 *nbElements = requestedSize;
2157 *entities = SMESH_Actor::eAllEntity;
2160 bool exceeded = updateLimit > 0 && requestedSize > updateLimit;
2162 if ( limitExceeded ) *limitExceeded = autoUpdate && exceeded;
2164 if ( incrementalLimit ) {
2167 if ( nbOdElems > 0 ) {
2168 if ( total + nbOdElems > updateLimit ) {
2169 *entities = *entities & ~SMESH_Actor::e0DElements;
2170 *hidden = *hidden | SMESH_Actor::e0DElements;
2177 if ( nbEdges > 0 ) {
2178 if ( total + nbEdges > updateLimit ) {
2179 *entities = *entities & ~SMESH_Actor::eEdges;
2180 *hidden = *hidden | SMESH_Actor::eEdges;
2187 if ( nbFaces > 0 ) {
2188 if ( total + nbFaces > updateLimit ) {
2189 *entities = *entities & ~SMESH_Actor::eFaces;
2190 *hidden = *hidden | SMESH_Actor::eFaces;
2197 if ( nbVolumes > 0 ) {
2198 if ( total + nbVolumes > updateLimit ) {
2199 *entities = *entities & ~SMESH_Actor::eVolumes;
2200 *hidden = *hidden | SMESH_Actor::eVolumes;
2207 if ( nbBalls > 0 ) {
2208 if ( total + nbBalls > updateLimit ) {
2209 *entities = *entities & ~SMESH_Actor::eBallElem;
2210 *hidden = *hidden | SMESH_Actor::eBallElem;
2218 return autoUpdate && !exceeded;
2221 //=============================================================================
2225 //=============================================================================
2226 SUIT_ResourceMgr* SMESHGUI::resourceMgr()
2228 return dynamic_cast<SUIT_ResourceMgr*>( SUIT_Session::session()->resourceMgr() );
2231 //=============================================================================
2235 //=============================================================================
2236 SMESHGUI* SMESHGUI::GetSMESHGUI()
2238 SMESHGUI* smeshMod = 0;
2239 SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
2242 CAM_Module* module = app->module( "Mesh" );
2243 smeshMod = dynamic_cast<SMESHGUI*>( module );
2251 Standard_EXPORT SMESHGUI* GetComponentGUI()
2253 return SMESHGUI::GetSMESHGUI();
2257 //=============================================================================
2261 //=============================================================================
2262 void SMESHGUI::SetState(int aState)
2267 //=============================================================================
2271 //=============================================================================
2272 void SMESHGUI::ResetState()
2277 //=============================================================================
2281 //=============================================================================
2282 void SMESHGUI::EmitSignalDeactivateDialog()
2284 emit SignalDeactivateActiveDialog();
2287 //=============================================================================
2291 //=============================================================================
2292 void SMESHGUI::EmitSignalStudyFrameChanged()
2294 emit SignalStudyFrameChanged();
2297 //=============================================================================
2301 //=============================================================================
2302 void SMESHGUI::EmitSignalCloseAllDialogs()
2304 emit SignalCloseAllDialogs();
2307 //=============================================================================
2311 //=============================================================================
2312 void SMESHGUI::EmitSignalVisibilityChanged()
2314 emit SignalVisibilityChanged();
2317 //=============================================================================
2321 //=============================================================================
2322 void SMESHGUI::EmitSignalCloseView()
2324 emit SignalCloseView();
2327 //=============================================================================
2331 //=============================================================================
2332 void SMESHGUI::EmitSignalActivatedViewManager()
2334 emit SignalActivatedViewManager();
2337 //=============================================================================
2341 //=============================================================================
2342 QDialog *SMESHGUI::GetActiveDialogBox()
2344 return myActiveDialogBox;
2347 //=============================================================================
2351 //=============================================================================
2352 void SMESHGUI::SetActiveDialogBox(QDialog * aDlg)
2354 myActiveDialogBox = (QDialog *) aDlg;
2358 //=============================================================================
2362 //=============================================================================
2363 SUIT_Desktop* SMESHGUI::desktop()
2365 SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
2367 return app->desktop();
2372 //=============================================================================
2376 //=============================================================================
2377 SalomeApp_Study* SMESHGUI::activeStudy()
2379 SUIT_Application* app = SUIT_Session::session()->activeApplication();
2381 return dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
2386 //=============================================================================
2390 //=============================================================================
2391 void SMESHGUI::Modified( bool theIsUpdateActions )
2393 if( SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() ) ) {
2394 if( SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) ) {
2395 appStudy->Modified();
2396 if( theIsUpdateActions )
2397 app->updateActions();
2402 //=============================================================================
2406 //=============================================================================
2407 bool SMESHGUI::DefineDlgPosition(QWidget * aDlg, int &x, int &y)
2409 /* Here the position is on the bottom right corner - 10 */
2410 // aDlg->resize(QSize().expandedTo(aDlg->minimumSizeHint()));
2412 SUIT_Desktop *PP = desktop();
2413 x = abs(PP->x() + PP->size().width() - aDlg->size().width() - 10);
2414 y = abs(PP->y() + PP->size().height() - aDlg->size().height() - 10);
2419 * \brief Verifies whether study of operation is locked
2420 * \param theMess - specifies whether message box must be shown if study is locked
2421 * \return State of study.
2423 * Verifies whether study of operation is locked. If second parameter is TRUE and study
2424 * is locked when corresponding message box appears
2426 bool SMESHGUI::isStudyLocked( bool theMessage )
2428 if ( SMESH::getStudy()->GetProperties()->IsLocked() )
2431 SUIT_MessageBox::warning( SMESHGUI::desktop(),
2432 QObject::tr( "WRN_WARNING" ),
2433 QObject::tr( "WRN_STUDY_LOCKED" ) );
2439 //=============================================================================
2443 //=============================================================================
2444 bool SMESHGUI::OnGUIEvent( int theCommandID )
2446 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
2450 SUIT_ResourceMgr* mgr = resourceMgr();
2454 SUIT_ViewWindow* view = application()->desktop()->activeWindow();
2455 SVTK_ViewWindow* vtkwnd = dynamic_cast<SVTK_ViewWindow*>( view );
2457 //QAction* act = action( theCommandID );
2459 switch (theCommandID) {
2460 case SMESHOp::OpDelete:
2461 if(isStudyLocked()) break;
2464 case SMESHOp::OpImportDAT:
2465 case SMESHOp::OpImportUNV:
2466 case SMESHOp::OpImportMED:
2467 case SMESHOp::OpImportSTL:
2468 case SMESHOp::OpImportCGNS:
2469 case SMESHOp::OpImportSAUV:
2470 case SMESHOp::OpImportGMF:
2471 case SMESHOp::OpPopupImportDAT:
2472 case SMESHOp::OpPopupImportUNV:
2473 case SMESHOp::OpPopupImportMED:
2474 case SMESHOp::OpPopupImportSTL:
2475 case SMESHOp::OpPopupImportCGNS:
2476 case SMESHOp::OpPopupImportSAUV:
2477 case SMESHOp::OpPopupImportGMF:
2479 if(isStudyLocked()) break;
2480 ::ImportMeshesFromFile(GetSMESHGen(),theCommandID);
2484 case SMESHOp::OpFileInformation:
2486 SALOME_ListIO selected;
2487 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2489 aSel->selectedObjects( selected );
2490 if( selected.Extent() )
2492 Handle(SALOME_InteractiveObject) anIObject = selected.First();
2493 SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
2494 if ( !aMesh->_is_nil() )
2496 SMESHGUI_FileInfoDlg dlg( desktop(), aMesh->GetMEDFileInfo() );
2502 case SMESHOp::OpExportDAT:
2503 case SMESHOp::OpExportMED:
2504 case SMESHOp::OpExportUNV:
2505 case SMESHOp::OpExportSTL:
2506 case SMESHOp::OpExportCGNS:
2507 case SMESHOp::OpExportSAUV:
2508 case SMESHOp::OpExportGMF:
2509 case SMESHOp::OpPopupExportDAT:
2510 case SMESHOp::OpPopupExportMED:
2511 case SMESHOp::OpPopupExportUNV:
2512 case SMESHOp::OpPopupExportSTL:
2513 case SMESHOp::OpPopupExportCGNS:
2514 case SMESHOp::OpPopupExportSAUV:
2515 case SMESHOp::OpPopupExportGMF:
2517 ::ExportMeshToFile(theCommandID);
2521 case SMESHOp::OpReset: // SCALAR BAR
2523 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2524 SALOME_ListIO selected;
2526 aSel->selectedObjects( selected );
2528 SALOME_ListIteratorOfListIO it(selected);
2529 for( ; it.More(); it.Next()) {
2530 Handle(SALOME_InteractiveObject) anIO = it.Value();
2531 if( anIO->hasEntry() ) {
2532 if( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) {
2533 anActor->SetControlMode( SMESH_Actor::eNone );
2534 #ifndef DISABLE_PLOT2DVIEWER
2535 SMESH::ProcessIn2DViewers(anActor,SMESH::RemoveFrom2dViewer);
2540 SMESH::UpdateView();
2543 case SMESHOp::OpScalarBarProperties:
2545 SMESHGUI_Preferences_ScalarBarDlg::ScalarBarProperties( this );
2548 case SMESHOp::OpShowScalarBar:
2550 // show/hide scalar bar
2551 ::ShowElement(theCommandID);
2554 case SMESHOp::OpSaveDistribution:
2556 // dump control distribution data to the text file
2557 ::SaveDistribution();
2561 case SMESHOp::OpShowDistribution:
2563 // show/hide distribution
2564 ::ShowElement(theCommandID);
2568 #ifndef DISABLE_PLOT2DVIEWER
2569 case SMESHOp::OpPlotDistribution:
2571 // plot distribution
2572 ::PlotDistribution();
2578 case SMESHOp::OpAutoColor:
2582 case SMESHOp::OpDisableAutoColor:
2583 ::DisableAutoColor();
2586 case SMESHOp::OpClipping:
2587 case SMESHOp::OpTransparency:
2588 case SMESHOp::OpProperties: // Display preferences (colors, shrink size, line width, ...)
2591 case SMESHOp::OpDMWireframe:
2592 case SMESHOp::OpDMShading:
2593 case SMESHOp::OpDMNodes:
2594 case SMESHOp::OpDMShrink:
2595 ::SetDisplayMode(theCommandID, myMarkerMap);
2598 //2D quadratic representation
2599 case SMESHOp::OpRepresentationLines:
2600 case SMESHOp::OpRepresentationArcs:
2601 ::SetDisplayMode(theCommandID, myMarkerMap);
2605 case SMESHOp::OpDE0DElements:
2606 case SMESHOp::OpDEEdges:
2607 case SMESHOp::OpDEFaces:
2608 case SMESHOp::OpDEVolumes:
2609 case SMESHOp::OpDEBalls:
2610 case SMESHOp::OpDEAllEntity:
2611 ::SetDisplayEntity(theCommandID);
2614 // Choose entities to be displayed
2615 case SMESHOp::OpDEChoose:
2617 ( new SMESHGUI_DisplayEntitiesDlg( SMESHGUI::desktop() ) )->exec();
2621 case SMESHOp::OpOrientationOnFaces:
2623 SUIT_OverrideCursor wc;
2624 LightApp_SelectionMgr* mgr = selectionMgr();
2625 SALOME_ListIO selected; mgr->selectedObjects( selected );
2627 SALOME_ListIteratorOfListIO it(selected);
2628 for( ; it.More(); it.Next()) {
2629 Handle(SALOME_InteractiveObject) anIObject = it.Value();
2630 if(anIObject->hasEntry()) {
2631 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){
2632 anActor->SetFacesOriented( !anActor->GetFacesOriented() );
2639 case SMESHOp::OpUpdate:
2641 if(isStudyLocked()) break;
2642 SUIT_OverrideCursor wc;
2645 SMESH::UpdateView();
2647 catch (std::bad_alloc) { // PAL16774 (Crash after display of many groups)
2648 SMESH::OnVisuException();
2650 catch (...) { // PAL16774 (Crash after display of many groups)
2651 SMESH::OnVisuException();
2655 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2656 aSel->selectedObjects( l );
2657 aSel->setSelectedObjects( l );
2661 case SMESHOp::OpHide:
2662 case SMESHOp::OpShow:
2663 case SMESHOp::OpShowOnly:
2665 SUIT_OverrideCursor wc;
2666 SMESH::EDisplaing anAction;
2667 switch (theCommandID) {
2668 case SMESHOp::OpHide: anAction = SMESH::eErase; break;
2669 case SMESHOp::OpShow: anAction = SMESH::eDisplay; break;
2670 case SMESHOp::OpShowOnly: anAction = SMESH::eDisplayOnly; break;
2673 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2674 SALOME_ListIO sel_objects, to_process;
2676 aSel->selectedObjects( sel_objects );
2678 if ( theCommandID==SMESHOp::OpShowOnly )
2680 //MESSAGE("anAction = SMESH::eDisplayOnly");
2681 startOperation( myEraseAll );
2684 extractContainers( sel_objects, to_process );
2689 SALOME_ListIteratorOfListIO It( to_process );
2690 for ( ; It.More(); It.Next())
2692 Handle(SALOME_InteractiveObject) IOS = It.Value();
2693 if ( IOS->hasEntry() )
2695 if ( !SMESH::UpdateView( anAction, IOS->getEntry() )) {
2696 SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged();
2697 break; // PAL16774 (Crash after display of many groups)
2699 if (anAction == SMESH::eDisplayOnly)
2700 anAction = SMESH::eDisplay;
2705 // PAL13338 + PAL15161 -->
2706 if ( ( theCommandID==SMESHOp::OpShow || theCommandID==SMESHOp::OpShowOnly ) && !isStudyLocked()) {
2707 SMESH::UpdateView();
2708 SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged();
2710 // PAL13338 + PAL15161 <--
2712 catch (...) { // PAL16774 (Crash after display of many groups)
2713 SMESH::OnVisuException();
2716 if (anAction == SMESH::eErase) {
2718 aSel->setSelectedObjects( l1 );
2721 aSel->setSelectedObjects( to_process );
2726 case SMESHOp::OpNode:
2728 if(isStudyLocked()) break;
2731 EmitSignalDeactivateDialog();
2733 ( new SMESHGUI_NodesDlg( this ) )->show();
2736 SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"),tr("SMESH_WRN_VIEWER_VTK"));
2741 case SMESHOp::OpCreateMesh:
2742 case SMESHOp::OpCreateSubMesh:
2743 case SMESHOp::OpEditMeshOrSubMesh:
2744 case SMESHOp::OpEditMesh:
2745 case SMESHOp::OpEditSubMesh:
2746 case SMESHOp::OpCompute:
2747 case SMESHOp::OpComputeSubMesh:
2748 case SMESHOp::OpPreCompute:
2749 case SMESHOp::OpEvaluate:
2750 case SMESHOp::OpMeshOrder:
2751 startOperation( theCommandID );
2753 case SMESHOp::OpCopyMesh:
2755 if (isStudyLocked()) break;
2756 EmitSignalDeactivateDialog();
2757 ( new SMESHGUI_CopyMeshDlg( this ) )->show();
2760 case SMESHOp::OpBuildCompoundMesh:
2762 if (isStudyLocked()) break;
2763 EmitSignalDeactivateDialog();
2764 ( new SMESHGUI_BuildCompoundDlg( this ) )->show();
2768 case SMESHOp::OpDiagonalInversion:
2769 case SMESHOp::OpUnionOfTwoTriangle:
2773 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), tr( "NOT_A_VTK_VIEWER" ) );
2777 if ( isStudyLocked() )
2780 /*Standard_Boolean aRes;
2781 SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IObject);
2782 if ( aMesh->_is_nil() )
2784 SUIT_MessageBox::warning(GetDesktop(), tr( "SMESH_WRN_WARNING" ),
2785 tr( "SMESH_BAD_SELECTION" ) );
2789 EmitSignalDeactivateDialog();
2790 if ( theCommandID == SMESHOp::OpDiagonalInversion )
2791 ( new SMESHGUI_TrianglesInversionDlg( this ) )->show();
2793 ( new SMESHGUI_UnionOfTwoTrianglesDlg( this ) )->show();
2796 case SMESHOp::OpOrientation:
2797 case SMESHOp::OpUnionOfTriangles:
2798 case SMESHOp::OpCuttingOfQuadrangles:
2799 case SMESHOp::OpSplitVolumes:
2803 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), tr( "NOT_A_VTK_VIEWER" ) );
2807 if ( isStudyLocked() )
2810 EmitSignalDeactivateDialog();
2811 SMESHGUI_MultiEditDlg* aDlg = NULL;
2812 if ( theCommandID == SMESHOp::OpOrientation )
2813 aDlg = new SMESHGUI_ChangeOrientationDlg(this);
2814 else if ( theCommandID == SMESHOp::OpUnionOfTriangles )
2815 aDlg = new SMESHGUI_UnionOfTrianglesDlg(this);
2816 else if ( theCommandID == SMESHOp::OpSplitVolumes )
2817 aDlg = new SMESHGUI_SplitVolumesDlg(this);
2819 aDlg = new SMESHGUI_CuttingOfQuadsDlg(this);
2824 case SMESHOp::OpSmoothing:
2826 if(isStudyLocked()) break;
2828 EmitSignalDeactivateDialog();
2829 ( new SMESHGUI_SmoothingDlg( this ) )->show();
2832 SUIT_MessageBox::warning(desktop(), tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2836 case SMESHOp::OpExtrusion:
2838 if (isStudyLocked()) break;
2840 EmitSignalDeactivateDialog();
2841 ( new SMESHGUI_ExtrusionDlg ( this ) )->show();
2843 SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2847 case SMESHOp::OpExtrusionAlongAPath:
2849 if (isStudyLocked()) break;
2851 EmitSignalDeactivateDialog();
2852 ( new SMESHGUI_ExtrusionAlongPathDlg( this ) )->show();
2854 SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2858 case SMESHOp::OpRevolution:
2860 if(isStudyLocked()) break;
2862 EmitSignalDeactivateDialog();
2863 ( new SMESHGUI_RevolutionDlg( this ) )->show();
2866 SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2870 case SMESHOp::OpPatternMapping:
2872 if ( isStudyLocked() )
2876 EmitSignalDeactivateDialog();
2877 ( new SMESHGUI_MeshPatternDlg( this ) )->show();
2880 SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2884 case SMESHOp::OpSplitBiQuadratic:
2885 case SMESHOp::OpConvertMeshToQuadratic:
2886 case SMESHOp::OpCreateBoundaryElements: // create 2D mesh from 3D
2887 case SMESHOp::OpReorientFaces:
2888 case SMESHOp::OpCreateGeometryGroup:
2890 startOperation( theCommandID );
2893 case SMESHOp::OpCreateGroup:
2897 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
2901 if(isStudyLocked()) break;
2902 EmitSignalDeactivateDialog();
2903 SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_nil();
2905 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2906 SALOME_ListIO selected;
2908 aSel->selectedObjects( selected );
2910 int nbSel = selected.Extent();
2912 // check if mesh is selected
2913 aMesh = SMESH::GetMeshByIO( selected.First() );
2915 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aMesh);
2920 case SMESHOp::OpConstructGroup:
2924 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
2928 if(isStudyLocked()) break;
2929 EmitSignalDeactivateDialog();
2931 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2932 SALOME_ListIO selected;
2934 aSel->selectedObjects( selected );
2936 int nbSel = selected.Extent();
2938 // check if submesh is selected
2939 Handle(SALOME_InteractiveObject) IObject = selected.First();
2940 if (IObject->hasEntry()) {
2941 _PTR(SObject) aSObj = SMESH::getStudy()->FindObjectID(IObject->getEntry());
2943 SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( aSObj ) );
2944 if (!aSubMesh->_is_nil()) {
2946 SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
2947 // get submesh elements list by types
2948 SMESH::long_array_var aNodes = aSubMesh->GetElementsByType(SMESH::NODE);
2949 SMESH::long_array_var aEdges = aSubMesh->GetElementsByType(SMESH::EDGE);
2950 SMESH::long_array_var aFaces = aSubMesh->GetElementsByType(SMESH::FACE);
2951 SMESH::long_array_var aVolumes = aSubMesh->GetElementsByType(SMESH::VOLUME);
2952 // create group for each type o elements
2953 QString aName = IObject->getName();
2954 QStringList anEntryList;
2955 if (aNodes->length() > 0) {
2956 SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::NODE, aName + "_Nodes");
2957 aGroup->Add(aNodes.inout());
2958 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( aGroup ) )
2959 anEntryList.append( aSObject->GetID().c_str() );
2961 if (aEdges->length() > 0) {
2962 SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::EDGE, aName + "_Edges");
2963 aGroup->Add(aEdges.inout());
2964 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( aGroup ) )
2965 anEntryList.append( aSObject->GetID().c_str() );
2967 if (aFaces->length() > 0) {
2968 SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::FACE, aName + "_Faces");
2969 aGroup->Add(aFaces.inout());
2970 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( aGroup ) )
2971 anEntryList.append( aSObject->GetID().c_str() );
2973 if (aVolumes->length() > 0) {
2974 SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::VOLUME, aName + "_Volumes");
2975 aGroup->Add(aVolumes.inout());
2976 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( aGroup ) )
2977 anEntryList.append( aSObject->GetID().c_str() );
2980 anApp->browseObjects( anEntryList );
2982 catch(const SALOME::SALOME_Exception & S_ex){
2983 SalomeApp_Tools::QtCatchCorbaException(S_ex);
2990 SUIT_MessageBox::warning(desktop(),
2991 tr("SMESH_WRN_WARNING"),
2992 tr("SMESH_WRN_NO_AVAILABLE_DATA"));
2997 case SMESHOp::OpEditGroup:
3001 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
3005 if(isStudyLocked()) break;
3006 EmitSignalDeactivateDialog();
3008 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
3009 SALOME_ListIO selected;
3011 aSel->selectedObjects( selected );
3013 SALOME_ListIteratorOfListIO It (selected);
3014 int nbSelectedGroups = 0;
3015 for ( ; It.More(); It.Next() )
3017 SMESH::SMESH_GroupBase_var aGroup =
3018 SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(It.Value());
3019 if (!aGroup->_is_nil()) {
3021 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aGroup);
3025 if (nbSelectedGroups == 0)
3027 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, SMESH::SMESH_GroupBase::_nil());
3033 case SMESHOp::OpAddElemGroupPopup: // Add elements to group
3035 if(isStudyLocked()) break;
3036 if (myState == 800) {
3037 SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) myActiveDialogBox;
3038 if (aDlg) aDlg->onAdd();
3043 case SMESHOp::OpRemoveElemGroupPopup: // Remove elements from group
3045 if(isStudyLocked()) break;
3046 if (myState == 800) {
3047 SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) myActiveDialogBox;
3048 if (aDlg) aDlg->onRemove();
3053 case SMESHOp::OpEditGeomGroupAsGroup:
3057 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
3061 if(isStudyLocked()) break;
3062 EmitSignalDeactivateDialog();
3064 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
3065 SALOME_ListIO selected;
3067 aSel->selectedObjects( selected );
3069 SALOME_ListIteratorOfListIO It (selected);
3070 for ( ; It.More(); It.Next() )
3072 SMESH::SMESH_GroupOnGeom_var aGroup =
3073 SMESH::IObjectToInterface<SMESH::SMESH_GroupOnGeom>(It.Value());
3074 if (!aGroup->_is_nil()) {
3075 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aGroup, true );
3080 SMESH::SMESH_GroupOnFilter_var aGroup =
3081 SMESH::IObjectToInterface<SMESH::SMESH_GroupOnFilter>(It.Value());
3082 if (!aGroup->_is_nil()) {
3083 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aGroup, true );
3091 case SMESHOp::OpUnionGroups:
3092 case SMESHOp::OpIntersectGroups:
3093 case SMESHOp::OpCutGroups:
3097 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
3101 if ( isStudyLocked() )
3104 EmitSignalDeactivateDialog();
3106 SMESHGUI_GroupOpDlg* aDlg = 0;
3107 if ( theCommandID == SMESHOp::OpUnionGroups )
3108 aDlg = new SMESHGUI_UnionGroupsDlg( this );
3109 else if ( theCommandID == SMESHOp::OpIntersectGroups )
3110 aDlg = new SMESHGUI_IntersectGroupsDlg( this );
3112 aDlg = new SMESHGUI_CutGroupsDlg( this );
3119 case SMESHOp::OpGroupUnderlyingElem: // Create groups of entities from existing groups of superior dimensions
3121 if ( isStudyLocked() )
3124 EmitSignalDeactivateDialog();
3125 SMESHGUI_GroupOpDlg* aDlg = new SMESHGUI_DimGroupDlg( this );
3131 case SMESHOp::OpDeleteGroup: // Delete groups with their contents
3135 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) );
3139 if ( isStudyLocked() )
3142 EmitSignalDeactivateDialog();
3144 ( new SMESHGUI_DeleteGroupDlg( this ) )->show();
3148 case SMESHOp::OpMeshInformation:
3149 case SMESHOp::OpWhatIs:
3151 int page = theCommandID == SMESHOp::OpMeshInformation ? SMESHGUI_MeshInfoDlg::BaseInfo : SMESHGUI_MeshInfoDlg::ElemInfo;
3152 EmitSignalDeactivateDialog();
3153 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
3154 SALOME_ListIO selected;
3156 aSel->selectedObjects( selected );
3158 if ( selected.Extent() > 1 ) { // a dlg for each IO
3159 SALOME_ListIteratorOfListIO It( selected );
3160 for ( ; It.More(); It.Next() ) {
3161 SMESHGUI_MeshInfoDlg* dlg = new SMESHGUI_MeshInfoDlg( SMESHGUI::desktop(), page );
3162 dlg->showInfo( It.Value() );
3167 SMESHGUI_MeshInfoDlg* dlg = new SMESHGUI_MeshInfoDlg( SMESHGUI::desktop(), page );
3173 case SMESHOp::OpFindElementByPoint:
3175 startOperation( theCommandID );
3179 case SMESHOp::OpEditHypothesis:
3181 if(isStudyLocked()) break;
3183 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
3184 SALOME_ListIO selected;
3186 aSel->selectedObjects( selected );
3188 int nbSel = selected.Extent();
3191 Handle(SALOME_InteractiveObject) anIObject = selected.First();
3192 SMESH::SMESH_Hypothesis_var aHypothesis = SMESH::IObjectToInterface<SMESH::SMESH_Hypothesis>(anIObject);
3194 if ( !aHypothesis->_is_nil() )
3196 SMESHGUI_GenericHypothesisCreator* aCreator =
3197 SMESH::GetHypothesisCreator( SMESH::toQStr( aHypothesis->GetName() ));
3200 // set geometry of mesh and sub-mesh to aCreator
3201 aSel->selectedObjects( selected, "", /*convertReferences=*/false);
3202 if ( selected.Extent() == 1 )
3204 QString subGeomID, meshGeomID;
3205 Handle(SALOME_InteractiveObject) hypIO = selected.First();
3206 if ( SMESH::GetGeomEntries( hypIO, subGeomID, meshGeomID ))
3208 if ( subGeomID.isEmpty() ) subGeomID = meshGeomID;
3209 aCreator->setShapeEntry( subGeomID );
3210 aCreator->setMainShapeEntry( meshGeomID );
3214 aCreator->edit( aHypothesis.in(), anIObject->getName(), desktop(), this, SLOT( onHypothesisEdit( int ) ) );
3224 case SMESHOp::OpUnassign: // REMOVE HYPOTHESIS / ALGORITHMS
3226 if(isStudyLocked()) break;
3227 SUIT_OverrideCursor wc;
3229 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
3230 SALOME_ListIO selected;
3232 aSel->selectedObjects( selected, QString::null, false );
3234 SALOME_ListIteratorOfListIO It(selected);
3235 for (int i = 0; It.More(); It.Next(), i++) {
3236 Handle(SALOME_InteractiveObject) IObject = It.Value();
3237 SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
3240 aSel->setSelectedObjects( l1 );
3245 case SMESHOp::OpElem0D:
3246 case SMESHOp::OpBall:
3247 case SMESHOp::OpEdge:
3248 case SMESHOp::OpTriangle:
3249 case SMESHOp::OpQuadrangle:
3250 case SMESHOp::OpPolygon:
3251 case SMESHOp::OpTetrahedron:
3252 case SMESHOp::OpHexahedron:
3253 case SMESHOp::OpPentahedron:
3254 case SMESHOp::OpPyramid:
3255 case SMESHOp::OpHexagonalPrism:
3257 if(isStudyLocked()) break;
3259 EmitSignalDeactivateDialog();
3260 SMDSAbs_EntityType type = SMDSEntity_Edge;
3261 switch (theCommandID) {
3262 case SMESHOp::OpElem0D: type = SMDSEntity_0D; break;
3263 case SMESHOp::OpBall: type = SMDSEntity_Ball; break;
3264 case SMESHOp::OpTriangle: type = SMDSEntity_Triangle; break;
3265 case SMESHOp::OpQuadrangle: type = SMDSEntity_Quadrangle; break;
3266 case SMESHOp::OpTetrahedron: type = SMDSEntity_Tetra; break;
3267 case SMESHOp::OpPolygon: type = SMDSEntity_Polygon; break;
3268 case SMESHOp::OpHexahedron: type = SMDSEntity_Hexa; break;
3269 case SMESHOp::OpPentahedron: type = SMDSEntity_Penta; break;
3270 case SMESHOp::OpPyramid: type = SMDSEntity_Pyramid; break;
3271 case SMESHOp::OpHexagonalPrism: type = SMDSEntity_Hexagonal_Prism; break;
3274 ( new SMESHGUI_AddMeshElementDlg( this, type ) )->show();
3277 SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3281 case SMESHOp::OpPolyhedron:
3283 if(isStudyLocked()) break;
3285 EmitSignalDeactivateDialog();
3286 ( new SMESHGUI_CreatePolyhedralVolumeDlg( this ) )->show();
3289 SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3293 case SMESHOp::OpQuadraticEdge:
3294 case SMESHOp::OpQuadraticTriangle:
3295 case SMESHOp::OpBiQuadraticTriangle:
3296 case SMESHOp::OpQuadraticQuadrangle:
3297 case SMESHOp::OpBiQuadraticQuadrangle:
3298 case SMESHOp::OpQuadraticPolygon:
3299 case SMESHOp::OpQuadraticTetrahedron:
3300 case SMESHOp::OpQuadraticPyramid:
3301 case SMESHOp::OpQuadraticPentahedron:
3302 case SMESHOp::OpBiQuadraticPentahedron:
3303 case SMESHOp::OpQuadraticHexahedron:
3304 case SMESHOp::OpTriQuadraticHexahedron:
3306 if(isStudyLocked()) break;
3308 EmitSignalDeactivateDialog();
3309 SMDSAbs_EntityType type = SMDSEntity_Last;
3311 switch (theCommandID) {
3312 case SMESHOp::OpQuadraticEdge: type = SMDSEntity_Quad_Edge; break;
3313 case SMESHOp::OpQuadraticTriangle: type = SMDSEntity_Quad_Triangle; break;
3314 case SMESHOp::OpBiQuadraticTriangle: type = SMDSEntity_BiQuad_Triangle; break;
3315 case SMESHOp::OpQuadraticQuadrangle: type = SMDSEntity_Quad_Quadrangle; break;
3316 case SMESHOp::OpBiQuadraticQuadrangle: type = SMDSEntity_BiQuad_Quadrangle; break;
3317 case SMESHOp::OpQuadraticPolygon: type = SMDSEntity_Quad_Polygon; break;
3318 case SMESHOp::OpQuadraticTetrahedron: type = SMDSEntity_Quad_Tetra; break;
3319 case SMESHOp::OpQuadraticPyramid: type = SMDSEntity_Quad_Pyramid; break;
3320 case SMESHOp::OpQuadraticPentahedron: type = SMDSEntity_Quad_Penta; break;
3321 case SMESHOp::OpBiQuadraticPentahedron: type = SMDSEntity_BiQuad_Penta; break;
3322 case SMESHOp::OpQuadraticHexahedron: type = SMDSEntity_Quad_Hexa; break;
3323 case SMESHOp::OpTriQuadraticHexahedron: type = SMDSEntity_TriQuad_Hexa; break;
3326 if ( type != SMDSEntity_Last )
3327 ( new SMESHGUI_AddQuadraticElementDlg( this, type ) )->show();
3330 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3331 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3335 case SMESHOp::OpRemoveNodes:
3337 if(isStudyLocked()) break;
3339 EmitSignalDeactivateDialog();
3340 ( new SMESHGUI_RemoveNodesDlg( this ) )->show();
3343 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3344 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3348 case SMESHOp::OpRemoveElements: // REMOVES ELEMENTS
3350 if(isStudyLocked()) break;
3352 EmitSignalDeactivateDialog();
3353 ( new SMESHGUI_RemoveElementsDlg( this ) )->show();
3357 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3358 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3362 case SMESHOp::OpClearMesh: {
3364 if(isStudyLocked()) break;
3366 SALOME_ListIO selected;
3367 if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
3368 aSel->selectedObjects( selected );
3370 SUIT_OverrideCursor wc;
3371 SALOME_ListIteratorOfListIO It (selected);
3372 for ( ; It.More(); It.Next() )
3374 Handle(SALOME_InteractiveObject) IOS = It.Value();
3375 SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IOS);
3376 if ( aMesh->_is_nil()) continue;
3379 if ( aMesh->NbNodes() == 0 ) // imported mesh is not empty
3380 SMESH::RemoveVisualObjectWithActors(IOS->getEntry(), true);
3381 _PTR(SObject) aMeshSObj = SMESH::FindSObject(aMesh);
3382 // hide groups and submeshes
3383 _PTR(ChildIterator) anIter =
3384 SMESH::getStudy()->NewChildIterator( aMeshSObj );
3385 for ( anIter->InitEx(true); anIter->More(); anIter->Next() )
3387 _PTR(SObject) so = anIter->Value();
3388 SMESH::RemoveVisualObjectWithActors(so->GetID().c_str(), true);
3391 catch (const SALOME::SALOME_Exception& S_ex){
3393 SalomeApp_Tools::QtCatchCorbaException(S_ex);
3397 SMESH::UpdateView();
3401 case SMESHOp::OpRemoveOrphanNodes:
3403 if(isStudyLocked()) break;
3404 SALOME_ListIO selected;
3405 if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
3406 aSel->selectedObjects( selected );
3407 if ( selected.Extent() == 1 ) {
3408 Handle(SALOME_InteractiveObject) anIO = selected.First();
3409 SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(anIO);
3410 if ( !aMesh->_is_nil() ) {
3411 bool confirm = SUIT_MessageBox::question( SMESHGUI::desktop(),
3412 tr( "SMESH_WARNING" ),
3413 tr( "REMOVE_ORPHAN_NODES_QUESTION"),
3414 SUIT_MessageBox::Yes |
3415 SUIT_MessageBox::No,
3416 SUIT_MessageBox::No ) == SUIT_MessageBox::Yes;
3419 SUIT_OverrideCursor wc;
3420 SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
3421 int removed = aMeshEditor->RemoveOrphanNodes();
3422 SUIT_MessageBox::information(SMESHGUI::desktop(),
3423 tr("SMESH_INFORMATION"),
3424 tr("NB_NODES_REMOVED").arg(removed));
3425 if ( removed > 0 ) {
3426 SMESH::UpdateView();
3427 SMESHGUI::Modified();
3430 catch (const SALOME::SALOME_Exception& S_ex) {
3431 SalomeApp_Tools::QtCatchCorbaException(S_ex);
3440 case SMESHOp::OpRenumberingNodes:
3442 if(isStudyLocked()) break;
3444 EmitSignalDeactivateDialog();
3445 ( new SMESHGUI_RenumberingDlg( this, 0 ) )->show();
3449 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3450 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3454 case SMESHOp::OpRenumberingElements:
3456 if(isStudyLocked()) break;
3458 EmitSignalDeactivateDialog();
3459 ( new SMESHGUI_RenumberingDlg( this, 1 ) )->show();
3463 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3464 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3468 case SMESHOp::OpTranslation:
3470 if(isStudyLocked()) break;
3472 EmitSignalDeactivateDialog();
3473 ( new SMESHGUI_TranslationDlg( this ) )->show();
3476 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3477 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3481 case SMESHOp::OpRotation:
3483 if(isStudyLocked()) break;
3485 EmitSignalDeactivateDialog();
3486 ( new SMESHGUI_RotationDlg( this ) )->show();
3489 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3490 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3494 case SMESHOp::OpSymmetry:
3496 if(isStudyLocked()) break;
3498 EmitSignalDeactivateDialog();
3499 ( new SMESHGUI_SymmetryDlg( this ) )->show();
3502 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3503 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3507 case SMESHOp::OpScale:
3509 if(isStudyLocked()) break;
3511 EmitSignalDeactivateDialog();
3512 ( new SMESHGUI_ScaleDlg( this ) )->show();
3515 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3516 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3521 case SMESHOp::OpOffset:
3523 if(isStudyLocked()) break;
3525 EmitSignalDeactivateDialog();
3526 ( new SMESHGUI_OffsetDlg( this ) )->show();
3529 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3530 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3535 case SMESHOp::OpSewing:
3537 if(isStudyLocked()) break;
3539 EmitSignalDeactivateDialog();
3540 ( new SMESHGUI_SewingDlg( this ) )->show();
3543 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3544 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3548 case SMESHOp::OpMergeNodes:
3550 if(isStudyLocked()) break;
3552 EmitSignalDeactivateDialog();
3553 ( new SMESHGUI_MergeDlg( this, 0 ) )->show();
3556 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3557 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3561 case SMESHOp::OpMergeElements:
3563 if (isStudyLocked()) break;
3565 EmitSignalDeactivateDialog();
3566 ( new SMESHGUI_MergeDlg( this, 1 ) )->show();
3568 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3569 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3574 case SMESHOp::OpMoveNode: // MAKE MESH PASS THROUGH POINT
3575 startOperation( SMESHOp::OpMoveNode );
3578 case SMESHOp::OpDuplicateNodes:
3580 if(isStudyLocked()) break;
3582 EmitSignalDeactivateDialog();
3583 ( new SMESHGUI_DuplicateNodesDlg( this ) )->show();
3586 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3587 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3592 case SMESHOp::OpElem0DOnElemNodes: // 0D_ON_ALL_NODES
3593 startOperation( SMESHOp::OpElem0DOnElemNodes );
3596 case SMESHOp::OpSelectFiltersLibrary: // Library of selection filters
3598 static QList<int> aTypes;
3599 if ( aTypes.isEmpty() )
3601 aTypes.append( SMESH::NODE );
3602 aTypes.append( SMESH::EDGE );
3603 aTypes.append( SMESH::FACE );
3604 aTypes.append( SMESH::VOLUME );
3606 if (!myFilterLibraryDlg)
3607 myFilterLibraryDlg = new SMESHGUI_FilterLibraryDlg( this, SMESH::GetDesktop( this ), aTypes, SMESHGUI_FilterLibraryDlg::EDIT );
3608 else if (myFilterLibraryDlg->isHidden())
3609 myFilterLibraryDlg->Init( aTypes, SMESHGUI_FilterLibraryDlg::EDIT );
3610 myFilterLibraryDlg->raise();
3614 case SMESHOp::OpFreeNode:
3615 case SMESHOp::OpEqualNode:
3616 case SMESHOp::OpNodeConnectivityNb:
3617 case SMESHOp::OpFreeEdge:
3618 case SMESHOp::OpFreeBorder:
3619 case SMESHOp::OpLength:
3620 case SMESHOp::OpConnection:
3621 case SMESHOp::OpEqualEdge:
3622 case SMESHOp::OpFreeFace:
3623 case SMESHOp::OpBareBorderFace:
3624 case SMESHOp::OpOverConstrainedFace:
3625 case SMESHOp::OpLength2D:
3626 case SMESHOp::OpDeflection2D:
3627 case SMESHOp::OpConnection2D:
3628 case SMESHOp::OpArea:
3629 case SMESHOp::OpTaper:
3630 case SMESHOp::OpAspectRatio:
3631 case SMESHOp::OpMinimumAngle:
3632 case SMESHOp::OpWarpingAngle:
3633 case SMESHOp::OpSkew:
3634 case SMESHOp::OpMaxElementLength2D:
3635 case SMESHOp::OpEqualFace:
3636 case SMESHOp::OpAspectRatio3D:
3637 case SMESHOp::OpVolume:
3638 case SMESHOp::OpMaxElementLength3D:
3639 case SMESHOp::OpBareBorderVolume:
3640 case SMESHOp::OpOverConstrainedVolume:
3641 case SMESHOp::OpEqualVolume:
3644 LightApp_SelectionMgr* mgr = selectionMgr();
3645 SALOME_ListIO selected; mgr->selectedObjects( selected );
3647 if( !selected.IsEmpty() ) {
3648 SUIT_OverrideCursor wc;
3649 ::Control( theCommandID );
3652 SUIT_MessageBox::warning(desktop(),
3653 tr( "SMESH_WRN_WARNING" ),
3654 tr( "SMESH_BAD_SELECTION" ) );
3658 SUIT_MessageBox::warning(desktop(),
3659 tr( "SMESH_WRN_WARNING" ),
3660 tr( "NOT_A_VTK_VIEWER" ) );
3663 case SMESHOp::OpOverallMeshQuality:
3664 OverallMeshQuality();
3666 case SMESHOp::OpNumberingNodes:
3668 SUIT_OverrideCursor wc;
3669 LightApp_SelectionMgr* mgr = selectionMgr();
3670 SALOME_ListIO selected; mgr->selectedObjects( selected );
3672 SALOME_ListIteratorOfListIO it(selected);
3673 for( ; it.More(); it.Next()) {
3674 Handle(SALOME_InteractiveObject) anIObject = it.Value();
3675 if(anIObject->hasEntry()) {
3676 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){
3677 anActor->SetPointsLabeled( !anActor->GetPointsLabeled() );
3683 case SMESHOp::OpNumberingElements:
3685 SUIT_OverrideCursor wc;
3686 LightApp_SelectionMgr* mgr = selectionMgr();
3687 SALOME_ListIO selected; mgr->selectedObjects( selected );
3689 SALOME_ListIteratorOfListIO it(selected);
3690 for( ; it.More(); it.Next()) {
3691 Handle(SALOME_InteractiveObject) anIObject = it.Value();
3692 if(anIObject->hasEntry())
3693 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){
3694 anActor->SetCellsLabeled( !anActor->GetCellsLabeled() );
3699 case SMESHOp::OpPropertiesLength:
3700 case SMESHOp::OpPropertiesArea:
3701 case SMESHOp::OpPropertiesVolume:
3702 case SMESHOp::OpMinimumDistance:
3703 case SMESHOp::OpBoundingBox:
3705 int page = SMESHGUI_MeasureDlg::MinDistance;
3706 if ( theCommandID == SMESHOp::OpBoundingBox )
3707 page = SMESHGUI_MeasureDlg::BoundingBox;
3708 else if ( theCommandID == SMESHOp::OpPropertiesLength )
3709 page = SMESHGUI_MeasureDlg::Length;
3710 else if ( theCommandID == SMESHOp::OpPropertiesArea )
3711 page = SMESHGUI_MeasureDlg::Area;
3712 else if ( theCommandID == SMESHOp::OpPropertiesVolume )
3713 page = SMESHGUI_MeasureDlg::Volume;
3715 EmitSignalDeactivateDialog();
3716 SMESHGUI_MeasureDlg* dlg = new SMESHGUI_MeasureDlg( SMESHGUI::desktop(), page );
3720 case SMESHOp::OpSortChild:
3726 anApp->updateActions(); //SRN: To update a Save button in the toolbar
3727 //updateObjBrowser();
3731 //=============================================================================
3735 //=============================================================================
3736 bool SMESHGUI::OnMousePress( QMouseEvent * pe, SUIT_ViewWindow * wnd )
3741 //=============================================================================
3745 //=============================================================================
3746 bool SMESHGUI::OnMouseMove( QMouseEvent * pe, SUIT_ViewWindow * wnd )
3751 //=============================================================================
3755 //=============================================================================
3756 bool SMESHGUI::OnKeyPress( QKeyEvent * pe, SUIT_ViewWindow * wnd )
3761 //=============================================================================
3762 /*! Method: BuildPresentation(const Handle(SALOME_InteractiveObject)& theIO)
3763 * Purpose: ensures that the actor for the given <theIO> exists in the active VTK view
3765 //=============================================================================
3766 void SMESHGUI::BuildPresentation( const Handle(SALOME_InteractiveObject) & theIO,
3767 SUIT_ViewWindow* wnd )
3769 if(theIO->hasEntry()){
3770 //SUIT_ViewWindow* wnd = SMESH::GetActiveWindow();
3771 SMESH::UpdateView(wnd,SMESH::eDisplay,theIO->getEntry());
3775 //=======================================================================
3776 // function : createSMESHAction
3778 //=======================================================================
3779 void SMESHGUI::createSMESHAction( const int id, const QString& po_id, const QString& icon_id,
3780 const int key, const bool toggle, const QString& shortcutAction )
3783 QWidget* parent = application()->desktop();
3784 SUIT_ResourceMgr* resMgr = resourceMgr();
3786 if ( !icon_id.isEmpty() )
3787 pix = resMgr->loadPixmap( "SMESH", tr( icon_id.toLatin1().data() ) );
3789 pix = resMgr->loadPixmap( "SMESH", tr( QString( "ICO_%1" ).arg( po_id ).toLatin1().data() ), false );
3790 if ( !pix.isNull() )
3791 icon = QIcon( pix );
3793 QString tooltip = tr( QString( "TOP_%1" ).arg( po_id ).toLatin1().data() ),
3794 menu = tr( QString( "MEN_%1" ).arg( po_id ).toLatin1().data() ),
3795 status_bar = tr( QString( "STB_%1" ).arg( po_id ).toLatin1().data() );
3797 createAction( id, tooltip, icon, menu, status_bar, key, parent,
3798 toggle, this, SLOT( OnGUIEvent() ), shortcutAction );
3801 //=======================================================================
3802 // function : createPopupItem
3804 //=======================================================================
3805 void SMESHGUI::createPopupItem( const int id,
3806 const QString& clients,
3807 const QString& types,
3808 const QString& theRule,
3811 if( !popupMgr()->contains( popupMgr()->actionId( action( id ) ) ) )
3812 popupMgr()->insert( action( id ), pId, 0 );
3814 QString lc = "$"; // VSR : instead of QtxPopupSelection::defEquality();
3815 QString dc = "selcount"; // VSR : instead of QtxPopupSelection::defSelCountParam()
3816 QString rule = "(%1) and (%2) and (%3)";
3817 rule = rule.arg( QString( "%1>0" ).arg( dc ) );
3818 if( clients.isEmpty() )
3819 rule = rule.arg( QString( "true" ) );
3821 rule = rule.arg( QString( "%1client in {%2}" ).arg( lc ).arg( clients ) );
3822 rule = rule.arg( QString( "%1type in {%2}" ).arg( lc ).arg( types ) );
3825 bool cont = myRules.contains( id );
3827 rule = QString( "%1 or (%2)" ).arg( myRules[ id ] ).arg( rule );
3829 popupMgr()->setRule( action( id ), rule, QtxPopupMgr::VisibleRule );
3830 myRules[ id ] = QString( cont ? "%1" : "(%1)" ).arg( rule );
3833 //=======================================================================
3834 // function : initialize
3836 //=======================================================================
3837 void SMESHGUI::initialize( CAM_Application* app )
3839 SalomeApp_Module::initialize( app );
3841 // SUIT_ResourceMgr* mgr = app->resourceMgr();
3843 /* Automatic Update flag */
3844 // myAutomaticUpdate = mgr->booleanValue( "SMESH", "AutomaticUpdate", myAutomaticUpdate );
3846 // ----- create actions --------------
3848 //createSMESHAction( SMESHOp::OpImportDAT, "IMPORT_DAT", "", (Qt::CTRL+Qt::Key_B) );
3849 createSMESHAction( SMESHOp::OpImportUNV, "IMPORT_UNV", "", (Qt::CTRL+Qt::Key_I) );
3850 createSMESHAction( SMESHOp::OpImportMED, "IMPORT_MED", "", (Qt::CTRL+Qt::Key_M) );
3851 createSMESHAction( SMESHOp::OpImportSTL, "IMPORT_STL" );
3853 createSMESHAction( SMESHOp::OpImportCGNS, "IMPORT_CGNS" );
3855 createSMESHAction( SMESHOp::OpImportSAUV, "IMPORT_SAUV" );
3856 createSMESHAction( SMESHOp::OpImportGMF, "IMPORT_GMF" );
3857 createSMESHAction( SMESHOp::OpPopupImportUNV, "IMPORT_UNV");
3858 createSMESHAction( SMESHOp::OpPopupImportMED, "IMPORT_MED");
3859 createSMESHAction( SMESHOp::OpPopupImportSTL, "IMPORT_STL" );
3861 createSMESHAction( SMESHOp::OpPopupImportCGNS, "IMPORT_CGNS" );
3863 createSMESHAction( SMESHOp::OpPopupImportSAUV, "IMPORT_SAUV" );
3864 createSMESHAction( SMESHOp::OpPopupImportGMF, "IMPORT_GMF" );
3866 createSMESHAction( SMESHOp::OpExportDAT, "DAT" );
3867 createSMESHAction( SMESHOp::OpExportMED, "MED" );
3868 createSMESHAction( SMESHOp::OpExportUNV, "UNV" );
3869 createSMESHAction( SMESHOp::OpExportSTL, "STL" );
3871 createSMESHAction( SMESHOp::OpExportCGNS, "CGNS");
3873 createSMESHAction( SMESHOp::OpExportSAUV, "SAUV");
3874 createSMESHAction( SMESHOp::OpExportGMF, "GMF" );
3875 createSMESHAction( SMESHOp::OpPopupExportDAT, "DAT" );
3876 createSMESHAction( SMESHOp::OpPopupExportMED, "MED" );
3877 createSMESHAction( SMESHOp::OpPopupExportUNV, "UNV" );
3878 createSMESHAction( SMESHOp::OpPopupExportSTL, "STL" );
3880 createSMESHAction( SMESHOp::OpPopupExportCGNS, "CGNS");
3882 createSMESHAction( SMESHOp::OpPopupExportSAUV, "SAUV");
3883 createSMESHAction( SMESHOp::OpPopupExportGMF, "GMF" );
3884 createSMESHAction( SMESHOp::OpFileInformation, "FILE_INFO" );
3885 createSMESHAction( SMESHOp::OpDelete, "DELETE", "ICON_DELETE", Qt::Key_Delete );
3886 createSMESHAction( SMESHOp::OpSelectFiltersLibrary, "SEL_FILTER_LIB" );
3887 createSMESHAction( SMESHOp::OpCreateMesh, "CREATE_MESH", "ICON_DLG_INIT_MESH" );
3888 createSMESHAction( SMESHOp::OpCreateSubMesh, "CREATE_SUBMESH", "ICON_DLG_ADD_SUBMESH" );
3889 createSMESHAction( SMESHOp::OpEditMeshOrSubMesh, "EDIT_MESHSUBMESH", "ICON_DLG_EDIT_MESH" );
3890 createSMESHAction( SMESHOp::OpEditMesh, "EDIT_MESH", "ICON_DLG_EDIT_MESH" );
3891 createSMESHAction( SMESHOp::OpEditSubMesh, "EDIT_SUBMESH", "ICON_DLG_EDIT_MESH" );
3892 createSMESHAction( SMESHOp::OpBuildCompoundMesh, "BUILD_COMPOUND", "ICON_BUILD_COMPOUND" );
3893 createSMESHAction( SMESHOp::OpCopyMesh, "COPY_MESH", "ICON_COPY_MESH" );
3894 createSMESHAction( SMESHOp::OpCompute, "COMPUTE", "ICON_COMPUTE" );
3895 createSMESHAction( SMESHOp::OpComputeSubMesh, "COMPUTE_SUBMESH", "ICON_COMPUTE" );
3896 createSMESHAction( SMESHOp::OpPreCompute, "PRECOMPUTE", "ICON_PRECOMPUTE" );
3897 createSMESHAction( SMESHOp::OpEvaluate, "EVALUATE", "ICON_EVALUATE" );
3898 createSMESHAction( SMESHOp::OpMeshOrder, "MESH_ORDER", "ICON_MESH_ORDER");
3899 createSMESHAction( SMESHOp::OpCreateGroup, "CREATE_GROUP", "ICON_CREATE_GROUP" );
3900 createSMESHAction( SMESHOp::OpCreateGeometryGroup, "CREATE_GEO_GROUP", "ICON_CREATE_GEO_GROUP" );
3901 createSMESHAction( SMESHOp::OpConstructGroup, "CONSTRUCT_GROUP", "ICON_CONSTRUCT_GROUP" );
3902 createSMESHAction( SMESHOp::OpEditGroup, "EDIT_GROUP", "ICON_EDIT_GROUP" );
3903 createSMESHAction( SMESHOp::OpEditGeomGroupAsGroup, "EDIT_GEOMGROUP_AS_GROUP", "ICON_EDIT_GROUP" );
3904 createSMESHAction( SMESHOp::OpUnionGroups, "UN_GROUP", "ICON_UNION" );
3905 createSMESHAction( SMESHOp::OpIntersectGroups, "INT_GROUP", "ICON_INTERSECT" );
3906 createSMESHAction( SMESHOp::OpCutGroups, "CUT_GROUP", "ICON_CUT" );
3907 createSMESHAction( SMESHOp::OpGroupUnderlyingElem, "UNDERLYING_ELEMS", "ICON_UNDERLYING_ELEMS" );
3908 createSMESHAction( SMESHOp::OpAddElemGroupPopup, "ADD_TO_GROUP" );
3909 createSMESHAction( SMESHOp::OpRemoveElemGroupPopup, "REMOVE_FROM_GROUP" );
3910 createSMESHAction( SMESHOp::OpDeleteGroup, "DEL_GROUP", "ICON_DEL_GROUP" );
3911 createSMESHAction( SMESHOp::OpMeshInformation , "ADV_INFO", "ICON_ADV_INFO" );
3912 //createSMESHAction( SMESHOp::OpStdInfo, "STD_INFO", "ICON_STD_INFO" );
3913 //createSMESHAction( SMESHOp::OpWhatIs, "WHAT_IS", "ICON_WHAT_IS" ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
3914 createSMESHAction( SMESHOp::OpFindElementByPoint, "FIND_ELEM", "ICON_FIND_ELEM" );
3916 createSMESHAction( SMESHOp::OpFreeNode, "FREE_NODE", "ICON_FREE_NODE", 0, true );
3917 createSMESHAction( SMESHOp::OpEqualNode, "EQUAL_NODE", "ICON_EQUAL_NODE", 0, true );
3918 createSMESHAction( SMESHOp::OpNodeConnectivityNb, "NODE_CONNECTIVITY_NB", "ICON_NODE_CONN_NB", 0, true );
3919 createSMESHAction( SMESHOp::OpFreeEdge, "FREE_EDGE", "ICON_FREE_EDGE", 0, true );
3920 createSMESHAction( SMESHOp::OpFreeBorder, "FREE_BORDER", "ICON_FREE_EDGE_2D", 0, true );
3921 createSMESHAction( SMESHOp::OpLength, "LENGTH", "ICON_LENGTH", 0, true );
3922 createSMESHAction( SMESHOp::OpConnection, "CONNECTION", "ICON_CONNECTION", 0, true );
3923 createSMESHAction( SMESHOp::OpEqualEdge, "EQUAL_EDGE", "ICON_EQUAL_EDGE", 0, true );
3924 createSMESHAction( SMESHOp::OpFreeFace, "FREE_FACES", "ICON_FREE_FACES", 0, true );
3925 createSMESHAction( SMESHOp::OpBareBorderFace, "BARE_BORDER_FACE", "ICON_BARE_BORDER_FACE", 0, true );
3926 createSMESHAction( SMESHOp::OpOverConstrainedFace, "OVER_CONSTRAINED_FACE", "ICON_OVER_CONSTRAINED_FACE", 0, true );
3927 createSMESHAction( SMESHOp::OpLength2D, "LENGTH_2D", "ICON_LENGTH_2D", 0, true );
3928 createSMESHAction( SMESHOp::OpDeflection2D, "DEFLECTION_2D", "ICON_DEFLECTION_2D", 0, true );
3929 createSMESHAction( SMESHOp::OpConnection2D, "CONNECTION_2D", "ICON_CONNECTION_2D", 0, true );
3930 createSMESHAction( SMESHOp::OpArea, "AREA", "ICON_AREA", 0, true );
3931 createSMESHAction( SMESHOp::OpTaper, "TAPER", "ICON_TAPER", 0, true );
3932 createSMESHAction( SMESHOp::OpAspectRatio, "ASPECT", "ICON_ASPECT", 0, true );
3933 createSMESHAction( SMESHOp::OpMinimumAngle, "MIN_ANG", "ICON_ANGLE", 0, true );
3934 createSMESHAction( SMESHOp::OpWarpingAngle, "WARP", "ICON_WARP", 0, true );
3935 createSMESHAction( SMESHOp::OpSkew, "SKEW", "ICON_SKEW", 0, true );
3936 createSMESHAction( SMESHOp::OpMaxElementLength2D, "MAX_ELEMENT_LENGTH_2D", "ICON_MAX_ELEMENT_LENGTH_2D", 0, true );
3937 createSMESHAction( SMESHOp::OpEqualFace, "EQUAL_FACE", "ICON_EQUAL_FACE", 0, true );
3938 createSMESHAction( SMESHOp::OpAspectRatio3D, "ASPECT_3D", "ICON_ASPECT_3D", 0, true );
3939 createSMESHAction( SMESHOp::OpVolume, "VOLUME_3D", "ICON_VOLUME_3D", 0, true );
3940 createSMESHAction( SMESHOp::OpMaxElementLength3D, "MAX_ELEMENT_LENGTH_3D", "ICON_MAX_ELEMENT_LENGTH_3D", 0, true );
3941 createSMESHAction( SMESHOp::OpBareBorderVolume, "BARE_BORDER_VOLUME", "ICON_BARE_BORDER_VOLUME", 0, true );
3942 createSMESHAction( SMESHOp::OpOverConstrainedVolume, "OVER_CONSTRAINED_VOLUME", "ICON_OVER_CONSTRAINED_VOLUME", 0, true );
3943 createSMESHAction( SMESHOp::OpEqualVolume, "EQUAL_VOLUME", "ICON_EQUAL_VOLUME", 0, true );
3944 createSMESHAction( SMESHOp::OpOverallMeshQuality, "OVERALL_MESH_QUALITY", "ICON_OVL_MESH_QUALITY" );
3946 createSMESHAction( SMESHOp::OpNode, "NODE", "ICON_DLG_NODE" );
3947 createSMESHAction( SMESHOp::OpElem0D, "ELEM0D", "ICON_DLG_ELEM0D" );
3948 createSMESHAction( SMESHOp::OpElem0DOnElemNodes, "0D_ON_ALL_NODES", "ICON_0D_ON_ALL_NODES" );
3949 createSMESHAction( SMESHOp::OpBall, "BALL", "ICON_DLG_BALL" );
3950 createSMESHAction( SMESHOp::OpEdge, "EDGE", "ICON_DLG_EDGE" );
3951 createSMESHAction( SMESHOp::OpTriangle, "TRIANGLE", "ICON_DLG_TRIANGLE" );
3952 createSMESHAction( SMESHOp::OpQuadrangle, "QUAD", "ICON_DLG_QUADRANGLE" );
3953 createSMESHAction( SMESHOp::OpPolygon, "POLYGON", "ICON_DLG_POLYGON" );
3954 createSMESHAction( SMESHOp::OpTetrahedron, "TETRA", "ICON_DLG_TETRAS" );
3955 createSMESHAction( SMESHOp::OpHexahedron, "HEXA", "ICON_DLG_HEXAS" );
3956 createSMESHAction( SMESHOp::OpPentahedron, "PENTA", "ICON_DLG_PENTA" );
3957 createSMESHAction( SMESHOp::OpPyramid , "PYRAMID", "ICON_DLG_PYRAMID" );
3958 createSMESHAction( SMESHOp::OpHexagonalPrism, "OCTA", "ICON_DLG_OCTA" );
3959 createSMESHAction( SMESHOp::OpPolyhedron, "POLYHEDRON", "ICON_DLG_POLYHEDRON" );
3960 createSMESHAction( SMESHOp::OpQuadraticEdge, "QUADRATIC_EDGE", "ICON_DLG_QUADRATIC_EDGE" );
3961 createSMESHAction( SMESHOp::OpQuadraticTriangle, "QUADRATIC_TRIANGLE", "ICON_DLG_QUADRATIC_TRIANGLE" );
3962 createSMESHAction( SMESHOp::OpBiQuadraticTriangle, "BIQUADRATIC_TRIANGLE", "ICON_DLG_BIQUADRATIC_TRIANGLE" );
3963 createSMESHAction( SMESHOp::OpQuadraticQuadrangle, "QUADRATIC_QUADRANGLE", "ICON_DLG_QUADRATIC_QUADRANGLE" );
3964 createSMESHAction( SMESHOp::OpBiQuadraticQuadrangle, "BIQUADRATIC_QUADRANGLE", "ICON_DLG_BIQUADRATIC_QUADRANGLE" );
3965 createSMESHAction( SMESHOp::OpQuadraticPolygon, "QUADRATIC_POLYGON", "ICON_DLG_QUADRATIC_POLYGON" );
3966 createSMESHAction( SMESHOp::OpQuadraticTetrahedron, "QUADRATIC_TETRAHEDRON", "ICON_DLG_QUADRATIC_TETRAHEDRON" );
3967 createSMESHAction( SMESHOp::OpQuadraticPyramid, "QUADRATIC_PYRAMID", "ICON_DLG_QUADRATIC_PYRAMID" );
3968 createSMESHAction( SMESHOp::OpQuadraticPentahedron, "QUADRATIC_PENTAHEDRON", "ICON_DLG_QUADRATIC_PENTAHEDRON" );
3969 createSMESHAction( SMESHOp::OpBiQuadraticPentahedron, "BIQUADRATIC_PENTAHEDRON", "ICON_DLG_BIQUADRATIC_PENTAHEDRON" );
3970 createSMESHAction( SMESHOp::OpQuadraticHexahedron, "QUADRATIC_HEXAHEDRON", "ICON_DLG_QUADRATIC_HEXAHEDRON" );
3971 createSMESHAction( SMESHOp::OpTriQuadraticHexahedron, "TRIQUADRATIC_HEXAHEDRON", "ICON_DLG_TRIQUADRATIC_HEXAHEDRON" );
3973 createSMESHAction( SMESHOp::OpRemoveNodes, "REMOVE_NODES", "ICON_DLG_REM_NODE" );
3974 createSMESHAction( SMESHOp::OpRemoveElements, "REMOVE_ELEMENTS", "ICON_DLG_REM_ELEMENT" );
3975 createSMESHAction( SMESHOp::OpRemoveOrphanNodes, "REMOVE_ORPHAN_NODES", "ICON_DLG_REM_ORPHAN_NODES" );
3976 createSMESHAction( SMESHOp::OpClearMesh, "CLEAR_MESH", "ICON_CLEAR_MESH" );
3978 //createSMESHAction( SMESHOp::OpRenumberingNodes, "RENUM_NODES", "ICON_DLG_RENUMBERING_NODES" );
3979 //createSMESHAction( SMESHOp::OpRenumberingElements, "RENUM_ELEMENTS", "ICON_DLG_RENUMBERING_ELEMENTS" );
3981 createSMESHAction( SMESHOp::OpTranslation, "TRANS", "ICON_SMESH_TRANSLATION_VECTOR" );
3982 createSMESHAction( SMESHOp::OpRotation, "ROT", "ICON_DLG_MESH_ROTATION" );
3983 createSMESHAction( SMESHOp::OpSymmetry, "SYM", "ICON_SMESH_SYMMETRY_PLANE" );
3984 createSMESHAction( SMESHOp::OpScale, "SCALE", "ICON_DLG_MESH_SCALE" );
3985 createSMESHAction( SMESHOp::OpOffset, "OFFSET", "ICON_DLG_MESH_OFFSET" );
3986 createSMESHAction( SMESHOp::OpSewing, "SEW", "ICON_SMESH_SEWING_FREEBORDERS" );
3987 createSMESHAction( SMESHOp::OpMergeNodes, "MERGE", "ICON_SMESH_MERGE_NODES" );
3988 createSMESHAction( SMESHOp::OpMergeElements, "MERGE_ELEMENTS", "ICON_DLG_MERGE_ELEMENTS" );
3989 createSMESHAction( SMESHOp::OpMoveNode, "MESH_THROU_POINT","ICON_DLG_MOVE_NODE" );
3990 createSMESHAction( SMESHOp::OpDuplicateNodes, "DUPLICATE_NODES", "ICON_SMESH_DUPLICATE_NODES" );
3991 createSMESHAction( SMESHOp::OpDiagonalInversion, "INV", "ICON_DLG_MESH_DIAGONAL" );
3992 createSMESHAction( SMESHOp::OpUnionOfTwoTriangle, "UNION2", "ICON_UNION2TRI" );
3993 createSMESHAction( SMESHOp::OpOrientation, "ORIENT", "ICON_DLG_MESH_ORIENTATION" );
3994 createSMESHAction( SMESHOp::OpReorientFaces, "REORIENT_2D", "ICON_REORIENT_2D" );
3995 createSMESHAction( SMESHOp::OpUnionOfTriangles, "UNION", "ICON_UNIONTRI" );
3996 createSMESHAction( SMESHOp::OpCuttingOfQuadrangles, "CUT", "ICON_CUTQUAD" );
3997 createSMESHAction( SMESHOp::OpSplitVolumes, "SPLIT_TO_TETRA", "ICON_SPLIT_TO_TETRA" );
3998 createSMESHAction( SMESHOp::OpSplitBiQuadratic, "SPLIT_BIQUAD", "ICON_SPLIT_BIQUAD" );
3999 createSMESHAction( SMESHOp::OpSmoothing, "SMOOTH", "ICON_DLG_SMOOTHING" );
4000 createSMESHAction( SMESHOp::OpExtrusion, "EXTRUSION", "ICON_EXTRUSION" );
4001 createSMESHAction( SMESHOp::OpExtrusionAlongAPath, "EXTRUSION_ALONG", "ICON_EXTRUSION_ALONG" );
4002 createSMESHAction( SMESHOp::OpRevolution, "REVOLUTION", "ICON_REVOLUTION" );
4003 createSMESHAction( SMESHOp::OpPatternMapping, "MAP", "ICON_MAP" );
4004 createSMESHAction( SMESHOp::OpConvertMeshToQuadratic, "CONV_TO_QUAD", "ICON_CONV_TO_QUAD" );
4005 createSMESHAction( SMESHOp::OpCreateBoundaryElements, "2D_FROM_3D", "ICON_2D_FROM_3D" );
4007 createSMESHAction( SMESHOp::OpReset, "RESET" );
4008 createSMESHAction( SMESHOp::OpScalarBarProperties, "SCALAR_BAR_PROP" );
4009 createSMESHAction( SMESHOp::OpShowScalarBar, "SHOW_SCALAR_BAR","",0, true );
4010 createSMESHAction( SMESHOp::OpSaveDistribution, "SAVE_DISTRIBUTION" );
4011 createSMESHAction( SMESHOp::OpShowDistribution, "SHOW_DISTRIBUTION","",0, true );
4012 #ifndef DISABLE_PLOT2DVIEWER
4013 createSMESHAction( SMESHOp::OpPlotDistribution, "PLOT_DISTRIBUTION" );
4015 createSMESHAction( SMESHOp::OpDMWireframe, "WIRE", "ICON_WIRE", 0, true );
4016 createSMESHAction( SMESHOp::OpDMShading, "SHADE", "ICON_SHADE", 0, true );
4017 createSMESHAction( SMESHOp::OpDMNodes, "NODES", "ICON_POINTS", 0, true );
4018 createSMESHAction( SMESHOp::OpDMShrink, "SHRINK", "ICON_SHRINK", 0, true );
4019 createSMESHAction( SMESHOp::OpUpdate, "UPDATE", "ICON_UPDATE" );
4020 createSMESHAction( SMESHOp::OpDE0DElements, "ELEMS0D", "ICON_DLG_ELEM0D", 0, true );
4021 createSMESHAction( SMESHOp::OpDEEdges, "EDGES", "ICON_DLG_EDGE", 0, true );
4022 createSMESHAction( SMESHOp::OpDEFaces, "FACES", "ICON_DLG_TRIANGLE", 0, true );
4023 createSMESHAction( SMESHOp::OpDEVolumes, "VOLUMES", "ICON_DLG_TETRAS", 0, true );
4024 createSMESHAction( SMESHOp::OpDEBalls, "BALLS", "ICON_DLG_BALL", 0, true );
4025 createSMESHAction( SMESHOp::OpDEChoose, "CHOOSE", "ICON_DLG_CHOOSE", 0, false );
4026 createSMESHAction( SMESHOp::OpDEAllEntity, "ALL", "ICON_DLG_CHOOSE_ALL", 0, false );
4027 createSMESHAction( SMESHOp::OpOrientationOnFaces, "FACE_ORIENTATION", "", 0, true );
4029 createSMESHAction( SMESHOp::OpRepresentationLines, "LINE_REPRESENTATION", "", 0, true );
4030 createSMESHAction( SMESHOp::OpRepresentationArcs, "ARC_REPRESENTATION", "", 0, true );
4032 createSMESHAction( SMESHOp::OpEditHypothesis, "EDIT_HYPO" );
4033 createSMESHAction( SMESHOp::OpUnassign, "UNASSIGN" );
4034 createSMESHAction( SMESHOp::OpNumberingNodes, "NUM_NODES", "", 0, true );
4035 createSMESHAction( SMESHOp::OpNumberingElements, "NUM_ELEMENTS", "", 0, true );
4036 createSMESHAction( SMESHOp::OpProperties, "COLORS" );
4037 createSMESHAction( SMESHOp::OpTransparency, "TRANSP" );
4038 createSMESHAction( SMESHOp::OpClipping, "CLIP" );
4039 createSMESHAction( SMESHOp::OpAutoColor, "AUTO_COLOR" );
4040 createSMESHAction( SMESHOp::OpDisableAutoColor, "DISABLE_AUTO_COLOR" );
4042 createSMESHAction( SMESHOp::OpMinimumDistance, "MEASURE_MIN_DIST", "ICON_MEASURE_MIN_DIST" );
4043 createSMESHAction( SMESHOp::OpBoundingBox, "MEASURE_BND_BOX", "ICON_MEASURE_BND_BOX" );
4044 createSMESHAction( SMESHOp::OpPropertiesLength, "MEASURE_LENGTH", "ICON_MEASURE_LENGTH" );
4045 createSMESHAction( SMESHOp::OpPropertiesArea, "MEASURE_AREA", "ICON_MEASURE_AREA" );
4046 createSMESHAction( SMESHOp::OpPropertiesVolume, "MEASURE_VOLUME", "ICON_MEASURE_VOLUME" );
4048 createSMESHAction( SMESHOp::OpHide, "HIDE", "ICON_HIDE" );
4049 createSMESHAction( SMESHOp::OpShow, "SHOW", "ICON_SHOW" );
4050 createSMESHAction( SMESHOp::OpShowOnly, "DISPLAY_ONLY" );
4052 createSMESHAction( SMESHOp::OpSortChild, "SORT_CHILD_ITEMS" );
4054 QList<int> aCtrlActions;
4055 aCtrlActions << SMESHOp::OpFreeNode << SMESHOp::OpEqualNode
4056 << SMESHOp::OpNodeConnectivityNb // node controls
4057 << SMESHOp::OpFreeEdge << SMESHOp::OpFreeBorder
4058 << SMESHOp::OpLength << SMESHOp::OpConnection << SMESHOp::OpEqualEdge // edge controls
4059 << SMESHOp::OpDeflection2D
4060 << SMESHOp::OpFreeFace << SMESHOp::OpLength2D << SMESHOp::OpConnection2D
4061 << SMESHOp::OpArea << SMESHOp::OpTaper << SMESHOp::OpAspectRatio
4062 << SMESHOp::OpMinimumAngle << SMESHOp::OpWarpingAngle << SMESHOp::OpSkew
4063 << SMESHOp::OpMaxElementLength2D << SMESHOp::OpBareBorderFace
4064 << SMESHOp::OpOverConstrainedFace << SMESHOp::OpEqualFace // face controls
4065 << SMESHOp::OpAspectRatio3D << SMESHOp::OpVolume
4066 << SMESHOp::OpMaxElementLength3D << SMESHOp::OpBareBorderVolume
4067 << SMESHOp::OpOverConstrainedVolume << SMESHOp::OpEqualVolume; // volume controls
4068 QActionGroup* aCtrlGroup = new QActionGroup( application()->desktop() );
4069 aCtrlGroup->setExclusive( true );
4070 for( int i = 0; i < aCtrlActions.size(); i++ )
4071 aCtrlGroup->addAction( action( aCtrlActions[i] ) );
4073 // ----- create menu --------------
4074 int fileId = createMenu( tr( "MEN_FILE" ), -1, 1 ),
4075 editId = createMenu( tr( "MEN_EDIT" ), -1, 3 ),
4076 toolsId = createMenu( tr( "MEN_TOOLS" ), -1, 5, 50 ),
4077 meshId = createMenu( tr( "MEN_MESH" ), -1, 70, 10 ),
4078 ctrlId = createMenu( tr( "MEN_CTRL" ), -1, 60, 10 ),
4079 modifyId = createMenu( tr( "MEN_MODIFY" ), -1, 40, 10 ),
4080 measureId = createMenu( tr( "MEN_MEASURE" ), -1, 50, 10 ),
4081 viewId = createMenu( tr( "MEN_VIEW" ), -1, 2 );
4083 createMenu( separator(), fileId );
4085 QMenu* nodeMenu = new QMenu(); QMenu* edgeMenu = new QMenu();
4086 QMenu* faceMenu = new QMenu(); QMenu* volumeMenu = new QMenu();
4087 int importId = createMenu( tr( "MEN_IMPORT" ), fileId, -1, 10 ),
4088 exportId = createMenu( tr( "MEN_EXPORT" ), fileId, -1, 10 ),
4089 nodeId = createMenu( tr( "MEN_NODE_CTRL" ), ctrlId, -1, 10, -1, nodeMenu ),
4090 edgeId = createMenu( tr( "MEN_EDGE_CTRL" ), ctrlId, -1, 10, -1, edgeMenu ),
4091 faceId = createMenu( tr( "MEN_FACE_CTRL" ), ctrlId, -1, 10, -1, faceMenu ),
4092 volumeId = createMenu( tr( "MEN_VOLUME_CTRL" ), ctrlId, -1, 10, -1, volumeMenu ),
4093 addId = createMenu( tr( "MEN_ADD" ), modifyId, 402 ),
4094 removeId = createMenu( tr( "MEN_REMOVE" ), modifyId, 403 ),
4095 //renumId = createMenu( tr( "MEN_RENUM" ), modifyId, 404 ),
4096 transfId = createMenu( tr( "MEN_TRANSF" ), modifyId, 405 ),
4097 basicPropId = createMenu( tr( "MEN_BASIC_PROPERTIES" ), measureId, -1, 10 );
4099 //createMenu( SMESHOp::OpImportDAT, importId, -1 );
4100 createMenu( SMESHOp::OpImportUNV, importId, -1 );
4101 createMenu( SMESHOp::OpImportMED, importId, -1 );
4102 createMenu( SMESHOp::OpImportSTL, importId, -1 );
4104 createMenu( SMESHOp::OpImportCGNS, importId, -1 );
4106 createMenu( SMESHOp::OpImportSAUV, importId, -1 );
4107 createMenu( SMESHOp::OpImportGMF, importId, -1 );
4108 createMenu( SMESHOp::OpExportDAT, exportId, -1 );
4109 createMenu( SMESHOp::OpExportMED, exportId, -1 );
4110 createMenu( SMESHOp::OpExportUNV, exportId, -1 );
4111 createMenu( SMESHOp::OpExportSTL, exportId, -1 );
4113 createMenu( SMESHOp::OpExportCGNS, exportId, -1 );
4115 createMenu( SMESHOp::OpExportSAUV, exportId, -1 );
4116 createMenu( SMESHOp::OpExportGMF, exportId, -1 );
4117 createMenu( separator(), fileId, 10 );
4119 createMenu( SMESHOp::OpDelete, editId, -1 );
4121 createMenu( SMESHOp::OpSelectFiltersLibrary, toolsId, -1 );
4123 createMenu( SMESHOp::OpCreateMesh, meshId, -1 ); // "Mesh" menu
4124 createMenu( SMESHOp::OpCreateSubMesh, meshId, -1 );
4125 createMenu( SMESHOp::OpEditMeshOrSubMesh, meshId, -1 );
4126 createMenu( SMESHOp::OpBuildCompoundMesh, meshId, -1 );
4127 createMenu( SMESHOp::OpCopyMesh, meshId, -1 );
4128 createMenu( separator(), meshId, -1 );
4129 createMenu( SMESHOp::OpCompute, meshId, -1 );
4130 createMenu( SMESHOp::OpPreCompute, meshId, -1 );
4131 createMenu( SMESHOp::OpEvaluate, meshId, -1 );
4132 createMenu( SMESHOp::OpMeshOrder, meshId, -1 );
4133 createMenu( separator(), meshId, -1 );
4134 createMenu( SMESHOp::OpCreateGroup, meshId, -1 );
4135 createMenu( SMESHOp::OpCreateGeometryGroup, meshId, -1 );
4136 createMenu( SMESHOp::OpConstructGroup, meshId, -1 );
4137 createMenu( SMESHOp::OpEditGroup, meshId, -1 );
4138 createMenu( SMESHOp::OpEditGeomGroupAsGroup, meshId, -1 );
4139 createMenu( separator(), meshId, -1 );
4140 createMenu( SMESHOp::OpUnionGroups, meshId, -1 );
4141 createMenu( SMESHOp::OpIntersectGroups, meshId, -1 );
4142 createMenu( SMESHOp::OpCutGroups, meshId, -1 );
4143 createMenu( separator(), meshId, -1 );
4144 createMenu( SMESHOp::OpGroupUnderlyingElem, meshId, -1 );
4145 createMenu( separator(), meshId, -1 );
4146 createMenu( SMESHOp::OpMeshInformation, meshId, -1 );
4147 //createMenu( SMESHOp::OpStdInfo, meshId, -1 );
4148 //createMenu( SMESHOp::OpWhatIs, meshId, -1 ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
4149 createMenu( SMESHOp::OpFindElementByPoint, meshId, -1 );
4150 createMenu( separator(), meshId, -1 );
4152 createMenu( SMESHOp::OpFreeNode, nodeId, -1 );
4153 createMenu( SMESHOp::OpEqualNode, nodeId, -1 );
4154 //createMenu( SMESHOp::OpNodeConnectivityNb, nodeId, -1 );
4155 createMenu( SMESHOp::OpFreeBorder, edgeId, -1 );
4156 createMenu( SMESHOp::OpLength, edgeId, -1 );
4157 createMenu( SMESHOp::OpConnection, edgeId, -1 );
4158 createMenu( SMESHOp::OpEqualEdge, edgeId, -1 );
4159 createMenu( SMESHOp::OpFreeEdge, faceId, -1 );
4160 createMenu( SMESHOp::OpFreeFace, faceId, -1 );
4161 createMenu( SMESHOp::OpBareBorderFace, faceId, -1 );
4162 createMenu( SMESHOp::OpOverConstrainedFace, faceId, -1 );
4163 createMenu( SMESHOp::OpLength2D, faceId, -1 );
4164 createMenu( SMESHOp::OpConnection2D, faceId, -1 );
4165 createMenu( SMESHOp::OpArea, faceId, -1 );
4166 createMenu( SMESHOp::OpTaper, faceId, -1 );
4167 createMenu( SMESHOp::OpAspectRatio, faceId, -1 );
4168 createMenu( SMESHOp::OpMinimumAngle, faceId, -1 );
4169 createMenu( SMESHOp::OpWarpingAngle, faceId, -1 );
4170 createMenu( SMESHOp::OpSkew, faceId, -1 );
4171 createMenu( SMESHOp::OpMaxElementLength2D, faceId, -1 );
4172 createMenu( SMESHOp::OpEqualFace, faceId, -1 );
4173 createMenu( SMESHOp::OpDeflection2D, faceId, -1 );
4174 createMenu( SMESHOp::OpAspectRatio3D, volumeId, -1 );
4175 createMenu( SMESHOp::OpVolume, volumeId, -1 );
4176 createMenu( SMESHOp::OpMaxElementLength3D, volumeId, -1 );
4177 createMenu( SMESHOp::OpBareBorderVolume, volumeId, -1 );
4178 createMenu( SMESHOp::OpOverConstrainedVolume, volumeId, -1 );
4179 createMenu( SMESHOp::OpEqualVolume, volumeId, -1 );
4180 createMenu( separator(), ctrlId, -1 );
4181 createMenu( SMESHOp::OpReset, ctrlId, -1 );
4182 createMenu( separator(), ctrlId, -1 );
4183 createMenu( SMESHOp::OpOverallMeshQuality, ctrlId, -1 );
4185 createMenu( SMESHOp::OpNode, addId, -1 );
4186 createMenu( SMESHOp::OpElem0D, addId, -1 );
4187 createMenu( SMESHOp::OpElem0DOnElemNodes, addId, -1 );
4188 createMenu( SMESHOp::OpBall, addId, -1 );
4189 createMenu( SMESHOp::OpEdge, addId, -1 );
4190 createMenu( SMESHOp::OpTriangle, addId, -1 );
4191 createMenu( SMESHOp::OpQuadrangle, addId, -1 );
4192 createMenu( SMESHOp::OpPolygon, addId, -1 );
4193 createMenu( SMESHOp::OpTetrahedron, addId, -1 );
4194 createMenu( SMESHOp::OpHexahedron, addId, -1 );
4195 createMenu( SMESHOp::OpPentahedron, addId, -1 );
4196 createMenu( SMESHOp::OpPyramid, addId, -1 );
4197 createMenu( SMESHOp::OpHexagonalPrism, addId, -1 );
4198 createMenu( SMESHOp::OpPolyhedron, addId, -1 );
4199 createMenu( separator(), addId, -1 );
4200 createMenu( SMESHOp::OpQuadraticEdge, addId, -1 );
4201 createMenu( SMESHOp::OpQuadraticTriangle, addId, -1 );
4202 createMenu( SMESHOp::OpBiQuadraticTriangle , addId, -1 );
4203 createMenu( SMESHOp::OpQuadraticQuadrangle, addId, -1 );
4204 createMenu( SMESHOp::OpBiQuadraticQuadrangle, addId, -1 );
4205 createMenu( SMESHOp::OpQuadraticPolygon, addId, -1 );
4206 createMenu( SMESHOp::OpQuadraticTetrahedron, addId, -1 );
4207 createMenu( SMESHOp::OpQuadraticPyramid, addId, -1 );
4208 createMenu( SMESHOp::OpQuadraticPentahedron, addId, -1 );
4209 createMenu( SMESHOp::OpBiQuadraticPentahedron, addId, -1 );
4210 createMenu( SMESHOp::OpQuadraticHexahedron, addId, -1 );
4211 createMenu( SMESHOp::OpTriQuadraticHexahedron, addId, -1 );
4213 createMenu( SMESHOp::OpRemoveNodes, removeId, -1 );
4214 createMenu( SMESHOp::OpRemoveElements, removeId, -1 );
4215 createMenu( SMESHOp::OpRemoveOrphanNodes, removeId, -1 );
4216 createMenu( separator(), removeId, -1 );
4217 createMenu( SMESHOp::OpDeleteGroup, removeId, -1 );
4218 createMenu( separator(), removeId, -1 );
4219 createMenu( SMESHOp::OpClearMesh, removeId, -1 );
4221 //createMenu( SMESHOp::OpRenumberingNodes, renumId, -1 );
4222 //createMenu( SMESHOp::OpRenumberingElements, renumId, -1 );
4224 createMenu( SMESHOp::OpMergeNodes, transfId, -1 );
4225 createMenu( SMESHOp::OpMergeElements, transfId, -1 );
4226 createMenu( SMESHOp::OpTranslation, transfId, -1 );
4227 createMenu( SMESHOp::OpRotation, transfId, -1 );
4228 createMenu( SMESHOp::OpSymmetry, transfId, -1 );
4229 createMenu( SMESHOp::OpScale, transfId, -1 );
4230 createMenu( SMESHOp::OpOffset, transfId, -1 );
4231 createMenu( SMESHOp::OpSewing, transfId, -1 );
4232 createMenu( SMESHOp::OpDuplicateNodes, transfId, -1 );
4234 createMenu( SMESHOp::OpConvertMeshToQuadratic, modifyId, -1 );
4235 createMenu( SMESHOp::OpCreateBoundaryElements, modifyId, -1 );
4236 createMenu( SMESHOp::OpExtrusion, modifyId, -1 );
4237 createMenu( SMESHOp::OpExtrusionAlongAPath, modifyId, -1 );
4238 createMenu( SMESHOp::OpRevolution, modifyId, -1 );
4239 createMenu( SMESHOp::OpOrientation, modifyId, -1 );
4240 createMenu( SMESHOp::OpReorientFaces, modifyId, -1 );
4241 createMenu( SMESHOp::OpMoveNode, modifyId, -1 );
4242 createMenu( SMESHOp::OpDiagonalInversion, modifyId, -1 );
4243 createMenu( SMESHOp::OpUnionOfTwoTriangle, modifyId, -1 );
4244 createMenu( SMESHOp::OpUnionOfTriangles, modifyId, -1 );
4245 createMenu( SMESHOp::OpCuttingOfQuadrangles, modifyId, -1 );
4246 createMenu( SMESHOp::OpSplitVolumes, modifyId, -1 );
4247 createMenu( SMESHOp::OpSplitBiQuadratic, modifyId, -1 );
4248 createMenu( SMESHOp::OpSmoothing, modifyId, -1 );
4249 createMenu( SMESHOp::OpPatternMapping, modifyId, -1 );
4251 createMenu( SMESHOp::OpMinimumDistance, measureId, -1 );
4252 createMenu( SMESHOp::OpBoundingBox, measureId, -1 );
4253 createMenu( SMESHOp::OpPropertiesLength, basicPropId, -1 );
4254 createMenu( SMESHOp::OpPropertiesArea, basicPropId, -1 );
4255 createMenu( SMESHOp::OpPropertiesVolume, basicPropId, -1 );
4256 createMenu( SMESHOp::OpUpdate, viewId, -1 );
4258 connect( nodeMenu, SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) );
4259 connect( edgeMenu, SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) );
4260 connect( faceMenu, SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) );
4261 connect( volumeMenu, SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) );
4263 // ----- create toolbars --------------
4264 int meshTb = createTool( tr( "TB_MESH" ), QString( "SMESHMeshToolbar" ) ),
4265 info = createTool( tr( "TB_INFO" ), QString( "SMESHInformationToolbar" ) ),
4266 groupTb = createTool( tr( "TB_GROUP" ), QString( "SMESHGroupToolbar" ) ),
4267 ctrl0dTb = createTool( tr( "TB_CTRL0D" ), QString( "SMESHNodeControlsToolbar" ) ),
4268 ctrl1dTb = createTool( tr( "TB_CTRL1D" ), QString( "SMESHEdgeControlsToolbar" ) ),
4269 ctrl2dTb = createTool( tr( "TB_CTRL2D" ), QString( "SMESHFaceControlsToolbar" ) ),
4270 ctrl3dTb = createTool( tr( "TB_CTRL3D" ), QString( "SMESHVolumeControlsToolbar" ) ),
4271 addElemTb = createTool( tr( "TB_ADD" ), QString( "SMESHAddElementToolbar" ) ),
4272 addNonElemTb = createTool( tr( "TB_ADDNON" ), QString( "SMESHAddElementToolbar" ) ),
4273 remTb = createTool( tr( "TB_REM" ), QString( "SMESHRemoveToolbar" ) ),
4274 //renumbTb = createTool( tr( "TB_RENUMBER" ), QString( "SMESHRenumberingToolbar" ) ),
4275 transformTb = createTool( tr( "TB_TRANSFORM" ), QString( "SMESHTransformationToolbar" ) ),
4276 modifyTb = createTool( tr( "TB_MODIFY" ), QString( "SMESHModificationToolbar" ) ),
4277 measuremTb = createTool( tr( "TB_MEASUREM" ), QString( "SMESHMeasurementsToolbar" ) ),
4278 dispModeTb = createTool( tr( "TB_DISP_MODE" ), QString( "SMESHDisplayModeToolbar" ) );
4280 createTool( SMESHOp::OpCreateMesh, meshTb );
4281 createTool( SMESHOp::OpCreateSubMesh, meshTb );
4282 createTool( SMESHOp::OpEditMeshOrSubMesh, meshTb );
4283 createTool( SMESHOp::OpBuildCompoundMesh, meshTb );
4284 createTool( SMESHOp::OpCopyMesh, meshTb );
4285 createTool( separator(), meshTb );
4286 createTool( SMESHOp::OpCompute, meshTb );
4287 createTool( SMESHOp::OpPreCompute, meshTb );
4288 createTool( SMESHOp::OpEvaluate, meshTb );
4289 createTool( SMESHOp::OpMeshOrder, meshTb );
4291 createTool( SMESHOp::OpCreateGroup, groupTb );
4292 createTool( SMESHOp::OpCreateGeometryGroup, groupTb );
4293 createTool( SMESHOp::OpConstructGroup, groupTb );
4294 createTool( SMESHOp::OpEditGroup, groupTb );
4296 createTool( SMESHOp::OpMeshInformation, info );
4297 //createTool( SMESHOp::OpStdInfo, meshTb );
4298 //createTool( SMESHOp::OpWhatIs, meshTb ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
4299 createTool( SMESHOp::OpFindElementByPoint, info );
4301 createTool( SMESHOp::OpFreeNode, ctrl0dTb );
4302 createTool( SMESHOp::OpEqualNode, ctrl0dTb );
4303 //createTool( SMESHOp::OpNodeConnectivityNb, ctrl0dTb );
4305 createTool( SMESHOp::OpFreeBorder, ctrl1dTb );
4306 createTool( SMESHOp::OpLength, ctrl1dTb );
4307 createTool( SMESHOp::OpConnection, ctrl1dTb );
4308 createTool( SMESHOp::OpEqualEdge, ctrl1dTb );
4310 createTool( SMESHOp::OpFreeEdge, ctrl2dTb );
4311 createTool( SMESHOp::OpFreeFace, ctrl2dTb );
4312 createTool( SMESHOp::OpBareBorderFace, ctrl2dTb );
4313 createTool( SMESHOp::OpOverConstrainedFace, ctrl2dTb );
4314 createTool( SMESHOp::OpLength2D, ctrl2dTb );
4315 createTool( SMESHOp::OpConnection2D, ctrl2dTb );
4316 createTool( SMESHOp::OpArea, ctrl2dTb );
4317 createTool( SMESHOp::OpTaper, ctrl2dTb );
4318 createTool( SMESHOp::OpAspectRatio, ctrl2dTb );
4319 createTool( SMESHOp::OpMinimumAngle, ctrl2dTb );
4320 createTool( SMESHOp::OpWarpingAngle, ctrl2dTb );
4321 createTool( SMESHOp::OpSkew, ctrl2dTb );
4322 createTool( SMESHOp::OpMaxElementLength2D, ctrl2dTb );
4323 createTool( SMESHOp::OpEqualFace, ctrl2dTb );
4324 createTool( SMESHOp::OpDeflection2D, ctrl2dTb );
4326 createTool( SMESHOp::OpAspectRatio3D, ctrl3dTb );
4327 createTool( SMESHOp::OpVolume, ctrl3dTb );
4328 createTool( SMESHOp::OpMaxElementLength3D, ctrl3dTb );
4329 createTool( SMESHOp::OpBareBorderVolume, ctrl3dTb );
4330 createTool( SMESHOp::OpOverConstrainedVolume, ctrl3dTb );
4331 createTool( SMESHOp::OpEqualVolume, ctrl3dTb );
4333 createTool( SMESHOp::OpNode, addElemTb );
4334 createTool( SMESHOp::OpElem0D, addElemTb );
4335 createTool( SMESHOp::OpElem0DOnElemNodes, addElemTb );
4336 createTool( SMESHOp::OpBall, addElemTb );
4337 createTool( SMESHOp::OpEdge, addElemTb );
4338 createTool( SMESHOp::OpTriangle, addElemTb );
4339 createTool( SMESHOp::OpQuadrangle, addElemTb );
4340 createTool( SMESHOp::OpPolygon, addElemTb );
4341 createTool( SMESHOp::OpTetrahedron, addElemTb );
4342 createTool( SMESHOp::OpHexahedron, addElemTb );
4343 createTool( SMESHOp::OpPentahedron, addElemTb );
4344 createTool( SMESHOp::OpPyramid, addElemTb );
4345 createTool( SMESHOp::OpHexagonalPrism, addElemTb );
4346 createTool( SMESHOp::OpPolyhedron, addElemTb );
4348 createTool( SMESHOp::OpQuadraticEdge, addNonElemTb );
4349 createTool( SMESHOp::OpQuadraticTriangle, addNonElemTb );
4350 createTool( SMESHOp::OpBiQuadraticTriangle, addNonElemTb );
4351 createTool( SMESHOp::OpQuadraticQuadrangle, addNonElemTb );
4352 createTool( SMESHOp::OpBiQuadraticQuadrangle, addNonElemTb );
4353 createTool( SMESHOp::OpQuadraticPolygon, addNonElemTb );
4354 createTool( SMESHOp::OpQuadraticTetrahedron, addNonElemTb );
4355 createTool( SMESHOp::OpQuadraticPyramid, addNonElemTb );
4356 createTool( SMESHOp::OpQuadraticPentahedron, addNonElemTb );
4357 createTool( SMESHOp::OpBiQuadraticPentahedron, addNonElemTb );
4358 createTool( SMESHOp::OpQuadraticHexahedron, addNonElemTb );
4359 createTool( SMESHOp::OpTriQuadraticHexahedron, addNonElemTb );
4361 createTool( SMESHOp::OpRemoveNodes, remTb );
4362 createTool( SMESHOp::OpRemoveElements, remTb );
4363 createTool( SMESHOp::OpRemoveOrphanNodes, remTb );
4364 createTool( SMESHOp::OpClearMesh, remTb );
4366 //createTool( SMESHOp::OpRenumberingNodes, renumbTb );
4367 //createTool( SMESHOp::OpRenumberingElements, renumbTb );
4369 createTool( SMESHOp::OpMergeNodes, transformTb );
4370 createTool( SMESHOp::OpMergeElements, transformTb );
4371 createTool( SMESHOp::OpTranslation, transformTb );
4372 createTool( SMESHOp::OpRotation, transformTb );
4373 createTool( SMESHOp::OpSymmetry, transformTb );
4374 createTool( SMESHOp::OpScale, transformTb );
4375 createTool( SMESHOp::OpOffset, transformTb );
4376 createTool( SMESHOp::OpSewing, transformTb );
4377 createTool( SMESHOp::OpDuplicateNodes, transformTb );
4379 createTool( SMESHOp::OpConvertMeshToQuadratic, modifyTb );
4380 createTool( SMESHOp::OpCreateBoundaryElements, modifyTb );
4381 createTool( SMESHOp::OpExtrusion, modifyTb );
4382 createTool( SMESHOp::OpExtrusionAlongAPath, modifyTb );
4383 createTool( SMESHOp::OpRevolution, modifyTb );
4384 createTool( SMESHOp::OpOrientation, modifyTb );
4385 createTool( SMESHOp::OpReorientFaces, modifyTb );
4386 createTool( SMESHOp::OpMoveNode, modifyTb );
4387 createTool( SMESHOp::OpDiagonalInversion, modifyTb );
4388 createTool( SMESHOp::OpUnionOfTwoTriangle, modifyTb );
4389 createTool( SMESHOp::OpUnionOfTriangles, modifyTb );
4390 createTool( SMESHOp::OpCuttingOfQuadrangles, modifyTb );
4391 createTool( SMESHOp::OpSplitVolumes, modifyTb );
4392 createTool( SMESHOp::OpSplitBiQuadratic, modifyTb );
4393 createTool( SMESHOp::OpSmoothing, modifyTb );
4394 createTool( SMESHOp::OpPatternMapping, modifyTb );
4396 createTool( SMESHOp::OpMinimumDistance, measuremTb );
4398 createTool( SMESHOp::OpUpdate, dispModeTb );
4400 QString lc = "$"; // VSR : instead of QtxPopupSelection::defEquality();
4401 QString dc = "selcount"; // VSR : instead of QtxPopupSelection::defSelCountParam()
4405 OB = "'ObjectBrowser'",
4406 View = "'" + SVTK_Viewer::Type() + "'",
4408 mesh = pat.arg( SMESHGUI_Selection::typeName( SMESH::MESH ) ),
4409 group = pat.arg( SMESHGUI_Selection::typeName( SMESH::GROUP ) ),
4410 hypo = pat.arg( SMESHGUI_Selection::typeName( SMESH::HYPOTHESIS ) ),
4411 algo = pat.arg( SMESHGUI_Selection::typeName( SMESH::ALGORITHM ) ),
4412 smesh = pat.arg( SMESHGUI_Selection::typeName( SMESH::COMPONENT ) ),
4413 elems = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ).
4414 arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_VERTEX ) ).
4415 arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_EDGE ) ).
4416 arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_FACE ) ).
4417 arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_SOLID ) ).
4418 arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_COMPOUND ) ).
4419 arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH ) ),
4421 mesh_part = mesh + " " + subMesh + " " + group,
4422 mesh_group = mesh + " " + group,
4423 mesh_submesh = mesh + " " + subMesh,
4424 hyp_alg = hypo + " " + algo;
4426 // popup for object browser
4428 isInvisible("not( isVisible )"),
4429 isEmpty("numberOfNodes = 0"),
4430 isNotEmpty("numberOfNodes <> 0"),
4432 // has nodes, edges, etc in VISIBLE! actor
4433 hasNodes("(numberOfNodes > 0 ) && hasActor"),
4434 hasElems("(count( elemTypes ) > 0)"),
4435 hasDifferentElems("(count( elemTypes ) > 1)"),
4436 hasDifferentObjElems("(count( objElemTypes ) > 1)"),
4437 hasBalls("({'BallElem'} in elemTypes)"),
4438 hasElems0d("({'Elem0d'} in elemTypes)"),
4439 hasEdges("({'Edge'} in elemTypes)"),
4440 hasFaces("({'Face'} in elemTypes)"),
4441 hasVolumes("({'Volume'} in elemTypes)"),
4442 hasFacesOrVolumes("(({'Face'} in elemTypes) || ({'Volume'} in elemTypes)) ");
4444 createPopupItem( SMESHOp::OpFileInformation, OB, mesh, "&& selcount=1 && isImported" );
4445 createPopupItem( SMESHOp::OpCreateSubMesh, OB, mesh, "&& hasGeomReference");
4446 createPopupItem( SMESHOp::OpEditMesh, OB, mesh, "&& selcount=1" );
4447 createPopupItem( SMESHOp::OpEditSubMesh, OB, subMesh, "&& selcount=1 && hasGeomReference" );
4448 createPopupItem( SMESHOp::OpEditGroup, OB, group );
4449 createPopupItem( SMESHOp::OpEditGeomGroupAsGroup, OB, group, "&& groupType != 'Group'" );
4451 popupMgr()->insert( separator(), -1, 0 );
4452 createPopupItem( SMESHOp::OpCompute, OB, mesh, "&& selcount=1 && isComputable" );
4453 createPopupItem( SMESHOp::OpComputeSubMesh, OB, subMesh, "&& selcount=1 && isComputable" );
4454 createPopupItem( SMESHOp::OpPreCompute, OB, mesh, "&& selcount=1 && isPreComputable" );
4455 createPopupItem( SMESHOp::OpEvaluate, OB, mesh, "&& selcount=1 && isComputable" );
4456 createPopupItem( SMESHOp::OpMeshOrder, OB, mesh, "&& selcount=1 && isComputable && hasGeomReference" );
4457 createPopupItem( SMESHOp::OpUpdate, OB, mesh_part );
4458 createPopupItem( SMESHOp::OpMeshInformation, OB, mesh_part );
4459 createPopupItem( SMESHOp::OpFindElementByPoint,OB, mesh_group, "&& selcount=1" );
4460 createPopupItem( SMESHOp::OpOverallMeshQuality,OB, mesh_part );
4461 popupMgr()->insert( separator(), -1, 0 );
4462 createPopupItem( SMESHOp::OpCreateGroup, OB, mesh, "&& selcount=1" );
4463 createPopupItem( SMESHOp::OpCreateGeometryGroup, OB, mesh, "&& selcount=1 && hasGeomReference" );
4464 createPopupItem( SMESHOp::OpConstructGroup, OB, subMesh );
4465 popupMgr()->insert( separator(), -1, 0 );
4466 createPopupItem( SMESHOp::OpEditHypothesis, OB, hypo, "&& isEditableHyp");
4467 createPopupItem( SMESHOp::OpUnassign, OB, hyp_alg );
4468 popupMgr()->insert( separator(), -1, 0 );
4469 createPopupItem( SMESHOp::OpConvertMeshToQuadratic, OB, mesh_submesh );
4470 createPopupItem( SMESHOp::OpCreateBoundaryElements, OB, mesh_group, "&& selcount=1 && dim>=2");
4471 popupMgr()->insert( separator(), -1, 0 );
4472 createPopupItem( SMESHOp::OpClearMesh, OB, mesh );
4473 //popupMgr()->insert( separator(), -1, 0 );
4475 QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( dc );
4476 QString multiple_non_empty = QString( " && %1>0 && numberOfNodes>0" ).arg( dc );
4477 QString only_one_2D = only_one_non_empty + " && dim>1";
4479 int anId = popupMgr()->insert( tr( "MEN_EXPORT" ), -1, -1 ); // EXPORT submenu
4480 createPopupItem( SMESHOp::OpPopupExportMED, OB, mesh_group, multiple_non_empty, anId );
4481 createPopupItem( SMESHOp::OpPopupExportUNV, OB, mesh_group, only_one_non_empty, anId );
4482 createPopupItem( SMESHOp::OpPopupExportSTL, OB, mesh_group, only_one_2D, anId );
4484 createPopupItem( SMESHOp::OpPopupExportCGNS, OB, mesh_group, multiple_non_empty, anId );
4486 createPopupItem( SMESHOp::OpPopupExportSAUV, OB, mesh_group, only_one_non_empty, anId );
4487 createPopupItem( SMESHOp::OpPopupExportGMF, OB, mesh_group, only_one_non_empty, anId );
4488 createPopupItem( SMESHOp::OpPopupExportDAT, OB, mesh_group, only_one_non_empty, anId );
4489 createPopupItem( SMESHOp::OpDelete, OB, mesh_part + " " + hyp_alg );
4490 createPopupItem( SMESHOp::OpDeleteGroup, OB, group );
4492 anId = popupMgr()->insert( tr( "MEN_IMPORT" ), -1, -1 ); // IMPORT submenu
4493 createPopupItem( SMESHOp::OpPopupImportMED, OB, smesh, "", anId );
4494 createPopupItem( SMESHOp::OpPopupImportUNV, OB, smesh, "", anId );
4495 createPopupItem( SMESHOp::OpPopupImportSTL, OB, smesh, "", anId );
4497 createPopupItem( SMESHOp::OpPopupImportCGNS, OB, smesh, "", anId );
4499 createPopupItem( SMESHOp::OpPopupImportSAUV, OB, smesh, "", anId );
4500 createPopupItem( SMESHOp::OpPopupImportGMF, OB, smesh, "", anId );
4501 createPopupItem( SMESHOp::OpPopupImportDAT, OB, smesh, "", anId );
4502 popupMgr()->insert( separator(), -1, 0 );
4505 createPopupItem( SMESHOp::OpEditGroup, View, group );
4506 createPopupItem( SMESHOp::OpAddElemGroupPopup, View, elems, "&& guiState = 800" );
4507 createPopupItem( SMESHOp::OpRemoveElemGroupPopup, View, elems, "&& guiState = 800" );
4509 popupMgr()->insert( separator(), -1, 0 );
4510 createPopupItem( SMESHOp::OpUpdate, View, mesh_part );
4511 createPopupItem( SMESHOp::OpMeshInformation, View, mesh_part );
4512 createPopupItem( SMESHOp::OpOverallMeshQuality, View, mesh_part );
4513 createPopupItem( SMESHOp::OpFindElementByPoint, View, mesh );
4514 popupMgr()->insert( separator(), -1, 0 );
4516 createPopupItem( SMESHOp::OpAutoColor, OB + " " + View, mesh, "&& (not isAutoColor)" );
4517 createPopupItem( SMESHOp::OpDisableAutoColor, OB + " " + View, mesh, "&& isAutoColor" );
4518 popupMgr()->insert( separator(), -1, 0 );
4520 QString aClient = QString( "%1client in {%2}" ).arg( lc ).arg( "'VTKViewer'" );
4521 QString aType = QString( "%1type in {%2}" ).arg( lc );
4522 aType = aType.arg( mesh_part );
4523 QString aMeshInVTK = aClient + "&&" + aType;
4525 aClient = "($client in {'VTKViewer' 'ObjectBrowser'})";
4526 QString anActiveVTK = QString("activeView = '%1'").arg(SVTK_Viewer::Type());
4527 QString aSelCount = QString( "%1 > 0" ).arg( dc );
4529 //-------------------------------------------------
4531 //-------------------------------------------------
4532 anId = popupMgr()->insert( tr( "MEN_NUM" ), -1, -1 );
4534 popupMgr()->insert( action( SMESHOp::OpNumberingNodes ), anId, -1 );
4535 popupMgr()->setRule( action( SMESHOp::OpNumberingNodes ), aMeshInVTK + "&& isVisible &&" + hasNodes, QtxPopupMgr::VisibleRule );
4536 popupMgr()->setRule( action( SMESHOp::OpNumberingNodes ), "{'Point'} in labeledTypes", QtxPopupMgr::ToggleRule );
4538 popupMgr()->insert( action( SMESHOp::OpNumberingElements ), anId, -1 );
4539 popupMgr()->setRule( action( SMESHOp::OpNumberingElements ), aMeshInVTK + "&& isVisible &&" + hasElems, QtxPopupMgr::VisibleRule );
4540 popupMgr()->setRule( action( SMESHOp::OpNumberingElements ), "{'Cell'} in labeledTypes", QtxPopupMgr::ToggleRule );
4542 popupMgr()->insert( separator(), -1, -1 );
4544 //-------------------------------------------------
4546 //-------------------------------------------------
4547 anId = popupMgr()->insert( tr( "MEN_DISPMODE" ), -1, -1 );
4549 popupMgr()->insert( action( SMESHOp::OpDMWireframe ), anId, -1 );
4550 popupMgr()->setRule( action( SMESHOp::OpDMWireframe ), aMeshInVTK + "&&" + hasElems, QtxPopupMgr::VisibleRule );
4551 popupMgr()->setRule( action( SMESHOp::OpDMWireframe ), "displayMode = 'eEdge'", QtxPopupMgr::ToggleRule );
4553 popupMgr()->insert( action( SMESHOp::OpDMShading ), anId, -1 );
4554 popupMgr()->setRule( action( SMESHOp::OpDMShading ),aMeshInVTK+ "&& (" + hasFaces + "||" + hasVolumes + ")", QtxPopupMgr::VisibleRule);
4555 popupMgr()->setRule( action( SMESHOp::OpDMShading ), "displayMode = 'eSurface'", QtxPopupMgr::ToggleRule );
4557 popupMgr()->insert( action( SMESHOp::OpDMNodes ), anId, -1 );
4558 popupMgr()->setRule( action( SMESHOp::OpDMNodes ), aMeshInVTK + "&&" + hasNodes + "&&" + hasElems, QtxPopupMgr::VisibleRule );
4559 popupMgr()->setRule( action( SMESHOp::OpDMNodes ), "displayMode = 'ePoint'", QtxPopupMgr::ToggleRule );
4561 popupMgr()->insert( separator(), anId, -1 );
4563 popupMgr()->insert( action( SMESHOp::OpDMShrink ), anId, -1 );
4564 popupMgr()->setRule( action( SMESHOp::OpDMShrink ), aMeshInVTK + "&& shrinkMode <> 'IsNotShrinkable' && displayMode <> 'ePoint'", QtxPopupMgr::VisibleRule);
4565 popupMgr()->setRule( action( SMESHOp::OpDMShrink ), "shrinkMode = 'IsShrunk'", QtxPopupMgr::ToggleRule );
4567 //-------------------------------------------------
4569 //-------------------------------------------------
4570 QString aDiffElemsInVTK = aMeshInVTK + "&&" + hasDifferentElems;
4572 anId = popupMgr()->insert( tr( "MEN_DISP_ENT" ), -1, -1 );
4574 popupMgr()->insert( action( SMESHOp::OpDE0DElements ), anId, -1 );
4575 popupMgr()->setRule( action( SMESHOp::OpDE0DElements ), aDiffElemsInVTK + "&& isVisible &&" + hasElems0d, QtxPopupMgr::VisibleRule);
4576 popupMgr()->setRule( action( SMESHOp::OpDE0DElements ), "{'Elem0d'} in entityMode", QtxPopupMgr::ToggleRule);
4578 popupMgr()->insert( action( SMESHOp::OpDEEdges ), anId, -1 );
4579 popupMgr()->setRule( action( SMESHOp::OpDEEdges ), aDiffElemsInVTK + "&& isVisible &&" + hasEdges, QtxPopupMgr::VisibleRule );
4580 popupMgr()->setRule( action( SMESHOp::OpDEEdges ), "{'Edge'} in entityMode", QtxPopupMgr::ToggleRule );
4582 popupMgr()->insert( action( SMESHOp::OpDEFaces ), anId, -1 );
4583 popupMgr()->setRule( action( SMESHOp::OpDEFaces ), aDiffElemsInVTK + "&& isVisible &&" + hasFaces, QtxPopupMgr::VisibleRule );
4584 popupMgr()->setRule( action( SMESHOp::OpDEFaces ), "{'Face'} in entityMode", QtxPopupMgr::ToggleRule );
4586 popupMgr()->insert( action( SMESHOp::OpDEVolumes ), anId, -1 );
4587 popupMgr()->setRule( action( SMESHOp::OpDEVolumes ), aDiffElemsInVTK + "&& isVisible &&" + hasVolumes, QtxPopupMgr::VisibleRule );
4588 popupMgr()->setRule( action( SMESHOp::OpDEVolumes ), "{'Volume'} in entityMode", QtxPopupMgr::ToggleRule );
4590 popupMgr()->insert( action( SMESHOp::OpDEBalls ), anId, -1 );
4591 popupMgr()->setRule( action( SMESHOp::OpDEBalls ), aDiffElemsInVTK + "&& isVisible &&" + hasBalls, QtxPopupMgr::VisibleRule );
4592 popupMgr()->setRule( action( SMESHOp::OpDEBalls ), "{'BallElem'} in entityMode", QtxPopupMgr::ToggleRule );
4594 popupMgr()->insert( separator(), anId, -1 );
4596 popupMgr()->insert( action( SMESHOp::OpDEChoose ), anId, -1 );
4597 popupMgr()->setRule( action( SMESHOp::OpDEChoose ), aClient + "&& $type in {" + mesh + "} &&" + hasDifferentObjElems, QtxPopupMgr::VisibleRule );
4599 popupMgr()->insert( separator(), anId, -1 );
4601 popupMgr()->insert( action( SMESHOp::OpDEAllEntity ), anId, -1 );
4602 popupMgr()->setRule( action( SMESHOp::OpDEAllEntity ), aDiffElemsInVTK + "&& isVisible && not( elemTypes in entityMode )", QtxPopupMgr::VisibleRule );
4605 //-------------------------------------------------
4606 // Representation of the 2D Quadratic elements
4607 //-------------------------------------------------
4608 anId = popupMgr()->insert( tr( "MEN_QUADRATIC_REPRESENT" ), -1, -1 );
4609 popupMgr()->insert( action( SMESHOp::OpRepresentationLines ), anId, -1 );
4610 popupMgr()->setRule( action( SMESHOp::OpRepresentationLines ), aMeshInVTK + "&& isVisible && isQuadratic",QtxPopupMgr::VisibleRule );
4611 popupMgr()->setRule( action( SMESHOp::OpRepresentationLines ), "quadratic2DMode = 'eLines'", QtxPopupMgr::ToggleRule );
4613 popupMgr()->insert( action( SMESHOp::OpRepresentationArcs ), anId, -1 );
4614 popupMgr()->setRule( action( SMESHOp::OpRepresentationArcs ), aMeshInVTK + "&& isVisible && isQuadratic", QtxPopupMgr::VisibleRule );
4615 popupMgr()->setRule( action( SMESHOp::OpRepresentationArcs ), "quadratic2DMode = 'eArcs'", QtxPopupMgr::ToggleRule );
4617 //-------------------------------------------------
4618 // Orientation of faces
4619 //-------------------------------------------------
4620 popupMgr()->insert( action( SMESHOp::OpOrientationOnFaces ), -1, -1 );
4621 popupMgr()->setRule( action( SMESHOp::OpOrientationOnFaces ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule);
4622 popupMgr()->setRule( action( SMESHOp::OpOrientationOnFaces ), "facesOrientationMode = 'IsOriented'", QtxPopupMgr::ToggleRule );
4624 //-------------------------------------------------
4626 //-------------------------------------------------
4627 popupMgr()->insert( action( SMESHOp::OpProperties ), -1, -1 );
4628 popupMgr()->setRule( action( SMESHOp::OpProperties ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule );
4630 //-------------------------------------------------
4632 //-------------------------------------------------
4633 popupMgr()->insert( action( SMESHOp::OpTransparency ), -1, -1 );
4634 popupMgr()->setRule( action( SMESHOp::OpTransparency ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule );
4636 //-------------------------------------------------
4638 //-------------------------------------------------
4640 aMeshInVtkHasNodes = aMeshInVTK + "&&" + hasNodes,
4641 aMeshInVtkHasEdges = aMeshInVTK + "&&" + hasEdges,
4642 aMeshInVtkHasFaces = aMeshInVTK + "&&" + hasFaces,
4643 aMeshInVtkHasVolumes = aMeshInVTK + "&&" + hasVolumes;
4645 anId = popupMgr()->insert( tr( "MEN_CTRL" ), -1, -1 );
4647 popupMgr()->insert( action( SMESHOp::OpReset ), anId, -1 ); // RESET
4648 popupMgr()->setRule( action( SMESHOp::OpReset ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
4650 popupMgr()->insert( separator(), anId, -1 );
4652 int aSubId = popupMgr()->insert( tr( "MEN_NODE_CTRL" ), anId, -1 ); // NODE CONTROLS
4654 popupMgr()->insert( action( SMESHOp::OpFreeNode ), aSubId, -1 );
4655 popupMgr()->setRule( action( SMESHOp::OpFreeNode ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
4656 popupMgr()->setRule( action( SMESHOp::OpFreeNode ), "controlMode = 'eFreeNodes'", QtxPopupMgr::ToggleRule );
4658 popupMgr()->insert ( action( SMESHOp::OpEqualNode ), aSubId, -1 );
4659 popupMgr()->setRule( action( SMESHOp::OpEqualNode ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
4660 popupMgr()->setRule( action( SMESHOp::OpEqualNode ), "controlMode = 'eCoincidentNodes'", QtxPopupMgr::ToggleRule);
4662 // popupMgr()->insert( action( SMESHOp::OpNodeConnectivityNb ), aSubId, -1 );
4663 // popupMgr()->setRule( action( SMESHOp::OpNodeConnectivityNb ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
4664 // popupMgr()->setRule( action( SMESHOp::OpNodeConnectivityNb ), "controlMode = 'eNodeConnectivityNb'", QtxPopupMgr::ToggleRule );
4666 aSubId = popupMgr()->insert( tr( "MEN_EDGE_CTRL" ), anId, -1 ); // EDGE CONTROLS
4668 popupMgr()->insert( action( SMESHOp::OpFreeBorder ), aSubId, -1 );
4669 popupMgr()->setRule( action( SMESHOp::OpFreeBorder ), aMeshInVTK + "&&" + hasEdges + "&&" + hasFacesOrVolumes, QtxPopupMgr::VisibleRule );
4670 popupMgr()->setRule( action( SMESHOp::OpFreeBorder ), "controlMode = 'eFreeBorders'", QtxPopupMgr::ToggleRule );
4672 popupMgr()->insert( action( SMESHOp::OpLength ), aSubId, -1 );
4673 popupMgr()->setRule( action( SMESHOp::OpLength ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
4674 popupMgr()->setRule( action( SMESHOp::OpLength ), "controlMode = 'eLength'", QtxPopupMgr::ToggleRule );
4676 popupMgr()->insert( action( SMESHOp::OpConnection ), aSubId, -1 );
4677 popupMgr()->setRule( action( SMESHOp::OpConnection ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
4678 popupMgr()->setRule( action( SMESHOp::OpConnection ), "controlMode = 'eMultiConnection'", QtxPopupMgr::ToggleRule );
4679 popupMgr()->insert ( action( SMESHOp::OpEqualEdge ), aSubId, -1 ); // EQUAL_EDGE
4680 popupMgr()->setRule( action( SMESHOp::OpEqualEdge ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
4681 popupMgr()->setRule( action( SMESHOp::OpEqualEdge ), "controlMode = 'eCoincidentElems1D'", QtxPopupMgr::ToggleRule);
4683 aSubId = popupMgr()->insert( tr( "MEN_FACE_CTRL" ), anId, -1 ); // FACE CONTROLS
4685 popupMgr()->insert( action( SMESHOp::OpFreeEdge ), aSubId, -1 );
4686 popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4687 popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), "controlMode = 'eFreeEdges'", QtxPopupMgr::ToggleRule );
4689 popupMgr()->insert ( action( SMESHOp::OpFreeFace ), aSubId, -1 );
4690 popupMgr()->setRule( action( SMESHOp::OpFreeFace ), aMeshInVtkHasFaces /*aMeshInVtkHasVolumes*/,
4691 QtxPopupMgr::VisibleRule );
4692 popupMgr()->setRule( action( SMESHOp::OpFreeFace ), "controlMode = 'eFreeFaces'", QtxPopupMgr::ToggleRule );
4694 popupMgr()->insert ( action( SMESHOp::OpLength2D ), aSubId, -1 );
4695 popupMgr()->setRule( action( SMESHOp::OpLength2D ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4696 popupMgr()->setRule( action( SMESHOp::OpLength2D ), "controlMode = 'eLength2D'", QtxPopupMgr::ToggleRule );
4698 popupMgr()->insert ( action( SMESHOp::OpConnection2D ), aSubId, -1 );
4699 popupMgr()->setRule( action( SMESHOp::OpConnection2D ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4700 popupMgr()->setRule( action( SMESHOp::OpConnection2D ), "controlMode = 'eMultiConnection2D'", QtxPopupMgr::ToggleRule );
4702 popupMgr()->insert ( action( SMESHOp::OpArea ), aSubId, -1 );
4703 popupMgr()->setRule( action( SMESHOp::OpArea ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4704 popupMgr()->setRule( action( SMESHOp::OpArea ), "controlMode = 'eArea'", QtxPopupMgr::ToggleRule );
4706 popupMgr()->insert ( action( SMESHOp::OpTaper ), aSubId, -1 );
4707 popupMgr()->setRule( action( SMESHOp::OpTaper ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4708 popupMgr()->setRule( action( SMESHOp::OpTaper ), "controlMode = 'eTaper'", QtxPopupMgr::ToggleRule );
4710 popupMgr()->insert ( action( SMESHOp::OpAspectRatio ), aSubId, -1 );
4711 popupMgr()->setRule( action( SMESHOp::OpAspectRatio ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4712 popupMgr()->setRule( action( SMESHOp::OpAspectRatio ), "controlMode = 'eAspectRatio'", QtxPopupMgr::ToggleRule );
4714 popupMgr()->insert ( action( SMESHOp::OpMinimumAngle ), aSubId, -1 );
4715 popupMgr()->setRule( action( SMESHOp::OpMinimumAngle ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4716 popupMgr()->setRule( action( SMESHOp::OpMinimumAngle ), "controlMode = 'eMinimumAngle'", QtxPopupMgr::ToggleRule );
4718 popupMgr()->insert ( action( SMESHOp::OpWarpingAngle ), aSubId, -1 );
4719 popupMgr()->setRule( action( SMESHOp::OpWarpingAngle ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4720 popupMgr()->setRule( action( SMESHOp::OpWarpingAngle ), "controlMode = 'eWarping'", QtxPopupMgr::ToggleRule );
4722 popupMgr()->insert ( action( SMESHOp::OpSkew ), aSubId, -1 );
4723 popupMgr()->setRule( action( SMESHOp::OpSkew ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4724 popupMgr()->setRule( action( SMESHOp::OpSkew ), "controlMode = 'eSkew'", QtxPopupMgr::ToggleRule );
4726 popupMgr()->insert ( action( SMESHOp::OpMaxElementLength2D ), aSubId, -1 );
4727 popupMgr()->setRule( action( SMESHOp::OpMaxElementLength2D ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4728 popupMgr()->setRule( action( SMESHOp::OpMaxElementLength2D ), "controlMode = 'eMaxElementLength2D'", QtxPopupMgr::ToggleRule );
4730 popupMgr()->insert ( action( SMESHOp::OpBareBorderFace ), aSubId, -1 );
4731 popupMgr()->setRule( action( SMESHOp::OpBareBorderFace ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4732 popupMgr()->setRule( action( SMESHOp::OpBareBorderFace ), "controlMode = 'eBareBorderFace'", QtxPopupMgr::ToggleRule );
4734 popupMgr()->insert ( action( SMESHOp::OpOverConstrainedFace ), aSubId, -1 );
4735 popupMgr()->setRule( action( SMESHOp::OpOverConstrainedFace ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4736 popupMgr()->setRule( action( SMESHOp::OpOverConstrainedFace ), "controlMode = 'eOverConstrainedFace'", QtxPopupMgr::ToggleRule );
4738 popupMgr()->insert ( action( SMESHOp::OpEqualFace ), aSubId, -1 );
4739 popupMgr()->setRule( action( SMESHOp::OpEqualFace ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
4740 popupMgr()->setRule( action( SMESHOp::OpEqualFace ), "controlMode = 'eCoincidentElems2D'", QtxPopupMgr::ToggleRule );
4742 popupMgr()->insert ( action( SMESHOp::OpDeflection2D ), aSubId, -1 );
4743 popupMgr()->setRule( action( SMESHOp::OpDeflection2D ), aMeshInVtkHasFaces + " && hasGeomReference", QtxPopupMgr::VisibleRule );
4744 popupMgr()->setRule( action( SMESHOp::OpDeflection2D ), "controlMode = 'eDeflection2D'", QtxPopupMgr::ToggleRule );
4746 aSubId = popupMgr()->insert( tr( "MEN_VOLUME_CTRL" ), anId, -1 ); // VOLUME CONTROLS
4748 popupMgr()->insert ( action( SMESHOp::OpAspectRatio3D ), aSubId, -1 );
4749 popupMgr()->setRule( action( SMESHOp::OpAspectRatio3D ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
4750 popupMgr()->setRule( action( SMESHOp::OpAspectRatio3D ), "controlMode = 'eAspectRatio3D'", QtxPopupMgr::ToggleRule );
4752 popupMgr()->insert ( action( SMESHOp::OpVolume ), aSubId, -1 );
4753 popupMgr()->setRule( action( SMESHOp::OpVolume ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
4754 popupMgr()->setRule( action( SMESHOp::OpVolume ), "controlMode = 'eVolume3D'", QtxPopupMgr::ToggleRule );
4756 popupMgr()->insert ( action( SMESHOp::OpMaxElementLength3D ), aSubId, -1 );
4757 popupMgr()->setRule( action( SMESHOp::OpMaxElementLength3D ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
4758 popupMgr()->setRule( action( SMESHOp::OpMaxElementLength3D ), "controlMode = 'eMaxElementLength3D'", QtxPopupMgr::ToggleRule );
4760 popupMgr()->insert ( action( SMESHOp::OpBareBorderVolume ), aSubId, -1 );
4761 popupMgr()->setRule( action( SMESHOp::OpBareBorderVolume ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
4762 popupMgr()->setRule( action( SMESHOp::OpBareBorderVolume ), "controlMode = 'eBareBorderVolume'", QtxPopupMgr::ToggleRule );
4764 popupMgr()->insert ( action( SMESHOp::OpOverConstrainedVolume ), aSubId, -1 );
4765 popupMgr()->setRule( action( SMESHOp::OpOverConstrainedVolume ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
4766 popupMgr()->setRule( action( SMESHOp::OpOverConstrainedVolume ), "controlMode = 'eOverConstrainedVolume'", QtxPopupMgr::ToggleRule );
4768 popupMgr()->insert ( action( SMESHOp::OpEqualVolume ), aSubId, -1 );
4769 popupMgr()->setRule( action( SMESHOp::OpEqualVolume ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
4770 popupMgr()->setRule( action( SMESHOp::OpEqualVolume ), "controlMode = 'eCoincidentElems3D'", QtxPopupMgr::ToggleRule );
4772 popupMgr()->insert( separator(), anId, -1 );
4774 popupMgr()->insert( action( SMESHOp::OpShowScalarBar ), anId, -1 );
4775 popupMgr()->setRule( action( SMESHOp::OpShowScalarBar ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
4776 popupMgr()->setRule( action( SMESHOp::OpShowScalarBar ), aMeshInVTK + "&& controlMode <> 'eNone' && isScalarBarVisible", QtxPopupMgr::ToggleRule );
4777 popupMgr()->insert( action( SMESHOp::OpScalarBarProperties ), anId, -1 );
4778 popupMgr()->setRule( action( SMESHOp::OpScalarBarProperties ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
4780 popupMgr()->insert( separator(), anId, -1 );
4782 aSubId = popupMgr()->insert( tr( "MEN_DISTRIBUTION_CTRL" ), anId, -1 ); // NODE CONTROLS
4784 popupMgr()->insert( action( SMESHOp::OpSaveDistribution ), aSubId, -1 );
4785 popupMgr()->setRule( action( SMESHOp::OpSaveDistribution ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
4787 popupMgr()->insert( action( SMESHOp::OpShowDistribution ), aSubId, -1 );
4788 popupMgr()->setRule( action( SMESHOp::OpShowDistribution ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
4789 popupMgr()->setRule( action( SMESHOp::OpShowDistribution ), aMeshInVTK + "&& isNumFunctor && isScalarBarVisible && isDistributionVisible", QtxPopupMgr::ToggleRule);
4791 #ifndef DISABLE_PLOT2DVIEWER
4792 popupMgr()->insert( action( SMESHOp::OpPlotDistribution ), aSubId, -1 );
4793 popupMgr()->setRule( action( SMESHOp::OpPlotDistribution ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
4796 //-------------------------------------------------
4798 //-------------------------------------------------
4799 popupMgr()->insert( separator(), -1, -1 );
4800 QString aRule = "$component={'SMESH'} and ( type='Component' or (" + aClient + " and " +
4801 aType + " and " + aSelCount + " and " + anActiveVTK + " and " + isNotEmpty + " %1 ) )";
4802 popupMgr()->insert( action( SMESHOp::OpShow ), -1, -1 );
4803 popupMgr()->setRule( action( SMESHOp::OpShow ), aRule.arg( "and (not isVisible)" ), QtxPopupMgr::VisibleRule );
4805 popupMgr()->insert( action( SMESHOp::OpHide ), -1, -1 );
4806 popupMgr()->setRule( action( SMESHOp::OpHide ), aRule.arg( "and isVisible" ), QtxPopupMgr::VisibleRule );
4808 popupMgr()->insert( action( SMESHOp::OpShowOnly ), -1, -1 );
4809 popupMgr()->setRule( action( SMESHOp::OpShowOnly ), aRule.arg( "" ), QtxPopupMgr::VisibleRule );
4811 popupMgr()->insert( separator(), -1, -1 );
4813 //-------------------------------------------------
4815 //-------------------------------------------------
4816 popupMgr()->insert( action( SMESHOp::OpClipping ), -1, -1 );
4817 popupMgr()->setRule( action( SMESHOp::OpClipping ), "client='VTKViewer'", QtxPopupMgr::VisibleRule );
4819 popupMgr()->insert( separator(), -1, -1 );
4821 popupMgr()->insert( action( SMESHOp::OpSortChild ), -1, -1 );
4822 popupMgr()->setRule( action( SMESHOp::OpSortChild ), "$component={'SMESH'} and client='ObjectBrowser' and isContainer and nbChildren>1", QtxPopupMgr::VisibleRule );
4823 popupMgr()->insert( separator(), -1, -1 );
4825 connect( application(), SIGNAL( viewManagerActivated( SUIT_ViewManager* ) ),
4826 this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) );
4828 connect( application(), SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
4829 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
4832 //================================================================================
4834 * \brief Return true if SMESH or GEOM objects are selected.
4835 * Is called form LightApp_Module::activateModule() which clear selection if
4836 * not isSelectionCompatible()
4838 //================================================================================
4840 bool SMESHGUI::isSelectionCompatible()
4842 bool isCompatible = true;
4843 SALOME_ListIO selected;
4844 if ( LightApp_SelectionMgr *Sel = selectionMgr() )
4845 Sel->selectedObjects( selected );
4847 SALOME_ListIteratorOfListIO It( selected );
4848 for ( ; isCompatible && It.More(); It.Next())
4850 ( strcmp("GEOM", It.Value()->getComponentDataType()) == 0 ) ||
4851 ( strcmp("SMESH", It.Value()->getComponentDataType()) == 0 );
4853 return isCompatible;
4857 bool SMESHGUI::reusableOperation( const int id )
4859 // compute, evaluate and precompute are not reusable operations
4860 return ( id == SMESHOp::OpCompute || id == SMESHOp::OpPreCompute || id == SMESHOp::OpEvaluate ) ? false : SalomeApp_Module::reusableOperation( id );
4863 bool SMESHGUI::activateModule( SUIT_Study* study )
4865 bool res = SalomeApp_Module::activateModule( study );
4867 setMenuShown( true );
4868 setToolShown( true );
4870 // import Python module that manages SMESH plugins (need to be here because SalomePyQt API uses active module)
4871 PyGILState_STATE gstate = PyGILState_Ensure();
4872 PyObject* pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
4873 if ( !pluginsmanager ) {
4877 PyObject* result = PyObject_CallMethod( pluginsmanager, (char*)"initialize", (char*)"isss",1,"smesh",tr("MEN_MESH").toUtf8().data(),tr("SMESH_PLUGINS_OTHER").toUtf8().data());
4882 PyGILState_Release(gstate);
4883 // end of SMESH plugins loading
4885 // Reset actions accelerator keys
4886 action(SMESHOp::OpDelete)->setEnabled(true); // Delete: Key_Delete
4888 // 0020210. Make SMESH_Gen update meshes at switching GEOM->SMESH
4889 GetSMESHGen()->UpdateStudy();
4891 // get all view currently opened in the study and connect their signals to
4892 // the corresponding slots of the class.
4893 SUIT_Desktop* aDesk = study->application()->desktop();
4895 QList<SUIT_ViewWindow*> wndList = aDesk->windows();
4896 SUIT_ViewWindow* wnd;
4897 foreach ( wnd, wndList )
4901 Py_XDECREF(pluginsmanager);
4905 bool SMESHGUI::deactivateModule( SUIT_Study* study )
4907 setMenuShown( false );
4908 setToolShown( false );
4910 EmitSignalCloseAllDialogs();
4912 // Unset actions accelerator keys
4913 action(SMESHOp::OpDelete)->setEnabled(false); // Delete: Key_Delete
4915 return SalomeApp_Module::deactivateModule( study );
4918 void SMESHGUI::studyClosed( SUIT_Study* s )
4922 SMESH::RemoveVisuData();
4923 SalomeApp_Module::studyClosed( s );
4926 void SMESHGUI::OnGUIEvent()
4928 const QObject* obj = sender();
4929 if ( !obj || !obj->inherits( "QAction" ) )
4931 int id = actionId((QAction*)obj);
4936 SMESH::SMESH_Gen_var SMESHGUI::GetSMESHGen()
4938 if ( CORBA::is_nil( myComponentSMESH ) )
4940 SMESHGUI aGUI; //SRN BugID: IPAL9186: Create an instance of SMESHGUI to initialize myComponentSMESH
4941 return aGUI.myComponentSMESH;
4943 return myComponentSMESH;
4946 QString SMESHGUI::engineIOR() const
4948 CORBA::ORB_var anORB = getApp()->orb();
4949 CORBA::String_var anIOR = anORB->object_to_string(GetSMESHGen());
4950 return QString( anIOR.in() );
4953 void SMESHGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
4955 SalomeApp_Module::contextMenuPopup( client, menu, title );
4957 selectionMgr()->selectedObjects( lst );
4958 if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) {
4959 Handle(SALOME_InteractiveObject) io = lst.First();
4960 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
4961 _PTR(Study) study = appStudy->studyDS();
4962 _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
4964 QString aName = QString( SMESH::fromUtf8(obj->GetName()) );
4965 while ( aName.at( aName.length() - 1 ) == ' ' ) // Remove extraspaces in Name of Popup
4966 aName.remove( (aName.length() - 1), 1 );
4972 LightApp_Selection* SMESHGUI::createSelection() const
4974 return new SMESHGUI_Selection();
4977 void SMESHGUI::windows( QMap<int, int>& aMap ) const
4979 aMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
4980 aMap.insert( SalomeApp_Application::WT_NoteBook, Qt::LeftDockWidgetArea );
4981 #ifndef DISABLE_PYCONSOLE
4982 aMap.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
4986 void SMESHGUI::viewManagers( QStringList& list ) const
4988 list.append( SVTK_Viewer::Type() );
4991 void SMESHGUI::onViewManagerActivated( SUIT_ViewManager* mgr )
4993 if ( dynamic_cast<SVTK_ViewManager*>( mgr ) ) {
4994 SMESH::UpdateSelectionProp( this );
4996 QVector<SUIT_ViewWindow*> aViews = mgr->getViews();
4997 for(int i = 0; i < aViews.count() ; i++){
4998 SUIT_ViewWindow *sf = aViews[i];
5001 EmitSignalActivatedViewManager();
5005 void SMESHGUI::onViewManagerRemoved( SUIT_ViewManager* theViewManager )
5007 if( theViewManager && theViewManager->getType() == SVTK_Viewer::Type() )
5008 myClippingPlaneInfoMap.erase( theViewManager );
5011 void SMESHGUI::addActorAsObserver( SMESH_Actor* theActor )
5013 theActor->AddObserver( SMESH::DeleteActorEvent,
5014 myEventCallbackCommand.GetPointer(),
5018 void SMESHGUI::ProcessEvents( vtkObject* theObject,
5019 unsigned long theEvent,
5020 void* theClientData,
5023 if( SMESHGUI* aSMESHGUI = reinterpret_cast<SMESHGUI*>( theClientData ) ) {
5024 if( theObject && (int) theEvent == SMESH::DeleteActorEvent ) {
5025 if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( theObject ) ) {
5026 SMESHGUI_ClippingPlaneInfoMap& aClippingPlaneInfoMap = aSMESHGUI->getClippingPlaneInfoMap();
5027 SMESHGUI_ClippingPlaneInfoMap::iterator anIter1 = aClippingPlaneInfoMap.begin();
5028 for( ; anIter1 != aClippingPlaneInfoMap.end(); anIter1++ ) {
5029 SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = anIter1->second;
5030 SMESHGUI_ClippingPlaneInfoList::iterator anIter2 = aClippingPlaneInfoList.begin();
5031 for( ; anIter2 != aClippingPlaneInfoList.end(); anIter2++ ) {
5032 SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter2;
5033 std::list<vtkActor*>& anActorList = aClippingPlaneInfo.ActorList;
5034 SMESH::TActorList::iterator anIter3 = anActorList.begin();
5035 for ( ; anIter3 != anActorList.end(); anIter3++ ) {
5036 if( anActor == *anIter3 ) {
5037 anActorList.erase( anIter3 );
5048 void SMESHGUI::createPreferences()
5050 // General tab ------------------------------------------------------------------------
5051 int genTab = addPreference( tr( "PREF_TAB_GENERAL" ) );
5053 int autoUpdate = addPreference( tr( "PREF_AUTO_UPDATE" ), genTab, LightApp_Preferences::Auto, "SMESH", "auto_update" );
5054 setPreferenceProperty( autoUpdate, "columns", 2 );
5055 int lim = addPreference( tr( "PREF_UPDATE_LIMIT" ), autoUpdate, LightApp_Preferences::IntSpin, "SMESH", "update_limit" );
5056 setPreferenceProperty( lim, "min", 0 );
5057 setPreferenceProperty( lim, "max", 100000000 );
5058 setPreferenceProperty( lim, "step", 1000 );
5059 setPreferenceProperty( lim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
5060 addPreference( tr( "PREF_INCREMENTAL_LIMIT" ), autoUpdate, LightApp_Preferences::Bool, "SMESH", "incremental_limit" );
5062 int dispgroup = addPreference( tr( "PREF_DISPLAY_MODE_GROUP" ), genTab );
5063 setPreferenceProperty( dispgroup, "columns", 2 );
5064 int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), dispgroup, LightApp_Preferences::Selector, "SMESH", "display_mode" );
5066 modes.append( tr("MEN_WIRE") );
5067 modes.append( tr("MEN_SHADE") );
5068 modes.append( tr("MEN_NODES") );
5069 modes.append( tr("MEN_SHRINK") );
5070 QList<QVariant> indices;
5071 indices.append( 0 );
5072 indices.append( 1 );
5073 indices.append( 2 );
5074 indices.append( 3 );
5075 setPreferenceProperty( dispmode, "strings", modes );
5076 setPreferenceProperty( dispmode, "indexes", indices );
5078 int arcgroup = addPreference( tr( "QUADRATIC_REPRESENT_MODE_GROUP" ), genTab );
5079 setPreferenceProperty( arcgroup, "columns", 2 );
5080 int quadraticmode = addPreference( tr( "QUADRATIC_REPRESENT_MODE" ), arcgroup, LightApp_Preferences::Selector, "SMESH", "quadratic_mode" );
5081 QStringList quadraticModes;
5082 quadraticModes.append(tr("MEN_LINE_REPRESENTATION"));
5083 quadraticModes.append(tr("MEN_ARC_REPRESENTATION"));
5085 indices.append( 0 );
5086 indices.append( 1 );
5087 setPreferenceProperty( quadraticmode, "strings", quadraticModes );
5088 setPreferenceProperty( quadraticmode, "indexes", indices );
5090 int maxAngle = addPreference( tr( "MAX_ARC_ANGLE" ), arcgroup, LightApp_Preferences::IntSpin,
5091 "SMESH", "max_angle" );
5092 setPreferenceProperty( maxAngle, "min", 1 );
5093 setPreferenceProperty( maxAngle, "max", 90 );
5095 int qaGroup = addPreference( tr( "PREF_GROUP_QUALITY" ), genTab );
5096 setPreferenceProperty( qaGroup, "columns", 2 );
5097 addPreference( tr( "PREF_DISPLAY_ENTITY" ), qaGroup, LightApp_Preferences::Bool, "SMESH", "display_entity" );
5098 addPreference( tr( "PREF_PRECISION_USE" ), qaGroup, LightApp_Preferences::Bool, "SMESH", "use_precision" );
5099 int prec = addPreference( tr( "PREF_PRECISION_VALUE" ), qaGroup, LightApp_Preferences::IntSpin, "SMESH", "controls_precision" );
5100 setPreferenceProperty( prec, "min", 0 );
5101 setPreferenceProperty( prec, "max", 100 );
5102 int doubleNodesTol = addPreference( tr( "PREF_EQUAL_NODES_TOL" ), qaGroup, LightApp_Preferences::DblSpin, "SMESH", "equal_nodes_tolerance" );
5103 setPreferenceProperty( doubleNodesTol, "precision", 10 );
5104 setPreferenceProperty( doubleNodesTol, "min", 0.0000000001 );
5105 setPreferenceProperty( doubleNodesTol, "max", 1000000.0 );
5106 setPreferenceProperty( doubleNodesTol, "step", 0.0000001 );
5109 int cinc = addPreference(tr("PREF_CONTROLS_INCREMENT"), qaGroup, LightApp_Preferences::IntSpin, "SMESH", "controls_increment");
5110 setPreferenceProperty( cinc, "min", 0 );
5111 setPreferenceProperty( cinc, "max", 5 );
5114 int exportgroup = addPreference( tr( "PREF_GROUP_EXPORT" ), genTab );
5115 setPreferenceProperty( exportgroup, "columns", 2 );
5116 addPreference( tr( "PREF_AUTO_GROUPS" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "auto_groups" );
5117 addPreference( tr( "PREF_SHOW_WARN" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "show_warning" );
5118 //addPreference( tr( "PREF_RENUMBER" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "renumbering" );
5120 int computeGroup = addPreference( tr( "PREF_GROUP_COMPUTE" ), genTab );
5121 setPreferenceProperty( computeGroup, "columns", 2 );
5122 int notifyMode = addPreference( tr( "PREF_NOTIFY_MODE" ), computeGroup, LightApp_Preferences::Selector, "SMESH", "show_result_notification" );
5124 modes.append( tr( "PREF_NOTIFY_NEVER" ) );
5125 modes.append( tr( "PREF_NOTIFY_ERROR" ) );
5126 modes.append( tr( "PREF_NOTIFY_ALWAYS" ) );
5128 indices.append( 0 );
5129 indices.append( 1 );
5130 indices.append( 2 );
5131 setPreferenceProperty( notifyMode, "strings", modes );
5132 setPreferenceProperty( notifyMode, "indexes", indices );
5134 int infoGroup = addPreference( tr( "PREF_GROUP_INFO" ), genTab );
5135 setPreferenceProperty( infoGroup, "columns", 2 );
5136 int elemInfo = addPreference( tr( "PREF_ELEM_INFO" ), infoGroup, LightApp_Preferences::Selector, "SMESH", "mesh_elem_info" );
5138 modes.append( tr( "PREF_ELEM_INFO_SIMPLE" ) );
5139 modes.append( tr( "PREF_ELEM_INFO_TREE" ) );
5141 indices.append( 0 );
5142 indices.append( 1 );
5143 setPreferenceProperty( elemInfo, "strings", modes );
5144 setPreferenceProperty( elemInfo, "indexes", indices );
5145 int nodesLim = addPreference( tr( "PREF_GPP_NODES_LIMIT" ), infoGroup, LightApp_Preferences::IntSpin, "SMESH", "info_groups_nodes_limit" );
5146 setPreferenceProperty( nodesLim, "min", 0 );
5147 setPreferenceProperty( nodesLim, "max", 10000000 );
5148 setPreferenceProperty( nodesLim, "step", 10000 );
5149 setPreferenceProperty( nodesLim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
5150 int ctrlLim = addPreference( tr( "PREF_CTRL_LIMIT" ), infoGroup, LightApp_Preferences::IntSpin, "SMESH", "info_controls_limit" );
5151 setPreferenceProperty( ctrlLim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
5152 setPreferenceProperty( ctrlLim, "min", 0 );
5153 setPreferenceProperty( ctrlLim, "max", 10000000 );
5154 setPreferenceProperty( ctrlLim, "step", 1000 );
5155 addPreference( tr( "PREF_ELEM_INFO_GRP_DETAILS" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "elem_info_grp_details" );
5156 addPreference( tr( "PREF_DUMP_BASE_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_base" );
5157 addPreference( tr( "PREF_DUMP_ELEM_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_elem" );
5158 addPreference( tr( "PREF_DUMP_ADD_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_add" );
5159 addPreference( tr( "PREF_DUMP_CTRL_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_ctrl" );
5161 int segGroup = addPreference( tr( "PREF_GROUP_SEGMENT_LENGTH" ), genTab );
5162 setPreferenceProperty( segGroup, "columns", 2 );
5163 int segLen = addPreference( tr( "PREF_SEGMENT_LENGTH" ), segGroup, LightApp_Preferences::IntSpin,
5164 "SMESH", "segmentation" );
5165 setPreferenceProperty( segLen, "min", 1 );
5166 setPreferenceProperty( segLen, "max", 10000000 );
5167 int nbSeg = addPreference( tr( "PREF_NB_SEGMENTS" ), segGroup, LightApp_Preferences::IntSpin,
5168 "SMESH", "nb_segments_per_edge" );
5169 setPreferenceProperty( nbSeg, "min", 1 );
5170 setPreferenceProperty( nbSeg, "max", 10000000 );
5172 int loadGroup = addPreference( tr( "SMESH_PREF_MESH_LOADING" ), genTab );
5173 addPreference( tr( "PREF_FORGET_MESH_AT_HYP_MODIF" ), loadGroup, LightApp_Preferences::Bool,
5174 "SMESH", "forget_mesh_on_hyp_modif" );
5177 // Quantities with individual precision settings
5178 int precGroup = addPreference( tr( "SMESH_PREF_GROUP_PRECISION" ), genTab );
5179 setPreferenceProperty( precGroup, "columns", 2 );
5181 const int nbQuantities = 6;
5182 int precs[nbQuantities], ii = 0;
5183 precs[ii++] = addPreference( tr( "SMESH_PREF_length_precision" ), precGroup,
5184 LightApp_Preferences::IntSpin, "SMESH", "length_precision" );
5185 precs[ii++] = addPreference( tr( "SMESH_PREF_angle_precision" ), precGroup,
5186 LightApp_Preferences::IntSpin, "SMESH", "angle_precision" );
5187 precs[ii++] = addPreference( tr( "SMESH_PREF_len_tol_precision" ), precGroup,
5188 LightApp_Preferences::IntSpin, "SMESH", "len_tol_precision" );
5189 precs[ii++] = addPreference( tr( "SMESH_PREF_parametric_precision" ), precGroup,
5190 LightApp_Preferences::IntSpin, "SMESH", "parametric_precision" );
5191 precs[ii++] = addPreference( tr( "SMESH_PREF_area_precision" ), precGroup,
5192 LightApp_Preferences::IntSpin, "SMESH", "area_precision" );
5193 precs[ii ] = addPreference( tr( "SMESH_PREF_vol_precision" ), precGroup,
5194 LightApp_Preferences::IntSpin, "SMESH", "vol_precision" );
5196 // Set property for precision value for spinboxes
5197 for ( ii = 0; ii < nbQuantities; ii++ ){
5198 setPreferenceProperty( precs[ii], "min", -14 );
5199 setPreferenceProperty( precs[ii], "max", 14 );
5200 setPreferenceProperty( precs[ii], "precision", 2 );
5203 int previewGroup = addPreference( tr( "SMESH_PREF_GROUP_PREVIEW" ), genTab );
5204 setPreferenceProperty( previewGroup, "columns", 2 );
5205 int chunkSize = addPreference( tr( "PREF_PREVIEW_CHUNK_SIZE" ), previewGroup, LightApp_Preferences::IntSpin, "SMESH", "preview_actor_chunk_size" );
5206 setPreferenceProperty( chunkSize, "min", 1 );
5207 setPreferenceProperty( chunkSize, "max", 1000 );
5208 setPreferenceProperty( chunkSize, "step", 50 );
5210 int pyDumpGroup = addPreference( tr( "PREF_PYTHON_DUMP" ), genTab );
5211 addPreference( tr( "PREF_HISTORICAL_PYTHON_DUMP" ), pyDumpGroup, LightApp_Preferences::Bool, "SMESH", "historical_python_dump" );
5213 // Mesh tab ------------------------------------------------------------------------
5214 int meshTab = addPreference( tr( "PREF_TAB_MESH" ) );
5215 int nodeGroup = addPreference( tr( "PREF_GROUP_NODES" ), meshTab );
5216 setPreferenceProperty( nodeGroup, "columns", 3 );
5218 addPreference( tr( "PREF_COLOR" ), nodeGroup, LightApp_Preferences::Color, "SMESH", "node_color" );
5220 int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), nodeGroup, LightApp_Preferences::Selector, "SMESH", "type_of_marker" );
5222 SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
5223 QList<QVariant> aMarkerTypeIndicesList;
5224 QList<QVariant> aMarkerTypeIconsList;
5225 for ( int i = VTK::MT_POINT; i < VTK::MT_USER; i++ ) {
5226 QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
5227 QPixmap pixmap = aResourceMgr->loadPixmap( "VTKViewer", tr( qPrintable( icoFile ) ) );
5228 aMarkerTypeIndicesList << i;
5229 aMarkerTypeIconsList << pixmap;
5231 setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
5232 setPreferenceProperty( typeOfMarker, "icons", aMarkerTypeIconsList );
5234 int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), nodeGroup, LightApp_Preferences::Selector, "SMESH", "marker_scale" );
5236 QList<QVariant> aMarkerScaleIndicesList;
5237 QStringList aMarkerScaleValuesList;
5238 for ( int i = VTK::MS_10; i <= VTK::MS_70; i++ ) {
5239 aMarkerScaleIndicesList << i;
5240 //aMarkerScaleValuesList << QString::number( (i-(int)VTK::MS_10)*0.5 + 1.0 );
5241 aMarkerScaleValuesList << QString::number( i );
5243 setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
5244 setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
5246 int elemGroup = addPreference( tr( "PREF_GROUP_ELEMENTS" ), meshTab );
5247 //setPreferenceProperty( elemGroup, "columns", 2 );
5249 int ColorId = addPreference( tr( "PREF_FILL" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "fill_color" );
5250 setPreferenceProperty( ColorId, "text", tr("PREF_BACKFACE") );
5251 ColorId = addPreference( tr( "PREF_VOLUME" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "volume_color" );
5252 setPreferenceProperty( ColorId, "text", tr("PREF_REVERSEDVOLUME") );
5253 addPreference( tr( "PREF_COLOR_0D" ), elemGroup, LightApp_Preferences::Color, "SMESH", "elem0d_color" );
5254 addPreference( tr( "PREF_BALL_COLOR" ), elemGroup, LightApp_Preferences::Color, "SMESH", "ball_elem_color" );
5255 addPreference( tr( "PREF_OUTLINE" ), elemGroup, LightApp_Preferences::Color, "SMESH", "outline_color" );
5256 addPreference( tr( "PREF_WIREFRAME" ), elemGroup, LightApp_Preferences::Color, "SMESH", "wireframe_color" );
5257 addPreference( tr( "PREF_PREVIEW_COLOR" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "preview_color" );
5260 int grpGroup = addPreference( tr( "PREF_GROUP_GROUPS" ), meshTab );
5261 setPreferenceProperty( grpGroup, "columns", 2 );
5263 addPreference( tr( "PREF_GRP_NAMES" ), grpGroup, LightApp_Preferences::Color, "SMESH", "group_name_color" );
5264 addPreference( tr( "PREF_GRP_DEF_COLOR" ), grpGroup, LightApp_Preferences::Color, "SMESH", "default_grp_color" );
5266 int size0d = addPreference(tr("PREF_SIZE_0D"), elemGroup,
5267 LightApp_Preferences::IntSpin, "SMESH", "elem0d_size");
5268 /* int ballSize = addPreference(tr("PREF_BALL_SIZE"), elemGroup,
5269 LightApp_Preferences::IntSpin, "SMESH", "ball_elem_size"); */
5270 double ballDiameter = addPreference(tr("PREF_BALL_DIAMETER"), elemGroup,
5271 LightApp_Preferences::DblSpin, "SMESH", "ball_elem_diameter");
5272 double ballScale = addPreference(tr("PREF_BALL_SCALE"), elemGroup,
5273 LightApp_Preferences::DblSpin, "SMESH", "ball_elem_scale");
5274 int elemW = addPreference(tr("PREF_WIDTH"), elemGroup,
5275 LightApp_Preferences::IntSpin, "SMESH", "element_width");
5276 int outW = addPreference(tr("PREF_OUTLINE_WIDTH"), elemGroup,
5277 LightApp_Preferences::IntSpin, "SMESH", "outline_width");
5278 int shrink = addPreference(tr("PREF_SHRINK_COEFF"), elemGroup,
5279 LightApp_Preferences::IntSpin, "SMESH", "shrink_coeff");
5281 setPreferenceProperty( size0d, "min", 1 );
5282 setPreferenceProperty( size0d, "max", 10 );
5284 // setPreferenceProperty( ballSize, "min", 1 );
5285 // setPreferenceProperty( ballSize, "max", 10 );
5287 setPreferenceProperty( ballDiameter, "min", 1e-7 );
5288 setPreferenceProperty( ballDiameter, "max", 1e9 );
5289 setPreferenceProperty( ballDiameter, "step", 0.1 );
5291 setPreferenceProperty( ballScale, "min", 1e-2 );
5292 setPreferenceProperty( ballScale, "max", 1e7 );
5293 setPreferenceProperty( ballScale, "step", 0.5 );
5295 setPreferenceProperty( elemW, "min", 1 );
5296 setPreferenceProperty( elemW, "max", 5 );
5298 setPreferenceProperty( outW, "min", 1 );
5299 setPreferenceProperty( outW, "max", 5 );
5301 setPreferenceProperty( shrink, "min", 0 );
5302 setPreferenceProperty( shrink, "max", 100 );
5304 int numGroup = addPreference( tr( "PREF_GROUP_NUMBERING" ), meshTab );
5305 setPreferenceProperty( numGroup, "columns", 2 );
5307 addPreference( tr( "PREF_NUMBERING_NODE" ), numGroup, LightApp_Preferences::Color, "SMESH", "numbering_node_color" );
5308 addVtkFontPref( tr( "PREF_NUMBERING_FONT" ), numGroup, "numbering_node_font", true );
5310 addPreference( tr( "PREF_NUMBERING_ELEM" ), numGroup, LightApp_Preferences::Color, "SMESH", "numbering_elem_color" );
5311 addVtkFontPref( tr( "PREF_NUMBERING_FONT" ), numGroup, "numbering_elem_font", true );
5313 int orientGroup = addPreference( tr( "PREF_GROUP_FACES_ORIENTATION" ), meshTab );
5314 setPreferenceProperty( orientGroup, "columns", 1 );
5316 addPreference( tr( "PREF_ORIENTATION_COLOR" ), orientGroup, LightApp_Preferences::Color, "SMESH", "orientation_color" );
5317 int orientScale = addPreference( tr( "PREF_ORIENTATION_SCALE" ), orientGroup, LightApp_Preferences::DblSpin, "SMESH", "orientation_scale" );
5319 setPreferenceProperty( orientScale, "min", 0.05 );
5320 setPreferenceProperty( orientScale, "max", 0.5 );
5321 setPreferenceProperty( orientScale, "step", 0.05 );
5323 addPreference( tr( "PREF_ORIENTATION_3D_VECTORS" ), orientGroup, LightApp_Preferences::Bool, "SMESH", "orientation_3d_vectors" );
5325 // Selection tab ------------------------------------------------------------------------
5326 int selTab = addPreference( tr( "PREF_TAB_SELECTION" ) );
5328 int selGroup = addPreference( tr( "PREF_GROUP_SELECTION" ), selTab );
5329 setPreferenceProperty( selGroup, "columns", 2 );
5331 addPreference( tr( "PREF_OBJECT_COLOR" ), selGroup, LightApp_Preferences::Color, "SMESH", "selection_object_color" );
5332 addPreference( tr( "PREF_ELEMENT_COLOR" ), selGroup, LightApp_Preferences::Color, "SMESH", "selection_element_color" );
5334 int preGroup = addPreference( tr( "PREF_GROUP_PRESELECTION" ), selTab );
5335 setPreferenceProperty( preGroup, "columns", 2 );
5337 addPreference( tr( "PREF_HIGHLIGHT_COLOR" ), preGroup, LightApp_Preferences::Color, "SMESH", "highlight_color" );
5339 int precSelGroup = addPreference( tr( "PREF_GROUP_PRECISION" ), selTab );
5340 setPreferenceProperty( precSelGroup, "columns", 2 );
5342 addPreference( tr( "PREF_NODES" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_node" );
5343 addPreference( tr( "PREF_ELEMENTS" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_element" );
5344 addPreference( tr( "PREF_OBJECTS" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_object" );
5346 int sinc = addPreference(tr("PREF_SELECTION_INCREMENT"), selTab, LightApp_Preferences::IntSpin, "SMESH", "selection_increment");
5347 setPreferenceProperty( sinc, "min", 0 );
5348 setPreferenceProperty( sinc, "max", 5 );
5350 // Scalar Bar tab ------------------------------------------------------------------------
5351 int sbarTab = addPreference( tr( "SMESH_SCALARBAR" ) );
5352 int fontGr = addPreference( tr( "SMESH_FONT_SCALARBAR" ), sbarTab );
5353 setPreferenceProperty( fontGr, "columns", 2 );
5355 addVtkFontPref( tr( "SMESH_TITLE" ), fontGr, "scalar_bar_title_font" );
5356 addPreference( tr( "PREF_TITLE_COLOR" ), fontGr, LightApp_Preferences::Color, "SMESH", "scalar_bar_title_color" );
5358 addVtkFontPref( tr( "SMESH_LABELS" ), fontGr, "scalar_bar_label_font" );
5359 addPreference( tr( "PREF_LABELS_COLOR" ), fontGr, LightApp_Preferences::Color, "SMESH", "scalar_bar_label_color" );
5361 int colorsLabelsGr = addPreference( tr( "SMESH_LABELS_COLORS_SCALARBAR" ), sbarTab );
5362 setPreferenceProperty( colorsLabelsGr, "columns", 2 );
5364 int numcol = addPreference( tr( "SMESH_NUMBEROFCOLORS" ), colorsLabelsGr, LightApp_Preferences::IntSpin, "SMESH", "scalar_bar_num_colors" );
5365 setPreferenceProperty( numcol, "min", 2 );
5366 setPreferenceProperty( numcol, "max", 256 );
5368 int numlab = addPreference( tr( "SMESH_NUMBEROFLABELS" ), colorsLabelsGr, LightApp_Preferences::IntSpin, "SMESH", "scalar_bar_num_labels" );
5369 setPreferenceProperty( numlab, "min", 2 );
5370 setPreferenceProperty( numlab, "max", 65 );
5372 int orientGr = addPreference( tr( "SMESH_ORIENTATION" ), sbarTab );
5373 setPreferenceProperty( orientGr, "columns", 2 );
5374 int orient = addPreference( tr( "SMESH_ORIENTATION" ), orientGr, LightApp_Preferences::Selector, "SMESH", "scalar_bar_orientation" );
5375 QStringList orients;
5376 orients.append( tr( "SMESH_VERTICAL" ) );
5377 orients.append( tr( "SMESH_HORIZONTAL" ) );
5378 indices.clear(); indices.append( 0 ); indices.append( 1 );
5379 setPreferenceProperty( orient, "strings", orients );
5380 setPreferenceProperty( orient, "indexes", indices );
5382 int posVSizeGr = addPreference( tr( "SMESH_POSITION_SIZE_SCALARBAR" ) + " " + tr( "SMESH_VERTICAL" ), sbarTab );
5383 setPreferenceProperty( posVSizeGr, "columns", 2 );
5384 int xv = addPreference( tr( "SMESH_X_SCALARBAR" ), posVSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_vertical_x" );
5385 int yv = addPreference( tr( "SMESH_Y_SCALARBAR" ), posVSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_vertical_y" );
5386 int wv = addPreference( tr( "SMESH_WIDTH" ), posVSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_vertical_width" );
5387 int hv = addPreference( tr( "SMESH_HEIGHT" ), posVSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_vertical_height" );
5388 setPreferenceProperty( xv, "step", 0.1 );
5389 setPreferenceProperty( xv, "min", 0.0 );
5390 setPreferenceProperty( xv, "max", 1.0 );
5391 setPreferenceProperty( yv, "step", 0.1 );
5392 setPreferenceProperty( yv, "min", 0.0 );
5393 setPreferenceProperty( yv, "max", 1.0 );
5394 setPreferenceProperty( wv, "step", 0.1 );
5395 setPreferenceProperty( wv, "min", 0.0 );
5396 setPreferenceProperty( wv, "max", 1.0 );
5397 setPreferenceProperty( hv, "min", 0.0 );
5398 setPreferenceProperty( hv, "max", 1.0 );
5399 setPreferenceProperty( hv, "step", 0.1 );
5401 int posHSizeGr = addPreference( tr( "SMESH_POSITION_SIZE_SCALARBAR" ) + " " + tr( "SMESH_HORIZONTAL" ), sbarTab );
5402 setPreferenceProperty( posHSizeGr, "columns", 2 );
5403 int xh = addPreference( tr( "SMESH_X_SCALARBAR" ), posHSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_horizontal_x" );
5404 int yh = addPreference( tr( "SMESH_Y_SCALARBAR" ), posHSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_horizontal_y" );
5405 int wh = addPreference( tr( "SMESH_WIDTH" ), posHSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_horizontal_width" );
5406 int hh = addPreference( tr( "SMESH_HEIGHT" ), posHSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_horizontal_height" );
5407 setPreferenceProperty( xv, "min", 0.0 );
5408 setPreferenceProperty( xv, "max", 1.0 );
5409 setPreferenceProperty( xv, "step", 0.1 );
5410 setPreferenceProperty( xh, "min", 0.0 );
5411 setPreferenceProperty( xh, "max", 1.0 );
5412 setPreferenceProperty( xh, "step", 0.1 );
5413 setPreferenceProperty( yh, "min", 0.0 );
5414 setPreferenceProperty( yh, "max", 1.0 );
5415 setPreferenceProperty( yh, "step", 0.1 );
5416 setPreferenceProperty( wh, "min", 0.0 );
5417 setPreferenceProperty( wh, "max", 1.0 );
5418 setPreferenceProperty( wh, "step", 0.1 );
5419 setPreferenceProperty( hh, "min", 0.0 );
5420 setPreferenceProperty( hh, "max", 1.0 );
5421 setPreferenceProperty( hh, "step", 0.1 );
5423 int distributionGr = addPreference( tr( "SMESH_DISTRIBUTION_SCALARBAR" ), sbarTab, LightApp_Preferences::Auto, "SMESH", "distribution_visibility" );
5424 int coloringType = addPreference( tr( "SMESH_DISTRIBUTION_COLORING_TYPE" ), distributionGr, LightApp_Preferences::Selector, "SMESH", "distribution_coloring_type" );
5425 setPreferenceProperty( distributionGr, "columns", 3 );
5427 types.append( tr( "SMESH_MONOCOLOR" ) );
5428 types.append( tr( "SMESH_MULTICOLOR" ) );
5429 indices.clear(); indices.append( 0 ); indices.append( 1 );
5430 setPreferenceProperty( coloringType, "strings", types );
5431 setPreferenceProperty( coloringType, "indexes", indices );
5432 addPreference( tr( "SMESH_DISTRIBUTION_COLOR" ), distributionGr, LightApp_Preferences::Color, "SMESH", "distribution_color" );
5436 void SMESHGUI::preferencesChanged( const QString& sect, const QString& name )
5438 if ( sect=="SMESH" ) {
5439 float sbX1 = 0.01, sbY1 = 0.01, sbW = 0.08, sbH = 0.08;
5440 float aTol = 1.00000009999999;
5441 std::string aWarning;
5442 SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
5444 if ( name== "selection_object_color" ||
5445 name=="selection_element_color" ||
5446 name== "highlight_color" ||
5447 name=="selection_precision_node" ||
5448 name=="selection_precision_element" ||
5449 name=="selection_precision_object" ||
5450 name=="selection_increment")
5452 SMESH::UpdateSelectionProp( this );
5454 else if (name == "scalar_bar_vertical_x" || name == "scalar_bar_vertical_width")
5456 sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_x", sbX1);
5457 sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_width", sbW);
5458 if ( sbX1+sbW > aTol ) {
5459 aWarning = "Origin and Size Vertical: X+Width > 1\n";
5462 aResourceMgr->setValue("SMESH", "scalar_bar_vertical_x", sbX1);
5463 aResourceMgr->setValue("SMESH", "scalar_bar_vertical_width", sbW);
5466 else if (name == "scalar_bar_vertical_y" || name == "scalar_bar_vertical_height" )
5468 sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_y", sbY1);
5469 sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_height",sbH);
5470 if ( sbY1 + sbH > aTol ) {
5471 aWarning = "Origin and Size Vertical: Y+Height > 1\n";
5472 aResourceMgr->setValue("SMESH", "scalar_bar_vertical_y", sbY1);
5473 aResourceMgr->setValue("SMESH", "scalar_bar_vertical_height",sbH);
5476 else if (name == "scalar_bar_horizontal_x" || name == "scalar_bar_horizontal_width")
5478 sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_x", sbX1);
5479 sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_width", sbW);
5480 if ( sbX1 + sbW > aTol ) {
5481 aWarning = "Origin and Size Horizontal: X+Width > 1\n";
5484 aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_x", sbX1);
5485 aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_width", sbW);
5488 else if (name == "scalar_bar_horizontal_y" || name == "scalar_bar_horizontal_height")
5490 sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_y", sbY1);
5491 sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_height",sbH);
5492 if ( sbY1 + sbH > aTol ) {
5493 aWarning = "Origin and Size Horizontal: Y+Height > 1\n";
5496 aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_y", sbY1);
5497 aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_height",sbH);
5500 else if ( name == "segmentation" )
5502 int nbSeg = aResourceMgr->integerValue( "SMESH", "segmentation", 10 );
5503 myComponentSMESH->SetBoundaryBoxSegmentation( nbSeg );
5505 else if ( name == "nb_segments_per_edge" )
5507 int nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
5508 myComponentSMESH->SetDefaultNbSegments( nbSeg );
5510 else if ( name == "historical_python_dump" || name == "forget_mesh_on_hyp_modif" || name == "default_grp_color" )
5512 QString val = aResourceMgr->stringValue( "SMESH", name );
5513 myComponentSMESH->SetOption( name.toLatin1().constData(), val.toLatin1().constData() );
5515 else if ( name == "numbering_node_color" || name == "numbering_node_font" )
5517 SMESH::UpdateFontProp( this );
5519 else if ( name == "numbering_elem_color" || name == "numbering_elem_font" )
5521 SMESH::UpdateFontProp( this );
5524 if ( aWarning.size() != 0 ) {
5525 aWarning += "The default values are applied instead.";
5526 SUIT_MessageBox::warning(SMESHGUI::desktop(),
5527 QObject::tr("SMESH_ERR_SCALARBAR_PARAMS"),
5528 QObject::tr(aWarning.c_str()));
5533 //================================================================================
5535 * \brief Update something in accordance with update flags
5536 * \param theFlags - update flags
5538 * Update viewer or/and object browser etc. in accordance with update flags ( see
5539 * LightApp_UpdateFlags enumeration ).
5541 //================================================================================
5542 void SMESHGUI::update( const int flags )
5544 if ( (flags & UF_Viewer) | (flags & UF_Forced) )
5545 SMESH::UpdateView();
5547 SalomeApp_Module::update( flags );
5550 //================================================================================
5552 * \brief Set default selection mode
5554 * SLOT called when operation committed. Sets default selection mode
5556 //================================================================================
5557 void SMESHGUI::onOperationCommited( SUIT_Operation* )
5559 SVTK_ViewWindow* vtkWnd =
5560 dynamic_cast<SVTK_ViewWindow*>( application()->desktop()->activeWindow() );
5562 vtkWnd->SetSelectionMode( ActorSelection );
5565 //================================================================================
5567 * \brief Set default selection mode
5569 * SLOT called when operation aborted. Sets default selection mode
5571 //================================================================================
5572 void SMESHGUI::onOperationAborted( SUIT_Operation* )
5574 SVTK_ViewWindow* vtkWnd =
5575 dynamic_cast<SVTK_ViewWindow*>( application()->desktop()->activeWindow() );
5577 vtkWnd->SetSelectionMode( ActorSelection );
5580 //================================================================================
5582 * \brief Creates operation with given identifier
5583 * \param id - identifier of operation to be started
5584 * \return Pointer on created operation or NULL if operation is not created
5586 * Virtual method redefined from the base class creates operation with given id.
5587 * It is called called automatically from startOperation method of base class.
5589 //================================================================================
5590 LightApp_Operation* SMESHGUI::createOperation( const int id ) const
5592 LightApp_Operation* op = 0;
5593 // to do : create operation here
5596 case SMESHOp::OpSplitBiQuadratic:
5597 op = new SMESHGUI_SplitBiQuadOp();
5599 case SMESHOp::OpConvertMeshToQuadratic:
5600 op = new SMESHGUI_ConvToQuadOp();
5602 case SMESHOp::OpCreateBoundaryElements: // create 2D mesh as boundary on 3D
5603 op = new SMESHGUI_Make2DFrom3DOp();
5605 case SMESHOp::OpReorientFaces:
5606 op = new SMESHGUI_ReorientFacesOp();
5608 case SMESHOp::OpCreateMesh:
5609 op = new SMESHGUI_MeshOp( true, true );
5611 case SMESHOp::OpCreateSubMesh:
5612 op = new SMESHGUI_MeshOp( true, false );
5614 case SMESHOp::OpEditMeshOrSubMesh:
5615 case SMESHOp::OpEditMesh:
5616 case SMESHOp::OpEditSubMesh:
5617 op = new SMESHGUI_MeshOp( false );
5619 case SMESHOp::OpCompute:
5620 case SMESHOp::OpComputeSubMesh:
5621 op = new SMESHGUI_ComputeOp();
5623 case SMESHOp::OpPreCompute:
5624 op = new SMESHGUI_PrecomputeOp();
5626 case SMESHOp::OpEvaluate:
5627 op = new SMESHGUI_EvaluateOp();
5629 case SMESHOp::OpMeshOrder:
5630 op = new SMESHGUI_MeshOrderOp();
5632 case SMESHOp::OpCreateGeometryGroup:
5633 op = new SMESHGUI_GroupOnShapeOp();
5635 case SMESHOp::OpFindElementByPoint:
5636 op = new SMESHGUI_FindElemByPointOp();
5638 case SMESHOp::OpMoveNode: // Make mesh pass through point
5639 op = new SMESHGUI_MakeNodeAtPointOp();
5641 case SMESHOp::OpElem0DOnElemNodes: // Create 0D elements on all nodes
5642 op = new SMESHGUI_Add0DElemsOnAllNodesOp();
5649 op = SalomeApp_Module::createOperation( id );
5653 //================================================================================
5655 * \brief Stops current operations and starts a given one
5656 * \param id - The id of the operation to start
5658 //================================================================================
5660 void SMESHGUI::switchToOperation(int id)
5662 activeStudy()->abortAllOperations();
5663 startOperation( id );
5666 LightApp_Displayer* SMESHGUI::displayer()
5669 myDisplayer = new SMESHGUI_Displayer( getApp() );
5673 SALOMEDS::Color SMESHGUI::getUniqueColor( const QList<SALOMEDS::Color>& theReservedColors )
5676 int aTolerance = 64;
5677 int anIterations = 0;
5683 if( anIterations % aPeriod == 0 )
5686 if( aTolerance < 1 )
5690 aHue = (int)( 360.0 * rand() / RAND_MAX );
5693 QList<SALOMEDS::Color>::const_iterator it = theReservedColors.constBegin();
5694 QList<SALOMEDS::Color>::const_iterator itEnd = theReservedColors.constEnd();
5695 for( ; it != itEnd; ++it )
5697 SALOMEDS::Color anAutoColor = *it;
5698 QColor aQColor( (int)( anAutoColor.R * 255.0 ), (int)( anAutoColor.G * 255.0 ), (int)( anAutoColor.B * 255.0 ) );
5701 aQColor.getHsv( &h, &s, &v );
5702 if( abs( h - aHue ) < aTolerance )
5714 aColor.setHsv( aHue, 255, 255 );
5716 SALOMEDS::Color aSColor;
5717 aSColor.R = aColor.redF();
5718 aSColor.G = aColor.greenF();
5719 aSColor.B = aColor.blueF();
5724 const char* gSeparator = "_"; // character used to separate parameter names
5725 const char* gDigitsSep = ":"; // character used to separate numeric parameter values (color = r:g:b)
5726 const char* gPathSep = "|"; // character used to separate paths
5729 * \brief Store visual parameters
5731 * This method is called just before the study document is saved.
5732 * Store visual parameters in AttributeParameter attribue(s)
5734 void SMESHGUI::storeVisualParameters (int savePoint)
5737 Kernel_Utils::Localizer loc;
5739 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
5740 if (!appStudy || !appStudy->studyDS())
5742 _PTR(Study) studyDS = appStudy->studyDS();
5744 // componentName is used for encoding of entries when storing them in IParameters
5745 std::string componentName = myComponentSMESH->ComponentDataType();
5746 //_PTR(SComponent) aSComponent = studyDS->FindComponent("SMESH");
5747 //if (!aSComponent) return;
5750 _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
5751 componentName.c_str(),
5753 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
5755 // store custom markers
5756 if( !myMarkerMap.empty() )
5758 VTK::MarkerMap::const_iterator anIter = myMarkerMap.begin();
5759 for( ; anIter != myMarkerMap.end(); anIter++ )
5761 int anId = anIter->first;
5762 VTK::MarkerData aMarkerData = anIter->second;
5763 std::string aMarkerFileName = aMarkerData.first;
5764 VTK::MarkerTexture aMarkerTexture = aMarkerData.second;
5765 if( aMarkerTexture.size() < 3 )
5766 continue; // should contain at least width, height and the first value
5768 QString aPropertyName( "texture" );
5769 aPropertyName += gSeparator;
5770 aPropertyName += QString::number( anId );
5772 QString aPropertyValue = aMarkerFileName.c_str();
5773 aPropertyValue += gPathSep;
5775 VTK::MarkerTexture::const_iterator aTextureIter = aMarkerTexture.begin();
5776 ushort aWidth = *aTextureIter++;
5777 ushort aHeight = *aTextureIter++;
5778 aPropertyValue += QString::number( aWidth ); aPropertyValue += gDigitsSep;
5779 aPropertyValue += QString::number( aHeight ); aPropertyValue += gDigitsSep;
5780 for( ; aTextureIter != aMarkerTexture.end(); aTextureIter++ )
5781 aPropertyValue += QString::number( *aTextureIter );
5783 ip->setProperty( aPropertyName.toStdString(), aPropertyValue.toStdString() );
5787 // viewers counters are used for storing view_numbers in IParameters
5790 // main cycle to store parameters of displayed objects
5791 QList<SUIT_ViewManager*> lst;
5792 QList<SUIT_ViewManager*>::Iterator it;
5793 getApp()->viewManagers(lst);
5794 for (it = lst.begin(); it != lst.end(); it++)
5796 SUIT_ViewManager* vman = *it;
5797 QString vType = vman->getType();
5799 // saving VTK actors properties
5800 if (vType == SVTK_Viewer::Type())
5802 // store the clipping planes attached to the view manager
5803 SMESHGUI_ClippingPlaneInfoList aClippingPlaneInfoList;
5804 SMESHGUI_ClippingPlaneInfoMap::const_iterator anIter = myClippingPlaneInfoMap.find( vman );
5805 if( anIter != myClippingPlaneInfoMap.end() )
5806 aClippingPlaneInfoList = anIter->second;
5808 if( !aClippingPlaneInfoList.empty() ) {
5809 SMESHGUI_ClippingPlaneInfoList::const_iterator anIter = aClippingPlaneInfoList.begin();
5810 for( int anId = 0; anIter != aClippingPlaneInfoList.end(); anIter++, anId++ )
5812 const SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter;
5813 SMESH::OrientedPlane* aPlane = aClippingPlaneInfo.Plane;
5815 QString aPropertyName( "ClippingPlane" );
5816 aPropertyName += gSeparator;
5817 aPropertyName += QString::number( vtkViewers );
5818 aPropertyName += gSeparator;
5819 aPropertyName += QString::number( anId );
5821 QString aPropertyValue = QString::number( (int)aPlane->PlaneMode ).toLatin1().constData();
5822 aPropertyValue += gDigitsSep;
5823 aPropertyValue += QString::number( aPlane->IsOpenGLClipping ).toLatin1().constData();
5824 aPropertyValue += gDigitsSep;
5825 if ( aPlane->PlaneMode == SMESH::Absolute ) {
5826 aPropertyValue += QString::number( aPlane->myAbsoluteOrientation ).toLatin1().constData();
5827 aPropertyValue += gDigitsSep;
5828 aPropertyValue += QString::number( aPlane->X ).toLatin1().constData();
5829 aPropertyValue += gDigitsSep;
5830 aPropertyValue += QString::number( aPlane->Y ).toLatin1().constData();
5831 aPropertyValue += gDigitsSep;
5832 aPropertyValue += QString::number( aPlane->Z ).toLatin1().constData();
5833 aPropertyValue += gDigitsSep;
5834 aPropertyValue += QString::number( aPlane->Dx ).toLatin1().constData();
5835 aPropertyValue += gDigitsSep;
5836 aPropertyValue += QString::number( aPlane->Dy ).toLatin1().constData();
5837 aPropertyValue += gDigitsSep;
5838 aPropertyValue += QString::number( aPlane->Dz ).toLatin1().constData();
5840 else if ( aPlane->PlaneMode == SMESH::Relative ) {
5841 aPropertyValue += QString::number( (int)aPlane->myRelativeOrientation ).toLatin1().constData();
5842 aPropertyValue += gDigitsSep;
5843 aPropertyValue += QString::number( aPlane->GetDistance() ).toLatin1().constData();
5844 aPropertyValue += gDigitsSep;
5845 aPropertyValue += QString::number( aPlane->myAngle[0] ).toLatin1().constData();
5846 aPropertyValue += gDigitsSep;
5847 aPropertyValue += QString::number( aPlane->myAngle[1] ).toLatin1().constData();
5850 ip->setProperty( aPropertyName.toStdString(), aPropertyValue.toStdString() );
5854 QVector<SUIT_ViewWindow*> views = vman->getViews();
5855 for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++)
5857 if (SVTK_ViewWindow* vtkView = dynamic_cast<SVTK_ViewWindow*>(views[i]))
5859 VTK::ActorCollectionCopy aCopy(vtkView->getRenderer()->GetActors());
5860 vtkActorCollection* allActors = aCopy.GetActors();
5861 allActors->InitTraversal();
5862 while (vtkActor* actor = allActors->GetNextActor())
5864 if (actor->GetVisibility()) // store only visible actors
5866 SMESH_Actor* aSmeshActor = 0;
5867 if (actor->IsA("SMESH_Actor"))
5868 aSmeshActor = SMESH_Actor::SafeDownCast(actor);
5869 if (aSmeshActor && aSmeshActor->hasIO())
5871 Handle(SALOME_InteractiveObject) io = aSmeshActor->getIO();
5874 // entry is "encoded" = it does NOT contain component address,
5875 // since it is a subject to change on next component loading
5876 std::string entry = ip->encodeEntry(io->getEntry(), componentName);
5878 std::string param, vtkParam = vType.toLatin1().data();
5879 vtkParam += gSeparator;
5880 vtkParam += QString::number(vtkViewers).toLatin1().data();
5881 vtkParam += gSeparator;
5884 param = vtkParam + "Visibility";
5885 ip->setParameter(entry, param, "On");
5888 param = vtkParam + "Representation";
5889 ip->setParameter(entry, param, QString::number
5890 ((int)aSmeshActor->GetRepresentation()).toLatin1().data());
5893 param = vtkParam + "IsShrunk";
5894 ip->setParameter(entry, param, QString::number
5895 ((int)aSmeshActor->IsShrunk()).toLatin1().data());
5897 // Displayed entities
5898 unsigned int aMode = aSmeshActor->GetEntityMode();
5899 bool isE = aMode & SMESH_Actor::eEdges;
5900 bool isF = aMode & SMESH_Actor::eFaces;
5901 bool isV = aMode & SMESH_Actor::eVolumes;
5902 bool is0d = aMode & SMESH_Actor::e0DElements;
5903 bool isB = aMode & SMESH_Actor::eBallElem;
5905 QString modeStr ("e");
5906 modeStr += gDigitsSep; modeStr += QString::number(isE);
5907 modeStr += gDigitsSep; modeStr += "f";
5908 modeStr += gDigitsSep; modeStr += QString::number(isF);
5909 modeStr += gDigitsSep; modeStr += "v";
5910 modeStr += gDigitsSep; modeStr += QString::number(isV);
5911 modeStr += gDigitsSep; modeStr += "0d";
5912 modeStr += gDigitsSep; modeStr += QString::number(is0d);
5913 modeStr += gDigitsSep; modeStr += "b";
5914 modeStr += gDigitsSep; modeStr += QString::number(isB);
5916 param = vtkParam + "Entities";
5917 ip->setParameter(entry, param, modeStr.toLatin1().data());
5923 aSmeshActor->GetSufaceColor(r, g, b, delta);
5924 QStringList colorStr;
5925 colorStr << "surface";
5926 colorStr << QString::number(r);
5927 colorStr << QString::number(g);
5928 colorStr << QString::number(b);
5930 colorStr << "backsurface";
5931 colorStr << QString::number(delta);
5933 aSmeshActor->GetVolumeColor(r, g, b, delta);
5934 colorStr << "volume";
5935 colorStr << QString::number(r);
5936 colorStr << QString::number(g);
5937 colorStr << QString::number(b);
5938 colorStr << QString::number(delta);
5940 aSmeshActor->GetEdgeColor(r, g, b);
5942 colorStr << QString::number(r);
5943 colorStr << QString::number(g);
5944 colorStr << QString::number(b);
5946 aSmeshActor->GetNodeColor(r, g, b);
5948 colorStr << QString::number(r);
5949 colorStr << QString::number(g);
5950 colorStr << QString::number(b);
5952 aSmeshActor->GetOutlineColor(r, g, b);
5953 colorStr << "outline";
5954 colorStr << QString::number(r);
5955 colorStr << QString::number(g);
5956 colorStr << QString::number(b);
5958 aSmeshActor->Get0DColor(r, g, b);
5959 colorStr << "elem0d";
5960 colorStr << QString::number(r);
5961 colorStr << QString::number(g);
5962 colorStr << QString::number(b);
5964 aSmeshActor->GetBallColor(r, g, b);
5966 colorStr << QString::number(r);
5967 colorStr << QString::number(g);
5968 colorStr << QString::number(b);
5970 aSmeshActor->GetFacesOrientationColor(r, g, b);
5971 colorStr << "orientation";
5972 colorStr << QString::number(r);
5973 colorStr << QString::number(g);
5974 colorStr << QString::number(b);
5976 param = vtkParam + "Colors";
5977 ip->setParameter(entry, param, qPrintable(colorStr.join(gDigitsSep)));
5980 QStringList sizeStr;
5982 sizeStr << QString::number((int)aSmeshActor->GetLineWidth());
5983 sizeStr << "outline";
5984 sizeStr << QString::number((int)aSmeshActor->GetOutlineWidth());
5985 sizeStr << "elem0d";
5986 sizeStr << QString::number((int)aSmeshActor->Get0DSize());
5988 //sizeStr << QString::number((int)aSmeshActor->GetBallSize());
5989 sizeStr << QString::number((double)aSmeshActor->GetBallSize());
5990 sizeStr << QString::number((double)aSmeshActor->GetBallScale());
5991 sizeStr << "shrink";
5992 sizeStr << QString::number(aSmeshActor->GetShrinkFactor());
5993 sizeStr << "orientation";
5994 sizeStr << QString::number(aSmeshActor->GetFacesOrientationScale());
5995 sizeStr << QString::number(aSmeshActor->GetFacesOrientation3DVectors());
5997 param = vtkParam + "Sizes";
5998 ip->setParameter(entry, param, qPrintable(sizeStr.join(gDigitsSep)));
6003 VTK::MarkerType aMarkerType = aSmeshActor->GetMarkerType();
6004 if( aMarkerType == VTK::MT_USER ) {
6005 markerStr += "custom";
6006 markerStr += gDigitsSep;
6007 markerStr += QString::number( aSmeshActor->GetMarkerTexture() );
6011 markerStr += gDigitsSep;
6012 markerStr += QString::number( (int)aMarkerType );
6013 markerStr += gDigitsSep;
6014 markerStr += QString::number( (int)aSmeshActor->GetMarkerScale() );
6017 param = vtkParam + "PointMarker";
6018 ip->setParameter(entry, param, markerStr.toLatin1().data());
6021 param = vtkParam + "Opacity";
6022 ip->setParameter(entry, param,
6023 QString::number(aSmeshActor->GetOpacity()).toLatin1().data());
6026 param = vtkParam + "ClippingPlane";
6028 if( !aClippingPlaneInfoList.empty() ) {
6029 SMESHGUI_ClippingPlaneInfoList::const_iterator anIter1 = aClippingPlaneInfoList.begin();
6030 for( int anId = 0; anIter1 != aClippingPlaneInfoList.end(); anIter1++, anId++ )
6032 const SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter1;
6033 std::list<vtkActor*> anActorList = aClippingPlaneInfo.ActorList;
6034 SMESH::TActorList::iterator anIter2 = anActorList.begin();
6035 for ( ; anIter2 != anActorList.end(); anIter2++ ) {
6036 if( aSmeshActor == *anIter2 ) {
6037 ip->setParameter( entry, param + QString::number( ++aPlaneId ).toLatin1().constData(),
6038 QString::number( anId ).toLatin1().constData() );
6045 ip->setParameter( entry, param, "Off" );
6046 } // if (io->hasEntry())
6047 } // SMESH_Actor && hasIO
6049 } // while.. actors traversal
6053 } // if (SVTK view model)
6054 } // for (viewManagers)
6057 // data structures for clipping planes processing
6061 bool isOpenGLClipping;
6062 vtkIdType RelativeOrientation;
6065 int AbsoluteOrientation;
6066 double X, Y, Z, Dx, Dy, Dz;
6068 typedef std::list<TPlaneData> TPlaneDataList;
6069 typedef std::map<int, TPlaneDataList> TPlaneDataMap;
6071 typedef std::list<vtkActor*> TActorList;
6074 TActorList ActorList;
6075 SUIT_ViewManager* ViewManager;
6077 typedef std::list<TPlaneInfo> TPlaneInfoList;
6078 typedef std::map<int, TPlaneInfoList> TPlaneInfoMap;
6081 * \brief Restore visual parameters
6083 * This method is called after the study document is opened.
6084 * Restore visual parameters from AttributeParameter attribue(s)
6086 void SMESHGUI::restoreVisualParameters (int savePoint)
6089 Kernel_Utils::Localizer loc;
6091 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
6092 if (!appStudy || !appStudy->studyDS())
6094 _PTR(Study) studyDS = appStudy->studyDS();
6096 // componentName is used for encoding of entries when storing them in IParameters
6097 std::string componentName = myComponentSMESH->ComponentDataType();
6098 //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
6099 //if (!aSComponent) return;
6102 _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
6103 componentName.c_str(),
6105 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
6107 // restore custom markers and map of clipping planes
6108 TPlaneDataMap aPlaneDataMap;
6110 std::vector<std::string> properties = ip->getProperties();
6111 for (std::vector<std::string>::iterator propIt = properties.begin(); propIt != properties.end(); ++propIt)
6113 std::string property = *propIt;
6114 QString aPropertyName( property.c_str() );
6115 QString aPropertyValue( ip->getProperty( property ).c_str() );
6117 QStringList aPropertyNameList = aPropertyName.split( gSeparator, QString::SkipEmptyParts );
6118 if( aPropertyNameList.isEmpty() )
6121 QString aPropertyType = aPropertyNameList[0];
6122 if( aPropertyType == "texture" )
6124 if( aPropertyNameList.size() != 2 )
6128 int anId = aPropertyNameList[1].toInt( &ok );
6129 if( !ok || anId < 1 )
6132 QStringList aPropertyValueList = aPropertyValue.split( gPathSep, QString::SkipEmptyParts );
6133 if( aPropertyValueList.size() != 2 )
6136 std::string aMarkerFileName = aPropertyValueList[0].toStdString();
6137 QString aMarkerTextureString = aPropertyValueList[1];
6138 QStringList aMarkerTextureStringList = aMarkerTextureString.split( gDigitsSep, QString::SkipEmptyParts );
6139 if( aMarkerTextureStringList.size() != 3 )
6143 ushort aWidth = aMarkerTextureStringList[0].toUShort( &ok );
6148 ushort aHeight = aMarkerTextureStringList[1].toUShort( &ok );
6152 VTK::MarkerTexture aMarkerTexture;
6153 aMarkerTexture.push_back( aWidth );
6154 aMarkerTexture.push_back( aHeight );
6156 QString aMarkerTextureData = aMarkerTextureStringList[2];
6157 for( int i = 0, n = aMarkerTextureData.length(); i < n; i++ )
6159 QChar aChar = aMarkerTextureData.at( i );
6160 if( aChar.isDigit() )
6161 aMarkerTexture.push_back( aChar.digitValue() );
6164 myMarkerMap[ anId ] = VTK::MarkerData( aMarkerFileName, aMarkerTexture );
6166 else if( aPropertyType == "ClippingPlane" )
6168 if( aPropertyNameList.size() != 3 )
6172 int aViewId = aPropertyNameList[1].toInt( &ok );
6173 if( !ok || aViewId < 0 )
6177 int aClippingPlaneId = aPropertyNameList[2].toInt( &ok );
6178 if( !ok || aClippingPlaneId < 0 )
6181 QStringList aPropertyValueList = aPropertyValue.split( gDigitsSep, QString::SkipEmptyParts );
6182 if( aPropertyValueList.size() != 6 && aPropertyValueList.size() != 9 )
6185 TPlaneData aPlaneData;
6186 aPlaneData.AbsoluteOrientation = false;
6187 aPlaneData.RelativeOrientation = 0;
6188 aPlaneData.Distance = aPlaneData.Angle[0] = aPlaneData.Angle[1] = 0;
6189 aPlaneData.X = aPlaneData.Y = aPlaneData.Z = 0;
6190 aPlaneData.Dx = aPlaneData.Dy = aPlaneData.Dz = 0;
6192 aPlaneData.Id = aClippingPlaneId;
6195 aPlaneData.Mode = aPropertyValueList[0].toInt( &ok );
6200 aPlaneData.isOpenGLClipping = aPropertyValueList[1].toInt( &ok );
6204 if ( (SMESH::Mode)aPlaneData.Mode == SMESH::Absolute )
6207 aPlaneData.AbsoluteOrientation = aPropertyValueList[2].toInt( &ok );
6212 aPlaneData.X = aPropertyValueList[3].toDouble( &ok );
6217 aPlaneData.Y = aPropertyValueList[4].toDouble( &ok );
6222 aPlaneData.Z = aPropertyValueList[5].toDouble( &ok );
6227 aPlaneData.Dx = aPropertyValueList[6].toDouble( &ok );
6232 aPlaneData.Dy = aPropertyValueList[7].toDouble( &ok );
6237 aPlaneData.Dz = aPropertyValueList[8].toDouble( &ok );
6241 else if ( (SMESH::Mode)aPlaneData.Mode == SMESH::Relative ) {
6243 aPlaneData.RelativeOrientation = aPropertyValueList[2].toInt( &ok );
6248 aPlaneData.Distance = aPropertyValueList[3].toDouble( &ok );
6253 aPlaneData.Angle[0] = aPropertyValueList[4].toDouble( &ok );
6258 aPlaneData.Angle[1] = aPropertyValueList[5].toDouble( &ok );
6263 TPlaneDataList& aPlaneDataList = aPlaneDataMap[ aViewId ];
6264 aPlaneDataList.push_back( aPlaneData );
6268 TPlaneInfoMap aPlaneInfoMap;
6270 std::vector<std::string> entries = ip->getEntries();
6272 for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
6274 // entry is a normal entry - it should be "decoded" (setting base address of component)
6275 QString entry (ip->decodeEntry(*entIt).c_str());
6277 // Check that the entry corresponds to a real object in the Study
6278 // as the object may be deleted or modified after the visual state is saved.
6279 _PTR(SObject) so = studyDS->FindObjectID(entry.toUtf8().data());
6280 if (!so) continue; //Skip the not existent entry
6282 std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
6283 std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
6285 std::vector<std::string>::iterator namesIt = paramNames.begin();
6286 std::vector<std::string>::iterator valuesIt = paramValues.begin();
6288 // actors are stored in a map after displaying of them for
6289 // quicker access in the future: map < viewID to actor >
6290 NCollection_DataMap<int, SMESH_Actor*> vtkActors;
6292 for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
6294 // visual parameters are stored in strings as follows: ViewerType_ViewIndex_ParamName.
6295 // '_' is used as separator and should not be used in viewer type or parameter names.
6296 QStringList lst = QString((*namesIt).c_str()).split(gSeparator, QString::SkipEmptyParts);
6297 if (lst.size() != 3)
6300 QString viewerTypStr = lst[0];
6301 QString viewIndexStr = lst[1];
6302 QString paramNameStr = lst[2];
6305 int viewIndex = viewIndexStr.toUInt(&ok);
6306 if (!ok) // bad conversion of view index to integer
6310 if (viewerTypStr == SVTK_Viewer::Type())
6312 SMESH_Actor* aSmeshActor = 0;
6313 if (vtkActors.IsBound(viewIndex))
6314 aSmeshActor = vtkActors.Find(viewIndex);
6316 QList<SUIT_ViewManager*> lst;
6317 getApp()->viewManagers(viewerTypStr, lst);
6319 // SVTK ViewManager always has 1 ViewWindow, so view index is index of view manager
6320 SUIT_ViewManager* vman = NULL;
6321 if (viewIndex >= 0 && viewIndex < lst.count())
6322 vman = lst.at(viewIndex);
6324 if (paramNameStr == "Visibility")
6326 if (!aSmeshActor && displayer() && vman)
6328 SUIT_ViewModel* vmodel = vman->getViewModel();
6329 // SVTK view model can be casted to SALOME_View
6330 displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
6332 // store displayed actor in a temporary map for quicker
6333 // access later when restoring other parameters
6334 SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) vman->getActiveView();
6335 vtkRenderer* Renderer = vtkView->getRenderer();
6336 VTK::ActorCollectionCopy aCopy(Renderer->GetActors());
6337 vtkActorCollection* theActors = aCopy.GetActors();
6338 theActors->InitTraversal();
6339 bool isFound = false;
6340 vtkActor *ac = theActors->GetNextActor();
6341 for (; ac != NULL && !isFound; ac = theActors->GetNextActor()) {
6342 if (ac->IsA("SMESH_Actor")) {
6343 SMESH_Actor* aGeomAc = SMESH_Actor::SafeDownCast(ac);
6344 if (aGeomAc->hasIO()) {
6345 Handle(SALOME_InteractiveObject) io = aGeomAc->getIO();
6346 if (io->hasEntry() && strcmp(io->getEntry(), entry.toUtf8().data()) == 0) {
6348 vtkActors.Bind(viewIndex, aGeomAc);
6354 } // if (paramNameStr == "Visibility")
6357 // the rest properties "work" with SMESH_Actor
6360 QString val ((*valuesIt).c_str());
6363 if (paramNameStr == "Representation") {
6364 aSmeshActor->SetRepresentation((SMESH_Actor::EReperesent)val.toInt());
6367 else if (paramNameStr == "IsShrunk") {
6369 if (!aSmeshActor->IsShrunk())
6370 aSmeshActor->SetShrink();
6373 if (aSmeshActor->IsShrunk())
6374 aSmeshActor->UnShrink();
6377 // Displayed entities
6378 else if (paramNameStr == "Entities") {
6379 QStringList mode = val.split(gDigitsSep, QString::SkipEmptyParts);
6380 int aEntityMode = SMESH_Actor::eAllEntity;
6381 for ( int i = 0; i < mode.count(); i+=2 ) {
6382 if ( i < mode.count()-1 ) {
6383 QString type = mode[i];
6384 bool val = mode[i+1].toInt();
6385 if ( type == "e" && !val )
6386 aEntityMode = aEntityMode & ~SMESH_Actor::eEdges;
6387 else if ( type == "f" && !val )
6388 aEntityMode = aEntityMode & ~SMESH_Actor::eFaces;
6389 else if ( type == "v" && !val )
6390 aEntityMode = aEntityMode & ~SMESH_Actor::eVolumes;
6391 else if ( type == "0d" && !val )
6392 aEntityMode = aEntityMode & ~SMESH_Actor::e0DElements;
6393 else if ( type == "b" && !val )
6394 aEntityMode = aEntityMode & ~SMESH_Actor::eBallElem;
6397 aSmeshActor->SetEntityMode( aEntityMode );
6400 else if (paramNameStr == "Colors") {
6401 QStringList colors = val.split(gDigitsSep, QString::SkipEmptyParts);
6408 QColor outlineColor;
6409 QColor orientationColor;
6415 // below lines are required to get default values for delta coefficients
6416 // of backface color for faces and color of reversed volumes
6417 SMESH::GetColor( "SMESH", "fill_color", c, deltaF, "0,170,255|-100" );
6418 SMESH::GetColor( "SMESH", "volume_color", c, deltaV, "255,0,170|-100" );
6419 for ( int i = 0; i < colors.count(); i++ ) {
6420 QString type = colors[i];
6421 if ( type == "surface" ) {
6422 // face color is set by 3 values r:g:b, where
6423 // - r,g,b - is rgb color components
6424 if ( i+1 >= colors.count() ) break; // format error
6425 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6426 if ( i+2 >= colors.count() ) break; // format error
6427 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6428 if ( i+3 >= colors.count() ) break; // format error
6429 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6430 faceColor.setRgbF( r, g, b );
6433 else if ( type == "backsurface" ) {
6434 // backface color can be defined in several ways
6435 // - in old versions, it is set as rgb triple r:g:b - this was is unsupported now
6436 // - in latest versions, it is set as delta coefficient
6437 bool rgbOk = false, deltaOk;
6438 if ( i+1 >= colors.count() ) break; // format error
6439 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6440 int delta = colors[i+1].toInt( &deltaOk );
6442 if ( i+1 < colors.count() ) // index is shifted to 1
6443 g = colors[i+1].toDouble( &rgbOk );
6444 if ( rgbOk ) i++; // shift index
6445 if ( rgbOk && i+1 < colors.count() ) // index is shifted to 2
6446 b = colors[i+1].toDouble( &rgbOk );
6448 // - as currently there's no way to set directly backsurface color as it was before,
6449 // we ignore old dump where r,g,b triple was set
6450 // - also we check that delta parameter is set properly
6451 if ( !rgbOk && deltaOk )
6454 else if ( type == "volume" ) {
6455 // volume color is set by 4 values r:g:b:delta, where
6456 // - r,g,b - is a normal volume rgb color components
6457 // - delta - is a reversed volume color delta coefficient
6458 if ( i+1 >= colors.count() ) break; // format error
6459 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6460 if ( i+2 >= colors.count() ) break; // format error
6461 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6462 if ( i+3 >= colors.count() ) break; // format error
6463 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6464 if ( i+4 >= colors.count() ) break; // format error
6465 int delta = colors[i+4].toInt( &bOk );
6466 if ( !bOk ) break; // format error
6467 volumeColor.setRgbF( r, g, b );
6471 else if ( type == "edge" ) {
6472 // edge color is set by 3 values r:g:b, where
6473 // - r,g,b - is rgb color components
6474 if ( i+1 >= colors.count() ) break; // format error
6475 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6476 if ( i+2 >= colors.count() ) break; // format error
6477 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6478 if ( i+3 >= colors.count() ) break; // format error
6479 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6480 edgeColor.setRgbF( r, g, b );
6483 else if ( type == "node" ) {
6484 // node color is set by 3 values r:g:b, where
6485 // - r,g,b - is rgb color components
6486 if ( i+1 >= colors.count() ) break; // format error
6487 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6488 if ( i+2 >= colors.count() ) break; // format error
6489 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6490 if ( i+3 >= colors.count() ) break; // format error
6491 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6492 nodeColor.setRgbF( r, g, b );
6495 else if ( type == "elem0d" ) {
6496 // 0d element color is set by 3 values r:g:b, where
6497 // - r,g,b - is rgb color components
6498 if ( i+1 >= colors.count() ) break; // format error
6499 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6500 if ( i+2 >= colors.count() ) break; // format error
6501 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6502 if ( i+3 >= colors.count() ) break; // format error
6503 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6504 elem0dColor.setRgbF( r, g, b );
6507 else if ( type == "ball" ) {
6508 // ball color is set by 3 values r:g:b, where
6509 // - r,g,b - is rgb color components
6510 if ( i+1 >= colors.count() ) break; // format error
6511 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6512 if ( i+2 >= colors.count() ) break; // format error
6513 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6514 if ( i+3 >= colors.count() ) break; // format error
6515 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6516 ballColor.setRgbF( r, g, b );
6519 else if ( type == "outline" ) {
6520 // outline color is set by 3 values r:g:b, where
6521 // - r,g,b - is rgb color components
6522 if ( i+1 >= colors.count() ) break; // format error
6523 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6524 if ( i+2 >= colors.count() ) break; // format error
6525 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6526 if ( i+3 >= colors.count() ) break; // format error
6527 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6528 outlineColor.setRgbF( r, g, b );
6531 else if ( type == "orientation" ) {
6532 // orientation color is set by 3 values r:g:b, where
6533 // - r,g,b - is rgb color components
6534 if ( i+1 >= colors.count() ) break; // format error
6535 r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6536 if ( i+2 >= colors.count() ) break; // format error
6537 g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6538 if ( i+3 >= colors.count() ) break; // format error
6539 b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
6540 orientationColor.setRgbF( r, g, b );
6545 if ( nodeColor.isValid() )
6546 aSmeshActor->SetNodeColor( nodeColor.redF(), nodeColor.greenF(), nodeColor.blueF() );
6548 if ( edgeColor.isValid() )
6549 aSmeshActor->SetEdgeColor( edgeColor.redF(), edgeColor.greenF(), edgeColor.blueF() );
6551 if ( faceColor.isValid() )
6552 aSmeshActor->SetSufaceColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF );
6554 if ( volumeColor.isValid() )
6555 aSmeshActor->SetVolumeColor( volumeColor.redF(), volumeColor.greenF(), volumeColor.blueF(), deltaV );
6556 else if ( faceColor.isValid() ) // backward compatibility (no separate color for volumes)
6557 aSmeshActor->SetVolumeColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF );
6559 if ( elem0dColor.isValid() )
6560 aSmeshActor->Set0DColor( elem0dColor.redF(), elem0dColor.greenF(), elem0dColor.blueF() );
6562 if ( ballColor.isValid() )
6563 aSmeshActor->SetBallColor( ballColor.redF(), ballColor.greenF(), ballColor.blueF() );
6565 if ( outlineColor.isValid() )
6566 aSmeshActor->SetOutlineColor( outlineColor.redF(), outlineColor.greenF(), outlineColor.blueF() );
6567 // orientation color
6568 if ( orientationColor.isValid() )
6569 aSmeshActor->SetFacesOrientationColor( orientationColor.redF(), orientationColor.greenF(), orientationColor.blueF() );
6572 else if (paramNameStr == "Sizes") {
6573 QStringList sizes = val.split(gDigitsSep, QString::SkipEmptyParts);
6576 int outlineWidth = -1;
6577 int elem0dSize = -1;
6578 //int ballSize = -1;
6579 double ballDiameter = -1.0;
6580 double ballScale = -1.0;
6581 double shrinkSize = -1;
6582 double orientationSize = -1;
6583 bool orientation3d = false;
6584 for ( int i = 0; i < sizes.count(); i++ ) {
6585 QString type = sizes[i];
6586 if ( type == "line" ) {
6587 // line (wireframe) width is given as single integer value
6588 if ( i+1 >= sizes.count() ) break; // format error
6589 int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
6593 if ( type == "outline" ) {
6594 // outline width is given as single integer value
6595 if ( i+1 >= sizes.count() ) break; // format error
6596 int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
6600 else if ( type == "elem0d" ) {
6601 // 0d element size is given as single integer value
6602 if ( i+1 >= sizes.count() ) break; // format error
6603 int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
6607 else if ( type == "ball" ) {
6608 // balls are specified by two values: size:scale, where
6609 // - size - is a integer value specifying size
6610 // - scale - is a double value specifying scale factor
6611 if ( i+1 >= sizes.count() ) break; // format error
6612 //int v1 = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
6613 double v1 = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
6614 if ( i+2 >= sizes.count() ) break; // format error
6615 double v2 = sizes[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
6621 else if ( type == "shrink" ) {
6622 // shrink factor is given as single floating point value
6623 if ( i+1 >= sizes.count() ) break; // format error
6624 double v = sizes[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6628 else if ( type == "orientation" ) {
6629 // orientation vectors are specified by two values size:3d, where
6630 // - size - is a floating point value specifying scale factor
6631 // - 3d - is a boolean
6632 if ( i+1 >= sizes.count() ) break; // format error
6633 double v1 = sizes[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
6634 if ( i+2 >= sizes.count() ) break; // format error
6635 int v2 = sizes[i+2].toInt( &bOk ); if ( !bOk ) break; // format error
6636 orientationSize = v1;
6637 orientation3d = (bool)v2;
6641 // line (wireframe) width
6642 if ( lineWidth > 0 )
6643 aSmeshActor->SetLineWidth( lineWidth );
6645 if ( outlineWidth > 0 )
6646 aSmeshActor->SetOutlineWidth( outlineWidth );
6647 else if ( lineWidth > 0 ) // backward compatibility (no separate width for outlines)
6648 aSmeshActor->SetOutlineWidth( lineWidth );
6650 if ( elem0dSize > 0 )
6651 aSmeshActor->Set0DSize( elem0dSize );
6653 /*if ( ballSize > 0 )
6654 aSmeshActor->SetBallSize( ballSize );*/
6656 if ( ballDiameter > 0 )
6657 aSmeshActor->SetBallSize( ballDiameter );
6659 if ( ballScale > 0.0 )
6660 aSmeshActor->SetBallScale( ballScale );
6662 if ( shrinkSize > 0 )
6663 aSmeshActor->SetShrinkFactor( shrinkSize );
6664 // orientation vectors
6665 if ( orientationSize > 0 ) {
6666 aSmeshActor->SetFacesOrientationScale( orientationSize );
6667 aSmeshActor->SetFacesOrientation3DVectors( orientation3d );
6671 else if (paramNameStr == "PointMarker") {
6672 QStringList data = val.split(gDigitsSep, QString::SkipEmptyParts);
6673 if( data.count() >= 2 ) {
6675 int aParam1 = data[1].toInt( &ok );
6677 if( data[0] == "std" && data.count() == 3 ) {
6678 int aParam2 = data[2].toInt( &ok );
6679 aSmeshActor->SetMarkerStd( (VTK::MarkerType)aParam1, (VTK::MarkerScale)aParam2 );
6681 else if( data[0] == "custom" ) {
6682 VTK::MarkerMap::const_iterator markerIt = myMarkerMap.find( aParam1 );
6683 if( markerIt != myMarkerMap.end() ) {
6684 VTK::MarkerData aMarkerData = markerIt->second;
6685 aSmeshActor->SetMarkerTexture( aParam1, aMarkerData.second );
6692 else if (paramNameStr == "Opacity") {
6693 aSmeshActor->SetOpacity(val.toFloat());
6696 else if (paramNameStr.startsWith("ClippingPlane")) {
6697 QStringList vals = val.split(gDigitsSep, QString::SkipEmptyParts);
6698 // old format - val looks like "Off" or "1:0:0:0.5:0:0"
6699 // (mode(relative), is OpenGL clipping plane, orientation, distance, two angles)
6700 // or "0:1:1:10.5:1.0:1.0:15.0:10.0:10.0"
6701 // (mode(absolute), is OpenGL clipping plane, orientation, base point(x, y, z), direction (dx, dy, dz))
6702 // new format - val looks like "Off" or "0" (plane id)
6703 // (note: in new format "Off" value is used only for consistency,
6704 // so it is processed together with values in old format)
6705 bool anIsOldFormat = ( vals.count() == 6 || vals.count() == 9 || val == "Off" );
6706 if( anIsOldFormat ) {
6707 if (paramNameStr == "ClippingPlane1" || val == "Off")
6708 aSmeshActor->RemoveAllClippingPlanes();
6710 QList<SUIT_ViewManager*> lst;
6711 getApp()->viewManagers(viewerTypStr, lst);
6712 // SVTK ViewManager always has 1 ViewWindow, so view index is index of view manager
6713 if (viewIndex >= 0 && viewIndex < lst.count()) {
6714 SUIT_ViewManager* vman = lst.at(viewIndex);
6715 SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) vman->getActiveView();
6717 SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = myClippingPlaneInfoMap[ vman ];
6719 SMESH::TActorList anActorList;
6720 anActorList.push_back( aSmeshActor );
6721 SMESH::OrientedPlane* aPlane = SMESH::OrientedPlane::New( vtkView );
6722 aPlane->myViewWindow = vtkView;
6723 SMESH::Mode aMode = ( SMESH::Mode )vals[0].toInt();
6724 aPlane->PlaneMode = aMode;
6725 bool isOpenGLClipping = ( bool )vals[1].toInt();
6726 aPlane->IsOpenGLClipping = isOpenGLClipping;
6727 if ( aMode == SMESH::Absolute ) {
6728 aPlane->myAbsoluteOrientation = vals[2].toInt();
6729 aPlane->X = vals[3].toFloat();
6730 aPlane->Y = vals[4].toFloat();
6731 aPlane->Z = vals[5].toFloat();
6732 aPlane->Dx = vals[6].toFloat();
6733 aPlane->Dy = vals[7].toFloat();
6734 aPlane->Dz = vals[8].toFloat();
6736 else if ( aMode == SMESH::Relative ) {
6737 aPlane->myRelativeOrientation = (SMESH::Orientation)vals[2].toInt();
6738 aPlane->myDistance = vals[3].toFloat();
6739 aPlane->myAngle[0] = vals[4].toFloat();
6740 aPlane->myAngle[1] = vals[5].toFloat();
6744 if ( SMESHGUI_ClippingDlg::AddPlane( anActorList, aPlane ) ) {
6745 SMESH::ClippingPlaneInfo aClippingPlaneInfo;
6746 aClippingPlaneInfo.Plane = aPlane;
6747 aClippingPlaneInfo.ActorList = anActorList;
6748 aClippingPlaneInfoList.push_back( aClippingPlaneInfo );
6756 int aPlaneId = val.toInt( &ok );
6757 if( ok && aPlaneId >= 0 ) {
6758 bool anIsDefinedPlane = false;
6759 TPlaneInfoList& aPlaneInfoList = aPlaneInfoMap[ viewIndex ];
6760 TPlaneInfoList::iterator anIter = aPlaneInfoList.begin();
6761 for( ; anIter != aPlaneInfoList.end(); anIter++ ) {
6762 TPlaneInfo& aPlaneInfo = *anIter;
6763 if( aPlaneInfo.PlaneId == aPlaneId ) {
6764 aPlaneInfo.ActorList.push_back( aSmeshActor );
6765 anIsDefinedPlane = true;
6769 if( !anIsDefinedPlane ) {
6770 TPlaneInfo aPlaneInfo;
6771 aPlaneInfo.PlaneId = aPlaneId;
6772 aPlaneInfo.ActorList.push_back( aSmeshActor );
6773 aPlaneInfo.ViewManager = vman;
6775 // to make the list sorted by plane id
6776 anIter = aPlaneInfoList.begin();
6777 for( ; anIter != aPlaneInfoList.end(); anIter++ ) {
6778 const TPlaneInfo& aPlaneInfoRef = *anIter;
6779 if( aPlaneInfoRef.PlaneId > aPlaneId )
6782 aPlaneInfoList.insert( anIter, aPlaneInfo );
6787 } // if (aSmeshActor)
6788 } // other parameters than Visibility
6790 } // for names/parameters iterator
6791 } // for entries iterator
6793 // take into account planes with empty list of actors referred to them
6794 QList<SUIT_ViewManager*> aVMList;
6795 getApp()->viewManagers(SVTK_Viewer::Type(), aVMList);
6797 TPlaneDataMap::const_iterator aPlaneDataIter = aPlaneDataMap.begin();
6798 for( ; aPlaneDataIter != aPlaneDataMap.end(); aPlaneDataIter++ ) {
6799 int aViewId = aPlaneDataIter->first;
6800 if( aViewId >= 0 && aViewId < aVMList.count() ) {
6801 SUIT_ViewManager* aViewManager = aVMList.at( aViewId );
6803 const TPlaneDataList& aPlaneDataList = aPlaneDataIter->second;
6805 TPlaneInfoList& aPlaneInfoList = aPlaneInfoMap[ aViewId ];
6806 TPlaneDataList::const_iterator anIter2 = aPlaneDataList.begin();
6807 for( ; anIter2 != aPlaneDataList.end(); anIter2++ ) {
6808 const TPlaneData& aPlaneData = *anIter2;
6809 int aPlaneId = aPlaneData.Id;
6811 bool anIsFound = false;
6812 TPlaneInfoList::const_iterator anIter3 = aPlaneInfoList.begin();
6813 for( ; anIter3 != aPlaneInfoList.end(); anIter3++ ) {
6814 const TPlaneInfo& aPlaneInfo = *anIter3;
6815 if( aPlaneInfo.PlaneId == aPlaneId ) {
6822 TPlaneInfo aPlaneInfo; // ActorList field is empty
6823 aPlaneInfo.PlaneId = aPlaneId;
6824 aPlaneInfo.ViewManager = aViewManager;
6826 // to make the list sorted by plane id
6827 TPlaneInfoList::iterator anIter4 = aPlaneInfoList.begin();
6828 for( ; anIter4 != aPlaneInfoList.end(); anIter4++ ) {
6829 const TPlaneInfo& aPlaneInfoRef = *anIter4;
6830 if( aPlaneInfoRef.PlaneId > aPlaneId )
6833 aPlaneInfoList.insert( anIter4, aPlaneInfo );
6839 // add clipping planes to actors according to the restored parameters
6840 // and update the clipping plane map
6841 TPlaneInfoMap::const_iterator anIter1 = aPlaneInfoMap.begin();
6842 for( ; anIter1 != aPlaneInfoMap.end(); anIter1++ ) {
6843 int aViewId = anIter1->first;
6844 const TPlaneInfoList& aPlaneInfoList = anIter1->second;
6846 TPlaneDataMap::const_iterator anIter2 = aPlaneDataMap.find( aViewId );
6847 if( anIter2 == aPlaneDataMap.end() )
6849 const TPlaneDataList& aPlaneDataList = anIter2->second;
6851 TPlaneInfoList::const_iterator anIter3 = aPlaneInfoList.begin();
6852 for( ; anIter3 != aPlaneInfoList.end(); anIter3++ ) {
6853 const TPlaneInfo& aPlaneInfo = *anIter3;
6854 int aPlaneId = aPlaneInfo.PlaneId;
6855 const TActorList& anActorList = aPlaneInfo.ActorList;
6856 SUIT_ViewManager* aViewManager = aPlaneInfo.ViewManager;
6860 SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>( aViewManager->getActiveView() );
6864 SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = myClippingPlaneInfoMap[ aViewManager ];
6866 TPlaneDataList::const_iterator anIter4 = aPlaneDataList.begin();
6867 for( ; anIter4 != aPlaneDataList.end(); anIter4++ ) {
6868 const TPlaneData& aPlaneData = *anIter4;
6869 if( aPlaneData.Id == aPlaneId ) {
6870 SMESH::OrientedPlane* aPlane = SMESH::OrientedPlane::New( aViewWindow );
6871 aPlane->myViewWindow = aViewWindow;
6872 aPlane->PlaneMode = (SMESH::Mode)aPlaneData.Mode;
6873 aPlane->IsOpenGLClipping = aPlaneData.isOpenGLClipping;
6874 if ( aPlane->PlaneMode == SMESH::Absolute ) {
6875 aPlane->myAbsoluteOrientation = aPlaneData.AbsoluteOrientation;
6876 aPlane->X = aPlaneData.X;
6877 aPlane->Y = aPlaneData.Y;
6878 aPlane->Z = aPlaneData.Z;
6879 aPlane->Dx = aPlaneData.Dx;
6880 aPlane->Dy = aPlaneData.Dy;
6881 aPlane->Dz = aPlaneData.Dz;
6883 else if ( aPlane->PlaneMode == SMESH::Relative ) {
6884 aPlane->myRelativeOrientation = (SMESH::Orientation)aPlaneData.RelativeOrientation;
6885 aPlane->myDistance = aPlaneData.Distance;
6886 aPlane->myAngle[0] = aPlaneData.Angle[0];
6887 aPlane->myAngle[1] = aPlaneData.Angle[1];
6890 if ( SMESHGUI_ClippingDlg::AddPlane( anActorList, aPlane ) ) {
6891 SMESH::ClippingPlaneInfo aClippingPlaneInfo;
6892 aClippingPlaneInfo.Plane = aPlane;
6893 aClippingPlaneInfo.ActorList = anActorList;
6894 aClippingPlaneInfoList.push_back( aClippingPlaneInfo );
6905 // update all VTK views
6906 QList<SUIT_ViewManager*> lst;
6907 getApp()->viewManagers(lst);
6908 for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
6909 SUIT_ViewModel* vmodel = (*it)->getViewModel();
6910 if (vmodel && vmodel->getType() == SVTK_Viewer::Type()) {
6911 SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
6912 // set OpenGL clipping planes
6913 VTK::ActorCollectionCopy aCopy( vtkView->getRenderer()->GetActors() );
6914 vtkActorCollection* anAllActors = aCopy.GetActors();
6915 anAllActors->InitTraversal();
6916 while( vtkActor* aVTKActor = anAllActors->GetNextActor() )
6917 if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) )
6918 anActor->SetOpenGLClippingPlane();
6920 vtkView->getRenderer()->ResetCameraClippingRange();
6927 \brief Adds preferences for dfont of VTK viewer
6929 \param pIf group identifier
6930 \param param parameter
6931 \return identifier of preferences
6933 int SMESHGUI::addVtkFontPref( const QString& label, const int pId, const QString& param, const bool needSize )
6935 int tfont = addPreference( label, pId, LightApp_Preferences::Font, "SMESH", param );
6937 setPreferenceProperty( tfont, "mode", QtxFontEdit::Custom );
6940 fam.append( tr( "SMESH_FONT_ARIAL" ) );
6941 fam.append( tr( "SMESH_FONT_COURIER" ) );
6942 fam.append( tr( "SMESH_FONT_TIMES" ) );
6944 setPreferenceProperty( tfont, "fonts", fam );
6946 int f = QtxFontEdit::Family | QtxFontEdit::Bold | QtxFontEdit::Italic | QtxFontEdit::Shadow;
6947 if ( needSize ) f = f | QtxFontEdit::Size;
6948 setPreferenceProperty( tfont, "features", f );
6954 \brief Actions after hypothesis edition
6955 Updates object browser after hypothesis edition
6957 void SMESHGUI::onHypothesisEdit( int result )
6960 SMESHGUI::Modified();
6961 updateObjBrowser( true );
6965 \brief Actions after choosing menu of control modes
6966 Updates control mode actions according to current selection
6968 void SMESHGUI::onUpdateControlActions()
6970 SALOME_ListIO selected;
6971 if ( LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr() )
6972 aSel->selectedObjects( selected );
6974 SMESH_Actor::eControl aControl = SMESH_Actor::eNone;
6975 if ( selected.Extent() ) {
6976 if ( selected.First()->hasEntry() ) {
6977 if ( SMESH_Actor* anActor = SMESH::FindActorByEntry( selected.First()->getEntry() )) {
6978 aControl = anActor->GetControlMode();
6979 SALOME_ListIteratorOfListIO it(selected);
6980 for ( it.Next(); it.More(); it.Next() ) {
6981 Handle(SALOME_InteractiveObject) anIO = it.Value();
6982 if ( anIO->hasEntry() ) {
6983 if ( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) {
6984 if ( aControl != anActor->GetControlMode() ) {
6985 aControl = SMESH_Actor::eNone;
6995 int anAction = ActionToControl( aControl, true );
6997 action( anAction )->setChecked( true );
6999 QMenu* send = (QMenu*)sender();
7000 QList<QAction*> actions = send->actions();
7001 for ( int i = 0; i < actions.size(); i++ )
7002 actions[i]->setChecked( false );
7008 \brief Signal handler closing(SUIT_ViewWindow*) of a view
7009 \param pview view being closed
7011 void SMESHGUI::onViewClosed( SUIT_ViewWindow* pview ) {
7012 #ifndef DISABLE_PLOT2DVIEWER
7013 //Crear all Plot2d Viewers if need.
7014 SMESH::ClearPlot2Viewers(pview);
7016 EmitSignalCloseView();
7019 void SMESHGUI::message( const QString& msg )
7022 QStringList data = msg.split("/");
7023 if ( data.count() > 0 ) {
7024 if ( data.first() == "mesh_loading" ) {
7026 QString entry = data.count() > 1 ? data[1] : QString();
7027 if ( entry.isEmpty() )
7030 _PTR(Study) study = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() )->studyDS();
7032 _PTR(SObject) obj = study->FindObjectID( entry.toUtf8().constData() );
7035 name = SMESH::fromUtf8(obj->GetName());
7036 if ( name.isEmpty() )
7039 if ( data.last() == "stop" )
7040 application()->putInfo( tr( "MESH_LOADING_MSG_FINISHED" ).arg( name ) );
7042 application()->putInfo( tr( "MESH_LOADING_MSG" ).arg( name ) );
7043 QApplication::processEvents();
7049 \brief Connects or disconnects signals about activating and cloning view on the module slots
7050 \param pview view which is connected/disconnected
7052 void SMESHGUI::connectView( const SUIT_ViewWindow* pview ) {
7056 SUIT_ViewManager* viewMgr = pview->getViewManager();
7058 disconnect( viewMgr, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
7059 this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) );
7061 connect( viewMgr, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
7062 this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) );
7067 \brief Return \c true if object can be renamed
7069 bool SMESHGUI::renameAllowed( const QString& entry) const {
7070 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
7074 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
7078 SalomeApp_DataObject* obj = dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry));
7083 if(appStudy->isComponent(entry) || obj->isReference())
7086 // check type to prevent renaming of inappropriate objects
7087 int aType = SMESHGUI_Selection::type(qPrintable(entry));
7088 if (aType == SMESH::MESH || aType == SMESH::GROUP ||
7089 aType == SMESH::SUBMESH || aType == SMESH::SUBMESH_COMPOUND ||
7090 aType == SMESH::SUBMESH_SOLID || aType == SMESH::SUBMESH_FACE ||
7091 aType == SMESH::SUBMESH_EDGE || aType == SMESH::SUBMESH_VERTEX ||
7092 aType == SMESH::HYPOTHESIS || aType == SMESH::ALGORITHM)
7099 Rename object by entry.
7100 \param entry entry of the object
7101 \param name new name of the object
7102 \brief Return \c true if rename operation finished successfully, \c false otherwise.
7104 bool SMESHGUI::renameObject( const QString& entry, const QString& name) {
7106 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
7110 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( anApp->activeStudy() );
7115 _PTR(Study) aStudy = appStudy->studyDS();
7120 bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
7122 SUIT_MessageBox::warning ( anApp->desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_STUDY_LOCKED") );
7127 _PTR(SObject) obj = aStudy->FindObjectID( qPrintable(entry) );
7128 _PTR(GenericAttribute) anAttr;
7129 _PTR(AttributeName) aName;
7131 if ( obj->FindAttribute(anAttr, "AttributeName") ) {
7133 // check type to prevent renaming of inappropriate objects
7134 int aType = SMESHGUI_Selection::type( qPrintable(entry));
7135 if (aType == SMESH::MESH || aType == SMESH::GROUP ||
7136 aType == SMESH::SUBMESH || aType == SMESH::SUBMESH_COMPOUND ||
7137 aType == SMESH::SUBMESH_SOLID || aType == SMESH::SUBMESH_FACE ||
7138 aType == SMESH::SUBMESH_EDGE || aType == SMESH::SUBMESH_VERTEX ||
7139 aType == SMESH::HYPOTHESIS || aType == SMESH::ALGORITHM) {
7140 if ( !name.isEmpty() ) {
7141 SMESHGUI::GetSMESHGen()->SetName(obj->GetIOR().c_str(), qUtf8Printable(name) );
7143 // update name of group object and its actor
7144 Handle(SALOME_InteractiveObject) IObject =
7145 new SALOME_InteractiveObject ( qPrintable(entry), "SMESH", qPrintable(name) );
7147 SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
7148 if( !aGroupObject->_is_nil() ) {
7149 aGroupObject->SetName( qUtf8Printable(name) );
7150 if ( SMESH_Actor *anActor = SMESH::FindActorByEntry( qPrintable(entry) ) )
7151 anActor->setName( qUtf8Printable(name) );
7161 SALOMEDS::Color SMESHGUI::getPredefinedUniqueColor()
7163 static QList<QColor> colors;
7165 if ( colors.isEmpty() ) {
7167 for (int s = 0; s < 2 ; s++)
7169 for (int v = 100; v >= 40; v = v - 20)
7171 for (int h = 0; h < 359 ; h = h + 60)
7173 colors.append(QColor::fromHsv(h, 255 - s * 127, v * 255 / 100));
7178 static int currentColor = randomize( colors.size() );
7180 SALOMEDS::Color color;
7181 color.R = (double)colors[currentColor].red() / 255.0;
7182 color.G = (double)colors[currentColor].green() / 255.0;
7183 color.B = (double)colors[currentColor].blue() / 255.0;
7185 currentColor = (currentColor+1) % colors.count();