1 // Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // File : SMESHGUI.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
29 #include "SMESHGUI_AddMeshElementDlg.h"
30 #include "SMESHGUI_AddQuadraticElementDlg.h"
31 #include "SMESHGUI_BuildCompoundDlg.h"
32 #include "SMESHGUI_ClippingDlg.h"
33 #include "SMESHGUI_ComputeDlg.h"
34 #include "SMESHGUI_ConvToQuadOp.h"
35 #include "SMESHGUI_CreatePolyhedralVolumeDlg.h"
36 #include "SMESHGUI_DeleteGroupDlg.h"
37 #include "SMESHGUI_Displayer.h"
38 #include "SMESHGUI_MergeDlg.h"
39 #include "SMESHGUI_ExtrusionAlongPathDlg.h"
40 #include "SMESHGUI_ExtrusionDlg.h"
41 #include "SMESHGUI_FileInfoDlg.h"
42 #include "SMESHGUI_FileValidator.h"
43 #include "SMESHGUI_FilterDlg.h"
44 #include "SMESHGUI_FilterLibraryDlg.h"
45 #include "SMESHGUI_FindElemByPointDlg.h"
46 #include "SMESHGUI_GroupDlg.h"
47 #include "SMESHGUI_GroupOnShapeDlg.h"
48 #include "SMESHGUI_GroupOpDlg.h"
49 #include "SMESHGUI_Hypotheses.h"
50 #include "SMESHGUI_Make2DFrom3DOp.h"
51 #include "SMESHGUI_MakeNodeAtPointDlg.h"
52 //#include "SMESHGUI_MeshInfosDlg.h"
53 #include "SMESHGUI_Measurements.h"
54 #include "SMESHGUI_MeshInfo.h"
55 #include "SMESHGUI_MeshOp.h"
56 #include "SMESHGUI_MeshOrderOp.h"
57 #include "SMESHGUI_MeshPatternDlg.h"
58 #include "SMESHGUI_MultiEditDlg.h"
59 #include "SMESHGUI_NodesDlg.h"
60 #include "SMESHGUI_Preferences_ColorDlg.h"
61 #include "SMESHGUI_Preferences_ScalarBarDlg.h"
62 #include "SMESHGUI_RemoveElementsDlg.h"
63 #include "SMESHGUI_RemoveNodesDlg.h"
64 #include "SMESHGUI_RenumberingDlg.h"
65 #include "SMESHGUI_RevolutionDlg.h"
66 #include "SMESHGUI_RotationDlg.h"
67 #include "SMESHGUI_Selection.h"
68 #include "SMESHGUI_SewingDlg.h"
69 #include "SMESHGUI_SingleEditDlg.h"
70 #include "SMESHGUI_SmoothingDlg.h"
71 //#include "SMESHGUI_StandardMeshInfosDlg.h"
72 #include "SMESHGUI_SymmetryDlg.h"
73 #include "SMESHGUI_TranslationDlg.h"
74 #include "SMESHGUI_ScaleDlg.h"
75 #include "SMESHGUI_TransparencyDlg.h"
76 //#include "SMESHGUI_WhatIsDlg.h"
77 #include "SMESHGUI_DuplicateNodesDlg.h"
78 #include "SMESHGUI_CopyMeshDlg.h"
80 #include "SMESHGUI_Utils.h"
81 #include "SMESHGUI_MeshUtils.h"
82 #include "SMESHGUI_GroupUtils.h"
83 #include "SMESHGUI_FilterUtils.h"
84 #include "SMESHGUI_PatternUtils.h"
85 #include "SMESHGUI_VTKUtils.h"
86 #include "SMESHGUI_HypothesesUtils.h"
88 #include <SMESH_Client.hxx>
89 #include <SMESH_Actor.h>
90 #include <SMESH_ScalarBarActor.h>
91 #include <SMESH_ActorUtils.h>
92 #include <SMESH_TypeFilter.hxx>
93 #include "SMESH_ControlsDef.hxx"
95 // SALOME GUI includes
96 #include <SalomeApp_Tools.h>
97 #include <SalomeApp_Study.h>
98 #include <SalomeApp_Application.h>
99 #include <SalomeApp_CheckFileDlg.h>
101 #include <LightApp_DataOwner.h>
102 #include <LightApp_Preferences.h>
103 #include <LightApp_SelectionMgr.h>
104 #include <LightApp_UpdateFlags.h>
105 #include <LightApp_NameDlg.h>
107 #include <SVTK_ViewWindow.h>
108 #include <SVTK_ViewModel.h>
109 #include <SVTK_ViewManager.h>
111 #include <VTKViewer_Algorithm.h>
113 #include <SUIT_MessageBox.h>
114 #include <SUIT_ResourceMgr.h>
115 #include <SUIT_FileDlg.h>
116 #include <SUIT_Desktop.h>
117 #include <SUIT_OverrideCursor.h>
118 #include <SUIT_Session.h>
120 #include <QtxPopupMgr.h>
121 #include <QtxFontEdit.h>
123 #include <SALOME_ListIO.hxx>
124 #include <SALOME_ListIteratorOfListIO.hxx>
126 #ifndef DISABLE_PLOT2DVIEWER
127 #include <SPlot2d_ViewModel.h>
128 #include <SPlot2d_Histogram.h>
132 #include <SALOMEconfig.h>
133 #include CORBA_CLIENT_HEADER(SALOMEDS_Attributes)
134 #include CORBA_CLIENT_HEADER(SMESH_MeshEditor)
135 #include CORBA_CLIENT_HEADER(SMESH_Measurements)
138 // #define INCLUDE_MENUITEM_DEF // VSR commented ????????
140 #include <QTextStream>
143 #include <boost/shared_ptr.hpp>
146 #include <vtkCamera.h>
147 #include <vtkRenderer.h>
148 #include <vtkPlane.h>
149 #include <vtkCallbackCommand.h>
150 #include <vtkLookupTable.h>
152 // SALOME KERNEL includes
153 #include <SALOMEDS_Study.hxx>
154 #include <SALOMEDSClient_StudyBuilder.hxx>
155 #include <SALOMEDSClient_SComponent.hxx>
156 #include <SALOMEDSClient_ClientFactory.hxx>
157 #include <SALOMEDSClient_IParameters.hxx>
160 #include <Standard_ErrorHandler.hxx>
161 #include <NCollection_DataMap.hxx>
163 //To disable automatic genericobj management, the following line should be commented.
164 //Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx
165 #define WITHGENERICOBJ
169 //=============================================================
170 void ImportMeshesFromFile(SMESH::SMESH_Gen_ptr theComponentMesh,
173 void ExportMeshToFile(int theCommandID);
175 void SetDisplayMode(int theCommandID, SMESHGUI_StudyId2MarkerMap& theMarkerMap);
177 void SetDisplayEntity(int theCommandID);
179 void Control( int theCommandID );
183 //=============================================================
184 void ImportMeshesFromFile( SMESH::SMESH_Gen_ptr theComponentMesh,
188 std::string myExtension;
190 if ( theCommandID == 113 ) {
191 filter.append( QObject::tr( "MED_FILES_FILTER" ) + " (*.med)" );
192 filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" );
194 else if ( theCommandID == 112 ) {
195 filter.append( QObject::tr( "IDEAS_FILES_FILTER" ) + " (*.unv)" );
197 else if ( theCommandID == 111 ) {
198 filter.append( QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)" );
200 else if ( theCommandID == 140 ) {
201 filter.append( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)" );
204 QString anInitialPath = "";
205 if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
206 anInitialPath = QDir::currentPath();
208 QStringList filenames = SUIT_FileDlg::getOpenFileNames( SMESHGUI::desktop(),
211 QObject::tr( "SMESH_IMPORT_MESH" ) );
212 if ( filenames.count() > 0 ) {
213 SUIT_OverrideCursor wc;
214 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
217 QStringList anEntryList;
218 bool isEmpty = false;
219 for ( QStringList::ConstIterator it = filenames.begin(); it != filenames.end(); ++it ) {
220 QString filename = *it;
221 SMESH::mesh_array_var aMeshes = new SMESH::mesh_array;
223 switch ( theCommandID ) {
226 // DAT format (currently unsupported)
227 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
228 arg( QObject::tr( "SMESH_ERR_NOT_SUPPORTED_FORMAT" ) ) );
234 aMeshes->length( 1 );
235 aMeshes[0] = theComponentMesh->CreateMeshesFromUNV( filename.toLatin1().constData() );
236 if ( aMeshes[0]->_is_nil() )
237 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
238 arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) );
244 SMESH::DriverMED_ReadStatus res;
245 aMeshes = theComponentMesh->CreateMeshesFromMED( filename.toLatin1().constData(), res );
246 if ( res != SMESH::DRS_OK ) {
247 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
248 arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) );
255 aMeshes->length( 1 );
256 aMeshes[0] = theComponentMesh->CreateMeshesFromSTL( filename.toLatin1().constData() );
257 if ( aMeshes[0]->_is_nil() ) {
258 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
259 arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) );
265 catch ( const SALOME::SALOME_Exception& S_ex ) {
266 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
267 arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) );
270 for ( int i = 0, iEnd = aMeshes->length(); i < iEnd; i++ ) {
271 _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshes[i] );
273 _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
274 _PTR(AttributePixMap) aPixmap = aBuilder->FindOrCreateAttribute( aMeshSO, "AttributePixMap" );
275 aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_IMPORTED" );
276 if ( theCommandID == 112 ) // mesh names aren't taken from the file for UNV import
277 SMESH::SetName( aMeshSO, QFileInfo(filename).fileName() );
279 anEntryList.append( aMeshSO->GetID().c_str() );
281 #ifdef WITHGENERICOBJ
282 // obj has been published in study. Its refcount has been incremented.
283 // It is safe to decrement its refcount
284 // so that it will be destroyed when the entry in study will be removed
285 aMeshes[i]->UnRegister();
294 // update Object browser
295 SMESHGUI::GetSMESHGUI()->updateObjBrowser();
297 // browse to the published meshes
298 if( LightApp_Application* anApp =
299 dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
300 anApp->browseObjects( anEntryList );
302 // show Error message box if there were errors
303 if ( errors.count() > 0 ) {
304 SUIT_MessageBox::critical( SMESHGUI::desktop(),
305 QObject::tr( "SMESH_ERROR" ),
306 QObject::tr( "SMESH_IMPORT_ERRORS" ) + "\n" + errors.join( "\n" ) );
309 // show warning message box, if some imported mesh is empty
311 SUIT_MessageBox::warning( SMESHGUI::desktop(),
312 QObject::tr( "SMESH_WRN_WARNING" ),
313 QObject::tr( "SMESH_DRS_SOME_EMPTY" ) );
318 void ExportMeshToFile( int theCommandID )
320 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
321 SALOME_ListIO selected;
323 aSel->selectedObjects( selected );
325 // actually, the following condition can't be met (added for insurance)
326 if( selected.Extent() == 0 ||
327 ( selected.Extent() > 1 && theCommandID != 122 && theCommandID != 125 ) )
330 bool hasDuplicatedMeshNames = false;
331 QList< QPair< SMESH::SMESH_Mesh_var, QString > > aMeshList;
332 QList< QPair< SMESH::SMESH_Mesh_var, QString > >::iterator aMeshIter;
333 SALOME_ListIteratorOfListIO It( selected );
334 for( ; It.More(); It.Next() ) {
335 Handle(SALOME_InteractiveObject) anIObject = It.Value();
336 SMESH::SMESH_Mesh_var aMeshItem = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>( anIObject );
337 if ( aMeshItem->_is_nil() ) {
338 SUIT_MessageBox::warning( SMESHGUI::desktop(),
339 QObject::tr( "SMESH_WRN_WARNING" ),
340 QObject::tr( "SMESH_BAD_MESH_SELECTION" ));
344 QString aMeshName = anIObject->getName();
346 // check for duplications
347 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
348 if( aMeshName == (*aMeshIter).second ) {
349 hasDuplicatedMeshNames = true;
354 aMeshList.append( QPair< SMESH::SMESH_Mesh_var, QString >( aMeshItem, aMeshName ) );
357 if( hasDuplicatedMeshNames ) {
358 int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
359 QObject::tr("SMESH_WRN_WARNING"),
360 QObject::tr("SMESH_EXPORT_MED_DUPLICATED_MESH_NAMES"),
361 QObject::tr("SMESH_BUT_YES"),
362 QObject::tr("SMESH_BUT_NO"), 0, 1);
367 aMeshIter = aMeshList.begin();
368 SMESH::SMESH_Mesh_var aMesh = (*aMeshIter).first;
369 QString aMeshName = (*aMeshIter).second;
371 QList<SALOMEDS::Color> aReservedColors;
373 QString aFilter, aTitle = QObject::tr("SMESH_EXPORT_MESH");
374 QMap<QString, SMESH::MED_VERSION> aFilterMap;
375 QMap<QString, int> aFilterMapSTL;
376 switch ( theCommandID ) {
380 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
381 SMESH::SMESH_Mesh_var aMeshItem = (*aMeshIter).first;
382 if (aMeshItem->HasDuplicatedGroupNamesMED()) {
383 int aRet = SUIT_MessageBox::warning
384 (SMESHGUI::desktop(),
385 QObject::tr("SMESH_WRN_WARNING"),
386 QObject::tr("SMESH_EXPORT_MED_DUPLICATED_GRP").arg((*aMeshIter).second),
387 QObject::tr("SMESH_BUT_YES"),
388 QObject::tr("SMESH_BUT_NO"), 0, 1);
394 //QString v21 (aMesh->GetVersionString(SMESH::MED_V2_1, 2));
395 QString v22 (aMesh->GetVersionString(SMESH::MED_V2_2, 2));
396 //aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v21 ) + " (*.med)", SMESH::MED_V2_1 );
397 aFilterMap.insert( QObject::tr( "MED_VX_FILES_FILTER" ).arg( v22 ) + " (*.med)", SMESH::MED_V2_2 );
402 aFilter = QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)";
407 if (aMesh->NbPyramids()) {
408 int aRet = SUIT_MessageBox::warning
409 (SMESHGUI::desktop(),
410 QObject::tr("SMESH_WRN_WARNING"),
411 QObject::tr("SMESH_EXPORT_UNV").arg(aMeshName),
412 QObject::tr("SMESH_BUT_YES"),
413 QObject::tr("SMESH_BUT_NO"), 0, 1);
417 aFilter = QObject::tr( "IDEAS_FILES_FILTER" ) + " (*.unv)";
424 there must be check on others mesh elements not equal triangles
426 // if (aMesh->NbTriangles() < 1) {
427 // SUIT_MessageBox::warning
428 // (SMESHGUI::desktop(),
429 // QObject::tr("SMESH_WRN_WARNING"),
430 // QObject::tr("SMESH_EXPORT_STL1").arg(aMeshName));
433 // if (!(aMesh->NbElements() - aMesh->NbTriangles())) {
434 // int aRet = SUIT_MessageBox::warning
435 // (SMESHGUI::desktop(),
436 // QObject::tr("SMESH_WRN_WARNING"),
437 // QObject::tr("SMESH_EXPORT_STL2").arg(aMeshName),
438 // QObject::tr("SMESH_BUT_YES"),
439 // QObject::tr("SMESH_BUT_NO"), 0, 1);
444 aFilterMapSTL.insert( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)", 1 ); // 1 - ASCII mode
445 aFilterMapSTL.insert( QObject::tr( "STL_BIN_FILES_FILTER" ) + " (*.stl)", 0 ); // 0 - Binary mode
453 SMESH::MED_VERSION aFormat;
454 // Init the parameter with the default value
455 bool aIsASCII_STL = true;
456 bool toCreateGroups = false;
457 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
459 toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false );
460 bool toOverwrite = true;
462 QString anInitialPath = "";
463 if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
464 anInitialPath = QDir::currentPath();
466 if ( theCommandID != 122 && theCommandID != 125 && theCommandID != 141) {
467 if ( anInitialPath.isEmpty() ) anInitialPath = SUIT_FileDlg::getLastVisitedPath();
468 aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(), anInitialPath + QString("/") + aMeshName,
469 aFilter, aTitle, false);
471 else if(theCommandID == 141) { // Export to STL
473 QMap<QString, int>::const_iterator it = aFilterMapSTL.begin();
474 for ( ; it != aFilterMapSTL.end(); ++it )
475 filters.push_back( it.key() );
477 SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
478 fd->setWindowTitle( aTitle );
479 fd->setNameFilters( filters );
480 fd->selectNameFilter( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)" );
481 if ( !anInitialPath.isEmpty() )
482 fd->setDirectory( anInitialPath );
483 fd->selectFile(aMeshName);
487 aFilename = fd->selectedFile();
488 aIsASCII_STL = (aFilterMapSTL[fd->selectedNameFilter()]) == 1 ? true: false;
493 else { // Export to MED
495 QString aDefaultFilter;
496 QMap<QString, SMESH::MED_VERSION>::const_iterator it = aFilterMap.begin();
497 for ( ; it != aFilterMap.end(); ++it ) {
498 filters.push_back( it.key() );
499 if (it.value() == SMESH::MED_V2_2)
500 aDefaultFilter = it.key();
503 //SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
504 SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg
505 ( SMESHGUI::desktop(), false, QObject::tr("SMESH_AUTO_GROUPS"), true, true );
506 fd->setWindowTitle( aTitle );
507 fd->setNameFilters( filters );
508 //fd->setSelectedNameFilter( QObject::tr("MED 2.2 (*.med)") );
509 fd->selectNameFilter(aDefaultFilter);
510 fd->SetChecked(toCreateGroups);
511 if ( !anInitialPath.isEmpty() )
512 fd->setDirectory( anInitialPath );
513 fd->selectFile(aMeshName);
515 SMESHGUI_FileValidator* fv = new SMESHGUI_FileValidator( fd );
516 fd->setValidator( fv );
521 aFilename = fd->selectedFile();
523 aFilename = QString::null;
526 aFormat = aFilterMap[fd->selectedNameFilter()];
527 toOverwrite = fv->isOverwrite();
529 if ( !aFilename.isEmpty() ) {
530 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
531 SMESH::SMESH_Mesh_var aMeshItem = (*aMeshIter).first;
532 if( (aMeshItem->NbPolygons()>0 || aMeshItem->NbPolyhedrons()>0)
533 && aFormat==SMESH::MED_V2_1) {
534 int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
535 QObject::tr("SMESH_WRN_WARNING"),
536 QObject::tr("SMESH_EXPORT_MED_V2_1").arg((*aMeshIter).second),
537 QObject::tr("SMESH_BUT_YES"),
538 QObject::tr("SMESH_BUT_NO"), 0, 1);
546 SMESH::MED_VERSION aVersion = SMESH::MED_V2_1;
547 bool isVersionOk = SMESHGUI::GetSMESHGen()->GetMEDVersion( aFilename.toLatin1().constData(), aVersion );
548 if( !isVersionOk || aVersion != aFormat ) {
549 int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
550 QObject::tr("SMESH_WRN_WARNING"),
551 QObject::tr("SMESH_EXPORT_MED_VERSION_COLLISION").arg(aFilename),
552 QObject::tr("SMESH_BUT_YES"),
553 QObject::tr("SMESH_BUT_NO"), 0, 1);
560 QStringList aMeshNamesCollisionList;
561 SMESH::string_array_var aMeshNames = SMESHGUI::GetSMESHGen()->GetMeshNames( aFilename.toLatin1().constData() );
562 for( int i = 0, n = aMeshNames->length(); i < n; i++ ) {
563 QString anExistingMeshName( aMeshNames[ i ] );
564 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
565 QString anExportMeshName = (*aMeshIter).second;
566 if( anExportMeshName == anExistingMeshName ) {
567 aMeshNamesCollisionList.append( anExportMeshName );
573 if( !aMeshNamesCollisionList.isEmpty() ) {
574 QString aMeshNamesCollisionString = aMeshNamesCollisionList.join( ", " );
575 int aRet = SUIT_MessageBox::warning(SMESHGUI::desktop(),
576 QObject::tr("SMESH_WRN_WARNING"),
577 QObject::tr("SMESH_EXPORT_MED_MESH_NAMES_COLLISION").arg(aMeshNamesCollisionString),
578 QObject::tr("SMESH_BUT_YES"),
579 QObject::tr("SMESH_BUT_NO"),
580 QObject::tr("SMESH_BUT_CANCEL"), 0, 2);
589 toCreateGroups = fd->IsChecked();
592 if ( !aFilename.isEmpty() ) {
593 // Check whether the file already exists and delete it if yes
594 QFile aFile( aFilename );
595 if ( aFile.exists() && toOverwrite )
597 SUIT_OverrideCursor wc;
600 bool Renumber = false;
601 // PAL 14172 : Check of we have to renumber or not from the preferences before export
603 Renumber= resMgr->booleanValue("SMESH","renumbering");
605 SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
606 aMeshEditor->RenumberNodes();
607 aMeshEditor->RenumberElements();
608 if ( SMESHGUI::automaticUpdate() )
611 switch ( theCommandID ) {
615 for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++, aMeshIndex++ ) {
616 SMESH::SMESH_Mesh_var aMeshItem = (*aMeshIter).first;
617 if( !aMeshItem->_is_nil() )
618 aMeshItem->ExportToMEDX( aFilename.toLatin1().data(), toCreateGroups, aFormat, toOverwrite && aMeshIndex == 0 );
624 aMesh->ExportDAT( aFilename.toLatin1().data() );
628 aMesh->ExportUNV( aFilename.toLatin1().data() );
631 aMesh->ExportSTL( aFilename.toLatin1().data(), aIsASCII_STL );
637 catch (const SALOME::SALOME_Exception& S_ex){
639 SUIT_MessageBox::warning(SMESHGUI::desktop(),
640 QObject::tr("SMESH_WRN_WARNING"),
641 QObject::tr("SMESH_EXPORT_FAILED"));
647 inline void InverseEntityMode(unsigned int& theOutputMode,
648 unsigned int theMode)
650 bool anIsNotPresent = ~theOutputMode & theMode;
652 theOutputMode |= theMode;
654 theOutputMode &= ~theMode;
657 void SetDisplayEntity(int theCommandID){
658 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
659 SALOME_ListIO selected;
661 aSel->selectedObjects( selected );
663 if(selected.Extent() >= 1){
664 SALOME_ListIteratorOfListIO It( selected );
665 for( ; It.More(); It.Next()){
666 Handle(SALOME_InteractiveObject) IObject = It.Value();
667 if(IObject->hasEntry()){
668 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
669 unsigned int aMode = anActor->GetEntityMode();
670 switch(theCommandID){
672 InverseEntityMode(aMode,SMESH_Actor::e0DElements);
675 InverseEntityMode(aMode,SMESH_Actor::eEdges);
678 InverseEntityMode(aMode,SMESH_Actor::eFaces);
681 InverseEntityMode(aMode,SMESH_Actor::eVolumes);
684 aMode = SMESH_Actor::eAllEntity;
688 anActor->SetEntityMode(aMode);
696 SALOME_ListIO selected;
697 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
701 LightApp_SelectionMgr* aSel = app->selectionMgr();
702 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
703 if( !aSel || !appStudy )
706 aSel->selectedObjects( selected );
707 if( selected.IsEmpty() )
710 Handle(SALOME_InteractiveObject) anIObject = selected.First();
712 _PTR(Study) aStudy = appStudy->studyDS();
713 _PTR(SObject) aMainSObject( aStudy->FindObjectID( anIObject->getEntry() ) );
714 SMESH::SMESH_Mesh_var aMainObject = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
715 if( aMainObject->_is_nil() )
718 aMainObject->SetAutoColor( true ); // mesh groups are re-colored here
720 SMESH::ListOfGroups aListOfGroups = *aMainObject->GetGroups();
721 for( int i = 0, n = aListOfGroups.length(); i < n; i++ )
723 SMESH::SMESH_GroupBase_var aGroupObject = aListOfGroups[i];
724 SALOMEDS::Color aColor = aGroupObject->GetColor();
725 _PTR(SObject) aGroupSObject = SMESH::FindSObject(aGroupObject);
727 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) {
728 if( aGroupObject->GetType() == SMESH::NODE )
729 anActor->SetNodeColor( aColor.R, aColor.G, aColor.B );
730 else if( aGroupObject->GetType() == SMESH::EDGE )
731 anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B );
732 else if( aGroupObject->GetType() == SMESH::ELEM0D )
733 anActor->Set0DColor( aColor.R, aColor.G, aColor.B );
735 anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B );
740 SMESH::RepaintCurrentView();
743 QString functorToString( SMESH::Controls::FunctorPtr f )
745 QString type = QObject::tr( "UNKNOWN_CONTROL" );
746 if ( dynamic_cast< SMESH::Controls::Volume* >( f.get() ) )
747 type = QObject::tr( "VOLUME_3D_ELEMENTS" );
748 else if ( dynamic_cast< SMESH::Controls::MaxElementLength2D* >( f.get() ) )
749 type = QObject::tr( "MAX_ELEMENT_LENGTH_2D" );
750 else if ( dynamic_cast< SMESH::Controls::MaxElementLength3D* >( f.get() ) )
751 type = QObject::tr( "MAX_ELEMENT_LENGTH_3D" );
752 else if ( dynamic_cast< SMESH::Controls::MinimumAngle* >( f.get() ) )
753 type = QObject::tr( "MINIMUMANGLE_ELEMENTS" );
754 else if ( dynamic_cast< SMESH::Controls::AspectRatio* >( f.get() ) )
755 type = QObject::tr( "ASPECTRATIO_ELEMENTS" );
756 else if ( dynamic_cast< SMESH::Controls::AspectRatio3D* >( f.get() ) )
757 type = QObject::tr( "ASPECTRATIO_3D_ELEMENTS" );
758 else if ( dynamic_cast< SMESH::Controls::Warping* >( f.get() ) )
759 type = QObject::tr( "WARP_ELEMENTS" );
760 else if ( dynamic_cast< SMESH::Controls::Taper* >( f.get() ) )
761 type = QObject::tr( "TAPER_ELEMENTS" );
762 else if ( dynamic_cast< SMESH::Controls::Skew* >( f.get() ) )
763 type = QObject::tr( "SKEW_ELEMENTS" );
764 else if ( dynamic_cast< SMESH::Controls::Area* >( f.get() ) )
765 type = QObject::tr( "AREA_ELEMENTS" );
766 else if ( dynamic_cast< SMESH::Controls::Length* >( f.get() ) )
767 type = QObject::tr( "LENGTH_EDGES" );
768 else if ( dynamic_cast< SMESH::Controls::Length2D* >( f.get() ) )
769 type = QObject::tr( "LENGTH2D_EDGES" );
770 else if ( dynamic_cast< SMESH::Controls::MultiConnection* >( f.get() ) )
771 type = QObject::tr( "MULTI_BORDERS" );
772 else if ( dynamic_cast< SMESH::Controls::MultiConnection2D* >( f.get() ) )
773 type = QObject::tr( "MULTI2D_BORDERS" );
774 else if ( dynamic_cast< SMESH::Controls::FreeNodes* >( f.get() ) )
775 type = QObject::tr( "FREE_NODES" );
776 else if ( dynamic_cast< SMESH::Controls::FreeEdges* >( f.get() ) )
777 type = QObject::tr( "FREE_EDGES" );
778 else if ( dynamic_cast< SMESH::Controls::FreeBorders* >( f.get() ) )
779 type = QObject::tr( "FREE_BORDERS" );
780 else if ( dynamic_cast< SMESH::Controls::FreeFaces* >( f.get() ) )
781 type = QObject::tr( "FREE_FACES" );
782 else if ( dynamic_cast< SMESH::Controls::BareBorderVolume* >( f.get() ) )
783 type = QObject::tr( "BARE_BORDER_VOLUME" );
784 else if ( dynamic_cast< SMESH::Controls::BareBorderFace* >( f.get() ) )
785 type = QObject::tr( "BARE_BORDER_FACE" );
786 else if ( dynamic_cast< SMESH::Controls::OverConstrainedVolume* >( f.get() ) )
787 type = QObject::tr( "OVER_CONSTRAINED_VOLUME" );
788 else if ( dynamic_cast< SMESH::Controls::OverConstrainedFace* >( f.get() ) )
789 type = QObject::tr( "OVER_CONSTRAINED_FACE" );
793 void SaveDistribution()
795 LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
796 SALOME_ListIO selected;
798 aSel->selectedObjects( selected );
800 if ( selected.Extent() == 1 ) {
801 Handle(SALOME_InteractiveObject) anIO = selected.First();
802 if ( anIO->hasEntry() ) {
803 SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
804 if ( anActor && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) {
805 SMESH_ScalarBarActor* aScalarBarActor = anActor->GetScalarBarActor();
806 SMESH::Controls::FunctorPtr aFunctor = anActor->GetFunctor();
807 if ( aScalarBarActor && aFunctor ) {
808 SMESH::Controls::NumericalFunctor* aNumFun = dynamic_cast<SMESH::Controls::NumericalFunctor*>( aFunctor.get() );
810 std::vector<int> elements;
811 SMESH::SMESH_Mesh_var mesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIO);
812 if ( mesh->_is_nil() ) {
813 SMESH::SMESH_IDSource_var idSource =
814 SMESH::IObjectToInterface<SMESH::SMESH_IDSource>(anIO);
815 if ( !idSource->_is_nil() )
817 SMESH::long_array_var ids = idSource->GetIDs();
818 elements.resize( ids->length() );
819 for ( unsigned i = 0; i < elements.size(); ++i )
820 elements[i] = ids[i];
823 int nbIntervals = aScalarBarActor->GetMaximumNumberOfColors();
824 vtkLookupTable* lookupTable =
825 static_cast<vtkLookupTable*>(aScalarBarActor->GetLookupTable());
826 double * minmax = lookupTable->GetRange();
827 std::vector<int> nbEvents;
828 std::vector<double> funValues;
829 aNumFun->GetHistogram( nbIntervals, nbEvents, funValues, elements, minmax );
830 QString anInitialPath = "";
831 if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
832 anInitialPath = QDir::currentPath();
833 QString aMeshName = anIO->getName();
835 filter.append( QObject::tr( "TEXT_FILES_FILTER" ) + " (*.txt)" );
836 filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" );
837 QString aFilename = anInitialPath + "/" + aMeshName + "_" +
838 functorToString( aFunctor ).toLower().simplified().replace( QRegExp( " |-" ), "_" ) + ".txt";
839 aFilename = SUIT_FileDlg::getFileName( SMESHGUI::desktop(),
842 QObject::tr( "SMESH_SAVE_DISTRIBUTION" ),
844 if ( !aFilename.isEmpty() ) {
845 QFile f( aFilename );
846 if ( f.open( QFile::WriteOnly | QFile::Truncate ) ) {
847 QTextStream out( &f );
848 out << "# Mesh: " << aMeshName << endl;
849 out << "# Control: " << functorToString( aFunctor ) << endl;
851 out.setFieldWidth( 10 );
852 for ( int i = 0; i < qMin( nbEvents.size(), funValues.size()-1 ); i++ )
853 out << funValues[i] << "\t" << funValues[i+1] << "\t" << nbEvents[i] << endl;
864 void ShowDistribution() {
865 LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
866 SALOME_ListIO selected;
868 aSel->selectedObjects( selected );
870 if ( selected.Extent() == 1 ) {
871 Handle(SALOME_InteractiveObject) anIO = selected.First();
872 if ( anIO->hasEntry() ) {
873 SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
874 if ( anActor && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) {
875 SMESH_ScalarBarActor *aScalarBarActor = anActor->GetScalarBarActor();
876 aScalarBarActor->SetDistributionVisibility(!aScalarBarActor->GetDistributionVisibility());
882 #ifndef DISABLE_PLOT2DVIEWER
883 void PlotDistribution() {
884 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
888 LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
889 SALOME_ListIO selected;
891 aSel->selectedObjects( selected );
893 if ( selected.Extent() == 1 ) {
894 Handle(SALOME_InteractiveObject) anIO = selected.First();
895 if ( anIO->hasEntry() ) {
896 //Find Actor by entry before getting Plot2d viewer,
897 //because after call getViewManager( Plot2d_Viewer::Type(), true ) active window is Plot2d Viewer
898 SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() );
900 SUIT_ViewManager* aViewManager = app->getViewManager( Plot2d_Viewer::Type(), true ); // create if necessary
905 SPlot2d_Viewer* aView = dynamic_cast<SPlot2d_Viewer*>(aViewManager->getViewModel());
909 Plot2d_ViewFrame* aPlot = aView->getActiveViewFrame();
913 if ( anActor && anActor->GetControlMode() != SMESH_Actor::eNone ) {
914 SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
915 QString functorName = functorToString( anActor->GetFunctor());
916 QString aHistogramName("%1 : %2");
917 aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName);
918 aHistogram->setName(aHistogramName);
919 aHistogram->setHorTitle(functorName);
920 aHistogram->setVerTitle(QObject::tr("DISTRIBUTION_NB_ENT"));
921 aPlot->displayObject(aHistogram, true);
926 #endif //DISABLE_PLOT2DVIEWER
928 void DisableAutoColor(){
929 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
930 SALOME_ListIO selected;
932 aSel->selectedObjects( selected );
934 if(selected.Extent()){
935 Handle(SALOME_InteractiveObject) anIObject = selected.First();
936 SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
937 if ( !aMesh->_is_nil() ) {
938 aMesh->SetAutoColor( false );
943 void SetDisplayMode(int theCommandID, SMESHGUI_StudyId2MarkerMap& theMarkerMap){
944 SALOME_ListIO selected;
945 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
949 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
950 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
951 if( !aSel || !appStudy )
954 if( theCommandID == 1134 ) { // Clipping dialog can be activated without selection
955 if( SMESHGUI* aModule = SMESHGUI::GetSMESHGUI() ) {
956 aModule->EmitSignalDeactivateDialog();
957 if( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( aModule ) )
958 (new SMESHGUI_ClippingDlg( aModule, aViewWindow ))->show();
963 _PTR(Study) aStudy = appStudy->studyDS();
965 aSel->selectedObjects( selected );
967 if(selected.Extent() >= 1){
968 switch(theCommandID){
970 SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
971 (new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI() ))->show();
975 QColor c, e, b, n, c0D, o;
978 vtkFloatingPointType Shrink = 0.0;
979 vtkFloatingPointType faces_orientation_scale = 0.0;
980 bool faces_orientation_3dvectors = false;
982 VTK::MarkerType aMarkerTypeCurrent = VTK::MT_NONE;
983 VTK::MarkerScale aMarkerScaleCurrent = VTK::MS_NONE;
984 int aMarkerTextureCurrent = 0;
986 SALOME_ListIteratorOfListIO It( selected );
987 for( ; It.More(); It.Next()){
988 Handle(SALOME_InteractiveObject) IObject = It.Value();
989 if(IObject->hasEntry()){
990 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
991 vtkFloatingPointType color[3];
992 anActor->GetSufaceColor(color[0], color[1], color[2]);
993 int c0 = int (color[0] * 255);
994 int c1 = int (color[1] * 255);
995 int c2 = int (color[2] * 255);
996 c.setRgb(c0, c1, c2);
998 vtkFloatingPointType edgecolor[3];
999 anActor->GetEdgeColor(edgecolor[0], edgecolor[1], edgecolor[2]);
1000 c0 = int (edgecolor[0] * 255);
1001 c1 = int (edgecolor[1] * 255);
1002 c2 = int (edgecolor[2] * 255);
1003 e.setRgb(c0, c1, c2);
1005 vtkFloatingPointType backfacecolor[3];
1006 anActor->GetBackSufaceColor(backfacecolor[0], backfacecolor[1], backfacecolor[2]);
1007 c0 = int (backfacecolor[0] * 255);
1008 c1 = int (backfacecolor[1] * 255);
1009 c2 = int (backfacecolor[2] * 255);
1010 b.setRgb(c0, c1, c2);
1012 vtkFloatingPointType nodecolor[3];
1013 anActor->GetNodeColor(nodecolor[0], nodecolor[1], nodecolor[2]);
1014 c0 = int (nodecolor[0] * 255);
1015 c1 = int (nodecolor[1] * 255);
1016 c2 = int (nodecolor[2] * 255);
1017 n.setRgb(c0, c1, c2);
1019 vtkFloatingPointType color0D[3];
1020 anActor->Get0DColor(color0D[0], color0D[1], color0D[2]);
1021 c0 = int (color0D[0] * 255);
1022 c1 = int (color0D[1] * 255);
1023 c2 = int (color0D[2] * 255);
1024 c0D.setRgb(c0, c1, c2);
1026 size0D = (int)anActor->Get0DSize();
1029 Edgewidth = (int)anActor->GetLineWidth();
1032 Shrink = anActor->GetShrinkFactor();
1034 vtkFloatingPointType faces_orientation_color[3];
1035 anActor->GetFacesOrientationColor(faces_orientation_color);
1036 c0 = int (faces_orientation_color[0] * 255);
1037 c1 = int (faces_orientation_color[1] * 255);
1038 c2 = int (faces_orientation_color[2] * 255);
1039 o.setRgb(c0, c1, c2);
1041 faces_orientation_scale = anActor->GetFacesOrientationScale();
1042 faces_orientation_3dvectors = anActor->GetFacesOrientation3DVectors();
1044 aMarkerTypeCurrent = anActor->GetMarkerType();
1045 aMarkerScaleCurrent = anActor->GetMarkerScale();
1046 aMarkerTextureCurrent = anActor->GetMarkerTexture();
1048 // even if there are multiple objects in the selection,
1049 // we need only the first one to get values for the dialog
1055 SMESHGUI_Preferences_ColorDlg *aDlg =
1056 new SMESHGUI_Preferences_ColorDlg( SMESHGUI::GetSMESHGUI() );
1057 aDlg->SetColor(1, c);
1058 aDlg->SetColor(2, e);
1059 aDlg->SetColor(3, n);
1060 aDlg->SetColor(4, b);
1061 aDlg->SetColor(5, c0D);
1062 aDlg->SetColor(6, o);
1063 aDlg->SetIntValue(1, Edgewidth);
1064 aDlg->SetIntValue(2, int(Shrink*100.));
1065 aDlg->SetIntValue(3, size0D);
1066 aDlg->SetDoubleValue(1, faces_orientation_scale);
1067 aDlg->SetBooleanValue(1, faces_orientation_3dvectors);
1069 aDlg->setCustomMarkerMap( theMarkerMap[ aStudy->StudyId() ] );
1071 if( aMarkerTypeCurrent != VTK::MT_USER )
1072 aDlg->setStandardMarker( aMarkerTypeCurrent, aMarkerScaleCurrent );
1074 aDlg->setCustomMarker( aMarkerTextureCurrent );
1077 QColor color = aDlg->GetColor(1);
1078 QColor edgecolor = aDlg->GetColor(2);
1079 QColor nodecolor = aDlg->GetColor(3);
1080 QColor backfacecolor = aDlg->GetColor(4);
1081 QColor color0D = aDlg->GetColor(5);
1082 QColor faces_orientation_color = aDlg->GetColor(6);
1085 theMarkerMap[ aStudy->StudyId() ] = aDlg->getCustomMarkerMap();
1087 SALOME_ListIteratorOfListIO It( selected );
1088 for( ; It.More(); It.Next()){
1089 Handle(SALOME_InteractiveObject) IObject = It.Value();
1090 if(IObject->hasEntry()){
1091 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
1092 /* actor color and backface color */
1093 anActor->SetSufaceColor(vtkFloatingPointType (color.red()) / 255.,
1094 vtkFloatingPointType (color.green()) / 255.,
1095 vtkFloatingPointType (color.blue()) / 255.);
1096 anActor->SetBackSufaceColor(vtkFloatingPointType (backfacecolor.red()) / 255.,
1097 vtkFloatingPointType (backfacecolor.green()) / 255.,
1098 vtkFloatingPointType (backfacecolor.blue()) / 255.);
1101 anActor->SetEdgeColor(vtkFloatingPointType (edgecolor.red()) / 255.,
1102 vtkFloatingPointType (edgecolor.green()) / 255.,
1103 vtkFloatingPointType (edgecolor.blue()) / 255.);
1105 /* Shrink factor and size edges */
1106 anActor->SetShrinkFactor(aDlg->GetIntValue(2) / 100.);
1107 anActor->SetLineWidth(aDlg->GetIntValue(1));
1109 /* Nodes color and size */
1110 anActor->SetNodeColor(vtkFloatingPointType (nodecolor.red()) / 255.,
1111 vtkFloatingPointType (nodecolor.green()) / 255.,
1112 vtkFloatingPointType (nodecolor.blue()) / 255.);
1115 anActor->Set0DColor(vtkFloatingPointType (color0D.red()) / 255.,
1116 vtkFloatingPointType (color0D.green()) / 255.,
1117 vtkFloatingPointType (color0D.blue()) / 255.);
1118 anActor->Set0DSize(aDlg->GetIntValue(3));
1120 /* Faces orientation */
1121 vtkFloatingPointType c[3] = {vtkFloatingPointType(faces_orientation_color.redF()),
1122 vtkFloatingPointType(faces_orientation_color.greenF()),
1123 vtkFloatingPointType(faces_orientation_color.blueF())};
1124 anActor->SetFacesOrientationColor(c);
1125 anActor->SetFacesOrientationScale(aDlg->GetDoubleValue(1));
1126 anActor->SetFacesOrientation3DVectors(aDlg->GetBooleanValue(1));
1128 VTK::MarkerType aMarkerTypeNew = aDlg->getMarkerType();
1129 VTK::MarkerScale aMarkerScaleNew = aDlg->getStandardMarkerScale();
1130 int aMarkerTextureNew = aDlg->getCustomMarkerID();
1131 if( aMarkerTypeNew != VTK::MT_USER )
1132 anActor->SetMarkerStd( aMarkerTypeNew, aMarkerScaleNew );
1134 const VTK::MarkerMap& aMarkerMap = theMarkerMap[ aStudy->StudyId() ];
1135 VTK::MarkerMap::const_iterator anIter = aMarkerMap.find( aMarkerTextureNew );
1136 if( anIter != aMarkerMap.end() )
1137 anActor->SetMarkerTexture( aMarkerTextureNew, anIter->second.second );
1140 SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
1141 if( !aGroupObject->_is_nil() )
1143 SMESH::ElementType anElementType = aGroupObject->GetType();
1145 switch( anElementType )
1147 case SMESH::NODE: aColor = nodecolor; break;
1148 case SMESH::EDGE: aColor = edgecolor; break;
1149 default: aColor = color; break;
1152 SALOMEDS::Color aGroupColor;
1153 aGroupColor.R = (float)aColor.red() / 255.0;
1154 aGroupColor.G = (float)aColor.green() / 255.0;
1155 aGroupColor.B = (float)aColor.blue() / 255.0;
1156 aGroupObject->SetColor( aGroupColor );
1161 SMESH::RepaintCurrentView();
1167 SALOME_ListIteratorOfListIO It( selected );
1168 for( ; It.More(); It.Next()){
1169 Handle(SALOME_InteractiveObject) IObject = It.Value();
1170 if(IObject->hasEntry()){
1171 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
1172 switch(theCommandID){
1174 anActor->SetRepresentation(SMESH_Actor::eEdge);
1177 anActor->SetRepresentation(SMESH_Actor::eSurface);
1180 if(anActor->IsShrunk())
1181 anActor->UnShrink();
1183 anActor->SetShrink();
1186 anActor->SetRepresentation(SMESH_Actor::ePoint);
1189 if(anActor->GetQuadratic2DRepresentation() != SMESH_Actor::eLines)
1190 anActor->SetQuadratic2DRepresentation(SMESH_Actor::eLines);
1193 if(anActor->GetQuadratic2DRepresentation() != SMESH_Actor::eArcs)
1194 anActor->SetQuadratic2DRepresentation(SMESH_Actor::eArcs);
1200 SMESH::RepaintCurrentView();
1204 void Control( int theCommandID )
1206 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1207 SALOME_ListIO selected;
1209 aSel->selectedObjects( selected );
1211 if( !selected.IsEmpty() ){
1212 Handle(SALOME_InteractiveObject) anIO = selected.First();
1214 SMESH_Actor::eControl aControl = SMESH_Actor::eNone;
1215 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIO->getEntry())){
1216 switch ( theCommandID ){
1218 aControl = SMESH_Actor::eLength;
1221 aControl = SMESH_Actor::eLength2D;
1224 aControl = SMESH_Actor::eFreeEdges;
1227 aControl = SMESH_Actor::eFreeBorders;
1230 aControl = SMESH_Actor::eMultiConnection;
1233 aControl = SMESH_Actor::eFreeNodes;
1236 aControl = SMESH_Actor::eMultiConnection2D;
1239 aControl = SMESH_Actor::eArea;
1242 aControl = SMESH_Actor::eTaper;
1245 aControl = SMESH_Actor::eAspectRatio;
1248 aControl = SMESH_Actor::eAspectRatio3D;
1251 aControl = SMESH_Actor::eMinimumAngle;
1254 aControl = SMESH_Actor::eWarping;
1257 aControl = SMESH_Actor::eSkew;
1260 aControl = SMESH_Actor::eVolume3D;
1263 aControl = SMESH_Actor::eFreeFaces;
1266 aControl = SMESH_Actor::eMaxElementLength2D;
1269 aControl = SMESH_Actor::eMaxElementLength3D;
1272 aControl = SMESH_Actor::eBareBorderVolume;
1275 aControl = SMESH_Actor::eBareBorderFace;
1278 aControl = SMESH_Actor::eOverConstrainedVolume;
1281 aControl = SMESH_Actor::eOverConstrainedFace;
1284 anActor->SetControlMode(aControl);
1285 anActor->GetScalarBarActor()->SetTitle( functorToString( anActor->GetFunctor() ).toLatin1().constData() );
1286 SMESH::RepaintCurrentView();
1287 #ifndef DISABLE_PLOT2DVIEWER
1288 if(anActor->GetPlot2Histogram()) {
1289 SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram();
1290 QString functorName = functorToString( anActor->GetFunctor());
1291 QString aHistogramName("%1 : %2");
1292 aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName);
1293 aHistogram->setName(aHistogramName);
1294 aHistogram->setHorTitle(functorName);
1295 SMESH::ProcessIn2DViewers(anActor);
1304 bool CheckOIType(const Handle(SALOME_InteractiveObject) & theIO,
1305 MeshObjectType theType,
1306 const QString theInTypeName,
1307 QString & theOutTypeName)
1309 SMESH_TypeFilter aTypeFilter( theType );
1311 if( !theIO.IsNull() )
1313 entry = theIO->getEntry();
1314 LightApp_DataOwner owner( entry );
1315 if ( aTypeFilter.isOk( &owner )) {
1316 theOutTypeName = theInTypeName;
1324 QString CheckTypeObject(const Handle(SALOME_InteractiveObject) & theIO)
1326 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
1327 _PTR(SObject) aSObj = aStudy->FindObjectID(theIO->getEntry());
1329 _PTR(SComponent) aSComp = aSObj->GetFatherComponent();
1330 CORBA::String_var anID = aSComp->GetID().c_str();
1331 if (!strcmp(anID.in(),theIO->getEntry()))
1337 CheckOIType ( theIO, HYPOTHESIS, "Hypothesis", aTypeName ) ||
1338 CheckOIType ( theIO, ALGORITHM, "Algorithm", aTypeName ) ||
1339 CheckOIType ( theIO, MESH, "Mesh", aTypeName ) ||
1340 CheckOIType ( theIO, SUBMESH, "SubMesh", aTypeName ) ||
1341 CheckOIType ( theIO, GROUP, "Group", aTypeName )
1349 QString CheckHomogeneousSelection()
1351 //SUIT_Study* aStudy = SMESH::GetActiveStudy();
1352 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1353 SALOME_ListIO selected;
1355 aSel->selectedObjects( selected );
1357 QString RefType = CheckTypeObject(selected.First());
1358 SALOME_ListIteratorOfListIO It(selected);
1359 for ( ; It.More(); It.Next())
1361 Handle(SALOME_InteractiveObject) IObject = It.Value();
1362 QString Type = CheckTypeObject(IObject);
1363 if (Type.compare(RefType) != 0)
1364 return "Heterogeneous Selection";
1371 void SMESHGUI::OnEditDelete()
1373 // VSR 17/11/04: check if all objects selected belong to SMESH component --> start
1374 LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr();
1375 SALOME_ListIO selected; aSel->selectedObjects( selected, QString::null, false );
1377 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
1378 _PTR(StudyBuilder) aStudyBuilder = aStudy->NewBuilder();
1379 _PTR(GenericAttribute) anAttr;
1380 _PTR(AttributeIOR) anIOR;
1382 int objectCount = 0;
1384 QString aParentComponent = QString::null;
1385 Handle(SALOME_InteractiveObject) anIO;
1386 for( SALOME_ListIteratorOfListIO anIt( selected ); anIt.More(); anIt.Next() )
1388 anIO = anIt.Value();
1389 QString cur = anIO->getComponentDataType();
1390 _PTR(SObject) aSO = aStudy->FindObjectID(anIO->getEntry());
1392 // check if object is reference
1393 _PTR(SObject) aRefSObj;
1394 aNameList.append("\n - ");
1395 if ( aSO->ReferencedObject( aRefSObj ) ) {
1396 QString aRefName = QString::fromStdString ( aRefSObj->GetName() );
1397 aNameList.append( aRefName );
1398 cur = QString::fromStdString ( aRefSObj->GetFatherComponent()->ComponentDataType() );
1401 aNameList.append(anIO->getName());
1405 if( aParentComponent.isNull() )
1406 aParentComponent = cur;
1407 else if( !aParentComponent.isEmpty() && aParentComponent!=cur )
1408 aParentComponent = "";
1411 if ( objectCount == 0 )
1412 return; // No Valid Objects Selected
1414 if ( aParentComponent != SMESHGUI::GetSMESHGUI()->name() ) {
1415 SUIT_MessageBox::warning( SMESHGUI::desktop(),
1416 QObject::tr("ERR_ERROR"),
1417 QObject::tr("NON_SMESH_OBJECTS_SELECTED").arg( SMESHGUI::GetSMESHGUI()->moduleName() ) );
1420 // VSR 17/11/04: check if all objects selected belong to SMESH component <-- finish
1421 if (SUIT_MessageBox::warning
1422 (SMESHGUI::desktop(),
1423 QObject::tr("SMESH_WRN_WARNING"),
1424 QObject::tr("SMESH_REALLY_DELETE").arg( objectCount ).arg( aNameList ),
1425 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1426 SUIT_MessageBox::Yes) != SUIT_MessageBox::Yes)
1429 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
1431 SALOME_ListIteratorOfListIO It(selected);
1433 aStudyBuilder->NewCommand(); // There is a transaction
1434 for( ; It.More(); It.Next()){ // loop on selected IO's
1435 Handle(SALOME_InteractiveObject) IObject = It.Value();
1436 if(IObject->hasEntry()) {
1437 _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry());
1439 // disable removal of "SMESH" component object
1440 if(aSO->FindAttribute(anAttr, "AttributeIOR")){
1442 if ( engineIOR() == anIOR->Value().c_str() )
1445 //Check the referenced object
1446 _PTR(SObject) aRefSObject;
1447 if ( aSO && aSO->ReferencedObject( aRefSObject ) )
1448 aSO = aRefSObject; // Delete main Object instead of reference
1450 // put the whole hierarchy of sub-objects of the selected SO into a list and
1451 // then treat them all starting from the deepest objects (at list back)
1453 std::list< _PTR(SObject) > listSO;
1454 listSO.push_back( aSO );
1455 std::list< _PTR(SObject) >::iterator itSO = listSO.begin();
1456 for ( ; itSO != listSO.end(); ++itSO ) {
1457 _PTR(ChildIterator) it = aStudy->NewChildIterator( *itSO );
1458 for (it->InitEx(false); it->More(); it->Next())
1459 listSO.push_back( it->Value() );
1462 // treat SO's in the list starting from the back
1464 std::list< _PTR(SObject) >::reverse_iterator ritSO = listSO.rbegin();
1465 for ( ; ritSO != listSO.rend(); ++ritSO ) {
1466 _PTR(SObject) SO = *ritSO;
1467 if ( !SO ) continue;
1468 std::string anEntry = SO->GetID();
1470 /** Erase graphical object **/
1471 if(SO->FindAttribute(anAttr, "AttributeIOR")){
1472 ViewManagerList aViewMenegers = anApp->viewManagers();
1473 ViewManagerList::const_iterator it = aViewMenegers.begin();
1474 for( ; it != aViewMenegers.end(); it++) {
1475 SUIT_ViewManager* vm = *it;
1476 int nbSf = vm ? vm->getViewsCount() : 0;
1478 QVector<SUIT_ViewWindow*> aViews = vm->getViews();
1479 for(int i = 0; i < nbSf; i++){
1480 SUIT_ViewWindow *sf = aViews[i];
1481 if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,anEntry.c_str())){
1482 SMESH::RemoveActor(sf,anActor);
1488 /** Remove an object from data structures **/
1489 SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO ));
1490 SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( SO ));
1491 if ( !aGroup->_is_nil() ) { // DELETE GROUP
1492 SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh();
1493 aMesh->RemoveGroup( aGroup );
1495 else if ( !aSubMesh->_is_nil() ) { // DELETE SUBMESH
1496 SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
1497 aMesh->RemoveSubMesh( aSubMesh );
1499 _PTR(SObject) aMeshSO = SMESH::FindSObject(aMesh);
1501 SMESH::ModifiedMesh(aMeshSO, false, aMesh->NbNodes()==0);
1504 IObject = new SALOME_InteractiveObject
1505 ( anEntry.c_str(), engineIOR().toLatin1().data(), SO->GetName().c_str() );
1506 QString objType = CheckTypeObject(IObject);
1507 if ( objType == "Hypothesis" || objType == "Algorithm" ) {// DELETE HYPOTHESIS
1508 SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
1509 aStudyBuilder->RemoveObjectWithChildren( SO );
1511 else {// default action: remove SObject from the study
1512 // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH
1513 //SUIT_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy);
1515 aStudyBuilder->RemoveObjectWithChildren( SO );
1519 } /* listSO back loop */
1520 } /* IObject->hasEntry() */
1523 aStudyBuilder->CommitCommand();
1525 /* Clear any previous selection */
1527 aSel->setSelectedObjects( l1 );
1529 SMESHGUI::GetSMESHGUI()->updateObjBrowser();
1534 SMESHGUI_EXPORT CAM_Module* createModule()
1536 return new SMESHGUI();
1540 SMESH::SMESH_Gen_var SMESHGUI::myComponentSMESH = SMESH::SMESH_Gen::_nil();
1542 //=============================================================================
1546 //=============================================================================
1547 SMESHGUI::SMESHGUI() :
1548 SalomeApp_Module( "SMESH" ),
1549 LightApp_Module( "SMESH" )
1551 if ( CORBA::is_nil( myComponentSMESH ) )
1553 CORBA::Boolean anIsEmbeddedMode;
1554 myComponentSMESH = SMESH_Client::GetSMESHGen(getApp()->orb(),anIsEmbeddedMode);
1555 MESSAGE("-------------------------------> anIsEmbeddedMode=" << anIsEmbeddedMode);
1557 // 0019923: EDF 765 SMESH : default values of hypothesis
1558 SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
1559 int nbSeg = aResourceMgr->integerValue( "SMESH", "segmentation", 10 );
1560 myComponentSMESH->SetBoundaryBoxSegmentation( nbSeg );
1561 nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
1562 myComponentSMESH->SetDefaultNbSegments( nbSeg );
1565 myActiveDialogBox = 0;
1566 myFilterLibraryDlg = 0;
1570 myEventCallbackCommand = vtkCallbackCommand::New();
1571 myEventCallbackCommand->Delete();
1572 myEventCallbackCommand->SetClientData( this );
1573 myEventCallbackCommand->SetCallback( SMESHGUI::ProcessEvents );
1576 SMESH::GetFilterManager();
1577 SMESH::GetPattern();
1578 SMESH::GetMeasurements();
1580 /* load resources for all available meshers */
1581 SMESH::InitAvailableHypotheses();
1584 //=============================================================================
1588 //=============================================================================
1589 SMESHGUI::~SMESHGUI()
1591 #ifdef WITHGENERICOBJ
1592 SMESH::GetFilterManager()->UnRegister();
1593 SMESH::GetMeasurements()->UnRegister();
1595 SMESH::GetFilterManager() = SMESH::FilterManager::_nil();
1596 SMESH::GetMeasurements() = SMESH::Measurements::_nil();
1599 //=============================================================================
1603 //=============================================================================
1604 LightApp_SelectionMgr* SMESHGUI::selectionMgr()
1606 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
1608 return dynamic_cast<LightApp_SelectionMgr*>( anApp->selectionMgr() );
1613 //=============================================================================
1617 //=============================================================================
1618 bool SMESHGUI::automaticUpdate(unsigned int requestedSize, bool* limitExceeded)
1620 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
1624 bool autoUpdate = resMgr->booleanValue( "SMESH", "auto_update", false );
1625 long updateLimit = resMgr->integerValue( "SMESH", "update_limit", 500000 );
1626 bool exceeded = updateLimit > 0 && requestedSize > updateLimit;
1627 if ( limitExceeded ) *limitExceeded = autoUpdate && exceeded;
1628 return autoUpdate && !exceeded;
1631 //=============================================================================
1635 //=============================================================================
1636 SUIT_ResourceMgr* SMESHGUI::resourceMgr()
1638 return dynamic_cast<SUIT_ResourceMgr*>( SUIT_Session::session()->resourceMgr() );
1641 //=============================================================================
1645 //=============================================================================
1646 SMESHGUI* SMESHGUI::GetSMESHGUI()
1648 SMESHGUI* smeshMod = 0;
1649 SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
1652 CAM_Module* module = app->module( "Mesh" );
1653 smeshMod = dynamic_cast<SMESHGUI*>( module );
1656 if ( smeshMod && smeshMod->application() && smeshMod->application()->activeStudy() )
1658 SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( smeshMod->application()->activeStudy() );
1661 _PTR(Study) aStudy = study->studyDS();
1663 GetSMESHGen()->SetCurrentStudy( _CAST(Study,aStudy)->GetStudy() );
1672 Standard_EXPORT SMESHGUI* GetComponentGUI()
1674 return SMESHGUI::GetSMESHGUI();
1678 //=============================================================================
1682 //=============================================================================
1683 void SMESHGUI::SetState(int aState)
1688 //=============================================================================
1692 //=============================================================================
1693 void SMESHGUI::ResetState()
1698 //=============================================================================
1702 //=============================================================================
1703 void SMESHGUI::EmitSignalDeactivateDialog()
1705 emit SignalDeactivateActiveDialog();
1708 //=============================================================================
1712 //=============================================================================
1713 void SMESHGUI::EmitSignalStudyFrameChanged()
1715 emit SignalStudyFrameChanged();
1718 //=============================================================================
1722 //=============================================================================
1723 void SMESHGUI::EmitSignalCloseAllDialogs()
1725 emit SignalCloseAllDialogs();
1728 //=============================================================================
1732 //=============================================================================
1733 void SMESHGUI::EmitSignalVisibilityChanged()
1735 emit SignalVisibilityChanged();
1738 //=============================================================================
1742 //=============================================================================
1743 QDialog *SMESHGUI::GetActiveDialogBox()
1745 return myActiveDialogBox;
1748 //=============================================================================
1752 //=============================================================================
1753 void SMESHGUI::SetActiveDialogBox(QDialog * aDlg)
1755 myActiveDialogBox = (QDialog *) aDlg;
1759 //=============================================================================
1763 //=============================================================================
1764 SUIT_Desktop* SMESHGUI::desktop()
1766 SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
1768 return app->desktop();
1773 //=============================================================================
1777 //=============================================================================
1778 SalomeApp_Study* SMESHGUI::activeStudy()
1780 SUIT_Application* app = SUIT_Session::session()->activeApplication();
1782 return dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
1787 //=============================================================================
1791 //=============================================================================
1792 void SMESHGUI::Modified( bool theIsUpdateActions )
1794 if( SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() ) ) {
1795 if( SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) ) {
1796 appStudy->Modified();
1797 if( theIsUpdateActions )
1798 app->updateActions();
1803 //=============================================================================
1807 //=============================================================================
1808 bool SMESHGUI::DefineDlgPosition(QWidget * aDlg, int &x, int &y)
1810 /* Here the position is on the bottom right corner - 10 */
1811 // aDlg->resize(QSize().expandedTo(aDlg->minimumSizeHint()));
1813 SUIT_Desktop *PP = desktop();
1814 x = abs(PP->x() + PP->size().width() - aDlg->size().width() - 10);
1815 y = abs(PP->y() + PP->size().height() - aDlg->size().height() - 10);
1819 //=============================================================================
1823 //=============================================================================
1824 static int isStudyLocked(_PTR(Study) theStudy){
1825 return theStudy->GetProperties()->IsLocked();
1828 static bool checkLock(_PTR(Study) theStudy) {
1829 if (isStudyLocked(theStudy)) {
1830 SUIT_MessageBox::warning( SMESHGUI::desktop(),
1831 QObject::tr("WRN_WARNING"),
1832 QObject::tr("WRN_STUDY_LOCKED") );
1838 //=======================================================================
1839 //function : CheckActiveStudyLocked
1841 //=======================================================================
1843 bool SMESHGUI::isActiveStudyLocked()
1845 _PTR(Study) aStudy = activeStudy()->studyDS();
1846 return checkLock( aStudy );
1849 //=============================================================================
1853 //=============================================================================
1854 bool SMESHGUI::OnGUIEvent( int theCommandID )
1856 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
1860 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); //Document OCAF de l'etude active
1861 SUIT_ResourceMgr* mgr = resourceMgr();
1865 if (CORBA::is_nil(GetSMESHGen()->GetCurrentStudy())) {
1866 GetSMESHGen()->SetCurrentStudy(_CAST(Study,aStudy)->GetStudy());
1869 SUIT_ViewWindow* view = application()->desktop()->activeWindow();
1870 SVTK_ViewWindow* vtkwnd = dynamic_cast<SVTK_ViewWindow*>( view );
1872 //QAction* act = action( theCommandID );
1874 switch (theCommandID) {
1876 if(checkLock(aStudy)) break;
1885 if(checkLock(aStudy)) break;
1886 ::ImportMeshesFromFile(GetSMESHGen(),theCommandID);
1890 case 150: //MED FILE INFORMATION
1892 SALOME_ListIO selected;
1893 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1895 aSel->selectedObjects( selected );
1896 if( selected.Extent() )
1898 Handle(SALOME_InteractiveObject) anIObject = selected.First();
1899 SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIObject);
1900 if ( !aMesh->_is_nil() )
1902 SMESHGUI_FileInfoDlg dlg( desktop(), aMesh->GetMEDFileInfo() );
1909 case 122: // EXPORT MED
1917 ::ExportMeshToFile(theCommandID);
1921 case 200: // SCALAR BAR
1923 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
1924 SALOME_ListIO selected;
1926 aSel->selectedObjects( selected );
1928 if( selected.Extent() ) {
1929 Handle(SALOME_InteractiveObject) anIO = selected.First();
1930 if( anIO->hasEntry() ) {
1931 if( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) {
1932 anActor->SetControlMode( SMESH_Actor::eNone );
1933 #ifndef DISABLE_PLOT2DVIEWER
1934 SMESH::ProcessIn2DViewers(anActor,SMESH::RemoveFrom2dViewer);
1943 SMESHGUI_Preferences_ScalarBarDlg::ScalarBarProperties( this );
1948 // dump control distribution data to the text file
1949 ::SaveDistribution();
1955 // show/ distribution
1956 ::ShowDistribution();
1960 #ifndef DISABLE_PLOT2DVIEWER
1963 // plot distribution
1964 ::PlotDistribution();
1975 ::DisableAutoColor();
1978 case 1134: // Clipping
1979 case 1133: // Tranparency
1980 case 1132: // Colors / Size
1987 ::SetDisplayMode(theCommandID, myMarkerMap);
1990 //2D quadratic representation
1993 ::SetDisplayMode(theCommandID, myMarkerMap);
1997 case 216: // 0D elements
2000 case 219: // Volumes
2001 case 220: // All Entity
2002 ::SetDisplayEntity(theCommandID);
2005 case 221: // Orientation of faces
2007 LightApp_SelectionMgr* mgr = selectionMgr();
2008 SALOME_ListIO selected; mgr->selectedObjects( selected );
2010 SALOME_ListIteratorOfListIO it(selected);
2011 for( ; it.More(); it.Next()) {
2012 Handle(SALOME_InteractiveObject) anIObject = it.Value();
2013 if(anIObject->hasEntry()) {
2014 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){
2015 anActor->SetFacesOriented( !anActor->GetFacesOriented() );
2024 if(checkLock(aStudy)) break;
2026 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
2029 SMESH::UpdateView();
2031 catch (std::bad_alloc) { // PAL16774 (Crash after display of many groups)
2032 SMESH::OnVisuException();
2034 catch (...) { // PAL16774 (Crash after display of many groups)
2035 SMESH::OnVisuException();
2039 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2040 aSel->selectedObjects( l );
2041 aSel->setSelectedObjects( l );
2046 case 301: // DISPLAY
2047 case 302: // DISPLAY ONLY
2049 SMESH::EDisplaing anAction;
2050 switch (theCommandID) {
2051 case 300: anAction = SMESH::eErase; break;
2052 case 301: anAction = SMESH::eDisplay; break;
2053 case 302: anAction = SMESH::eDisplayOnly; break;
2056 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2057 SALOME_ListIO sel_objects, to_process;
2059 aSel->selectedObjects( sel_objects );
2061 if( theCommandID==302 )
2063 MESSAGE("anAction = SMESH::eDisplayOnly");
2064 startOperation( myEraseAll );
2067 extractContainers( sel_objects, to_process );
2070 #if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
2074 SALOME_ListIteratorOfListIO It( to_process );
2075 for ( ; It.More(); It.Next()) {
2077 Handle(SALOME_InteractiveObject) IOS = It.Value();
2078 if (IOS->hasEntry()) {
2080 if (!SMESH::UpdateView(anAction, IOS->getEntry())) {
2081 SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged();
2082 break; // PAL16774 (Crash after display of many groups)
2084 if (anAction == SMESH::eDisplayOnly)
2086 MESSAGE("anAction = SMESH::eDisplayOnly");
2087 anAction = SMESH::eDisplay;
2093 // PAL13338 + PAL15161 -->
2094 if ( ( theCommandID==301 || theCommandID==302 ) && !checkLock(aStudy)) {
2095 MESSAGE("anAction = SMESH::eDisplayOnly");
2096 SMESH::UpdateView();
2097 SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged();
2099 // PAL13338 + PAL15161 <--
2101 catch (...) { // PAL16774 (Crash after display of many groups)
2102 SMESH::OnVisuException();
2105 if (anAction == SMESH::eErase) {
2106 MESSAGE("anAction == SMESH::eErase");
2108 aSel->setSelectedObjects( l1 );
2111 aSel->setSelectedObjects( to_process );
2118 if(checkLock(aStudy)) break;
2121 EmitSignalDeactivateDialog();
2123 ( new SMESHGUI_NodesDlg( this ) )->show();
2126 SUIT_MessageBox::warning(desktop(),
2127 tr("SMESH_WRN_WARNING"),
2128 tr("SMESH_WRN_VIEWER_VTK"));
2133 case 2151: // FILTER
2137 EmitSignalDeactivateDialog();
2138 ( new SMESHGUI_FilterDlg( this, SMESH::EDGE ) )->show();
2143 case 701: // COMPUTE MESH
2144 case 711: // PRECOMPUTE MESH
2145 case 712: // EVALUATE MESH
2146 case 713: // MESH ORDER
2148 if (checkLock(aStudy)) break;
2149 startOperation( theCommandID );
2153 case 702: // Create mesh
2154 case 703: // Create sub-mesh
2155 case 704: // Edit mesh/sub-mesh
2156 startOperation( theCommandID );
2158 case 705: // copy mesh
2160 if (checkLock(aStudy)) break;
2161 EmitSignalDeactivateDialog();
2162 ( new SMESHGUI_CopyMeshDlg( this ) )->show();
2165 case 710: // Build compound mesh
2167 if (checkLock(aStudy)) break;
2168 EmitSignalDeactivateDialog();
2169 ( new SMESHGUI_BuildCompoundDlg( this ) )->show();
2173 case 407: // DIAGONAL INVERSION
2174 case 408: // Delete diagonal
2178 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2179 tr( "NOT_A_VTK_VIEWER" ) );
2183 if ( checkLock( aStudy ) )
2186 /*Standard_Boolean aRes;
2187 SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IObject);
2188 if ( aMesh->_is_nil() )
2190 SUIT_MessageBox::warning(GetDesktop(), tr( "SMESH_WRN_WARNING" ),
2191 tr( "SMESH_BAD_SELECTION" ) );
2195 EmitSignalDeactivateDialog();
2196 if ( theCommandID == 407 )
2197 ( new SMESHGUI_TrianglesInversionDlg( this ) )->show();
2199 ( new SMESHGUI_UnionOfTwoTrianglesDlg( this ) )->show();
2202 case 409: // Change orientation
2203 case 410: // Union of triangles
2204 case 411: // Cutting of quadrangles
2205 case 419: // Splitting volumes into tetrahedra
2209 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2210 tr( "NOT_A_VTK_VIEWER" ) );
2214 if ( checkLock( aStudy ) )
2217 EmitSignalDeactivateDialog();
2218 SMESHGUI_MultiEditDlg* aDlg = NULL;
2219 if ( theCommandID == 409 )
2220 aDlg = new SMESHGUI_ChangeOrientationDlg(this);
2221 else if ( theCommandID == 410 )
2222 aDlg = new SMESHGUI_UnionOfTrianglesDlg(this);
2223 else if ( theCommandID == 419 )
2224 aDlg = new SMESHGUI_CuttingIntoTetraDlg(this);
2226 aDlg = new SMESHGUI_CuttingOfQuadsDlg(this);
2231 case 412: // Smoothing
2233 if(checkLock(aStudy)) break;
2235 EmitSignalDeactivateDialog();
2236 ( new SMESHGUI_SmoothingDlg( this ) )->show();
2239 SUIT_MessageBox::warning(desktop(),
2240 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2244 case 413: // Extrusion
2246 if (checkLock(aStudy)) break;
2248 EmitSignalDeactivateDialog();
2249 ( new SMESHGUI_ExtrusionDlg ( this ) )->show();
2251 SUIT_MessageBox::warning(desktop(),
2252 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2256 case 414: // Revolution
2258 if(checkLock(aStudy)) break;
2260 EmitSignalDeactivateDialog();
2261 ( new SMESHGUI_RevolutionDlg( this ) )->show();
2264 SUIT_MessageBox::warning(desktop(),
2265 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2269 case 415: // Pattern mapping
2271 if ( checkLock( aStudy ) )
2275 EmitSignalDeactivateDialog();
2276 ( new SMESHGUI_MeshPatternDlg( this ) )->show();
2279 SUIT_MessageBox::warning(desktop(),
2280 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2284 case 416: // Extrusion along a path
2286 if (checkLock(aStudy)) break;
2288 EmitSignalDeactivateDialog();
2289 ( new SMESHGUI_ExtrusionAlongPathDlg( this ) )->show();
2291 SUIT_MessageBox::warning(desktop(),
2292 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2296 case 417: // Convert mesh to quadratic
2298 startOperation( 417 );
2299 /* if (checkLock(aStudy)) break;
2301 EmitSignalDeactivateDialog();
2302 new SMESHGUI_ConvToQuadDlg();
2304 SUIT_MessageBox::warning(desktop(),
2305 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2309 case 418: // create 2D mesh from 3D
2311 startOperation( 418 );
2314 case 806: // CREATE GEO GROUP
2316 startOperation( 806 );
2319 case 801: // CREATE GROUP
2323 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2324 tr( "NOT_A_VTK_VIEWER" ) );
2328 if(checkLock(aStudy)) break;
2329 EmitSignalDeactivateDialog();
2330 SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_nil();
2332 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2333 SALOME_ListIO selected;
2335 aSel->selectedObjects( selected );
2337 int nbSel = selected.Extent();
2339 // check if mesh is selected
2340 aMesh = SMESH::GetMeshByIO( selected.First() );
2342 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aMesh);
2347 case 802: // CONSTRUCT GROUP
2351 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2352 tr( "NOT_A_VTK_VIEWER" ) );
2356 if(checkLock(aStudy)) break;
2357 EmitSignalDeactivateDialog();
2359 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2360 SALOME_ListIO selected;
2362 aSel->selectedObjects( selected );
2364 int nbSel = selected.Extent();
2366 // check if submesh is selected
2367 Handle(SALOME_InteractiveObject) IObject = selected.First();
2368 if (IObject->hasEntry()) {
2369 _PTR(SObject) aSObj = aStudy->FindObjectID(IObject->getEntry());
2371 SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( aSObj ) );
2372 if (!aSubMesh->_is_nil()) {
2374 SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather();
2375 // get submesh elements list by types
2376 SMESH::long_array_var aNodes = aSubMesh->GetElementsByType(SMESH::NODE);
2377 SMESH::long_array_var aEdges = aSubMesh->GetElementsByType(SMESH::EDGE);
2378 SMESH::long_array_var aFaces = aSubMesh->GetElementsByType(SMESH::FACE);
2379 SMESH::long_array_var aVolumes = aSubMesh->GetElementsByType(SMESH::VOLUME);
2380 // create group for each type o elements
2381 QString aName = IObject->getName();
2382 QStringList anEntryList;
2383 if (aNodes->length() > 0) {
2384 SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::NODE, aName + "_Nodes");
2385 aGroup->Add(aNodes.inout());
2386 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( aGroup ) )
2387 anEntryList.append( aSObject->GetID().c_str() );
2389 if (aEdges->length() > 0) {
2390 SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::EDGE, aName + "_Edges");
2391 aGroup->Add(aEdges.inout());
2392 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( aGroup ) )
2393 anEntryList.append( aSObject->GetID().c_str() );
2395 if (aFaces->length() > 0) {
2396 SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::FACE, aName + "_Faces");
2397 aGroup->Add(aFaces.inout());
2398 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( aGroup ) )
2399 anEntryList.append( aSObject->GetID().c_str() );
2401 if (aVolumes->length() > 0) {
2402 SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::VOLUME, aName + "_Volumes");
2403 aGroup->Add(aVolumes.inout());
2404 if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( aGroup ) )
2405 anEntryList.append( aSObject->GetID().c_str() );
2408 anApp->browseObjects( anEntryList );
2410 catch(const SALOME::SALOME_Exception & S_ex){
2411 SalomeApp_Tools::QtCatchCorbaException(S_ex);
2418 SUIT_MessageBox::warning(desktop(),
2419 tr("SMESH_WRN_WARNING"),
2420 tr("SMESH_WRN_NO_AVAILABLE_DATA"));
2425 case 803: // EDIT GROUP
2429 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2430 tr( "NOT_A_VTK_VIEWER" ) );
2434 if(checkLock(aStudy)) break;
2435 EmitSignalDeactivateDialog();
2437 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2438 SALOME_ListIO selected;
2440 aSel->selectedObjects( selected );
2442 SALOME_ListIteratorOfListIO It (selected);
2443 int nbSelectedGroups = 0;
2444 for ( ; It.More(); It.Next() )
2446 SMESH::SMESH_GroupBase_var aGroup =
2447 SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(It.Value());
2448 if (!aGroup->_is_nil()) {
2450 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aGroup);
2454 if (nbSelectedGroups == 0)
2456 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, SMESH::SMESH_GroupBase::_nil());
2462 case 804: // Add elements to group
2464 if(checkLock(aStudy)) break;
2465 if (myState == 800) {
2466 SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) myActiveDialogBox;
2467 if (aDlg) aDlg->onAdd();
2472 case 805: // Remove elements from group
2474 if(checkLock(aStudy)) break;
2475 if (myState == 800) {
2476 SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) myActiveDialogBox;
2477 if (aDlg) aDlg->onRemove();
2482 case 815: // Edit GEOM GROUP as standalone
2486 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2487 tr( "NOT_A_VTK_VIEWER" ) );
2491 if(checkLock(aStudy)) break;
2492 EmitSignalDeactivateDialog();
2494 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2495 SALOME_ListIO selected;
2497 aSel->selectedObjects( selected );
2499 SALOME_ListIteratorOfListIO It (selected);
2500 for ( ; It.More(); It.Next() )
2502 SMESH::SMESH_GroupOnGeom_var aGroup =
2503 SMESH::IObjectToInterface<SMESH::SMESH_GroupOnGeom>(It.Value());
2504 if (!aGroup->_is_nil()) {
2505 SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aGroup, true );
2512 case 810: // Union Groups
2513 case 811: // Intersect groups
2514 case 812: // Cut groups
2518 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2519 tr( "NOT_A_VTK_VIEWER" ) );
2523 if ( checkLock( aStudy ) )
2526 EmitSignalDeactivateDialog();
2528 SMESHGUI_GroupOpDlg* aDlg = 0;
2529 if ( theCommandID == 810 )
2530 aDlg = new SMESHGUI_UnionGroupsDlg( this );
2531 else if ( theCommandID == 811 )
2532 aDlg = new SMESHGUI_IntersectGroupsDlg( this );
2534 aDlg = new SMESHGUI_CutGroupsDlg( this );
2541 case 814: // Create groups of entities from existing groups of superior dimensions
2543 if ( checkLock( aStudy ) )
2546 EmitSignalDeactivateDialog();
2547 SMESHGUI_GroupOpDlg* aDlg = new SMESHGUI_DimGroupDlg( this );
2553 case 813: // Delete groups with their contents
2557 SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),
2558 tr( "NOT_A_VTK_VIEWER" ) );
2562 if ( checkLock( aStudy ) )
2565 EmitSignalDeactivateDialog();
2567 ( new SMESHGUI_DeleteGroupDlg( this ) )->show();
2571 case 900: // MESH INFOS
2572 case 903: // WHAT IS
2574 int page = theCommandID == 900 ? SMESHGUI_MeshInfoDlg::BaseInfo : SMESHGUI_MeshInfoDlg::ElemInfo;
2575 EmitSignalDeactivateDialog();
2576 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2577 SALOME_ListIO selected;
2579 aSel->selectedObjects( selected );
2581 if ( selected.Extent() > 1 ) { // a dlg for each IO
2582 SALOME_ListIteratorOfListIO It( selected );
2583 for ( ; It.More(); It.Next() ) {
2584 SMESHGUI_MeshInfoDlg* dlg = new SMESHGUI_MeshInfoDlg( SMESHGUI::desktop(), page );
2585 dlg->showInfo( It.Value() );
2590 SMESHGUI_MeshInfoDlg* dlg = new SMESHGUI_MeshInfoDlg( SMESHGUI::desktop(), page );
2596 case 902: // STANDARD MESH INFOS
2598 EmitSignalDeactivateDialog();
2599 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2600 SALOME_ListIO selected;
2602 aSel->selectedObjects( selected );
2604 if ( selected.Extent() > 1 ) { // a dlg for each IO
2606 SALOME_ListIteratorOfListIO It (selected);
2607 for ( ; It.More(); It.Next() ) {
2609 IOs.Append( It.Value() );
2610 aSel->setSelectedObjects( IOs );
2611 ( new SMESHGUI_StandardMeshInfosDlg( this ) )->show();
2613 // restore selection
2614 aSel->setSelectedObjects( selected );
2617 ( new SMESHGUI_StandardMeshInfosDlg( this ) )->show();
2620 case 903: // WHAT IS
2622 EmitSignalDeactivateDialog();
2623 ( new SMESHGUI_WhatIsDlg( this ) )->show();
2628 case 904: // FIND ELEM
2630 startOperation( theCommandID );
2634 case 1100: // EDIT HYPOTHESIS
2636 if(checkLock(aStudy)) break;
2638 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2639 SALOME_ListIO selected;
2641 aSel->selectedObjects( selected );
2643 int nbSel = selected.Extent();
2646 Handle(SALOME_InteractiveObject) anIObject = selected.First();
2647 SMESH::SMESH_Hypothesis_var aHypothesis = SMESH::IObjectToInterface<SMESH::SMESH_Hypothesis>(anIObject);
2649 /* Look for all mesh objects that have this hypothesis affected in order to flag as ModifiedMesh */
2650 /* At end below '...->updateObjBrowser(true)' will change icon of mesh objects */
2651 /* Warning : however by internal mechanism all subMeshes icons are changed ! */
2652 if ( !aHypothesis->_is_nil() )
2655 //SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHypothesis->GetName());
2656 SMESHGUI_GenericHypothesisCreator* aCreator = SMESH::GetHypothesisCreator(aHypothesis->GetName());
2658 aCreator->edit( aHypothesis.in(), anIObject->getName(), desktop(), this, SLOT( onHypothesisEdit( int ) ) );
2668 case 1102: // REMOVE HYPOTHESIS / ALGORITHMS
2670 if(checkLock(aStudy)) break;
2671 SUIT_OverrideCursor wc;
2673 LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
2674 SALOME_ListIO selected;
2676 aSel->selectedObjects( selected, QString::null, false );
2678 SALOME_ListIteratorOfListIO It(selected);
2679 for (int i = 0; It.More(); It.Next(), i++) {
2680 Handle(SALOME_InteractiveObject) IObject = It.Value();
2681 SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject);
2684 aSel->setSelectedObjects( l1 );
2689 case 4009: // ELEM0D
2690 case 4010: // GEOM::EDGE
2691 case 4021: // TRIANGLE
2693 case 4023: // POLYGON
2697 if(checkLock(aStudy)) break;
2699 EmitSignalDeactivateDialog();
2700 SMDSAbs_ElementType type = SMDSAbs_Edge;
2702 switch (theCommandID) {
2703 case 4009: // ELEM0D
2704 type = SMDSAbs_0DElement; nbNodes = 1; break;
2705 case 4021: // TRIANGLE
2706 type = SMDSAbs_Face; nbNodes = 3; break;
2708 type = SMDSAbs_Face; nbNodes = 4; break;
2710 type = SMDSAbs_Volume; nbNodes = 4; break;
2711 case 4023: // POLYGON
2712 type = SMDSAbs_Face; nbNodes = 5; break; // 5 - identificator for POLYGON
2714 type = SMDSAbs_Volume; nbNodes = 8; break;
2715 case 4033: // POLYHEDRE
2716 type = SMDSAbs_Volume; nbNodes = 9; break; // 9 - identificator for POLYHEDRE
2719 ( new SMESHGUI_AddMeshElementDlg( this, type, nbNodes ) )->show();
2722 SUIT_MessageBox::warning(desktop(),
2723 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2727 case 4033: // POLYHEDRON
2729 if(checkLock(aStudy)) break;
2731 EmitSignalDeactivateDialog();
2732 ( new SMESHGUI_CreatePolyhedralVolumeDlg( this ) )->show();
2735 SUIT_MessageBox::warning(SMESHGUI::desktop(),
2736 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2740 case 4034: // QUADRATIC EDGE
2741 case 4035: // QUADRATIC TRIANGLE
2742 case 4036: // QUADRATIC QUADRANGLE
2743 case 4037: // QUADRATIC TETRAHEDRON
2744 case 4038: // QUADRATIC PYRAMID
2745 case 4039: // QUADRATIC PENTAHEDRON
2746 case 4040: // QUADRATIC HEXAHEDRON
2748 if(checkLock(aStudy)) break;
2750 EmitSignalDeactivateDialog();
2753 switch (theCommandID) {
2755 type = QUAD_EDGE; break;
2757 type = QUAD_TRIANGLE; break;
2759 type = QUAD_QUADRANGLE; break;
2761 type = QUAD_TETRAHEDRON; break;
2763 type = QUAD_PYRAMID; break;
2765 type = QUAD_PENTAHEDRON; break;
2767 type = QUAD_HEXAHEDRON;
2771 ( new SMESHGUI_AddQuadraticElementDlg( this, type ) )->show();
2774 SUIT_MessageBox::warning(SMESHGUI::desktop(),
2775 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2779 case 4041: // REMOVES NODES
2781 if(checkLock(aStudy)) break;
2783 EmitSignalDeactivateDialog();
2784 ( new SMESHGUI_RemoveNodesDlg( this ) )->show();
2787 SUIT_MessageBox::warning(SMESHGUI::desktop(),
2788 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2792 case 4042: // REMOVES ELEMENTS
2794 if(checkLock(aStudy)) break;
2796 EmitSignalDeactivateDialog();
2797 ( new SMESHGUI_RemoveElementsDlg( this ) )->show();
2801 SUIT_MessageBox::warning(SMESHGUI::desktop(),
2802 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2806 case 4043: { // CLEAR_MESH
2808 if(checkLock(aStudy)) break;
2810 SALOME_ListIO selected;
2811 if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
2812 aSel->selectedObjects( selected );
2814 SUIT_OverrideCursor wc;
2815 SALOME_ListIteratorOfListIO It (selected);
2816 for ( ; It.More(); It.Next() )
2818 Handle(SALOME_InteractiveObject) IOS = It.Value();
2819 SMESH::SMESH_Mesh_var aMesh =
2820 SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IOS);
2821 if ( aMesh->_is_nil()) continue;
2823 SMESH::RemoveVisualObjectWithActors(IOS->getEntry(), true);
2825 _PTR(SObject) aMeshSObj = SMESH::FindSObject(aMesh);
2826 SMESH::ModifiedMesh( aMeshSObj, false, true);
2827 // hide groups and submeshes
2828 _PTR(ChildIterator) anIter =
2829 SMESH::GetActiveStudyDocument()->NewChildIterator( aMeshSObj );
2830 for ( anIter->InitEx(true); anIter->More(); anIter->Next() )
2832 _PTR(SObject) so = anIter->Value();
2833 SMESH::RemoveVisualObjectWithActors(so->GetID().c_str(), true);
2836 catch (const SALOME::SALOME_Exception& S_ex){
2838 SalomeApp_Tools::QtCatchCorbaException(S_ex);
2842 SMESH::UpdateView();
2846 case 4044: // REMOVE ORPHAN NODES
2848 if(checkLock(aStudy)) break;
2849 SALOME_ListIO selected;
2850 if( LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr() )
2851 aSel->selectedObjects( selected );
2852 if ( selected.Extent() == 1 ) {
2853 Handle(SALOME_InteractiveObject) anIO = selected.First();
2854 SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(anIO);
2855 if ( !aMesh->_is_nil() ) {
2856 bool confirm = SUIT_MessageBox::question( SMESHGUI::desktop(),
2857 tr( "SMESH_WARNING" ),
2858 tr( "REMOVE_ORPHAN_NODES_QUESTION"),
2859 SUIT_MessageBox::Yes |
2860 SUIT_MessageBox::No,
2861 SUIT_MessageBox::No ) == SUIT_MessageBox::Yes;
2864 SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
2865 int removed = aMeshEditor->RemoveOrphanNodes();
2866 SUIT_MessageBox::information(SMESHGUI::desktop(),
2867 tr("SMESH_INFORMATION"),
2868 tr("NB_NODES_REMOVED").arg(removed));
2869 if ( removed > 0 ) {
2870 SMESH::UpdateView();
2871 SMESHGUI::Modified();
2874 catch (const SALOME::SALOME_Exception& S_ex) {
2875 SalomeApp_Tools::QtCatchCorbaException(S_ex);
2884 case 4051: // RENUMBERING NODES
2886 if(checkLock(aStudy)) break;
2888 EmitSignalDeactivateDialog();
2889 ( new SMESHGUI_RenumberingDlg( this, 0 ) )->show();
2893 SUIT_MessageBox::warning(SMESHGUI::desktop(),
2894 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2898 case 4052: // RENUMBERING ELEMENTS
2900 if(checkLock(aStudy)) break;
2902 EmitSignalDeactivateDialog();
2903 ( new SMESHGUI_RenumberingDlg( this, 1 ) )->show();
2907 SUIT_MessageBox::warning(SMESHGUI::desktop(),
2908 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2912 case 4061: // TRANSLATION
2914 if(checkLock(aStudy)) break;
2916 EmitSignalDeactivateDialog();
2917 ( new SMESHGUI_TranslationDlg( this ) )->show();
2920 SUIT_MessageBox::warning(SMESHGUI::desktop(),
2921 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2925 case 4062: // ROTATION
2927 if(checkLock(aStudy)) break;
2929 EmitSignalDeactivateDialog();
2930 ( new SMESHGUI_RotationDlg( this ) )->show();
2933 SUIT_MessageBox::warning(SMESHGUI::desktop(),
2934 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2938 case 4063: // SYMMETRY
2940 if(checkLock(aStudy)) break;
2942 EmitSignalDeactivateDialog();
2943 ( new SMESHGUI_SymmetryDlg( this ) )->show();
2946 SUIT_MessageBox::warning(SMESHGUI::desktop(),
2947 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2951 case 4064: // SEWING
2953 if(checkLock(aStudy)) break;
2955 EmitSignalDeactivateDialog();
2956 ( new SMESHGUI_SewingDlg( this ) )->show();
2959 SUIT_MessageBox::warning(SMESHGUI::desktop(),
2960 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2964 case 4065: // MERGE NODES
2966 if(checkLock(aStudy)) break;
2968 EmitSignalDeactivateDialog();
2969 ( new SMESHGUI_MergeDlg( this, 0 ) )->show();
2972 SUIT_MessageBox::warning(SMESHGUI::desktop(),
2973 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2977 case 4066: // MERGE EQUAL ELEMENTS
2979 if (checkLock(aStudy)) break;
2981 EmitSignalDeactivateDialog();
2982 ( new SMESHGUI_MergeDlg( this, 1 ) )->show();
2984 SUIT_MessageBox::warning(SMESHGUI::desktop(),
2985 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
2990 case 4067: // MAKE MESH PASS THROUGH POINT
2991 startOperation( 4067 );
2996 if(checkLock(aStudy)) break;
2998 EmitSignalDeactivateDialog();
2999 ( new SMESHGUI_ScaleDlg( this ) )->show();
3002 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3003 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3008 case 4069: // DUPLICATE NODES
3010 if(checkLock(aStudy)) break;
3012 EmitSignalDeactivateDialog();
3013 ( new SMESHGUI_DuplicateNodesDlg( this ) )->show();
3016 SUIT_MessageBox::warning(SMESHGUI::desktop(),
3017 tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"));
3022 case 5105: // Library of selection filters
3024 static QList<int> aTypes;
3025 if ( aTypes.isEmpty() )
3027 aTypes.append( SMESH::NODE );
3028 aTypes.append( SMESH::EDGE );
3029 aTypes.append( SMESH::FACE );
3030 aTypes.append( SMESH::VOLUME );
3032 if (!myFilterLibraryDlg)
3033 myFilterLibraryDlg = new SMESHGUI_FilterLibraryDlg( this, SMESH::GetDesktop( this ), aTypes, SMESHGUI_FilterLibraryDlg::EDIT );
3034 else if (myFilterLibraryDlg->isHidden())
3035 myFilterLibraryDlg->Init( aTypes, SMESHGUI_FilterLibraryDlg::EDIT );
3036 myFilterLibraryDlg->raise();
3040 case 6017: // CONTROLS
3064 LightApp_SelectionMgr* mgr = selectionMgr();
3065 SALOME_ListIO selected; mgr->selectedObjects( selected );
3067 if ( selected.Extent() == 1 && selected.First()->hasEntry() ) {
3068 _PTR(SObject) SO = aStudy->FindObjectID( selected.First()->getEntry() );
3070 CORBA::Object_var aObject = SMESH::SObjectToObject( SO );
3071 SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( aObject );
3072 SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( aObject );
3073 SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( aObject );
3074 if ( !aMesh->_is_nil() || !aSubMesh->_is_nil() || !aGroup->_is_nil() ) {
3075 ::Control( theCommandID );
3080 SUIT_MessageBox::warning(desktop(),
3081 tr( "SMESH_WRN_WARNING" ),
3082 tr( "SMESH_BAD_SELECTION" ) );
3086 SUIT_MessageBox::warning(desktop(),
3087 tr( "SMESH_WRN_WARNING" ),
3088 tr( "NOT_A_VTK_VIEWER" ) );
3093 LightApp_SelectionMgr* mgr = selectionMgr();
3094 SALOME_ListIO selected; mgr->selectedObjects( selected );
3096 SALOME_ListIteratorOfListIO it(selected);
3097 for( ; it.More(); it.Next()) {
3098 Handle(SALOME_InteractiveObject) anIObject = it.Value();
3099 if(anIObject->hasEntry()) {
3100 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){
3101 anActor->SetPointsLabeled( !anActor->GetPointsLabeled() );
3109 LightApp_SelectionMgr* mgr = selectionMgr();
3110 SALOME_ListIO selected; mgr->selectedObjects( selected );
3112 SALOME_ListIteratorOfListIO it(selected);
3113 for( ; it.More(); it.Next()) {
3114 Handle(SALOME_InteractiveObject) anIObject = it.Value();
3115 if(anIObject->hasEntry())
3116 if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){
3117 anActor->SetCellsLabeled( !anActor->GetCellsLabeled() );
3125 int page = theCommandID == 501 ? SMESHGUI_MeasureDlg::MinDistance : SMESHGUI_MeasureDlg::BoundingBox;
3126 EmitSignalDeactivateDialog();
3127 SMESHGUI_MeasureDlg* dlg = new SMESHGUI_MeasureDlg( SMESHGUI::desktop(), page );
3133 anApp->updateActions(); //SRN: To update a Save button in the toolbar
3134 //updateObjBrowser();
3138 //=============================================================================
3142 //=============================================================================
3143 bool SMESHGUI::OnMousePress( QMouseEvent * pe, SUIT_ViewWindow * wnd )
3148 //=============================================================================
3152 //=============================================================================
3153 bool SMESHGUI::OnMouseMove( QMouseEvent * pe, SUIT_ViewWindow * wnd )
3158 //=============================================================================
3162 //=============================================================================
3163 bool SMESHGUI::OnKeyPress( QKeyEvent * pe, SUIT_ViewWindow * wnd )
3168 //=============================================================================
3169 /*! Method: BuildPresentation(const Handle(SALOME_InteractiveObject)& theIO)
3170 * Purpose: ensures that the actor for the given <theIO> exists in the active VTK view
3172 //=============================================================================
3173 void SMESHGUI::BuildPresentation( const Handle(SALOME_InteractiveObject) & theIO,
3174 SUIT_ViewWindow* wnd )
3176 if(theIO->hasEntry()){
3177 //SUIT_ViewWindow* wnd = SMESH::GetActiveWindow();
3178 SMESH::UpdateView(wnd,SMESH::eDisplay,theIO->getEntry());
3182 //=======================================================================
3183 // function : createSMESHAction
3185 //=======================================================================
3186 void SMESHGUI::createSMESHAction( const int id, const QString& po_id, const QString& icon_id,
3187 const int key, const bool toggle, const QString& shortcutAction )
3190 QWidget* parent = application()->desktop();
3191 SUIT_ResourceMgr* resMgr = resourceMgr();
3193 if ( !icon_id.isEmpty() )
3194 pix = resMgr->loadPixmap( "SMESH", tr( icon_id.toLatin1().data() ) );
3196 pix = resMgr->loadPixmap( "SMESH", tr( QString( "ICO_%1" ).arg( po_id ).toLatin1().data() ), false );
3197 if ( !pix.isNull() )
3198 icon = QIcon( pix );
3200 QString tooltip = tr( QString( "TOP_%1" ).arg( po_id ).toLatin1().data() ),
3201 menu = tr( QString( "MEN_%1" ).arg( po_id ).toLatin1().data() ),
3202 status_bar = tr( QString( "STB_%1" ).arg( po_id ).toLatin1().data() );
3204 createAction( id, tooltip, icon, menu, status_bar, key, parent,
3205 toggle, this, SLOT( OnGUIEvent() ), shortcutAction );
3208 //=======================================================================
3209 // function : createPopupItem
3211 //=======================================================================
3212 void SMESHGUI::createPopupItem( const int id,
3213 const QString& clients,
3214 const QString& types,
3215 const QString& theRule,
3220 parentId = popupMgr()->actionId( action( pId ) );
3222 if( !popupMgr()->contains( popupMgr()->actionId( action( id ) ) ) )
3223 popupMgr()->insert( action( id ), parentId, 0 );
3225 QString lc = "$"; // VSR : instead of QtxPopupSelection::defEquality();
3226 QString dc = "selcount"; // VSR : insetad of QtxPopupSelection::defSelCountParam()
3227 QString rule = "(%1) and (%2) and (%3)";
3228 rule = rule.arg( QString( "%1>0" ).arg( dc ) );
3229 if( clients.isEmpty() )
3230 rule = rule.arg( QString( "true" ) );
3232 rule = rule.arg( QString( "%1client in {%2}" ).arg( lc ).arg( clients ) );
3233 rule = rule.arg( QString( "%1type in {%2}" ).arg( lc ).arg( types ) );
3236 bool cont = myRules.contains( id );
3238 rule = QString( "%1 or (%2)" ).arg( myRules[ id ] ).arg( rule );
3240 popupMgr()->setRule( action( id ), rule, QtxPopupMgr::VisibleRule );
3241 myRules[ id ] = QString( cont ? "%1" : "(%1)" ).arg( rule );
3244 //=======================================================================
3245 // function : initialize
3247 //=======================================================================
3248 void SMESHGUI::initialize( CAM_Application* app )
3250 SalomeApp_Module::initialize( app );
3252 // SUIT_ResourceMgr* mgr = app->resourceMgr();
3254 /* Automatic Update flag */
3255 // myAutomaticUpdate = mgr->booleanValue( "SMESH", "AutomaticUpdate", myAutomaticUpdate );
3257 // ----- create actions --------------
3259 createSMESHAction( 111, "DAT", "", (Qt::CTRL+Qt::Key_B) );
3260 createSMESHAction( 112, "UNV", "", (Qt::CTRL+Qt::Key_U) );
3261 createSMESHAction( 113, "MED", "", (Qt::CTRL+Qt::Key_M) );
3262 createSMESHAction( 114, "NUM" );
3263 createSMESHAction( 121, "DAT" );
3264 createSMESHAction( 122, "MED" );
3265 createSMESHAction( 123, "UNV" );
3266 createSMESHAction( 140, "STL" );
3267 createSMESHAction( 124, "EXPORT_DAT" );
3268 createSMESHAction( 125, "EXPORT_MED" );
3269 createSMESHAction( 126, "EXPORT_UNV" );
3270 createSMESHAction( 141, "EXPORT_STL" );
3271 createSMESHAction( 150, "FILE_INFO" );
3272 createSMESHAction( 33, "DELETE", "ICON_DELETE", Qt::Key_Delete );
3273 createSMESHAction( 5105, "SEL_FILTER_LIB" );
3274 createSMESHAction( 701, "COMPUTE", "ICON_COMPUTE" );
3275 createSMESHAction( 702, "CREATE_MESH", "ICON_DLG_INIT_MESH" );
3276 createSMESHAction( 703, "CREATE_SUBMESH", "ICON_DLG_ADD_SUBMESH" );
3277 createSMESHAction( 704, "EDIT_MESHSUBMESH","ICON_DLG_EDIT_MESH" );
3278 createSMESHAction( 705, "COPY_MESH", "ICON_COPY_MESH" );
3279 createSMESHAction( 710, "BUILD_COMPOUND", "ICON_BUILD_COMPOUND" );
3280 createSMESHAction( 711, "PRECOMPUTE", "ICON_PRECOMPUTE" );
3281 createSMESHAction( 712, "EVALUATE", "ICON_COMPUTE" );
3282 createSMESHAction( 713, "MESH_ORDER", "ICON_COMPUTE" );
3283 createSMESHAction( 806, "CREATE_GEO_GROUP","ICON_CREATE_GEO_GROUP" );
3284 createSMESHAction( 801, "CREATE_GROUP", "ICON_CREATE_GROUP" );
3285 createSMESHAction( 802, "CONSTRUCT_GROUP", "ICON_CONSTRUCT_GROUP" );
3286 createSMESHAction( 803, "EDIT_GROUP", "ICON_EDIT_GROUP" );
3287 createSMESHAction( 815, "EDIT_GEOMGROUP_AS_GROUP", "ICON_EDIT_GROUP" );
3288 createSMESHAction( 804, "ADD" );
3289 createSMESHAction( 805, "REMOVE" );
3290 createSMESHAction( 810, "UN_GROUP", "ICON_UNION" );
3291 createSMESHAction( 811, "INT_GROUP", "ICON_INTERSECT" );
3292 createSMESHAction( 812, "CUT_GROUP", "ICON_CUT" );
3293 createSMESHAction( 814, "UNDERLYING_ELEMS","ICON_UNDERLYING_ELEMS" );
3294 createSMESHAction( 813, "DEL_GROUP", "ICON_DEL_GROUP" );
3295 createSMESHAction( 900, "ADV_INFO", "ICON_ADV_INFO" );
3296 //createSMESHAction( 902, "STD_INFO", "ICON_STD_INFO" );
3297 //createSMESHAction( 903, "WHAT_IS", "ICON_WHAT_IS" ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
3298 createSMESHAction( 904, "FIND_ELEM", "ICON_FIND_ELEM" );
3299 createSMESHAction( 6001, "LENGTH", "ICON_LENGTH", 0, true );
3300 createSMESHAction( 6002, "FREE_EDGE", "ICON_FREE_EDGE", 0, true );
3301 createSMESHAction( 6021, "FREE_FACES", "ICON_FREE_FACES", 0, true );
3302 createSMESHAction( 6022, "MAX_ELEMENT_LENGTH_2D", "ICON_MAX_ELEMENT_LENGTH_2D", 0, true );
3303 createSMESHAction( 6023, "MAX_ELEMENT_LENGTH_3D", "ICON_MAX_ELEMENT_LENGTH_3D", 0, true );
3304 createSMESHAction( 6024, "BARE_BORDER_VOLUME","ICON_BARE_BORDER_VOLUME", 0, true );
3305 createSMESHAction( 6025, "BARE_BORDER_FACE","ICON_BARE_BORDER_FACE", 0, true );
3306 createSMESHAction( 6026, "OVER_CONSTRAINED_VOLUME","ICON_OVER_CONSTRAINED_VOLUME", 0, true );
3307 createSMESHAction( 6027, "OVER_CONSTRAINED_FACE","ICON_OVER_CONSTRAINED_FACE", 0, true );
3308 createSMESHAction( 6003, "FREE_BORDER", "ICON_FREE_EDGE_2D", 0, true );
3309 createSMESHAction( 6004, "CONNECTION", "ICON_CONNECTION", 0, true );
3310 createSMESHAction( 6005, "FREE_NODE", "ICON_FREE_NODE", 0, true );
3311 createSMESHAction( 6011, "AREA", "ICON_AREA", 0, true );
3312 createSMESHAction( 6012, "TAPER", "ICON_TAPER", 0, true );
3313 createSMESHAction( 6013, "ASPECT", "ICON_ASPECT", 0, true );
3314 createSMESHAction( 6014, "MIN_ANG", "ICON_ANGLE", 0, true );
3315 createSMESHAction( 6015, "WARP", "ICON_WARP", 0, true );
3316 createSMESHAction( 6016, "SKEW", "ICON_SKEW", 0, true );
3317 createSMESHAction( 6017, "ASPECT_3D", "ICON_ASPECT_3D", 0, true );
3318 createSMESHAction( 6018, "LENGTH_2D", "ICON_LENGTH_2D", 0, true );
3319 createSMESHAction( 6019, "CONNECTION_2D", "ICON_CONNECTION_2D", 0, true );
3320 createSMESHAction( 6009, "VOLUME_3D", "ICON_VOLUME_3D", 0, true );
3321 createSMESHAction( 4000, "NODE", "ICON_DLG_NODE" );
3322 createSMESHAction( 4009, "ELEM0D", "ICON_DLG_ELEM0D" );
3323 createSMESHAction( 4010, "EDGE", "ICON_DLG_EDGE" );
3324 createSMESHAction( 4021, "TRIANGLE", "ICON_DLG_TRIANGLE" );
3325 createSMESHAction( 4022, "QUAD", "ICON_DLG_QUADRANGLE" );
3326 createSMESHAction( 4023, "POLYGON", "ICON_DLG_POLYGON" );
3327 createSMESHAction( 4031, "TETRA", "ICON_DLG_TETRAS" );
3328 createSMESHAction( 4032, "HEXA", "ICON_DLG_HEXAS" );
3329 createSMESHAction( 4041, "REMOVE_NODES", "ICON_DLG_REM_NODE" );
3330 createSMESHAction( 4042, "REMOVE_ELEMENTS", "ICON_DLG_REM_ELEMENT" );
3331 createSMESHAction( 4044, "REMOVE_ORPHAN_NODES", "ICON_DLG_REM_ORPHAN_NODES" );
3332 createSMESHAction( 4043, "CLEAR_MESH" , "ICON_CLEAR_MESH" );
3333 createSMESHAction( 4051, "RENUM_NODES", "ICON_DLG_RENUMBERING_NODES" );
3334 createSMESHAction( 4052, "RENUM_ELEMENTS", "ICON_DLG_RENUMBERING_ELEMENTS" );
3335 createSMESHAction( 4061, "TRANS", "ICON_SMESH_TRANSLATION_VECTOR" );
3336 createSMESHAction( 4062, "ROT", "ICON_DLG_MESH_ROTATION" );
3337 createSMESHAction( 4063, "SYM", "ICON_SMESH_SYMMETRY_PLANE" );
3338 createSMESHAction( 4064, "SEW", "ICON_SMESH_SEWING_FREEBORDERS" );
3339 createSMESHAction( 4065, "MERGE", "ICON_SMESH_MERGE_NODES" );
3340 createSMESHAction( 4066, "MERGE_ELEMENTS", "ICON_DLG_MERGE_ELEMENTS" );
3341 createSMESHAction( 4067, "MESH_THROU_POINT","ICON_DLG_MOVE_NODE" );
3342 createSMESHAction( 4068, "SCALE", "ICON_DLG_MESH_SCALE" );
3343 createSMESHAction( 4069, "DUPLICATE_NODES", "ICON_SMESH_DUPLICATE_NODES" );
3344 createSMESHAction( 407, "INV", "ICON_DLG_MESH_DIAGONAL" );
3345 createSMESHAction( 408, "UNION2", "ICON_UNION2TRI" );
3346 createSMESHAction( 409, "ORIENT", "ICON_DLG_MESH_ORIENTATION" );
3347 createSMESHAction( 410, "UNION", "ICON_UNIONTRI" );
3348 createSMESHAction( 411, "CUT", "ICON_CUTQUAD" );
3349 createSMESHAction( 412, "SMOOTH", "ICON_DLG_SMOOTHING" );
3350 createSMESHAction( 413, "EXTRUSION", "ICON_EXTRUSION" );
3351 createSMESHAction( 414, "REVOLUTION", "ICON_REVOLUTION" );
3352 createSMESHAction( 415, "MAP", "ICON_MAP" );
3353 createSMESHAction( 416, "EXTRUSION_ALONG", "ICON_EXTRUSION_ALONG" );
3354 createSMESHAction( 417, "CONV_TO_QUAD", "ICON_CONV_TO_QUAD" );
3355 createSMESHAction( 418, "2D_FROM_3D", "ICON_2D_FROM_3D" );
3356 createSMESHAction( 419, "SPLIT_TO_TETRA", "ICON_SPLIT_TO_TETRA" );
3357 createSMESHAction( 200, "RESET" );
3358 createSMESHAction( 201, "SCALAR_BAR_PROP" );
3359 createSMESHAction( 2021, "SAVE_DISTRIBUTION" );
3360 createSMESHAction( 2022, "SHOW_DISTRIBUTION","",0, true );
3361 #ifndef DISABLE_PLOT2DVIEWER
3362 createSMESHAction( 2023, "PLOT_DISTRIBUTION" );
3364 createSMESHAction( 211, "WIRE", "ICON_WIRE", 0, true );
3365 createSMESHAction( 212, "SHADE", "ICON_SHADE", 0, true );
3366 createSMESHAction( 213, "SHRINK", "ICON_SHRINK", 0, true );
3367 createSMESHAction( 214, "UPDATE", "ICON_UPDATE" );
3368 createSMESHAction( 215, "NODES", "ICON_POINTS", 0, true );
3369 createSMESHAction( 216, "ELEMS0D", "ICON_DLG_ELEM0D", 0, true );
3370 createSMESHAction( 217, "EDGES", "ICON_DLG_EDGE", 0, true );
3371 createSMESHAction( 218, "FACES", "ICON_DLG_TRIANGLE", 0, true );
3372 createSMESHAction( 219, "VOLUMES", "ICON_DLG_TETRAS", 0, true );
3373 createSMESHAction( 220, "ALL" );
3374 createSMESHAction( 221, "FACE_ORIENTATION", "", 0, true );
3376 createSMESHAction( 231, "LINE_REPRESENTATION", "", 0, true );
3377 createSMESHAction( 232, "ARC_REPRESENTATION", "", 0, true );
3379 createSMESHAction( 1100, "EDIT_HYPO" );
3380 createSMESHAction( 1102, "UNASSIGN" );
3381 createSMESHAction( 9010, "NUM_NODES", "", 0, true );
3382 createSMESHAction( 9011, "NUM_ELEMENTS", "", 0, true );
3383 createSMESHAction( 1131, "DISPMODE" );
3384 createSMESHAction( 1132, "COLORS" );
3385 createSMESHAction( 1133, "TRANSP" );
3386 createSMESHAction( 1134, "CLIP" );
3387 createSMESHAction( 1135, "DISP_ENT" );
3388 createSMESHAction( 1136, "AUTO_COLOR" );
3389 createSMESHAction( 1137, "DISABLE_AUTO_COLOR" );
3390 createSMESHAction( 2000, "CTRL" );
3392 createSMESHAction( 501, "MEASURE_MIN_DIST", "ICON_MEASURE_MIN_DIST" );
3393 createSMESHAction( 502, "MEASURE_BND_BOX", "ICON_MEASURE_BND_BOX" );
3395 createSMESHAction( 300, "ERASE" );
3396 createSMESHAction( 301, "DISPLAY" );
3397 createSMESHAction( 302, "DISPLAY_ONLY" );
3398 createSMESHAction( 4033, "POLYHEDRON", "ICON_DLG_POLYHEDRON" );
3399 createSMESHAction( 4034, "QUADRATIC_EDGE", "ICON_DLG_QUADRATIC_EDGE" );
3400 createSMESHAction( 4035, "QUADRATIC_TRIANGLE", "ICON_DLG_QUADRATIC_TRIANGLE" );
3401 createSMESHAction( 4036, "QUADRATIC_QUADRANGLE", "ICON_DLG_QUADRATIC_QUADRANGLE" );
3402 createSMESHAction( 4037, "QUADRATIC_TETRAHEDRON", "ICON_DLG_QUADRATIC_TETRAHEDRON" );
3403 createSMESHAction( 4038, "QUADRATIC_PYRAMID", "ICON_DLG_QUADRATIC_PYRAMID" );
3404 createSMESHAction( 4039, "QUADRATIC_PENTAHEDRON", "ICON_DLG_QUADRATIC_PENTAHEDRON" );
3405 createSMESHAction( 4040, "QUADRATIC_HEXAHEDRON", "ICON_DLG_QUADRATIC_HEXAHEDRON" );
3407 // ----- create menu --------------
3408 int fileId = createMenu( tr( "MEN_FILE" ), -1, 1 ),
3409 editId = createMenu( tr( "MEN_EDIT" ), -1, 3 ),
3410 toolsId = createMenu( tr( "MEN_TOOLS" ), -1, 5, 50 ),
3411 meshId = createMenu( tr( "MEN_MESH" ), -1, 70, 10 ),
3412 ctrlId = createMenu( tr( "MEN_CTRL" ), -1, 60, 10 ),
3413 modifyId = createMenu( tr( "MEN_MODIFY" ), -1, 40, 10 ),
3414 measureId = createMenu( tr( "MEN_MEASURE" ), -1, 50, 10 ),
3415 viewId = createMenu( tr( "MEN_VIEW" ), -1, 2 );
3417 createMenu( separator(), fileId );
3419 int importId = createMenu( tr( "MEN_IMPORT" ), fileId, -1, 10 ),
3420 exportId = createMenu( tr( "MEN_EXPORT" ), fileId, -1, 10 ),
3421 nodeId = createMenu( tr( "MEN_NODE_CTRL" ), ctrlId, -1, 10 ),
3422 edgeId = createMenu( tr( "MEN_EDGE_CTRL" ), ctrlId, -1, 10 ),
3423 faceId = createMenu( tr( "MEN_FACE_CTRL" ), ctrlId, -1, 10 ),
3424 volumeId = createMenu( tr( "MEN_VOLUME_CTRL" ), ctrlId, -1, 10 ),
3425 addId = createMenu( tr( "MEN_ADD" ), modifyId, 402 ),
3426 removeId = createMenu( tr( "MEN_REMOVE" ), modifyId, 403 ),
3427 renumId = createMenu( tr( "MEN_RENUM" ), modifyId, 404 ),
3428 transfId = createMenu( tr( "MEN_TRANSF" ), modifyId, 405 );
3430 createMenu( 111, importId, -1 );
3431 createMenu( 112, importId, -1 );
3432 createMenu( 113, importId, -1 );
3433 createMenu( 140, importId, -1 );
3435 createMenu( 121, exportId, -1 );
3436 createMenu( 122, exportId, -1 );
3437 createMenu( 123, exportId, -1 );
3438 createMenu( 141, exportId, -1 ); // export to stl STL
3440 createMenu( separator(), fileId, 10 );
3442 createMenu( 33, editId, -1 );
3444 createMenu( 5105, toolsId, -1 );
3446 createMenu( 702, meshId, -1 ); // "Mesh" menu
3447 createMenu( 703, meshId, -1 );
3448 createMenu( 704, meshId, -1 );
3449 createMenu( 710, meshId, -1 );
3450 createMenu( 705, meshId, -1 );
3451 createMenu( separator(), meshId, -1 );
3452 createMenu( 701, meshId, -1 );
3453 createMenu( 711, meshId, -1 );
3454 createMenu( 712, meshId, -1 );
3455 createMenu( 713, meshId, -1 );
3456 createMenu( separator(), meshId, -1 );
3457 createMenu( 801, meshId, -1 );
3458 createMenu( 806, meshId, -1 );
3459 createMenu( 802, meshId, -1 );
3460 createMenu( 803, meshId, -1 );
3461 createMenu( 815, meshId, -1 );
3462 createMenu( separator(), meshId, -1 );
3463 createMenu( 810, meshId, -1 );
3464 createMenu( 811, meshId, -1 );
3465 createMenu( 812, meshId, -1 );
3466 createMenu( separator(), meshId, -1 );
3467 createMenu( 814, meshId, -1 );
3468 createMenu( separator(), meshId, -1 );
3469 createMenu( 900, meshId, -1 );
3470 //createMenu( 902, meshId, -1 );
3471 //createMenu( 903, meshId, -1 ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
3472 createMenu( 904, meshId, -1 );
3473 createMenu( separator(), meshId, -1 );
3475 createMenu( 6005, nodeId, -1 );
3476 createMenu( 6002, edgeId, -1 );
3477 createMenu( 6003, edgeId, -1 );
3478 createMenu( 6001, edgeId, -1 );
3479 createMenu( 6004, edgeId, -1 );
3480 createMenu( 6021, faceId, -1 );
3481 createMenu( 6025, faceId, -1 );
3482 createMenu( 6027, faceId, -1 );
3483 createMenu( 6018, faceId, -1 );
3484 createMenu( 6019, faceId, -1 );
3485 createMenu( 6011, faceId, -1 );
3486 createMenu( 6012, faceId, -1 );
3487 createMenu( 6013, faceId, -1 );
3488 createMenu( 6014, faceId, -1 );
3489 createMenu( 6015, faceId, -1 );
3490 createMenu( 6016, faceId, -1 );
3491 createMenu( 6022, faceId, -1 );
3492 createMenu( 6017, volumeId, -1 );
3493 createMenu( 6009, volumeId, -1 );
3494 createMenu( 6023, volumeId, -1 );
3495 createMenu( 6024, volumeId, -1 );
3496 createMenu( 6026, volumeId, -1 );
3498 createMenu( 4000, addId, -1 );
3499 createMenu( 4009, addId, -1 );
3500 createMenu( 4010, addId, -1 );
3501 createMenu( 4021, addId, -1 );
3502 createMenu( 4022, addId, -1 );
3503 createMenu( 4023, addId, -1 );
3504 createMenu( 4031, addId, -1 );
3505 createMenu( 4032, addId, -1 );
3506 createMenu( 4033, addId, -1 );
3507 createMenu( separator(), addId, -1 );
3508 createMenu( 4034, addId, -1 );
3509 createMenu( 4035, addId, -1 );
3510 createMenu( 4036, addId, -1 );
3511 createMenu( 4037, addId, -1 );
3512 createMenu( 4038, addId, -1 );
3513 createMenu( 4039, addId, -1 );
3514 createMenu( 4040, addId, -1 );
3516 createMenu( 4041, removeId, -1 );
3517 createMenu( 4042, removeId, -1 );
3518 createMenu( 4044, removeId, -1 );
3519 createMenu( separator(), removeId, -1 );
3520 createMenu( 813, removeId, -1 );
3521 createMenu( separator(), removeId, -1 );
3522 createMenu( 4043, removeId, -1 );
3524 createMenu( 4051, renumId, -1 );
3525 createMenu( 4052, renumId, -1 );
3527 createMenu( 4061, transfId, -1 );
3528 createMenu( 4062, transfId, -1 );
3529 createMenu( 4063, transfId, -1 );
3530 createMenu( 4068, transfId, -1 );
3531 createMenu( 4064, transfId, -1 );
3532 createMenu( 4065, transfId, -1 );
3533 createMenu( 4066, transfId, -1 );
3534 createMenu( 4069, transfId, -1 );
3536 createMenu( 4067,modifyId, -1 );
3537 createMenu( 407, modifyId, -1 );
3538 createMenu( 408, modifyId, -1 );
3539 createMenu( 409, modifyId, -1 );
3540 createMenu( 410, modifyId, -1 );
3541 createMenu( 411, modifyId, -1 );
3542 createMenu( 419, modifyId, -1 );
3543 createMenu( 412, modifyId, -1 );
3544 createMenu( 413, modifyId, -1 );
3545 createMenu( 416, modifyId, -1 );
3546 createMenu( 414, modifyId, -1 );
3547 createMenu( 415, modifyId, -1 );
3548 createMenu( 417, modifyId, -1 );
3549 createMenu( 418, modifyId, -1 );
3551 createMenu( 501, measureId, -1 );
3552 createMenu( 502, measureId, -1 );
3553 createMenu( 214, viewId, -1 );
3555 // ----- create toolbars --------------
3556 int meshTb = createTool( tr( "TB_MESH" ) ),
3557 ctrlTb = createTool( tr( "TB_CTRL" ) ),
3558 addRemTb = createTool( tr( "TB_ADD_REMOVE" ) ),
3559 modifyTb = createTool( tr( "TB_MODIFY" ) ),
3560 dispModeTb = createTool( tr( "TB_DISP_MODE" ) );
3562 createTool( 702, meshTb );
3563 createTool( 703, meshTb );
3564 createTool( 704, meshTb );
3565 createTool( 710, meshTb );
3566 createTool( 705, meshTb );
3567 createTool( separator(), meshTb );
3568 createTool( 701, meshTb );
3569 createTool( 711, meshTb );
3570 createTool( 712, meshTb );
3571 createTool( 713, meshTb );
3572 createTool( separator(), meshTb );
3573 createTool( 801, meshTb );
3574 createTool( 806, meshTb );
3575 createTool( 802, meshTb );
3576 createTool( 803, meshTb );
3577 //createTool( 815, meshTb );
3578 createTool( separator(), meshTb );
3579 createTool( 900, meshTb );
3580 //createTool( 902, meshTb );
3581 //createTool( 903, meshTb ); // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
3582 createTool( 904, meshTb );
3583 createTool( separator(), meshTb );
3585 createTool( 6005, ctrlTb );
3586 createTool( separator(), ctrlTb );
3587 createTool( 6002, ctrlTb );
3588 createTool( 6003, ctrlTb );
3589 createTool( 6001, ctrlTb );
3590 createTool( 6004, ctrlTb );
3591 createTool( separator(), ctrlTb );
3592 createTool( 6021, ctrlTb );
3593 createTool( 6025, ctrlTb );
3594 createTool( 6027, ctrlTb );
3595 createTool( 6018, ctrlTb );
3596 createTool( 6019, ctrlTb );
3597 createTool( 6011, ctrlTb );
3598 createTool( 6012, ctrlTb );
3599 createTool( 6013, ctrlTb );
3600 createTool( 6014, ctrlTb );
3601 createTool( 6015, ctrlTb );
3602 createTool( 6016, ctrlTb );
3603 createTool( 6022, ctrlTb );
3604 createTool( separator(), ctrlTb );
3605 createTool( 6017, ctrlTb );
3606 createTool( 6009, ctrlTb );
3607 createTool( 6023, ctrlTb );
3608 createTool( 6024, ctrlTb );
3609 createTool( 6026, ctrlTb );
3610 createTool( separator(), ctrlTb );
3612 createTool( 4000, addRemTb );
3613 createTool( 4009, addRemTb );
3614 createTool( 4010, addRemTb );
3615 createTool( 4021, addRemTb );
3616 createTool( 4022, addRemTb );
3617 createTool( 4023, addRemTb );
3618 createTool( 4031, addRemTb );
3619 createTool( 4032, addRemTb );
3620 createTool( 4033, addRemTb );
3621 createTool( separator(), addRemTb );
3622 createTool( 4034, addRemTb );
3623 createTool( 4035, addRemTb );
3624 createTool( 4036, addRemTb );
3625 createTool( 4037, addRemTb );
3626 createTool( 4038, addRemTb );
3627 createTool( 4039, addRemTb );
3628 createTool( 4040, addRemTb );
3629 createTool( separator(), addRemTb );
3630 createTool( 4041, addRemTb );
3631 createTool( 4042, addRemTb );
3632 createTool( 4044, addRemTb );
3633 createTool( 4043, addRemTb );
3634 createTool( separator(), addRemTb );
3635 createTool( 4051, addRemTb );
3636 createTool( 4052, addRemTb );
3637 createTool( separator(), addRemTb );
3638 createTool( 4061, addRemTb );
3639 createTool( 4062, addRemTb );
3640 createTool( 4063, addRemTb );
3641 createTool( 4068, addRemTb );
3642 createTool( 4064, addRemTb );
3643 createTool( 4065, addRemTb );
3644 createTool( 4066, addRemTb );
3645 createTool( 4069, addRemTb );
3646 createTool( separator(), addRemTb );
3648 createTool( 4067,modifyTb );
3649 createTool( 407, modifyTb );
3650 createTool( 408, modifyTb );
3651 createTool( 409, modifyTb );
3652 createTool( 410, modifyTb );
3653 createTool( 411, modifyTb );
3654 createTool( 419, modifyTb );
3655 createTool( 412, modifyTb );
3656 createTool( 413, modifyTb );
3657 createTool( 416, modifyTb );
3658 createTool( 414, modifyTb );
3659 createTool( 415, modifyTb );
3660 createTool( 417, modifyTb );
3661 createTool( 418, modifyTb );
3663 createTool( 214, dispModeTb );
3665 QString lc = "$"; // VSR : instead of QtxPopupSelection::defEquality();
3666 QString dc = "selcount"; // VSR : instead of QtxPopupSelection::defSelCountParam()
3669 QString OB = "'ObjectBrowser'",
3670 View = "'" + SVTK_Viewer::Type() + "'",
3672 mesh = pat.arg( SMESHGUI_Selection::typeName( MESH ) ),
3673 group = pat.arg( SMESHGUI_Selection::typeName( GROUP ) ),
3674 hypo = pat.arg( SMESHGUI_Selection::typeName( HYPOTHESIS ) ),
3675 algo = pat.arg( SMESHGUI_Selection::typeName( ALGORITHM ) ),
3676 elems = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ).
3677 arg( SMESHGUI_Selection::typeName( SUBMESH_VERTEX ) ).
3678 arg( SMESHGUI_Selection::typeName( SUBMESH_EDGE ) ).
3679 arg( SMESHGUI_Selection::typeName( SUBMESH_FACE ) ).
3680 arg( SMESHGUI_Selection::typeName( SUBMESH_SOLID ) ).
3681 arg( SMESHGUI_Selection::typeName( SUBMESH_COMPOUND ) ).
3682 arg( SMESHGUI_Selection::typeName( SUBMESH ) ),
3684 mesh_group = mesh + " " + subMesh + " " + group,
3685 hyp_alg = hypo + " " + algo;
3687 // popup for object browser
3689 isInvisible("not( isVisible )"),
3690 isEmpty("numberOfNodes = 0"),
3691 isNotEmpty("numberOfNodes <> 0"),
3693 // has nodes, edges, etc in VISIBLE! actor
3694 hasNodes("(numberOfNodes > 0 )"),//&& isVisible)"),
3695 hasElems("(count( elemTypes ) > 0)"),
3696 hasDifferentElems("(count( elemTypes ) > 1)"),
3697 hasElems0d("({'Elem0d'} in elemTypes)"),
3698 hasEdges("({'Edge'} in elemTypes)"),
3699 hasFaces("({'Face'} in elemTypes)"),
3700 hasVolumes("({'Volume'} in elemTypes)");
3702 createPopupItem( 150, OB, mesh, "&& selcount=1 && isImported" ); // FILE INFORMATION
3703 createPopupItem( 703, OB, mesh, "&& isComputable"); // CREATE_SUBMESH
3704 //createPopupItem( 703, OB, subMesh, "&& isComputable" ); // CREATE_SUBMESH
3705 createPopupItem( 704, OB, mesh, "&& isComputable"); // EDIT_MESHSUBMESH
3706 createPopupItem( 704, OB, subMesh, "&& isComputable" ); // EDIT_MESHSUBMESH
3707 createPopupItem( 803, OB, group ); // EDIT_GROUP
3708 createPopupItem( 815, OB, group, "&& groupType = 'GroupOnGeom'" ); // EDIT_GROUP
3710 popupMgr()->insert( separator(), -1, 0 );
3711 createPopupItem( 701, OB, mesh, "&& isComputable" ); // COMPUTE
3712 createPopupItem( 711, OB, mesh, "&& isComputable && isPreComputable" ); // PRECOMPUTE
3713 createPopupItem( 712, OB, mesh, "&& isComputable" ); // EVALUATE
3714 createPopupItem( 713, OB, mesh, "&& isComputable" ); // MESH ORDER
3715 createPopupItem( 214, OB, mesh_group ); // UPDATE
3716 createPopupItem( 900, OB, mesh_group ); // ADV_INFO
3717 //createPopupItem( 902, OB, mesh ); // STD_INFO
3718 //createPopupItem( 903, OB, mesh_group ); // WHAT_IS // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
3719 createPopupItem( 904, OB, mesh ); // FIND_ELEM
3720 popupMgr()->insert( separator(), -1, 0 );
3721 createPopupItem( 801, OB, mesh ); // CREATE_GROUP
3722 createPopupItem( 806, OB, mesh ); // CREATE_GEO_GROUP
3723 createPopupItem( 802, OB, subMesh ); // CONSTRUCT_GROUP
3724 popupMgr()->insert( separator(), -1, 0 );
3725 createPopupItem( 1100, OB, hypo); // EDIT HYPOTHESIS
3726 createPopupItem( 1102, OB, hyp_alg ); // REMOVE HYPOTHESIS / ALGORITHMS
3727 popupMgr()->insert( separator(), -1, 0 );
3728 createPopupItem( 4043, OB, mesh ); // CLEAR_MESH
3729 popupMgr()->insert( separator(), -1, 0 );
3730 createPopupItem( 417, OB, mesh + " " + subMesh ); // convert to quadratic
3731 createPopupItem( 418, OB, mesh + " " + group, // create 2D mesh from 3D
3733 popupMgr()->insert( separator(), -1, 0 );
3735 QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( dc );
3736 QString multiple_non_empty = QString( " && %1>0 && numberOfNodes>0" ).arg( dc );
3738 createPopupItem( 125, OB, mesh, multiple_non_empty ); // EXPORT_MED
3739 createPopupItem( 126, OB, mesh, only_one_non_empty ); // EXPORT_UNV
3740 createPopupItem( 141, OB, mesh, only_one_non_empty ); // EXPORT_STL
3741 //createPopupItem( 33, OB, subMesh + " " + group ); // DELETE
3742 createPopupItem( 33, OB, mesh_group + " " + hyp_alg ); // DELETE
3743 popupMgr()->insert( separator(), -1, 0 );
3746 createPopupItem( 803, View, group ); // EDIT_GROUP
3747 createPopupItem( 804, View, elems ); // ADD
3748 createPopupItem( 805, View, elems ); // REMOVE
3750 popupMgr()->insert( separator(), -1, 0 );
3751 createPopupItem( 214, View, mesh_group ); // UPDATE
3752 createPopupItem( 900, View, mesh_group ); // ADV_INFO
3753 //createPopupItem( 902, View, mesh ); // STD_INFO
3754 //createPopupItem( 903, View, mesh_group ); // WHAT_IS // VSR: issue #0021242 (eliminate "Mesh Element Information" command)
3755 createPopupItem( 904, View, mesh ); // FIND_ELEM
3756 popupMgr()->insert( separator(), -1, 0 );
3758 createPopupItem( 1136, OB + " " + View, mesh, "&& (not isAutoColor)" ); // AUTO_COLOR
3759 createPopupItem( 1137, OB + " " + View, mesh, "&& isAutoColor" ); // DISABLE_AUTO_COLOR
3760 popupMgr()->insert( separator(), -1, 0 );
3763 QString aClient = QString( "%1client in {%2}" ).arg( lc ).arg( "'VTKViewer'" );
3764 QString aType = QString( "%1type in {%2}" ).arg( lc );
3765 aType = aType.arg( mesh_group );
3766 QString aMeshInVTK = aClient + "&&" + aType;
3768 aClient = "($client in {'VTKViewer' 'ObjectBrowser'})";
3769 QString anActiveVTK = QString("activeView = '%1'").arg(SVTK_Viewer::Type());
3770 QString aSelCount = QString( "%1 > 0" ).arg( dc );
3772 //-------------------------------------------------
3774 //-------------------------------------------------
3775 anId = popupMgr()->insert( tr( "MEN_NUM" ), -1, -1 );
3777 popupMgr()->insert( action( 9010 ), anId, -1 );
3778 popupMgr()->setRule( action( 9010 ), aMeshInVTK + "&& isVisible &&" + hasNodes, QtxPopupMgr::VisibleRule );
3779 popupMgr()->setRule( action( 9010 ), "{'Point'} in labeledTypes", QtxPopupMgr::ToggleRule );
3781 popupMgr()->insert( action( 9011 ), anId, -1 );
3782 popupMgr()->setRule( action( 9011 ), aMeshInVTK + "&& isVisible &&" + hasElems, QtxPopupMgr::VisibleRule );
3783 popupMgr()->setRule( action( 9011 ), "{'Cell'} in labeledTypes", QtxPopupMgr::ToggleRule );
3785 popupMgr()->insert( separator(), -1, -1 );
3787 //-------------------------------------------------
3789 //-------------------------------------------------
3790 anId = popupMgr()->insert( tr( "MEN_DISPMODE" ), -1, -1 );
3792 popupMgr()->insert( action( 211 ), anId, -1 ); // WIRE
3793 popupMgr()->setRule( action( 211 ), aMeshInVTK + "&&" + hasElems, QtxPopupMgr::VisibleRule );
3794 popupMgr()->setRule( action( 211 ), "displayMode = 'eEdge'", QtxPopupMgr::ToggleRule );
3796 popupMgr()->insert( action( 212 ), anId, -1 ); // SHADE
3797 popupMgr()->setRule( action( 212 ),aMeshInVTK+ "&& (" + hasFaces + "||" + hasVolumes + ")", QtxPopupMgr::VisibleRule);
3798 popupMgr()->setRule( action( 212 ), "displayMode = 'eSurface'", QtxPopupMgr::ToggleRule );
3800 popupMgr()->insert( action( 215 ), anId, -1 ); // POINTS
3801 popupMgr()->setRule( action( 215 ), aMeshInVTK + "&&" + hasNodes, QtxPopupMgr::VisibleRule );
3802 popupMgr()->setRule( action( 215 ), "displayMode = 'ePoint'", QtxPopupMgr::ToggleRule );
3804 popupMgr()->insert( separator(), anId, -1 );
3806 popupMgr()->insert( action( 213 ), anId, -1 ); // SHRINK
3807 popupMgr()->setRule( action( 213 ), aMeshInVTK + "&& shrinkMode <> 'IsNotShrinkable' && displayMode <> 'ePoint'", QtxPopupMgr::VisibleRule);
3808 popupMgr()->setRule( action( 213 ), "shrinkMode = 'IsShrunk'", QtxPopupMgr::ToggleRule );
3810 //-------------------------------------------------
3812 //-------------------------------------------------
3813 QString aDiffElemsInVTK = aMeshInVTK + "&&" + hasDifferentElems;
3815 anId = popupMgr()->insert( tr( "MEN_DISP_ENT" ), -1, -1 );
3817 popupMgr()->insert( action(216), anId, -1 ); // ELEMS 0D
3818 popupMgr()->setRule(action(216), aDiffElemsInVTK + "&& isVisible &&" + hasElems0d, QtxPopupMgr::VisibleRule);
3819 popupMgr()->setRule(action(216), "{'Elem0d'} in entityMode", QtxPopupMgr::ToggleRule);
3821 popupMgr()->insert( action( 217 ), anId, -1 ); // EDGES
3822 popupMgr()->setRule( action( 217 ), aDiffElemsInVTK + "&& isVisible &&" + hasEdges, QtxPopupMgr::VisibleRule );
3823 popupMgr()->setRule( action( 217 ), "{'Edge'} in entityMode", QtxPopupMgr::ToggleRule );
3825 popupMgr()->insert( action( 218 ), anId, -1 ); // FACES
3826 popupMgr()->setRule( action( 218 ), aDiffElemsInVTK + "&& isVisible &&" + hasFaces, QtxPopupMgr::VisibleRule );
3827 popupMgr()->setRule( action( 218 ), "{'Face'} in entityMode", QtxPopupMgr::ToggleRule );
3829 popupMgr()->insert( action( 219 ), anId, -1 ); // VOLUMES
3830 popupMgr()->setRule( action( 219 ), aDiffElemsInVTK + "&& isVisible &&" + hasVolumes, QtxPopupMgr::VisibleRule );
3831 popupMgr()->setRule( action( 219 ), "{'Volume'} in entityMode", QtxPopupMgr::ToggleRule );
3833 popupMgr()->insert( separator(), anId, -1 );
3835 popupMgr()->insert( action( 220 ), anId, -1 ); // ALL
3836 popupMgr()->setRule( action( 220 ), aDiffElemsInVTK + "&& isVisible && not( elemTypes in entityMode )", QtxPopupMgr::VisibleRule );
3839 //-------------------------------------------------
3840 // Representation of the 2D Quadratic elements
3841 //-------------------------------------------------
3842 anId = popupMgr()->insert( tr( "MEN_QUADRATIC_REPRESENT" ), -1, -1 );
3843 popupMgr()->insert( action( 231 ), anId, -1 ); // LINE REPRESENTATION
3844 popupMgr()->setRule( action( 231 ), aMeshInVTK + "and isVisible",QtxPopupMgr::VisibleRule );
3845 popupMgr()->setRule( action( 231 ), "quadratic2DMode = 'eLines'", QtxPopupMgr::ToggleRule );
3847 popupMgr()->insert( action( 232 ), anId, -1 ); // ARC REPRESENTATION
3848 popupMgr()->setRule( action( 232 ), aMeshInVTK + "and isVisible", QtxPopupMgr::VisibleRule );
3849 popupMgr()->setRule( action( 232 ), "quadratic2DMode = 'eArcs'", QtxPopupMgr::ToggleRule );
3851 //-------------------------------------------------
3852 // Orientation of faces
3853 //-------------------------------------------------
3854 popupMgr()->insert( action( 221 ), -1, -1 );
3855 popupMgr()->setRule( action( 221 ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule);
3856 popupMgr()->setRule( action( 221 ), "facesOrientationMode = 'IsOriented'", QtxPopupMgr::ToggleRule );
3858 //-------------------------------------------------
3860 //-------------------------------------------------
3861 popupMgr()->insert( action( 1132 ), -1, -1 );
3862 popupMgr()->setRule( action( 1132 ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule );
3864 //-------------------------------------------------
3866 //-------------------------------------------------
3867 popupMgr()->insert( action( 1133 ), -1, -1 );
3868 popupMgr()->setRule( action( 1133 ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule );
3870 //-------------------------------------------------
3872 //-------------------------------------------------
3874 aMeshInVtkHasNodes = aMeshInVTK + "&&" + hasNodes,
3875 aMeshInVtkHasEdges = aMeshInVTK + "&&" + hasEdges,
3876 aMeshInVtkHasFaces = aMeshInVTK + "&&" + hasFaces,
3877 aMeshInVtkHasVolumes = aMeshInVTK + "&&" + hasVolumes;
3879 anId = popupMgr()->insert( tr( "MEN_CTRL" ), -1, -1 );
3881 popupMgr()->insert( action( 200 ), anId, -1 ); // RESET
3882 popupMgr()->setRule( action( 200 ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
3884 popupMgr()->insert( separator(), anId, -1 );
3886 int aSubId = popupMgr()->insert( tr( "MEN_NODE_CTRL" ), anId, -1 ); // NODE CONTROLS
3888 popupMgr()->insert( action( 6005 ), aSubId, -1 ); // FREE_NODE
3889 popupMgr()->setRule( action( 6005 ), aMeshInVtkHasNodes, QtxPopupMgr::VisibleRule );
3890 popupMgr()->setRule( action( 6005 ), "controlMode = 'eFreeNodes'", QtxPopupMgr::ToggleRule );
3892 aSubId = popupMgr()->insert( tr( "MEN_EDGE_CTRL" ), anId, -1 ); // EDGE CONTROLS
3894 popupMgr()->insert( action( 6002 ), aSubId, -1 ); // FREE_EDGE
3895 popupMgr()->setRule( action( 6002 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
3896 popupMgr()->setRule( action( 6002 ), "controlMode = 'eFreeEdges'", QtxPopupMgr::ToggleRule );
3898 popupMgr()->insert( action( 6003 ), aSubId, -1 ); // FREE_BORDER
3899 popupMgr()->setRule( action( 6003 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
3900 popupMgr()->setRule( action( 6003 ), "controlMode = 'eFreeBorders'", QtxPopupMgr::ToggleRule );
3902 popupMgr()->insert( action( 6001 ), aSubId, -1 ); // LENGTH
3903 popupMgr()->setRule( action( 6001 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
3904 popupMgr()->setRule( action( 6001 ), "controlMode = 'eLength'", QtxPopupMgr::ToggleRule );
3906 popupMgr()->insert( action( 6004 ), aSubId, -1 ); // CONNECTION
3907 popupMgr()->setRule( action( 6004 ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule );
3908 popupMgr()->setRule( action( 6004 ), "controlMode = 'eMultiConnection'", QtxPopupMgr::ToggleRule );
3910 aSubId = popupMgr()->insert( tr( "MEN_FACE_CTRL" ), anId, -1 ); // FACE CONTROLS
3912 popupMgr()->insert ( action( 6021 ), aSubId, -1 ); // FREE_FACE
3913 popupMgr()->setRule( action( 6021 ), aMeshInVtkHasFaces /*aMeshInVtkHasVolumes*/,
3914 QtxPopupMgr::VisibleRule );
3915 popupMgr()->setRule( action( 6021 ), "controlMode = 'eFreeFaces'", QtxPopupMgr::ToggleRule );
3917 popupMgr()->insert ( action( 6018 ), aSubId, -1 ); // LENGTH_2D
3918 popupMgr()->setRule( action( 6018 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
3919 popupMgr()->setRule( action( 6018 ), "controlMode = 'eLength2D'", QtxPopupMgr::ToggleRule );
3921 popupMgr()->insert ( action( 6019 ), aSubId, -1 ); // CONNECTION_2D
3922 popupMgr()->setRule( action( 6019 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
3923 popupMgr()->setRule( action( 6019 ), "controlMode = 'eMultiConnection2D'", QtxPopupMgr::ToggleRule );
3925 popupMgr()->insert ( action( 6011 ), aSubId, -1 ); // AREA
3926 popupMgr()->setRule( action( 6011 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
3927 popupMgr()->setRule( action( 6011 ), "controlMode = 'eArea'", QtxPopupMgr::ToggleRule );
3929 popupMgr()->insert ( action( 6012 ), aSubId, -1 ); // TAPER
3930 popupMgr()->setRule( action( 6012 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
3931 popupMgr()->setRule( action( 6012 ), "controlMode = 'eTaper'", QtxPopupMgr::ToggleRule );
3933 popupMgr()->insert ( action( 6013 ), aSubId, -1 ); // ASPECT
3934 popupMgr()->setRule( action( 6013 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
3935 popupMgr()->setRule( action( 6013 ), "controlMode = 'eAspectRatio'", QtxPopupMgr::ToggleRule );
3937 popupMgr()->insert ( action( 6014 ), aSubId, -1 ); // MIN_ANG
3938 popupMgr()->setRule( action( 6014 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
3939 popupMgr()->setRule( action( 6014 ), "controlMode = 'eMinimumAngle'", QtxPopupMgr::ToggleRule );
3941 popupMgr()->insert ( action( 6015 ), aSubId, -1 ); // WARP
3942 popupMgr()->setRule( action( 6015 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
3943 popupMgr()->setRule( action( 6015 ), "controlMode = 'eWarping'", QtxPopupMgr::ToggleRule );
3945 popupMgr()->insert ( action( 6016 ), aSubId, -1 ); // SKEW
3946 popupMgr()->setRule( action( 6016 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
3947 popupMgr()->setRule( action( 6016 ), "controlMode = 'eSkew'", QtxPopupMgr::ToggleRule );
3949 popupMgr()->insert ( action( 6022 ), aSubId, -1 ); // MAX_ELEMENT_LENGTH_2D
3950 popupMgr()->setRule( action( 6022 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
3951 popupMgr()->setRule( action( 6022 ), "controlMode = 'eMaxElementLength2D'", QtxPopupMgr::ToggleRule );
3953 popupMgr()->insert ( action( 6025 ), aSubId, -1 ); // BARE_BORDER_FACE
3954 popupMgr()->setRule( action( 6025 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
3955 popupMgr()->setRule( action( 6025 ), "controlMode = 'eBareBorderFace'", QtxPopupMgr::ToggleRule );
3957 popupMgr()->insert ( action( 6027 ), aSubId, -1 ); // OVER_CONSTRAINED_FACE
3958 popupMgr()->setRule( action( 6027 ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule );
3959 popupMgr()->setRule( action( 6027 ), "controlMode = 'eOverConstrainedFace'", QtxPopupMgr::ToggleRule );
3961 aSubId = popupMgr()->insert( tr( "MEN_VOLUME_CTRL" ), anId, -1 ); // VOLUME CONTROLS
3963 popupMgr()->insert ( action( 6017 ), aSubId, -1 ); // ASPECT_3D
3964 popupMgr()->setRule( action( 6017 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
3965 popupMgr()->setRule( action( 6017 ), "controlMode = 'eAspectRatio3D'", QtxPopupMgr::ToggleRule );
3967 popupMgr()->insert ( action( 6009 ), aSubId, -1 ); // VOLUME_3D
3968 popupMgr()->setRule( action( 6009 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
3969 popupMgr()->setRule( action( 6009 ), "controlMode = 'eVolume3D'", QtxPopupMgr::ToggleRule );
3971 popupMgr()->insert ( action( 6023 ), aSubId, -1 ); // MAX_ELEMENT_LENGTH_3D
3972 popupMgr()->setRule( action( 6023 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
3973 popupMgr()->setRule( action( 6023 ), "controlMode = 'eMaxElementLength3D'", QtxPopupMgr::ToggleRule );
3975 popupMgr()->insert ( action( 6024 ), aSubId, -1 ); // BARE_BORDER_VOLUME
3976 popupMgr()->setRule( action( 6024 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
3977 popupMgr()->setRule( action( 6024 ), "controlMode = 'eBareBorderVolume'", QtxPopupMgr::ToggleRule );
3979 popupMgr()->insert ( action( 6026 ), aSubId, -1 ); // OVER_CONSTRAINED_VOLUME
3980 popupMgr()->setRule( action( 6026 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
3981 popupMgr()->setRule( action( 6026 ), "controlMode = 'eOverConstrainedVolume'", QtxPopupMgr::ToggleRule );
3983 popupMgr()->insert( separator(), anId, -1 );
3985 popupMgr()->insert( action( 201 ), anId, -1 ); // SCALAR_BAR_PROP
3986 popupMgr()->setRule( action( 201 ), aMeshInVTK + "&& controlMode <> 'eNone'", QtxPopupMgr::VisibleRule );
3988 popupMgr()->insert( separator(), anId, -1 );
3990 aSubId = popupMgr()->insert( tr( "MEN_DISTRIBUTION_CTRL" ), anId, -1 ); // NODE CONTROLS
3992 popupMgr()->insert( action( 2021 ), aSubId, -1 ); // SAVE_DISTRIBUTION
3993 popupMgr()->setRule( action( 2021 ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
3995 popupMgr()->insert( action( 2022 ), aSubId, -1 ); // SHOW_DISTRIBUTION
3996 popupMgr()->setRule( action( 2022 ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
3997 popupMgr()->setRule( action( 2022 ), aMeshInVTK + "&& isNumFunctor && isDistributionVisible", QtxPopupMgr::ToggleRule);
3999 #ifndef DISABLE_PLOT2DVIEWER
4000 popupMgr()->insert( action( 2023 ), aSubId, -1 ); // PLOT_DISTRIBUTION
4001 popupMgr()->setRule( action( 2023 ), aMeshInVTK + "&& isNumFunctor", QtxPopupMgr::VisibleRule );
4004 //-------------------------------------------------
4006 //-------------------------------------------------
4007 popupMgr()->insert( separator(), -1, -1 );
4008 QString aRule = "$component={'SMESH'} and ( type='Component' or (" + aClient + " and " +
4009 aType + " and " + aSelCount + " and " + anActiveVTK + " and " + isNotEmpty + " %1 ) )";
4010 popupMgr()->insert( action( 301 ), -1, -1 ); // DISPLAY
4011 popupMgr()->setRule( action( 301 ), aRule.arg( "and (not isVisible)" ), QtxPopupMgr::VisibleRule );
4013 popupMgr()->insert( action( 300 ), -1, -1 ); // ERASE
4014 popupMgr()->setRule( action( 300 ), aRule.arg( "and isVisible" ), QtxPopupMgr::VisibleRule );
4016 popupMgr()->insert( action( 302 ), -1, -1 ); // DISPLAY_ONLY
4017 popupMgr()->setRule( action( 302 ), aRule.arg( "" ), QtxPopupMgr::VisibleRule );
4019 popupMgr()->insert( separator(), -1, -1 );
4021 //-------------------------------------------------
4023 //-------------------------------------------------
4024 popupMgr()->insert( action( 1134 ), -1, -1 );
4025 popupMgr()->setRule( action( 1134 ), "client='VTKViewer'", QtxPopupMgr::VisibleRule );
4027 popupMgr()->insert( separator(), -1, -1 );
4029 connect( application(), SIGNAL( viewManagerActivated( SUIT_ViewManager* ) ),
4030 this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) );
4032 connect( application(), SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
4033 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
4036 //================================================================================
4038 * \brief Return true if SMESH or GEOM objects are selected.
4039 * Is called form LightApp_Module::activateModule() which clear selection if
4040 * not isSelectionCompatible()
4042 //================================================================================
4044 bool SMESHGUI::isSelectionCompatible()
4046 bool isCompatible = true;
4047 SALOME_ListIO selected;
4048 if ( LightApp_SelectionMgr *Sel = selectionMgr() )
4049 Sel->selectedObjects( selected );
4051 SALOME_ListIteratorOfListIO It( selected );
4052 for ( ; isCompatible && It.More(); It.Next())
4054 ( strcmp("GEOM", It.Value()->getComponentDataType()) == 0 ) ||
4055 ( strcmp("SMESH", It.Value()->getComponentDataType()) == 0 );
4057 return isCompatible;
4061 bool SMESHGUI::reusableOperation( const int id )
4063 // compute, evaluate and precompute are not reusable operations
4064 return ( id == 701 || id == 711 || id == 712 ) ? false : SalomeApp_Module::reusableOperation( id );
4067 bool SMESHGUI::activateModule( SUIT_Study* study )
4069 bool res = SalomeApp_Module::activateModule( study );
4071 setMenuShown( true );
4072 setToolShown( true );
4074 // import Python module that manages SMESH plugins (need to be here because SalomePyQt API uses active module)
4075 PyGILState_STATE gstate = PyGILState_Ensure();
4076 PyObject* pluginsmanager=PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
4077 if(pluginsmanager==NULL)
4081 PyObject* result=PyObject_CallMethod( pluginsmanager, (char*)"initialize", (char*)"isss",1,"smesh",tr("MEN_MESH").toStdString().c_str(),tr("SMESH_PLUGINS_OTHER").toStdString().c_str());
4086 PyGILState_Release(gstate);
4087 // end of GEOM plugins loading
4089 // Reset actions accelerator keys
4090 action(111)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B)); // Import DAT
4091 action(112)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_U)); // Import UNV
4092 action(113)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M)); // Import MED
4094 action( 33)->setEnabled(true); // Delete: Key_Delete
4096 // 0020210. Make SMESH_Gen update meshes at switching GEOM->SMESH
4097 GetSMESHGen()->SetCurrentStudy(SALOMEDS::Study::_nil());
4098 if ( SalomeApp_Study* s = dynamic_cast<SalomeApp_Study*>( study ))
4099 if ( _PTR(Study) aStudy = s->studyDS()) {
4100 GetSMESHGen()->SetCurrentStudy( _CAST(Study,aStudy)->GetStudy() );
4101 updateObjBrowser(); // objects can be removed
4104 // get all view currently opened in the study and connect their signals to
4105 // the corresponding slots of the class.
4106 SUIT_Desktop* aDesk = study->application()->desktop();
4108 QList<SUIT_ViewWindow*> wndList = aDesk->windows();
4109 SUIT_ViewWindow* wnd;
4110 foreach ( wnd, wndList )
4117 bool SMESHGUI::deactivateModule( SUIT_Study* study )
4119 setMenuShown( false );
4120 setToolShown( false );
4122 EmitSignalCloseAllDialogs();
4124 // Unset actions accelerator keys
4125 action(111)->setShortcut(QKeySequence()); // Import DAT
4126 action(112)->setShortcut(QKeySequence()); // Import UNV
4127 action(113)->setShortcut(QKeySequence()); // Import MED
4129 action( 33)->setEnabled(false); // Delete: Key_Delete
4131 return SalomeApp_Module::deactivateModule( study );
4134 void SMESHGUI::studyClosed( SUIT_Study* s )
4136 SMESH::RemoveVisuData( s->id() );
4137 SalomeApp_Module::studyClosed( s );
4140 void SMESHGUI::OnGUIEvent()
4142 const QObject* obj = sender();
4143 if ( !obj || !obj->inherits( "QAction" ) )
4145 int id = actionId((QAction*)obj);
4150 SMESH::SMESH_Gen_var SMESHGUI::GetSMESHGen()
4152 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); //Document OCAF de l'etude active
4153 if ( CORBA::is_nil( myComponentSMESH ) )
4155 SMESHGUI aGUI; //SRN BugID: IPAL9186: Create an instance of SMESHGUI to initialize myComponentSMESH
4157 aGUI.myComponentSMESH->SetCurrentStudy(_CAST(Study,aStudy)->GetStudy());
4158 return aGUI.myComponentSMESH;
4161 myComponentSMESH->SetCurrentStudy(_CAST(Study,aStudy)->GetStudy());
4162 return myComponentSMESH;
4165 QString SMESHGUI::engineIOR() const
4167 CORBA::ORB_var anORB = getApp()->orb();
4168 CORBA::String_var anIOR = anORB->object_to_string(GetSMESHGen());
4169 return QString( anIOR.in() );
4172 void SMESHGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
4174 SalomeApp_Module::contextMenuPopup( client, menu, title );
4176 selectionMgr()->selectedObjects( lst );
4177 if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) {
4178 Handle(SALOME_InteractiveObject) io = lst.First();
4179 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
4180 _PTR(Study) study = appStudy->studyDS();
4181 _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
4183 QString aName = QString( obj->GetName().c_str() );
4184 while ( aName.at( aName.length() - 1 ) == ' ' ) // Remove extraspaces in Name of Popup
4185 aName.remove( (aName.length() - 1), 1 );
4191 LightApp_Selection* SMESHGUI::createSelection() const
4193 return new SMESHGUI_Selection();
4196 void SMESHGUI::windows( QMap<int, int>& aMap ) const
4198 aMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
4199 aMap.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
4202 void SMESHGUI::viewManagers( QStringList& list ) const
4204 list.append( SVTK_Viewer::Type() );
4207 void SMESHGUI::onViewManagerActivated( SUIT_ViewManager* mgr )
4209 if ( dynamic_cast<SVTK_ViewManager*>( mgr ) ) {
4210 SMESH::UpdateSelectionProp( this );
4212 QVector<SUIT_ViewWindow*> aViews = mgr->getViews();
4213 for(int i = 0; i < aViews.count() ; i++){
4214 SUIT_ViewWindow *sf = aViews[i];
4220 void SMESHGUI::onViewManagerRemoved( SUIT_ViewManager* theViewManager )
4222 if( theViewManager && theViewManager->getType() == SVTK_Viewer::Type() )
4223 myClippingPlaneInfoMap.erase( theViewManager );
4226 void SMESHGUI::addActorAsObserver( SMESH_Actor* theActor )
4228 theActor->AddObserver( SMESH::DeleteActorEvent,
4229 myEventCallbackCommand.GetPointer(),
4233 void SMESHGUI::ProcessEvents( vtkObject* theObject,
4234 unsigned long theEvent,
4235 void* theClientData,
4238 if( SMESHGUI* aSMESHGUI = reinterpret_cast<SMESHGUI*>( theClientData ) ) {
4239 if( theObject && theEvent == SMESH::DeleteActorEvent ) {
4240 if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( theObject ) ) {
4241 SMESHGUI_ClippingPlaneInfoMap& aClippingPlaneInfoMap = aSMESHGUI->getClippingPlaneInfoMap();
4242 SMESHGUI_ClippingPlaneInfoMap::iterator anIter1 = aClippingPlaneInfoMap.begin();
4243 for( ; anIter1 != aClippingPlaneInfoMap.end(); anIter1++ ) {
4244 SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = anIter1->second;
4245 SMESHGUI_ClippingPlaneInfoList::iterator anIter2 = aClippingPlaneInfoList.begin();
4246 for( ; anIter2 != aClippingPlaneInfoList.end(); anIter2++ ) {
4247 SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter2;
4248 std::list<vtkActor*>& anActorList = aClippingPlaneInfo.ActorList;
4249 SMESH::TActorList::iterator anIter3 = anActorList.begin();
4250 for ( ; anIter3 != anActorList.end(); anIter3++ ) {
4251 if( anActor == *anIter3 ) {
4252 anActorList.erase( anIter3 );
4263 void SMESHGUI::createPreferences()
4265 // General tab ------------------------------------------------------------------------
4266 int genTab = addPreference( tr( "PREF_TAB_GENERAL" ) );
4268 int autoUpdate = addPreference( tr( "PREF_AUTO_UPDATE" ), genTab, LightApp_Preferences::Auto, "SMESH", "auto_update" );
4269 int lim = addPreference( tr( "PREF_UPDATE_LIMIT" ), autoUpdate, LightApp_Preferences::IntSpin, "SMESH", "update_limit" );
4270 setPreferenceProperty( lim, "min", 0 );
4271 setPreferenceProperty( lim, "max", 100000000 );
4272 setPreferenceProperty( lim, "step", 1000 );
4273 setPreferenceProperty( lim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
4275 int qaGroup = addPreference( tr( "PREF_GROUP_QUALITY" ), genTab );
4276 setPreferenceProperty( qaGroup, "columns", 2 );
4277 addPreference( tr( "PREF_DISPLAY_ENTITY" ), qaGroup, LightApp_Preferences::Bool, "SMESH", "display_entity" );
4278 addPreference( tr( "PREF_PRECISION_USE" ), qaGroup, LightApp_Preferences::Bool, "SMESH", "use_precision" );
4279 int prec = addPreference( tr( "PREF_PRECISION_VALUE" ), qaGroup, LightApp_Preferences::IntSpin, "SMESH", "controls_precision" );
4280 setPreferenceProperty( prec, "min", 0 );
4281 setPreferenceProperty( prec, "max", 16 );
4283 int dispgroup = addPreference( tr( "PREF_DISPLAY_MODE" ), genTab );
4284 setPreferenceProperty( dispgroup, "columns", 2 );
4285 int dispmode = addPreference( tr( "PREF_DISPLAY_MODE" ), dispgroup, LightApp_Preferences::Selector, "SMESH", "display_mode" );
4287 modes.append( "Wireframe" );
4288 modes.append( "Shading" );
4289 modes.append( "Nodes" );
4290 modes.append( "Shrink" );
4291 QList<QVariant> indices;
4292 indices.append( 0 );
4293 indices.append( 1 );
4294 indices.append( 2 );
4295 indices.append( 3 );
4296 setPreferenceProperty( dispmode, "strings", modes );
4297 setPreferenceProperty( dispmode, "indexes", indices );
4299 int arcgroup = addPreference( tr( "QUADRATIC_REPRESENT_MODE" ), genTab );
4300 setPreferenceProperty( arcgroup, "columns", 2 );
4301 int quadraticmode = addPreference( tr( "QUADRATIC_REPRESENT_MODE" ), arcgroup, LightApp_Preferences::Selector, "SMESH", "quadratic_mode" );
4302 QStringList quadraticModes;
4303 quadraticModes.append("Lines");
4304 quadraticModes.append("Arcs");
4306 indices.append( 0 );
4307 indices.append( 1 );
4308 setPreferenceProperty( quadraticmode, "strings", quadraticModes );
4309 setPreferenceProperty( quadraticmode, "indexes", indices );
4311 int maxAngle = addPreference( tr( "MAX_ARC_ANGLE" ), arcgroup, LightApp_Preferences::IntSpin,
4312 "SMESH", "max_angle" );
4313 setPreferenceProperty( maxAngle, "min", 1 );
4314 setPreferenceProperty( maxAngle, "max", 90 );
4318 int exportgroup = addPreference( tr( "PREF_GROUP_EXPORT" ), genTab );
4319 setPreferenceProperty( exportgroup, "columns", 2 );
4320 addPreference( tr( "PREF_AUTO_GROUPS" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "auto_groups" );
4321 addPreference( tr( "PREF_RENUMBER" ), exportgroup, LightApp_Preferences::Bool, "SMESH", "renumbering" );
4323 int computeGroup = addPreference( tr( "PREF_GROUP_COMPUTE" ), genTab );
4324 setPreferenceProperty( computeGroup, "columns", 2 );
4325 int notifyMode = addPreference( tr( "PREF_NOTIFY_MODE" ), computeGroup, LightApp_Preferences::Selector, "SMESH", "show_result_notification" );
4327 modes.append( tr( "PREF_NOTIFY_NEVER" ) );
4328 modes.append( tr( "PREF_NOTIFY_ERROR" ) );
4329 modes.append( tr( "PREF_NOTIFY_ALWAYS" ) );
4331 indices.append( 0 );
4332 indices.append( 1 );
4333 indices.append( 2 );
4334 setPreferenceProperty( notifyMode, "strings", modes );
4335 setPreferenceProperty( notifyMode, "indexes", indices );
4337 int infoGroup = addPreference( tr( "PREF_GROUP_INFO" ), genTab );
4338 setPreferenceProperty( computeGroup, "columns", 2 );
4339 int elemInfo = addPreference( tr( "PREF_ELEM_INFO" ), infoGroup, LightApp_Preferences::Selector, "SMESH", "mesh_elem_info" );
4341 modes.append( tr( "PREF_ELEM_INFO_SIMPLE" ) );
4342 modes.append( tr( "PREF_ELEM_INFO_TREE" ) );
4344 indices.append( 0 );
4345 indices.append( 1 );
4346 setPreferenceProperty( elemInfo, "strings", modes );
4347 setPreferenceProperty( elemInfo, "indexes", indices );
4349 int segGroup = addPreference( tr( "PREF_GROUP_SEGMENT_LENGTH" ), genTab );
4350 setPreferenceProperty( segGroup, "columns", 2 );
4351 int segLen = addPreference( tr( "PREF_SEGMENT_LENGTH" ), segGroup, LightApp_Preferences::IntSpin,
4352 "SMESH", "segmentation" );
4353 setPreferenceProperty( segLen, "min", 1 );
4354 setPreferenceProperty( segLen, "max", 10000000 );
4355 int nbSeg = addPreference( tr( "PREF_NB_SEGMENTS" ), segGroup, LightApp_Preferences::IntSpin,
4356 "SMESH", "nb_segments_per_edge" );
4357 setPreferenceProperty( nbSeg, "min", 1 );
4358 setPreferenceProperty( nbSeg, "max", 10000000 );
4360 // Quantities with individual precision settings
4361 int precGroup = addPreference( tr( "SMESH_PREF_GROUP_PRECISION" ), genTab );
4362 setPreferenceProperty( precGroup, "columns", 2 );
4364 const int nbQuantities = 6;
4365 int precs[nbQuantities], ii = 0;
4366 precs[ii++] = addPreference( tr( "SMESH_PREF_length_precision" ), precGroup,
4367 LightApp_Preferences::IntSpin, "SMESH", "length_precision" );
4368 precs[ii++] = addPreference( tr( "SMESH_PREF_angle_precision" ), precGroup,
4369 LightApp_Preferences::IntSpin, "SMESH", "angle_precision" );
4370 precs[ii++] = addPreference( tr( "SMESH_PREF_len_tol_precision" ), precGroup,
4371 LightApp_Preferences::IntSpin, "SMESH", "len_tol_precision" );
4372 precs[ii++] = addPreference( tr( "SMESH_PREF_parametric_precision" ), precGroup,
4373 LightApp_Preferences::IntSpin, "SMESH", "parametric_precision" );
4374 precs[ii++] = addPreference( tr( "SMESH_PREF_area_precision" ), precGroup,
4375 LightApp_Preferences::IntSpin, "SMESH", "area_precision" );
4376 precs[ii ] = addPreference( tr( "SMESH_PREF_vol_precision" ), precGroup,
4377 LightApp_Preferences::IntSpin, "SMESH", "vol_precision" );
4379 // Set property for precision value for spinboxes
4380 for ( ii = 0; ii < nbQuantities; ii++ ){
4381 setPreferenceProperty( precs[ii], "min", -14 );
4382 setPreferenceProperty( precs[ii], "max", 14 );
4383 setPreferenceProperty( precs[ii], "precision", 2 );
4386 // Mesh tab ------------------------------------------------------------------------
4387 int meshTab = addPreference( tr( "PREF_TAB_MESH" ) );
4388 int nodeGroup = addPreference( tr( "PREF_GROUP_NODES" ), meshTab );
4389 setPreferenceProperty( nodeGroup, "columns", 3 );
4391 addPreference( tr( "PREF_COLOR" ), nodeGroup, LightApp_Preferences::Color, "SMESH", "node_color" );
4393 int typeOfMarker = addPreference( tr( "PREF_TYPE_OF_MARKER" ), nodeGroup, LightApp_Preferences::Selector, "SMESH", "type_of_marker" );
4395 SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
4396 QList<QVariant> aMarkerTypeIndicesList;
4397 QList<QVariant> aMarkerTypeIconsList;
4398 for ( int i = VTK::MT_POINT; i < VTK::MT_USER; i++ ) {
4399 QString icoFile = QString( "ICON_VERTEX_MARKER_%1" ).arg( i );
4400 QPixmap pixmap = aResourceMgr->loadPixmap( "VTKViewer", tr( qPrintable( icoFile ) ) );
4401 aMarkerTypeIndicesList << i;
4402 aMarkerTypeIconsList << pixmap;
4404 setPreferenceProperty( typeOfMarker, "indexes", aMarkerTypeIndicesList );
4405 setPreferenceProperty( typeOfMarker, "icons", aMarkerTypeIconsList );
4407 int markerScale = addPreference( tr( "PREF_MARKER_SCALE" ), nodeGroup, LightApp_Preferences::Selector, "SMESH", "marker_scale" );
4409 QList<QVariant> aMarkerScaleIndicesList;
4410 QStringList aMarkerScaleValuesList;
4411 for ( int i = VTK::MS_10; i <= VTK::MS_70; i++ ) {
4412 aMarkerScaleIndicesList << i;
4413 aMarkerScaleValuesList << QString::number( (i-(int)VTK::MS_10)*0.5 + 1.0 );
4415 setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList );
4416 setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
4418 int elemGroup = addPreference( tr( "PREF_GROUP_ELEMENTS" ), meshTab );
4419 setPreferenceProperty( elemGroup, "columns", 2 );
4421 addPreference( tr( "PREF_FILL" ), elemGroup, LightApp_Preferences::Color, "SMESH", "fill_color" );
4422 addPreference( tr( "PREF_OUTLINE" ), elemGroup, LightApp_Preferences::Color, "SMESH", "outline_color" );
4423 addPreference( tr( "PREF_BACKFACE" ), elemGroup, LightApp_Preferences::Color, "SMESH", "backface_color" );
4424 addPreference( tr( "PREF_COLOR_0D" ), elemGroup, LightApp_Preferences::Color, "SMESH", "elem0d_color" );
4426 int grpGroup = addPreference( tr( "PREF_GROUP_GROUPS" ), meshTab );
4427 setPreferenceProperty( grpGroup, "columns", 2 );
4429 addPreference( tr( "PREF_GRP_NAMES" ), grpGroup, LightApp_Preferences::Color, "SMESH", "group_name_color" );
4431 //int sp = addPreference( "", elemGroup, LightApp_Preferences::Space );
4432 //setPreferenceProperty( sp, "hstretch", 0 );
4433 //setPreferenceProperty( sp, "vstretch", 0 );
4435 int size0d = addPreference(tr("PREF_SIZE_0D"), elemGroup,
4436 LightApp_Preferences::IntSpin, "SMESH", "elem0d_size");
4437 int sp = addPreference( "", elemGroup, LightApp_Preferences::Space );
4438 int elemW = addPreference(tr("PREF_WIDTH"), elemGroup,
4439 LightApp_Preferences::IntSpin, "SMESH", "element_width");
4440 int shrink = addPreference(tr("PREF_SHRINK_COEFF"), elemGroup,
4441 LightApp_Preferences::IntSpin, "SMESH", "shrink_coeff");
4443 setPreferenceProperty( size0d, "min", 1 );
4444 setPreferenceProperty( size0d, "max", 10 );
4446 setPreferenceProperty( sp, "hstretch", 0 );
4447 setPreferenceProperty( sp, "vstretch", 0 );
4449 setPreferenceProperty( elemW, "min", 1 );
4450 setPreferenceProperty( elemW, "max", 5 );
4452 setPreferenceProperty( shrink, "min", 0 );
4453 setPreferenceProperty( shrink, "max", 100 );
4455 int orientGroup = addPreference( tr( "PREF_GROUP_FACES_ORIENTATION" ), meshTab );
4456 setPreferenceProperty( orientGroup, "columns", 1 );
4458 addPreference( tr( "PREF_ORIENTATION_COLOR" ), orientGroup, LightApp_Preferences::Color, "SMESH", "orientation_color" );
4459 int orientScale = addPreference( tr( "PREF_ORIENTATION_SCALE" ), orientGroup, LightApp_Preferences::DblSpin, "SMESH", "orientation_scale" );
4461 setPreferenceProperty( orientScale, "min", 0.05 );
4462 setPreferenceProperty( orientScale, "max", 0.5 );
4463 setPreferenceProperty( orientScale, "step", 0.05 );
4465 addPreference( tr( "PREF_ORIENTATION_3D_VECTORS" ), orientGroup, LightApp_Preferences::Bool, "SMESH", "orientation_3d_vectors" );
4467 // Selection tab ------------------------------------------------------------------------
4468 int selTab = addPreference( tr( "PREF_TAB_SELECTION" ) );
4470 int selGroup = addPreference( tr( "PREF_GROUP_SELECTION" ), selTab );
4471 setPreferenceProperty( selGroup, "columns", 2 );
4473 addPreference( tr( "PREF_OBJECT_COLOR" ), selGroup, LightApp_Preferences::Color, "SMESH", "selection_object_color" );
4474 addPreference( tr( "PREF_ELEMENT_COLOR" ), selGroup, LightApp_Preferences::Color, "SMESH", "selection_element_color" );
4475 int selW = addPreference( tr( "PREF_WIDTH" ), selGroup, LightApp_Preferences::IntSpin, "SMESH", "selection_width" );
4477 setPreferenceProperty( selW, "min", 1 );
4478 setPreferenceProperty( selW, "max", 5 );
4480 int preGroup = addPreference( tr( "PREF_GROUP_PRESELECTION" ), selTab );
4481 setPreferenceProperty( preGroup, "columns", 2 );
4483 addPreference( tr( "PREF_HIGHLIGHT_COLOR" ), preGroup, LightApp_Preferences::Color, "SMESH", "highlight_color" );
4484 int preW = addPreference( tr( "PREF_WIDTH" ), preGroup, LightApp_Preferences::IntSpin, "SMESH", "highlight_width" );
4486 setPreferenceProperty( preW, "min", 1 );
4487 setPreferenceProperty( preW, "max", 5 );
4489 int precSelGroup = addPreference( tr( "PREF_GROUP_PRECISION" ), selTab );
4490 setPreferenceProperty( precSelGroup, "columns", 2 );
4492 addPreference( tr( "PREF_NODES" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_node" );
4493 addPreference( tr( "PREF_ELEMENTS" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_element" );
4494 addPreference( tr( "PREF_OBJECTS" ), precSelGroup, LightApp_Preferences::Double, "SMESH", "selection_precision_object" );
4496 // Scalar Bar tab ------------------------------------------------------------------------
4497 int sbarTab = addPreference( tr( "SMESH_SCALARBAR" ) );
4498 int fontGr = addPreference( tr( "SMESH_FONT_SCALARBAR" ), sbarTab );
4499 setPreferenceProperty( fontGr, "columns", 2 );
4501 addVtkFontPref( tr( "SMESH_TITLE" ), fontGr, "scalar_bar_title_font" );
4502 addPreference( tr( "PREF_TITLE_COLOR" ), fontGr, LightApp_Preferences::Color, "SMESH", "scalar_bar_title_color" );
4504 addVtkFontPref( tr( "SMESH_LABELS" ), fontGr, "scalar_bar_label_font" );
4505 addPreference( tr( "PREF_LABELS_COLOR" ), fontGr, LightApp_Preferences::Color, "SMESH", "scalar_bar_label_color" );
4507 int colorsLabelsGr = addPreference( tr( "SMESH_LABELS_COLORS_SCALARBAR" ), sbarTab );
4508 setPreferenceProperty( colorsLabelsGr, "columns", 2 );
4510 int numcol = addPreference( tr( "SMESH_NUMBEROFCOLORS" ), colorsLabelsGr, LightApp_Preferences::IntSpin, "SMESH", "scalar_bar_num_colors" );
4511 setPreferenceProperty( numcol, "min", 2 );
4512 setPreferenceProperty( numcol, "max", 256 );
4514 int numlab = addPreference( tr( "SMESH_NUMBEROFLABELS" ), colorsLabelsGr, LightApp_Preferences::IntSpin, "SMESH", "scalar_bar_num_labels" );
4515 setPreferenceProperty( numlab, "min", 2 );
4516 setPreferenceProperty( numlab, "max", 65 );
4518 int orientGr = addPreference( tr( "SMESH_ORIENTATION" ), sbarTab );
4519 setPreferenceProperty( orientGr, "columns", 2 );
4520 int orient = addPreference( tr( "SMESH_ORIENTATION" ), orientGr, LightApp_Preferences::Selector, "SMESH", "scalar_bar_orientation" );
4521 QStringList orients;
4522 orients.append( tr( "SMESH_VERTICAL" ) );
4523 orients.append( tr( "SMESH_HORIZONTAL" ) );
4524 indices.clear(); indices.append( 0 ); indices.append( 1 );
4525 setPreferenceProperty( orient, "strings", orients );
4526 setPreferenceProperty( orient, "indexes", indices );
4528 int posVSizeGr = addPreference( tr( "SMESH_POSITION_SIZE_SCALARBAR" ) + " " + tr( "SMESH_VERTICAL" ), sbarTab );
4529 setPreferenceProperty( posVSizeGr, "columns", 2 );
4530 int xv = addPreference( tr( "SMESH_X_SCALARBAR" ), posVSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_vertical_x" );
4531 int yv = addPreference( tr( "SMESH_Y_SCALARBAR" ), posVSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_vertical_y" );
4532 int wv = addPreference( tr( "SMESH_WIDTH" ), posVSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_vertical_width" );
4533 int hv = addPreference( tr( "SMESH_HEIGHT" ), posVSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_vertical_height" );
4534 setPreferenceProperty( xv, "step", 0.1 );
4535 setPreferenceProperty( xv, "min", 0.0 );
4536 setPreferenceProperty( xv, "max", 1.0 );
4537 setPreferenceProperty( yv, "step", 0.1 );
4538 setPreferenceProperty( yv, "min", 0.0 );
4539 setPreferenceProperty( yv, "max", 1.0 );
4540 setPreferenceProperty( wv, "step", 0.1 );
4541 setPreferenceProperty( wv, "min", 0.0 );
4542 setPreferenceProperty( wv, "max", 1.0 );
4543 setPreferenceProperty( hv, "min", 0.0 );
4544 setPreferenceProperty( hv, "max", 1.0 );
4545 setPreferenceProperty( hv, "step", 0.1 );
4547 int posHSizeGr = addPreference( tr( "SMESH_POSITION_SIZE_SCALARBAR" ) + " " + tr( "SMESH_HORIZONTAL" ), sbarTab );
4548 setPreferenceProperty( posHSizeGr, "columns", 2 );
4549 int xh = addPreference( tr( "SMESH_X_SCALARBAR" ), posHSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_horizontal_x" );
4550 int yh = addPreference( tr( "SMESH_Y_SCALARBAR" ), posHSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_horizontal_y" );
4551 int wh = addPreference( tr( "SMESH_WIDTH" ), posHSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_horizontal_width" );
4552 int hh = addPreference( tr( "SMESH_HEIGHT" ), posHSizeGr, LightApp_Preferences::DblSpin, "SMESH", "scalar_bar_horizontal_height" );
4553 setPreferenceProperty( xv, "min", 0.0 );
4554 setPreferenceProperty( xv, "max", 1.0 );
4555 setPreferenceProperty( xv, "step", 0.1 );
4556 setPreferenceProperty( xh, "min", 0.0 );
4557 setPreferenceProperty( xh, "max", 1.0 );
4558 setPreferenceProperty( xh, "step", 0.1 );
4559 setPreferenceProperty( yh, "min", 0.0 );
4560 setPreferenceProperty( yh, "max", 1.0 );
4561 setPreferenceProperty( yh, "step", 0.1 );
4562 setPreferenceProperty( wh, "min", 0.0 );
4563 setPreferenceProperty( wh, "max", 1.0 );
4564 setPreferenceProperty( wh, "step", 0.1 );
4565 setPreferenceProperty( hh, "min", 0.0 );
4566 setPreferenceProperty( hh, "max", 1.0 );
4567 setPreferenceProperty( hh, "step", 0.1 );
4569 int distributionGr = addPreference( tr( "SMESH_DISTRIBUTION_SCALARBAR" ), sbarTab, LightApp_Preferences::Auto, "SMESH", "distribution_visibility" );
4570 int coloringType = addPreference( tr( "SMESH_DISTRIBUTION_COLORING_TYPE" ), distributionGr, LightApp_Preferences::Selector, "SMESH", "distribution_coloring_type" );
4571 setPreferenceProperty( distributionGr, "columns", 3 );
4573 types.append( tr( "SMESH_MONOCOLOR" ) );
4574 types.append( tr( "SMESH_MULTICOLOR" ) );
4575 indices.clear(); indices.append( 0 ); indices.append( 1 );
4576 setPreferenceProperty( coloringType, "strings", types );
4577 setPreferenceProperty( coloringType, "indexes", indices );
4578 addPreference( tr( "SMESH_DISTRIBUTION_COLOR" ), distributionGr, LightApp_Preferences::Color, "SMESH", "distribution_color" );
4582 void SMESHGUI::preferencesChanged( const QString& sect, const QString& name )
4584 if( sect=="SMESH" ) {
4585 float sbX1,sbY1,sbW,sbH;
4586 float aTol = 1.00000009999999;
4587 std::string aWarning;
4588 SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this);
4589 if( name=="selection_object_color" || name=="selection_element_color" ||
4590 name=="selection_width" || name=="highlight_color" || name=="highlight_width" ||
4591 name=="selection_precision_node" || name=="selection_precision_element" ||
4592 name=="selection_precision_object")
4593 SMESH::UpdateSelectionProp( this );
4594 else if (name == QString("scalar_bar_vertical_x") || name == QString("scalar_bar_vertical_width")){
4595 sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_x", sbX1);
4596 sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_width", sbW);
4597 if(sbX1+sbW > aTol){
4598 aWarning = "Origin and Size Vertical: X+Width > 1\n";
4601 aResourceMgr->setValue("SMESH", "scalar_bar_vertical_x", sbX1);
4602 aResourceMgr->setValue("SMESH", "scalar_bar_vertical_width", sbW);
4605 else if(name == QString("scalar_bar_vertical_y") || name == QString("scalar_bar_vertical_height")){
4606 sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_y", sbY1);
4607 sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_height",sbH);
4608 if(sbY1+sbH > aTol){
4609 aWarning = "Origin and Size Vertical: Y+Height > 1\n";
4610 aResourceMgr->setValue("SMESH", "scalar_bar_vertical_y", sbY1);
4611 aResourceMgr->setValue("SMESH", "scalar_bar_vertical_height",sbH);
4614 else if(name == QString("scalar_bar_horizontal_x") || name == QString("scalar_bar_horizontal_width")){
4615 sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_x", sbX1);
4616 sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_width", sbW);
4617 if(sbX1+sbW > aTol){
4618 aWarning = "Origin and Size Horizontal: X+Width > 1\n";
4621 aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_x", sbX1);
4622 aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_width", sbW);
4625 else if(name == QString("scalar_bar_horizontal_y") || name == QString("scalar_bar_horizontal_height")){
4626 sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_y", sbY1);
4627 sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_height",sbH);
4628 if(sbY1+sbH > aTol){
4629 aWarning = "Origin and Size Horizontal: Y+Height > 1\n";
4632 aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_y", sbY1);
4633 aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_height",sbH);
4636 else if ( name == "segmentation" ) {
4637 int nbSeg = aResourceMgr->integerValue( "SMESH", "segmentation", 10 );
4638 myComponentSMESH->SetBoundaryBoxSegmentation( nbSeg );
4640 else if ( name == "nb_segments_per_edge" ) {
4641 int nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 );
4642 myComponentSMESH->SetDefaultNbSegments( nbSeg );
4645 if(aWarning.size() != 0){
4646 aWarning += "The default values are applied instead.";
4647 SUIT_MessageBox::warning(SMESHGUI::desktop(),
4648 QObject::tr("SMESH_ERR_SCALARBAR_PARAMS"),
4649 QObject::tr(aWarning.c_str()));
4654 //================================================================================
4656 * \brief Update something in accordance with update flags
4657 * \param theFlags - update flags
4659 * Update viewer or/and object browser etc. in accordance with update flags ( see
4660 * LightApp_UpdateFlags enumeration ).
4662 //================================================================================
4663 void SMESHGUI::update( const int flags )
4665 if ( (flags & UF_Viewer) | (flags & UF_Forced) )
4666 SMESH::UpdateView();
4668 SalomeApp_Module::update( flags );
4671 //================================================================================
4673 * \brief Set default selection mode
4675 * SLOT called when operation commited. Sets default selection mode
4677 //================================================================================
4678 void SMESHGUI::onOperationCommited( SUIT_Operation* )
4680 SVTK_ViewWindow* vtkWnd =
4681 dynamic_cast<SVTK_ViewWindow*>( application()->desktop()->activeWindow() );
4683 vtkWnd->SetSelectionMode( ActorSelection );
4686 //================================================================================
4688 * \brief Set default selection mode
4690 * SLOT called when operation aborted. Sets default selection mode
4692 //================================================================================
4693 void SMESHGUI::onOperationAborted( SUIT_Operation* )
4695 SVTK_ViewWindow* vtkWnd =
4696 dynamic_cast<SVTK_ViewWindow*>( application()->desktop()->activeWindow() );
4698 vtkWnd->SetSelectionMode( ActorSelection );
4701 //================================================================================
4703 * \brief Creates operation with given identifier
4704 * \param id - identifier of operation to be started
4705 * \return Pointer on created operation or NULL if operation is not created
4707 * Virtual method redefined from the base class creates operation with given id.
4708 * It is called called automatically from startOperation method of base class.
4710 //================================================================================
4711 LightApp_Operation* SMESHGUI::createOperation( const int id ) const
4713 LightApp_Operation* op = 0;
4714 // to do : create operation here
4717 case 417: //convert to quadratic
4718 op = new SMESHGUI_ConvToQuadOp();
4720 case 418: // create 2D mesh as boundary on 3D
4721 op = new SMESHGUI_Make2DFrom3DOp();
4723 case 701: // Compute mesh
4724 op = new SMESHGUI_ComputeOp();
4726 case 702: // Create mesh
4727 op = new SMESHGUI_MeshOp( true, true );
4729 case 703: // Create sub-mesh
4730 op = new SMESHGUI_MeshOp( true, false );
4732 case 704: // Edit mesh/sub-mesh
4733 op = new SMESHGUI_MeshOp( false );
4735 case 711: // Precompute mesh
4736 op = new SMESHGUI_PrecomputeOp();
4738 case 712: // Evaluate mesh
4739 op = new SMESHGUI_EvaluateOp();
4741 case 713: // Evaluate mesh
4742 op = new SMESHGUI_MeshOrderOp();
4744 case 806: // Create group on geom
4745 op = new SMESHGUI_GroupOnShapeOp();
4747 case 904: // Find element
4748 op = new SMESHGUI_FindElemByPointOp();
4750 case 4067: // make mesh pass through point
4751 op = new SMESHGUI_MakeNodeAtPointOp();
4758 op = SalomeApp_Module::createOperation( id );
4762 //================================================================================
4764 * \brief Stops current operations and starts a given one
4765 * \param id - The id of the operation to start
4767 //================================================================================
4769 void SMESHGUI::switchToOperation(int id)
4771 if ( _PTR(Study) aStudy = SMESH::GetActiveStudyDocument() )
4772 activeStudy()->abortAllOperations();
4773 startOperation( id );
4776 LightApp_Displayer* SMESHGUI::displayer()
4779 myDisplayer = new SMESHGUI_Displayer( getApp() );
4783 SALOMEDS::Color SMESHGUI::getUniqueColor( const QList<SALOMEDS::Color>& theReservedColors )
4786 int aTolerance = 64;
4787 int anIterations = 0;
4793 if( anIterations % aPeriod == 0 )
4796 if( aTolerance < 1 )
4800 aHue = (int)( 360.0 * rand() / RAND_MAX );
4803 QList<SALOMEDS::Color>::const_iterator it = theReservedColors.constBegin();
4804 QList<SALOMEDS::Color>::const_iterator itEnd = theReservedColors.constEnd();
4805 for( ; it != itEnd; ++it )
4807 SALOMEDS::Color anAutoColor = *it;
4808 QColor aQColor( (int)( anAutoColor.R * 255.0 ), (int)( anAutoColor.G * 255.0 ), (int)( anAutoColor.B * 255.0 ) );
4811 aQColor.getHsv( &h, &s, &v );
4812 if( abs( h - aHue ) < aTolerance )
4824 aColor.setHsv( aHue, 255, 255 );
4826 SALOMEDS::Color aSColor;
4827 aSColor.R = (double)aColor.red() / 255.0;
4828 aSColor.G = (double)aColor.green() / 255.0;
4829 aSColor.B = (double)aColor.blue() / 255.0;
4834 const char gSeparator = '_'; // character used to separate parameter names
4835 const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
4836 const char gPathSep = '|'; // character used to separate paths
4839 * \brief Store visual parameters
4841 * This method is called just before the study document is saved.
4842 * Store visual parameters in AttributeParameter attribue(s)
4844 void SMESHGUI::storeVisualParameters (int savePoint)
4846 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
4847 if (!appStudy || !appStudy->studyDS())
4849 _PTR(Study) studyDS = appStudy->studyDS();
4851 // componentName is used for encoding of entries when storing them in IParameters
4852 std::string componentName = myComponentSMESH->ComponentDataType();
4853 //_PTR(SComponent) aSComponent = studyDS->FindComponent("SMESH");
4854 //if (!aSComponent) return;
4857 _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
4858 componentName.c_str(),
4860 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
4862 // store map of custom markers
4863 const VTK::MarkerMap& aMarkerMap = myMarkerMap[ studyDS->StudyId() ];
4864 if( !aMarkerMap.empty() )
4866 VTK::MarkerMap::const_iterator anIter = aMarkerMap.begin();
4867 for( ; anIter != aMarkerMap.end(); anIter++ )
4869 int anId = anIter->first;
4870 VTK::MarkerData aMarkerData = anIter->second;
4871 std::string aMarkerFileName = aMarkerData.first;
4872 VTK::MarkerTexture aMarkerTexture = aMarkerData.second;
4873 if( aMarkerTexture.size() < 3 )
4874 continue; // should contain at least width, height and the first value
4876 QString aPropertyName( "texture" );
4877 aPropertyName += gSeparator;
4878 aPropertyName += QString::number( anId );
4880 QString aPropertyValue = aMarkerFileName.c_str();
4881 aPropertyValue += gPathSep;
4883 VTK::MarkerTexture::const_iterator aTextureIter = aMarkerTexture.begin();
4884 ushort aWidth = *aTextureIter++;
4885 ushort aHeight = *aTextureIter++;
4886 aPropertyValue += QString::number( aWidth ); aPropertyValue += gDigitsSep;
4887 aPropertyValue += QString::number( aHeight ); aPropertyValue += gDigitsSep;
4888 for( ; aTextureIter != aMarkerTexture.end(); aTextureIter++ )
4889 aPropertyValue += QString::number( *aTextureIter );
4891 ip->setProperty( aPropertyName.toStdString(), aPropertyValue.toStdString() );
4895 // viewers counters are used for storing view_numbers in IParameters
4898 // main cycle to store parameters of displayed objects
4899 QList<SUIT_ViewManager*> lst;
4900 QList<SUIT_ViewManager*>::Iterator it;
4901 getApp()->viewManagers(lst);
4902 for (it = lst.begin(); it != lst.end(); it++)
4904 SUIT_ViewManager* vman = *it;
4905 QString vType = vman->getType();
4907 // saving VTK actors properties
4908 if (vType == SVTK_Viewer::Type())
4910 // store the clipping planes attached to the view manager
4911 SMESHGUI_ClippingPlaneInfoList aClippingPlaneInfoList;
4912 SMESHGUI_ClippingPlaneInfoMap::const_iterator anIter = myClippingPlaneInfoMap.find( vman );
4913 if( anIter != myClippingPlaneInfoMap.end() )
4914 aClippingPlaneInfoList = anIter->second;
4916 if( !aClippingPlaneInfoList.empty() ) {
4917 SMESHGUI_ClippingPlaneInfoList::const_iterator anIter = aClippingPlaneInfoList.begin();
4918 for( int anId = 0; anIter != aClippingPlaneInfoList.end(); anIter++, anId++ )
4920 const SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter;
4921 SMESH::OrientedPlane* aPlane = aClippingPlaneInfo.Plane;
4923 QString aPropertyName( "ClippingPlane" );
4924 aPropertyName += gSeparator;
4925 aPropertyName += QString::number( vtkViewers );
4926 aPropertyName += gSeparator;
4927 aPropertyName += QString::number( anId );
4929 QString aPropertyValue = QString::number( (int)aPlane->GetOrientation() ).toLatin1().constData();
4930 aPropertyValue += gDigitsSep;
4931 aPropertyValue += QString::number( aPlane->GetDistance() ).toLatin1().constData();
4932 aPropertyValue += gDigitsSep;
4933 aPropertyValue += QString::number( aPlane->myAngle[0] ).toLatin1().constData();
4934 aPropertyValue += gDigitsSep;
4935 aPropertyValue += QString::number( aPlane->myAngle[1] ).toLatin1().constData();
4937 ip->setProperty( aPropertyName.toStdString(), aPropertyValue.toStdString() );
4941 QVector<SUIT_ViewWindow*> views = vman->getViews();
4942 for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++)
4944 if (SVTK_ViewWindow* vtkView = dynamic_cast<SVTK_ViewWindow*>(views[i]))
4946 VTK::ActorCollectionCopy aCopy(vtkView->getRenderer()->GetActors());
4947 vtkActorCollection* allActors = aCopy.GetActors();
4948 allActors->InitTraversal();
4949 while (vtkActor* actor = allActors->GetNextActor())
4951 if (actor->GetVisibility()) // store only visible actors
4953 SMESH_Actor* aSmeshActor = 0;
4954 if (actor->IsA("SMESH_Actor"))
4955 aSmeshActor = SMESH_Actor::SafeDownCast(actor);
4956 if (aSmeshActor && aSmeshActor->hasIO())
4958 Handle(SALOME_InteractiveObject) io = aSmeshActor->getIO();
4961 // entry is "encoded" = it does NOT contain component adress,
4962 // since it is a subject to change on next component loading
4963 std::string entry = ip->encodeEntry(io->getEntry(), componentName);
4965 std::string param, vtkParam = vType.toLatin1().data();
4966 vtkParam += gSeparator;
4967 vtkParam += QString::number(vtkViewers).toLatin1().data();
4968 vtkParam += gSeparator;
4971 param = vtkParam + "Visibility";
4972 ip->setParameter(entry, param, "On");
4975 param = vtkParam + "Representation";
4976 ip->setParameter(entry, param, QString::number
4977 ((int)aSmeshActor->GetRepresentation()).toLatin1().data());
4980 param = vtkParam + "IsShrunk";
4981 ip->setParameter(entry, param, QString::number
4982 ((int)aSmeshActor->IsShrunk()).toLatin1().data());
4984 // Displayed entities
4985 unsigned int aMode = aSmeshActor->GetEntityMode();
4986 bool isE = aMode & SMESH_Actor::eEdges;
4987 bool isF = aMode & SMESH_Actor::eFaces;
4988 bool isV = aMode & SMESH_Actor::eVolumes;
4990 QString modeStr ("e");
4991 modeStr += gDigitsSep; modeStr += QString::number(isE);
4992 modeStr += gDigitsSep; modeStr += "f";
4993 modeStr += gDigitsSep; modeStr += QString::number(isF);
4994 modeStr += gDigitsSep; modeStr += "v";
4995 modeStr += gDigitsSep; modeStr += QString::number(isV);
4997 param = vtkParam + "Entities";
4998 ip->setParameter(entry, param, modeStr.toLatin1().data());
5000 // Colors (surface:edge:)
5001 vtkFloatingPointType r, g, b;
5003 aSmeshActor->GetSufaceColor(r, g, b);
5004 QString colorStr ("surface");
5005 colorStr += gDigitsSep; colorStr += QString::number(r);
5006 colorStr += gDigitsSep; colorStr += QString::number(g);
5007 colorStr += gDigitsSep; colorStr += QString::number(b);
5009 aSmeshActor->GetBackSufaceColor(r, g, b);
5010 colorStr += gDigitsSep; colorStr += "backsurface";
5011 colorStr += gDigitsSep; colorStr += QString::number(r);
5012 colorStr += gDigitsSep; colorStr += QString::number(g);
5013 colorStr += gDigitsSep; colorStr += QString::number(b);
5015 aSmeshActor->GetEdgeColor(r, g, b);
5016 colorStr += gDigitsSep; colorStr += "edge";
5017 colorStr += gDigitsSep; colorStr += QString::number(r);
5018 colorStr += gDigitsSep; colorStr += QString::number(g);
5019 colorStr += gDigitsSep; colorStr += QString::number(b);
5021 aSmeshActor->GetNodeColor(r, g, b);
5022 colorStr += gDigitsSep; colorStr += "node";
5023 colorStr += gDigitsSep; colorStr += QString::number(r);
5024 colorStr += gDigitsSep; colorStr += QString::number(g);
5025 colorStr += gDigitsSep; colorStr += QString::number(b);
5027 param = vtkParam + "Colors";
5028 ip->setParameter(entry, param, colorStr.toLatin1().data());
5030 // Sizes of lines and points
5031 QString sizeStr ("line");
5032 sizeStr += gDigitsSep; sizeStr += QString::number((int)aSmeshActor->GetLineWidth());
5033 sizeStr += gDigitsSep; sizeStr += "shrink";
5034 sizeStr += gDigitsSep; sizeStr += QString::number(aSmeshActor->GetShrinkFactor());
5036 param = vtkParam + "Sizes";
5037 ip->setParameter(entry, param, sizeStr.toLatin1().data());
5042 VTK::MarkerType aMarkerType = aSmeshActor->GetMarkerType();
5043 if( aMarkerType == VTK::MT_USER ) {
5044 markerStr += "custom";
5045 markerStr += gDigitsSep;
5046 markerStr += QString::number( aSmeshActor->GetMarkerTexture() );
5050 markerStr += gDigitsSep;
5051 markerStr += QString::number( (int)aMarkerType );
5052 markerStr += gDigitsSep;
5053 markerStr += QString::number( (int)aSmeshActor->GetMarkerScale() );
5056 param = vtkParam + "PointMarker";
5057 ip->setParameter(entry, param, markerStr.toLatin1().data());
5060 param = vtkParam + "Opacity";
5061 ip->setParameter(entry, param,
5062 QString::number(aSmeshActor->GetOpacity()).toLatin1().data());
5065 param = vtkParam + "ClippingPlane";
5067 if( !aClippingPlaneInfoList.empty() ) {
5068 SMESHGUI_ClippingPlaneInfoList::const_iterator anIter1 = aClippingPlaneInfoList.begin();
5069 for( int anId = 0; anIter1 != aClippingPlaneInfoList.end(); anIter1++, anId++ )
5071 const SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter1;
5072 std::list<vtkActor*> anActorList = aClippingPlaneInfo.ActorList;
5073 SMESH::TActorList::iterator anIter2 = anActorList.begin();
5074 for ( ; anIter2 != anActorList.end(); anIter2++ ) {
5075 if( aSmeshActor == *anIter2 ) {
5076 ip->setParameter( entry, param + QString::number( ++aPlaneId ).toLatin1().constData(),
5077 QString::number( anId ).toLatin1().constData() );
5084 ip->setParameter( entry, param, "Off" );
5085 } // if (io->hasEntry())
5086 } // SMESH_Actor && hasIO
5088 } // while.. actors traversal
5092 } // if (SVTK view model)
5093 } // for (viewManagers)
5096 // data structures for clipping planes processing
5099 vtkIdType Orientation;
5100 vtkFloatingPointType Distance;
5101 vtkFloatingPointType Angle[2];
5103 typedef std::list<TPlaneData> TPlaneDataList;
5104 typedef std::map<int, TPlaneDataList> TPlaneDataMap;
5106 typedef std::list<vtkActor*> TActorList;
5109 TActorList ActorList;
5110 SUIT_ViewManager* ViewManager;
5112 typedef std::list<TPlaneInfo> TPlaneInfoList;
5113 typedef std::map<int, TPlaneInfoList> TPlaneInfoMap;
5116 * \brief Restore visual parameters
5118 * This method is called after the study document is opened.
5119 * Restore visual parameters from AttributeParameter attribue(s)
5121 void SMESHGUI::restoreVisualParameters (int savePoint)
5123 SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
5124 if (!appStudy || !appStudy->studyDS())
5126 _PTR(Study) studyDS = appStudy->studyDS();
5128 // componentName is used for encoding of entries when storing them in IParameters
5129 std::string componentName = myComponentSMESH->ComponentDataType();
5130 //_PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
5131 //if (!aSComponent) return;
5134 _PTR(AttributeParameter) ap = studyDS->GetModuleParameters("Interface Applicative",
5135 componentName.c_str(),
5137 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
5139 // restore map of custom markers and map of clipping planes
5140 VTK::MarkerMap& aMarkerMap = myMarkerMap[ studyDS->StudyId() ];
5141 TPlaneDataMap aPlaneDataMap;
5143 std::vector<std::string> properties = ip->getProperties();
5144 for (std::vector<std::string>::iterator propIt = properties.begin(); propIt != properties.end(); ++propIt)
5146 std::string property = *propIt;
5147 QString aPropertyName( property.c_str() );
5148 QString aPropertyValue( ip->getProperty( property ).c_str() );
5150 QStringList aPropertyNameList = aPropertyName.split( gSeparator, QString::SkipEmptyParts );
5151 if( aPropertyNameList.isEmpty() )
5154 QString aPropertyType = aPropertyNameList[0];
5155 if( aPropertyType == "texture" )
5157 if( aPropertyNameList.size() != 2 )
5161 int anId = aPropertyNameList[1].toInt( &ok );
5162 if( !ok || anId < 1 )
5165 QStringList aPropertyValueList = aPropertyValue.split( gPathSep, QString::SkipEmptyParts );
5166 if( aPropertyValueList.size() != 2 )
5169 std::string aMarkerFileName = aPropertyValueList[0].toStdString();
5170 QString aMarkerTextureString = aPropertyValueList[1];
5171 QStringList aMarkerTextureStringList = aMarkerTextureString.split( gDigitsSep, QString::SkipEmptyParts );
5172 if( aMarkerTextureStringList.size() != 3 )
5176 ushort aWidth = aMarkerTextureStringList[0].toUShort( &ok );
5181 ushort aHeight = aMarkerTextureStringList[1].toUShort( &ok );
5185 VTK::MarkerTexture aMarkerTexture;
5186 aMarkerTexture.push_back( aWidth );
5187 aMarkerTexture.push_back( aHeight );
5189 QString aMarkerTextureData = aMarkerTextureStringList[2];
5190 for( int i = 0, n = aMarkerTextureData.length(); i < n; i++ )
5192 QChar aChar = aMarkerTextureData.at( i );
5193 if( aChar.isDigit() )
5194 aMarkerTexture.push_back( aChar.digitValue() );
5197 aMarkerMap[ anId ] = VTK::MarkerData( aMarkerFileName, aMarkerTexture );
5199 else if( aPropertyType == "ClippingPlane" )
5201 if( aPropertyNameList.size() != 3 )
5205 int aViewId = aPropertyNameList[1].toInt( &ok );
5206 if( !ok || aViewId < 0 )
5210 int aClippingPlaneId = aPropertyNameList[2].toInt( &ok );
5211 if( !ok || aClippingPlaneId < 0 )
5214 QStringList aPropertyValueList = aPropertyValue.split( gDigitsSep, QString::SkipEmptyParts );
5215 if( aPropertyValueList.size() != 4 )
5218 TPlaneData aPlaneData;
5219 aPlaneData.Id = aClippingPlaneId;
5222 aPlaneData.Orientation = aPropertyValueList[0].toInt( &ok );
5227 aPlaneData.Distance = aPropertyValueList[1].toDouble( &ok );
5232 aPlaneData.Angle[0] = aPropertyValueList[2].toDouble( &ok );
5237 aPlaneData.Angle[1] = aPropertyValueList[3].toDouble( &ok );
5241 TPlaneDataList& aPlaneDataList = aPlaneDataMap[ aViewId ];
5242 aPlaneDataList.push_back( aPlaneData );
5246 TPlaneInfoMap aPlaneInfoMap;
5248 std::vector<std::string> entries = ip->getEntries();
5250 for (std::vector<std::string>::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt)
5252 // entry is a normal entry - it should be "decoded" (setting base adress of component)
5253 QString entry (ip->decodeEntry(*entIt).c_str());
5255 // Check that the entry corresponds to a real object in the Study
5256 // as the object may be deleted or modified after the visual state is saved.
5257 _PTR(SObject) so = studyDS->FindObjectID(entry.toLatin1().data());
5258 if (!so) continue; //Skip the not existent entry
5260 std::vector<std::string> paramNames = ip->getAllParameterNames( *entIt );
5261 std::vector<std::string> paramValues = ip->getAllParameterValues( *entIt );
5263 std::vector<std::string>::iterator namesIt = paramNames.begin();
5264 std::vector<std::string>::iterator valuesIt = paramValues.begin();
5266 // actors are stored in a map after displaying of them for
5267 // quicker access in the future: map < viewID to actor >
5268 NCollection_DataMap<int, SMESH_Actor*> vtkActors;
5270 for (; namesIt != paramNames.end(); ++namesIt, ++valuesIt)
5272 // visual parameters are stored in strings as follows: ViewerType_ViewIndex_ParamName.
5273 // '_' is used as separator and should not be used in viewer type or parameter names.
5274 QStringList lst = QString((*namesIt).c_str()).split(gSeparator, QString::SkipEmptyParts);
5275 if (lst.size() != 3)
5278 QString viewerTypStr = lst[0];
5279 QString viewIndexStr = lst[1];
5280 QString paramNameStr = lst[2];
5283 int viewIndex = viewIndexStr.toUInt(&ok);
5284 if (!ok) // bad conversion of view index to integer
5288 if (viewerTypStr == SVTK_Viewer::Type())
5290 SMESH_Actor* aSmeshActor = 0;
5291 if (vtkActors.IsBound(viewIndex))
5292 aSmeshActor = vtkActors.Find(viewIndex);
5294 QList<SUIT_ViewManager*> lst;
5295 getApp()->viewManagers(viewerTypStr, lst);
5297 // SVTK ViewManager always has 1 ViewWindow, so view index is index of view manager
5298 SUIT_ViewManager* vman = NULL;
5299 if (viewIndex >= 0 && viewIndex < lst.count())
5300 vman = lst.at(viewIndex);
5302 if (paramNameStr == "Visibility")
5304 if (!aSmeshActor && displayer() && vman)
5306 SUIT_ViewModel* vmodel = vman->getViewModel();
5307 // SVTK view model can be casted to SALOME_View
5308 displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
5310 // store displayed actor in a temporary map for quicker
5311 // access later when restoring other parameters
5312 SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) vman->getActiveView();
5313 vtkRenderer* Renderer = vtkView->getRenderer();
5314 VTK::ActorCollectionCopy aCopy(Renderer->GetActors());
5315 vtkActorCollection* theActors = aCopy.GetActors();
5316 theActors->InitTraversal();
5317 bool isFound = false;
5318 vtkActor *ac = theActors->GetNextActor();
5319 for (; ac != NULL && !isFound; ac = theActors->GetNextActor()) {
5320 if (ac->IsA("SMESH_Actor")) {
5321 SMESH_Actor* aGeomAc = SMESH_Actor::SafeDownCast(ac);
5322 if (aGeomAc->hasIO()) {
5323 Handle(SALOME_InteractiveObject) io =
5324 Handle(SALOME_InteractiveObject)::DownCast(aGeomAc->getIO());
5325 if (io->hasEntry() && strcmp(io->getEntry(), entry.toLatin1().data()) == 0) {
5327 vtkActors.Bind(viewIndex, aGeomAc);
5333 } // if (paramNameStr == "Visibility")
5336 // the rest properties "work" with SMESH_Actor
5339 QString val ((*valuesIt).c_str());
5342 if (paramNameStr == "Representation") {
5343 aSmeshActor->SetRepresentation((SMESH_Actor::EReperesent)val.toInt());
5346 else if (paramNameStr == "IsShrunk") {
5348 if (!aSmeshActor->IsShrunk())
5349 aSmeshActor->SetShrink();
5352 if (aSmeshActor->IsShrunk())
5353 aSmeshActor->UnShrink();
5356 // Displayed entities
5357 else if (paramNameStr == "Entities") {
5358 QStringList mode = val.split(gDigitsSep, QString::SkipEmptyParts);
5359 if (mode.count() == 6) {
5360 if (mode[0] != "e" || mode[2] != "f" || mode[4] != "v") {
5361 MESSAGE("Invalid order of data in Entities, must be: "
5362 "e:0/1:f:0/1:v:0/1");
5365 unsigned int aMode = aSmeshActor->GetEntityMode();
5366 unsigned int aNewMode =
5367 (int(SMESH_Actor::eEdges ) * mode[1].toInt()) |
5368 (int(SMESH_Actor::eFaces ) * mode[3].toInt()) |
5369 (int(SMESH_Actor::eVolumes) * mode[5].toInt());
5370 if (aNewMode != aMode)
5371 aSmeshActor->SetEntityMode(aNewMode);
5376 else if (paramNameStr == "Colors") {
5377 QStringList colors = val.split(gDigitsSep, QString::SkipEmptyParts);
5378 if (colors.count() == 16) {
5379 if (colors[0] != "surface" || colors[4] != "backsurface" ||
5380 colors[8] != "edge" || colors[12] != "node") {
5381 MESSAGE("Invalid order of data in Colors, must be: "
5382 "surface:r:g:b:backsurface:r:g:b:edge:r:g:b:node:r:g:b");
5385 aSmeshActor->SetSufaceColor(colors[1].toFloat(), colors[2].toFloat(), colors[3].toFloat());
5386 aSmeshActor->SetBackSufaceColor(colors[5].toFloat(), colors[6].toFloat(), colors[7].toFloat());
5387 aSmeshActor->SetEdgeColor(colors[9].toFloat(), colors[10].toFloat(), colors[11].toFloat());
5388 aSmeshActor->SetNodeColor(colors[13].toFloat(), colors[14].toFloat(), colors[15].toFloat());
5392 // Sizes of lines and points
5393 else if (paramNameStr == "Sizes") {
5394 QStringList sizes = val.split(gDigitsSep, QString::SkipEmptyParts);
5395 if (sizes.count() == 4) {
5396 if (sizes[0] != "line" || sizes[2] != "shrink") {
5397 MESSAGE("Invalid order of data in Sizes, must be: "
5398 "line:int:shrink:float");
5401 aSmeshActor->SetLineWidth(sizes[1].toInt());
5402 aSmeshActor->SetShrinkFactor(sizes[3].toFloat());
5405 else if (sizes.count() == 6) { // just to support old format
5406 if (sizes[0] != "line" || sizes[2] != "node" || sizes[4] != "shrink") {
5407 MESSAGE("Invalid order of data in Sizes, must be: "
5408 "line:int:node:int:shrink:float");
5411 aSmeshActor->SetLineWidth(sizes[1].toInt());
5412 //aSmeshActor->SetNodeSize(sizes[3].toInt()); // made obsolete
5413 aSmeshActor->SetShrinkFactor(sizes[5].toFloat());
5418 else if (paramNameStr == "PointMarker") {
5419 QStringList data = val.split(gDigitsSep, QString::SkipEmptyParts);
5420 if( data.count() >= 2 ) {
5422 int aParam1 = data[1].toInt( &ok );
5424 if( data[0] == "std" && data.count() == 3 ) {
5425 int aParam2 = data[2].toInt( &ok );
5426 aSmeshActor->SetMarkerStd( (VTK::MarkerType)aParam1, (VTK::MarkerScale)aParam2 );
5428 else if( data[0] == "custom" ) {
5429 VTK::MarkerMap::const_iterator markerIt = aMarkerMap.find( aParam1 );
5430 if( markerIt != aMarkerMap.end() ) {
5431 VTK::MarkerData aMarkerData = markerIt->second;
5432 aSmeshActor->SetMarkerTexture( aParam1, aMarkerData.second );
5439 else if (paramNameStr == "Opacity") {
5440 aSmeshActor->SetOpacity(val.toFloat());
5443 else if (paramNameStr.startsWith("ClippingPlane")) {
5444 QStringList vals = val.split(gDigitsSep, QString::SkipEmptyParts);
5445 // old format - val looks like "Off" or "0:0.5:0:0" (orientation, distance, two angles)
5446 // new format - val looks like "Off" or "0" (plane id)
5447 // (note: in new format "Off" value is used only for consistency,
5448 // so it is processed together with values in old format)
5449 bool anIsOldFormat = ( vals.count() == 4 || val == "Off" );
5450 if( anIsOldFormat ) {
5451 if (paramNameStr == "ClippingPlane1" || val == "Off")
5452 aSmeshActor->RemoveAllClippingPlanes();
5454 SMESH::Orientation anOrientation = (SMESH::Orientation)vals[0].toInt();
5455 double aDistance = vals[1].toFloat();
5456 vtkFloatingPointType anAngle[2];
5457 anAngle[0] = vals[2].toFloat();
5458 anAngle[1] = vals[3].toFloat();
5460 QList<SUIT_ViewManager*> lst;
5461 getApp()->viewManagers(viewerTypStr, lst);
5462 // SVTK ViewManager always has 1 ViewWindow, so view index is index of view manager
5463 if (viewIndex >= 0 && viewIndex < lst.count()) {
5464 SUIT_ViewManager* vman = lst.at(viewIndex);
5465 SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) vman->getActiveView();
5467 SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = myClippingPlaneInfoMap[ vman ];
5469 SMESH::TActorList anActorList;
5470 anActorList.push_back( aSmeshActor );
5471 SMESH::OrientedPlane* aPlane =
5472 SMESHGUI_ClippingDlg::AddPlane(anActorList, vtkView, anOrientation, aDistance, anAngle);
5474 SMESH::ClippingPlaneInfo aClippingPlaneInfo;
5475 aClippingPlaneInfo.Plane = aPlane;
5476 aClippingPlaneInfo.ActorList = anActorList;
5477 aClippingPlaneInfoList.push_back( aClippingPlaneInfo );
5484 int aPlaneId = val.toInt( &ok );
5485 if( ok && aPlaneId >= 0 ) {
5486 bool anIsDefinedPlane = false;
5487 TPlaneInfoList& aPlaneInfoList = aPlaneInfoMap[ viewIndex ];
5488 TPlaneInfoList::iterator anIter = aPlaneInfoList.begin();
5489 for( ; anIter != aPlaneInfoList.end(); anIter++ ) {
5490 TPlaneInfo& aPlaneInfo = *anIter;
5491 if( aPlaneInfo.PlaneId == aPlaneId ) {
5492 aPlaneInfo.ActorList.push_back( aSmeshActor );
5493 anIsDefinedPlane = true;
5497 if( !anIsDefinedPlane ) {
5498 TPlaneInfo aPlaneInfo;
5499 aPlaneInfo.PlaneId = aPlaneId;
5500 aPlaneInfo.ActorList.push_back( aSmeshActor );
5501 aPlaneInfo.ViewManager = vman;
5503 // to make the list sorted by plane id
5504 anIter = aPlaneInfoList.begin();
5505 for( ; anIter != aPlaneInfoList.end(); anIter++ ) {
5506 const TPlaneInfo& aPlaneInfoRef = *anIter;
5507 if( aPlaneInfoRef.PlaneId > aPlaneId )
5510 aPlaneInfoList.insert( anIter, aPlaneInfo );
5515 } // if (aSmeshActor)
5516 } // other parameters than Visibility
5518 } // for names/parameters iterator
5519 } // for entries iterator
5521 // take into account planes with empty list of actors referred to them
5522 QList<SUIT_ViewManager*> aVMList;
5523 getApp()->viewManagers(SVTK_Viewer::Type(), aVMList);
5525 TPlaneDataMap::const_iterator aPlaneDataIter = aPlaneDataMap.begin();
5526 for( ; aPlaneDataIter != aPlaneDataMap.end(); aPlaneDataIter++ ) {
5527 int aViewId = aPlaneDataIter->first;
5528 if( aViewId >= 0 && aViewId < aVMList.count() ) {
5529 SUIT_ViewManager* aViewManager = aVMList.at( aViewId );
5531 const TPlaneDataList& aPlaneDataList = aPlaneDataIter->second;
5533 TPlaneInfoList& aPlaneInfoList = aPlaneInfoMap[ aViewId ];
5534 TPlaneDataList::const_iterator anIter2 = aPlaneDataList.begin();
5535 for( ; anIter2 != aPlaneDataList.end(); anIter2++ ) {
5536 const TPlaneData& aPlaneData = *anIter2;
5537 int aPlaneId = aPlaneData.Id;
5539 bool anIsFound = false;
5540 TPlaneInfoList::const_iterator anIter3 = aPlaneInfoList.begin();
5541 for( ; anIter3 != aPlaneInfoList.end(); anIter3++ ) {
5542 const TPlaneInfo& aPlaneInfo = *anIter3;
5543 if( aPlaneInfo.PlaneId == aPlaneId ) {
5550 TPlaneInfo aPlaneInfo; // ActorList field is empty
5551 aPlaneInfo.PlaneId = aPlaneId;
5552 aPlaneInfo.ViewManager = aViewManager;
5554 // to make the list sorted by plane id
5555 TPlaneInfoList::iterator anIter4 = aPlaneInfoList.begin();
5556 for( ; anIter4 != aPlaneInfoList.end(); anIter4++ ) {
5557 const TPlaneInfo& aPlaneInfoRef = *anIter4;
5558 if( aPlaneInfoRef.PlaneId > aPlaneId )
5561 aPlaneInfoList.insert( anIter4, aPlaneInfo );
5567 // add clipping planes to actors according to the restored parameters
5568 // and update the clipping plane map
5569 TPlaneInfoMap::const_iterator anIter1 = aPlaneInfoMap.begin();
5570 for( ; anIter1 != aPlaneInfoMap.end(); anIter1++ ) {
5571 int aViewId = anIter1->first;
5572 const TPlaneInfoList& aPlaneInfoList = anIter1->second;
5574 TPlaneDataMap::const_iterator anIter2 = aPlaneDataMap.find( aViewId );
5575 if( anIter2 == aPlaneDataMap.end() )
5577 const TPlaneDataList& aPlaneDataList = anIter2->second;
5579 TPlaneInfoList::const_iterator anIter3 = aPlaneInfoList.begin();
5580 for( ; anIter3 != aPlaneInfoList.end(); anIter3++ ) {
5581 const TPlaneInfo& aPlaneInfo = *anIter3;
5582 int aPlaneId = aPlaneInfo.PlaneId;
5583 const TActorList& anActorList = aPlaneInfo.ActorList;
5584 SUIT_ViewManager* aViewManager = aPlaneInfo.ViewManager;
5588 SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>( aViewManager->getActiveView() );
5592 SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = myClippingPlaneInfoMap[ aViewManager ];
5594 TPlaneDataList::const_iterator anIter4 = aPlaneDataList.begin();
5595 for( ; anIter4 != aPlaneDataList.end(); anIter4++ ) {
5596 const TPlaneData& aPlaneData = *anIter4;
5597 if( aPlaneData.Id == aPlaneId ) {
5598 SMESH::OrientedPlane* aPlane =
5599 SMESHGUI_ClippingDlg::AddPlane( anActorList,
5601 (SMESH::Orientation)aPlaneData.Orientation,
5602 aPlaneData.Distance,
5605 SMESH::ClippingPlaneInfo aClippingPlaneInfo;
5606 aClippingPlaneInfo.Plane = aPlane;
5607 aClippingPlaneInfo.ActorList = anActorList;
5608 aClippingPlaneInfoList.push_back( aClippingPlaneInfo );
5616 // update all VTK views
5617 QList<SUIT_ViewManager*> lst;
5618 getApp()->viewManagers(lst);
5619 for (QList<SUIT_ViewManager*>::Iterator it = lst.begin(); it != lst.end(); it++) {
5620 SUIT_ViewModel* vmodel = (*it)->getViewModel();
5621 if (vmodel && vmodel->getType() == SVTK_Viewer::Type()) {
5622 SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) (*it)->getActiveView();
5623 vtkView->getRenderer()->ResetCameraClippingRange();
5630 \brief Adds preferences for dfont of VTK viewer
5632 \param pIf group identifier
5633 \param param parameter
5634 \return identifier of preferences
5636 int SMESHGUI::addVtkFontPref( const QString& label, const int pId, const QString& param )
5638 int tfont = addPreference( label, pId, LightApp_Preferences::Font, "SMESH", param );
5640 setPreferenceProperty( tfont, "mode", QtxFontEdit::Custom );
5643 fam.append( tr( "SMESH_FONT_ARIAL" ) );
5644 fam.append( tr( "SMESH_FONT_COURIER" ) );
5645 fam.append( tr( "SMESH_FONT_TIMES" ) );
5647 setPreferenceProperty( tfont, "fonts", fam );
5649 int f = QtxFontEdit::Family | QtxFontEdit::Bold | QtxFontEdit::Italic | QtxFontEdit::Shadow;
5650 setPreferenceProperty( tfont, "features", f );
5656 \brief Actions after hypothesis edition
5657 Updates object browser after hypothesis edition
5659 void SMESHGUI::onHypothesisEdit( int result )
5662 SMESHGUI::Modified();
5663 updateObjBrowser( true );
5668 \brief Signal handler closing(SUIT_ViewWindow*) of a view
5669 \param pview view being closed
5671 void SMESHGUI::onViewClosed( SUIT_ViewWindow* pview ) {
5672 #ifndef DISABLE_PLOT2DVIEWER
5673 //Crear all Plot2d Viewers if need.
5674 SMESH::ClearPlot2Viewers(pview);
5679 \brief Connects or disconnects signals about activating and cloning view on the module slots
5680 \param pview view which is connected/disconnected
5682 void SMESHGUI::connectView( const SUIT_ViewWindow* pview ) {
5686 SUIT_ViewManager* viewMgr = pview->getViewManager();
5688 disconnect( viewMgr, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
5689 this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) );
5691 connect( viewMgr, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
5692 this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) );
5697 \brief Return \c true if object can be renamed
5699 bool SMESHGUI::renameAllowed( const QString& entry) const {
5700 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
5704 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); //Document OCAF de l'etude active
5708 bool appRes = SalomeApp_Module::renameAllowed(entry);
5712 // check type to prevent renaming of inappropriate objects
5713 int aType = SMESHGUI_Selection::type(qPrintable(entry), aStudy);
5714 if (aType == MESH || aType == GROUP ||
5715 aType == SUBMESH || aType == SUBMESH_COMPOUND ||
5716 aType == SUBMESH_SOLID || aType == SUBMESH_FACE ||
5717 aType == SUBMESH_EDGE || aType == SUBMESH_VERTEX ||
5718 aType == HYPOTHESIS || aType == ALGORITHM)
5725 Rename object by entry.
5726 \param entry entry of the object
5727 \param name new name of the object
5728 \brief Return \c true if rename operation finished successfully, \c false otherwise.
5730 bool SMESHGUI::renameObject( const QString& entry, const QString& name) {
5732 SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>( application() );
5736 _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); //Document OCAF de l'etude active
5740 bool appRes = SalomeApp_Module::renameObject(entry,name);
5744 _PTR(SObject) obj = aStudy->FindObjectID( qPrintable(entry) );
5745 _PTR(GenericAttribute) anAttr;
5746 _PTR(AttributeName) aName;
5748 if ( obj->FindAttribute(anAttr, "AttributeName") ) {
5750 // check type to prevent renaming of inappropriate objects
5751 int aType = SMESHGUI_Selection::type( qPrintable(entry), aStudy );
5752 if (aType == MESH || aType == GROUP ||
5753 aType == SUBMESH || aType == SUBMESH_COMPOUND ||
5754 aType == SUBMESH_SOLID || aType == SUBMESH_FACE ||
5755 aType == SUBMESH_EDGE || aType == SUBMESH_VERTEX ||
5756 aType == HYPOTHESIS || aType == ALGORITHM) {
5757 if ( !name.isEmpty() ) {
5758 SMESHGUI::GetSMESHGen()->SetName(obj->GetIOR().c_str(), qPrintable(name) );
5760 // update name of group object and its actor
5761 Handle(SALOME_InteractiveObject) IObject =
5762 new SALOME_InteractiveObject ( qPrintable(entry), "SMESH", qPrintable(name) );
5764 SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
5765 if( !aGroupObject->_is_nil() ) {
5766 aGroupObject->SetName( qPrintable(name) );
5767 if ( SMESH_Actor *anActor = SMESH::FindActorByEntry( qPrintable(entry) ) )
5768 anActor->setName( qPrintable(name) );