X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI.cxx;h=fc3c33c04fe25b90746c4f17d0af9f809c6c9a6c;hp=1214bf1910e748e16b825d46ab25592617edb3bc;hb=f3e2b7fea2d36b7dbe2df39f3e08e9c4d9b30e6d;hpb=bf4083bfeee4e1ae00e16e8643d501cb8ff9142c diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 1214bf191..fc3c33c04 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -82,6 +82,7 @@ #include "SMESHGUI_TranslationDlg.h" #include "SMESHGUI_TransparencyDlg.h" #include "SMESHGUI_DisplayEntitiesDlg.h" +#include "SMESHGUI_SplitBiQuad.h" #include "SMESHGUI_FilterUtils.h" #include "SMESHGUI_GEOMGenUtils.h" @@ -173,14 +174,10 @@ // OCCT includes #include #include +#include #include -//To disable automatic genericobj management, the following line should be commented. -//Otherwise, it should be uncommented. -//Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx -#define WITHGENERICOBJ - // Below macro, when uncommented, switches on simplified (more performant) algorithm // of auto-color picking up #define SIMPLE_AUTOCOLOR @@ -190,7 +187,7 @@ namespace // Declarations //============================================================= void ImportMeshesFromFile(SMESH::SMESH_Gen_ptr theComponentMesh, - int theCommandID); + int theCommandID); void ExportMeshToFile(int theCommandID); @@ -198,6 +195,8 @@ namespace void SetDisplayEntity(int theCommandID); + int ActionToControl( int theID, bool theReversed = false ); + void Control( int theCommandID ); // Definitions @@ -208,7 +207,7 @@ namespace //================================================================================ void ImportMeshesFromFile( SMESH::SMESH_Gen_ptr theComponentMesh, - int theCommandID ) + int theCommandID ) { QStringList filter; std::string myExtension; @@ -420,17 +419,24 @@ namespace if( aSel ) aSel->selectedObjects( selected ); - const bool isDAT = ( theCommandID == SMESHOp::OpExportDAT || theCommandID == SMESHOp::OpPopupExportDAT ); - const bool isMED = ( theCommandID == SMESHOp::OpExportMED || theCommandID == SMESHOp::OpPopupExportMED ); - const bool isUNV = ( theCommandID == SMESHOp::OpExportUNV || theCommandID == SMESHOp::OpPopupExportUNV ); - const bool isSTL = ( theCommandID == SMESHOp::OpExportSTL || theCommandID == SMESHOp::OpPopupExportSTL ); + const bool isDAT = ( theCommandID == SMESHOp::OpExportDAT || + theCommandID == SMESHOp::OpPopupExportDAT ); + const bool isMED = ( theCommandID == SMESHOp::OpExportMED || + theCommandID == SMESHOp::OpPopupExportMED ); + const bool isUNV = ( theCommandID == SMESHOp::OpExportUNV || + theCommandID == SMESHOp::OpPopupExportUNV ); + const bool isSTL = ( theCommandID == SMESHOp::OpExportSTL || + theCommandID == SMESHOp::OpPopupExportSTL ); #ifdef WITH_CGNS - const bool isCGNS= ( theCommandID == SMESHOp::OpExportCGNS || theCommandID == SMESHOp::OpPopupExportCGNS ); + const bool isCGNS= ( theCommandID == SMESHOp::OpExportCGNS || + theCommandID == SMESHOp::OpPopupExportCGNS ); #else const bool isCGNS= false; #endif - const bool isSAUV= ( theCommandID == SMESHOp::OpExportSAUV || theCommandID == SMESHOp::OpPopupExportSAUV ); - const bool isGMF = ( theCommandID == SMESHOp::OpExportGMF || theCommandID == SMESHOp::OpPopupExportGMF ); + const bool isSAUV= ( theCommandID == SMESHOp::OpExportSAUV || + theCommandID == SMESHOp::OpPopupExportSAUV ); + const bool isGMF = ( theCommandID == SMESHOp::OpExportGMF || + theCommandID == SMESHOp::OpPopupExportGMF ); const bool multiMeshSupported = ( isMED || isCGNS ); // file can hold several meshes if ( selected.Extent() == 0 || ( selected.Extent() > 1 && !multiMeshSupported )) @@ -438,13 +444,14 @@ namespace // get mesh object from selection and check duplication of their names bool hasDuplicatedMeshNames = false; - QList< QPair< SMESH::SMESH_IDSource_var, QString > > aMeshList; + QList< QPair< SMESH::SMESH_IDSource_var, QString > > aMeshList; QList< QPair< SMESH::SMESH_IDSource_var, QString > >::iterator aMeshIter; SALOME_ListIteratorOfListIO It( selected ); for( ; It.More(); It.Next() ) { Handle(SALOME_InteractiveObject) anIObject = It.Value(); - SMESH::SMESH_IDSource_var aMeshItem = SMESH::IObjectToInterface(anIObject); + SMESH::SMESH_IDSource_var aMeshItem = + SMESH::IObjectToInterface(anIObject); if ( aMeshItem->_is_nil() ) { SUIT_MessageBox::warning( SMESHGUI::desktop(), QObject::tr( "SMESH_WRN_WARNING" ), @@ -568,7 +575,7 @@ namespace if ( !presentNotSupported.empty() ) { QString typeNames; - const char* typeMsg[SMESH::Entity_Last] = { + const char* typeMsg[] = { "SMESH_NODES", "SMESH_ELEMS0D","SMESH_EDGES","SMESH_QUADRATIC_EDGES", "SMESH_TRIANGLES", "SMESH_QUADRATIC_TRIANGLES", "SMESH_BIQUADRATIC_TRIANGLES", "SMESH_QUADRANGLES","SMESH_QUADRATIC_QUADRANGLES", "SMESH_BIQUADRATIC_QUADRANGLES", @@ -578,6 +585,10 @@ namespace "SMESH_TRIQUADRATIC_HEXAHEDRONS","SMESH_PENTAHEDRA","SMESH_QUADRATIC_PENTAHEDRONS", "SMESH_OCTAHEDRA","SMESH_POLYEDRONS","SMESH_QUADRATIC_POLYEDRONS","SMESH_BALLS" }; + // is typeMsg complete? (compilation failure mains that enum SMDSAbs_EntityType changed) + const int nbTypes = sizeof( typeMsg ) / sizeof( const char* ); + int _assert[( nbTypes == SMESH::Entity_Last ) ? 1 : -1 ]; _assert[0]=1; + QString andStr = " " + QObject::tr("SMESH_AND") + " ", comma(", "); for ( size_t iType = 0; iType < presentNotSupported.size(); ++iType ) { typeNames += QObject::tr( typeMsg[ presentNotSupported[ iType ]]); @@ -604,7 +615,7 @@ namespace SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); if ( resMgr ) toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false ); - bool toOverwrite = true; + bool toOverwrite = true; bool toFindOutDim = true; QString aFilter, aTitle = QObject::tr("SMESH_EXPORT_MESH"); @@ -915,7 +926,7 @@ namespace } inline void InverseEntityMode(unsigned int& theOutputMode, - unsigned int theMode) + unsigned int theMode) { bool anIsNotPresent = ~theOutputMode & theMode; if(anIsNotPresent) @@ -924,13 +935,14 @@ namespace theOutputMode &= ~theMode; } - void SetDisplayEntity(int theCommandID){ + void SetDisplayEntity(int theCommandID) + { LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); SALOME_ListIO selected; - if( aSel ) + if ( aSel ) aSel->selectedObjects( selected ); - if(selected.Extent() >= 1){ + if ( selected.Extent() >= 1 ) { SALOME_ListIteratorOfListIO It( selected ); for( ; It.More(); It.Next()){ Handle(SALOME_InteractiveObject) IObject = It.Value(); @@ -938,24 +950,12 @@ namespace if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){ unsigned int aMode = anActor->GetEntityMode(); switch(theCommandID){ - case SMESHOp::OpDE0DElements: - InverseEntityMode(aMode,SMESH_Actor::e0DElements); - break; - case SMESHOp::OpDEEdges: - InverseEntityMode(aMode,SMESH_Actor::eEdges); - break; - case SMESHOp::OpDEFaces: - InverseEntityMode(aMode,SMESH_Actor::eFaces); - break; - case SMESHOp::OpDEVolumes: - InverseEntityMode(aMode,SMESH_Actor::eVolumes); - break; - case SMESHOp::OpDEBalls: - InverseEntityMode(aMode,SMESH_Actor::eBallElem); - break; - case SMESHOp::OpDEAllEntity: - aMode = SMESH_Actor::eAllEntity; - break; + case SMESHOp::OpDE0DElements: InverseEntityMode(aMode,SMESH_Actor::e0DElements); break; + case SMESHOp::OpDEEdges: InverseEntityMode(aMode,SMESH_Actor::eEdges); break; + case SMESHOp::OpDEFaces: InverseEntityMode(aMode,SMESH_Actor::eFaces); break; + case SMESHOp::OpDEVolumes: InverseEntityMode(aMode,SMESH_Actor::eVolumes); break; + case SMESHOp::OpDEBalls: InverseEntityMode(aMode,SMESH_Actor::eBallElem); break; + case SMESHOp::OpDEAllEntity: aMode = SMESH_Actor::eAllEntity; break; } if(aMode) anActor->SetEntityMode(aMode); @@ -967,26 +967,27 @@ namespace void AutoColor() { - SALOME_ListIO selected; - SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); - if( !app ) + SalomeApp_Application* app = + dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) return; LightApp_SelectionMgr* aSel = app->selectionMgr(); SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); - if( !aSel || !appStudy ) + if ( !aSel || !appStudy ) return; + SALOME_ListIO selected; aSel->selectedObjects( selected ); - if( selected.IsEmpty() ) + if ( selected.IsEmpty() ) return; Handle(SALOME_InteractiveObject) anIObject = selected.First(); - _PTR(Study) aStudy = appStudy->studyDS(); - _PTR(SObject) aMainSObject( aStudy->FindObjectID( anIObject->getEntry() ) ); + _PTR(Study) aStudy = appStudy->studyDS(); + _PTR(SObject) aMainSObject = aStudy->FindObjectID( anIObject->getEntry() ); SMESH::SMESH_Mesh_var aMainObject = SMESH::IObjectToInterface(anIObject); - if( aMainObject->_is_nil() ) + if ( aMainObject->_is_nil() ) return; SUIT_OverrideCursor wc; @@ -996,10 +997,9 @@ namespace QList aReservedColors; SMESH::ListOfGroups aListOfGroups = *aMainObject->GetGroups(); - for( int i = 0, n = aListOfGroups.length(); i < n; i++ ) + for ( int i = 0, n = aListOfGroups.length(); i < n; i++ ) { SMESH::SMESH_GroupBase_var aGroupObject = aListOfGroups[i]; - //SALOMEDS::Color aColor = aGroupObject->GetColor(); #ifdef SIMPLE_AUTOCOLOR // simplified algorithm for auto-colors SALOMEDS::Color aColor = SMESHGUI::getPredefinedUniqueColor(); @@ -1010,10 +1010,10 @@ namespace aGroupObject->SetColor( aColor ); _PTR(SObject) aGroupSObject = SMESH::FindSObject(aGroupObject); - if (aGroupSObject) { + if ( aGroupSObject ) { QColor c; int delta; - if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) { + if ( SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) { switch ( aGroupObject->GetType ()) { case SMESH::NODE: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break; @@ -1038,7 +1038,8 @@ namespace SMESH::RepaintCurrentView(); } - void OverallMeshQuality() { + void OverallMeshQuality() + { SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog(); LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); SALOME_ListIO selected; @@ -1123,11 +1124,15 @@ namespace Handle(SALOME_InteractiveObject) anIO = selected.First(); if ( anIO->hasEntry() ) { SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ); - if ( anActor && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) { + if ( anActor && + anActor->GetScalarBarActor() && + anActor->GetControlMode() != SMESH_Actor::eNone ) + { SMESH_ScalarBarActor* aScalarBarActor = anActor->GetScalarBarActor(); SMESH::Controls::FunctorPtr aFunctor = anActor->GetFunctor(); if ( aScalarBarActor && aFunctor ) { - SMESH::Controls::NumericalFunctor* aNumFun = dynamic_cast( aFunctor.get() ); + SMESH::Controls::NumericalFunctor* aNumFun = + dynamic_cast( aFunctor.get() ); if ( aNumFun ) { std::vector elements; SMESH::SMESH_Mesh_var mesh = SMESH::IObjectToInterface(anIO); @@ -1149,7 +1154,8 @@ namespace bool isLogarithmic = lookupTable->GetScale() == VTK_SCALE_LOG10; std::vector nbEvents; std::vector funValues; - aNumFun->GetHistogram( nbIntervals, nbEvents, funValues, elements, minmax, isLogarithmic ); + aNumFun->GetHistogram( nbIntervals, nbEvents, funValues, + elements, minmax, isLogarithmic ); QString anInitialPath = ""; if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) anInitialPath = QDir::currentPath(); @@ -1157,7 +1163,7 @@ namespace QStringList filter; filter.append( QObject::tr( "TEXT_FILES_FILTER" ) + " (*.txt)" ); filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" ); - QString aFilename = anInitialPath + "/" + aMeshName + "_" + + QString aFilename = anInitialPath + "/" + aMeshName + "_" + functorToString( aFunctor ).toLower().simplified().replace( QRegExp( " |-" ), "_" ) + ".txt"; aFilename = SUIT_FileDlg::getFileName( SMESHGUI::desktop(), aFilename, @@ -1172,7 +1178,7 @@ namespace out << "# Control: " << functorToString( aFunctor ) << endl; out << "#" << endl; out.setFieldWidth( 10 ); - for ( int i = 0; i < qMin( nbEvents.size(), funValues.size()-1 ); i++ ) + for ( int i = 0; i < (int)qMin( nbEvents.size(), funValues.size()-1 ); i++ ) out << funValues[i] << "\t" << funValues[i+1] << "\t" << nbEvents[i] << endl; f.close(); } @@ -1184,17 +1190,21 @@ namespace } } - void ShowElement(int theCommandID ) { + void ShowElement( int theCommandID ) + { LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr(); SALOME_ListIO selected; if ( aSel ) aSel->selectedObjects( selected ); - + if ( selected.Extent() == 1 ) { Handle(SALOME_InteractiveObject) anIO = selected.First(); if ( anIO->hasEntry() ) { SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ); - if ( anActor && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) { + if ( anActor && + anActor->GetScalarBarActor() && + anActor->GetControlMode() != SMESH_Actor::eNone ) + { SMESH_ScalarBarActor *aScalarBarActor = anActor->GetScalarBarActor(); if ( theCommandID == SMESHOp::OpShowDistribution ) { aScalarBarActor->SetDistributionVisibility(!aScalarBarActor->GetDistributionVisibility()); @@ -1208,58 +1218,62 @@ namespace } #ifndef DISABLE_PLOT2DVIEWER - void PlotDistribution() { - SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); - if( !app ) - return; - - LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr(); - SALOME_ListIO selected; - if ( aSel ) - aSel->selectedObjects( selected ); - - if ( selected.Extent() == 1 ) { - Handle(SALOME_InteractiveObject) anIO = selected.First(); - if ( anIO->hasEntry() ) { - //Find Actor by entry before getting Plot2d viewer, - //because after call getViewManager( Plot2d_Viewer::Type(), true ) active window is Plot2d Viewer - SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ); - - SUIT_ViewManager* aViewManager = app->getViewManager( Plot2d_Viewer::Type(), true ); // create if necessary - - if( !aViewManager ) - return; - - SPlot2d_Viewer* aView = dynamic_cast(aViewManager->getViewModel()); - if ( !aView ) - return; - - Plot2d_ViewFrame* aPlot = aView->getActiveViewFrame(); - if ( !aPlot ) - return; - - if ( anActor && anActor->GetControlMode() != SMESH_Actor::eNone ) { - SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram(); - QString functorName = functorToString( anActor->GetFunctor()); - QString aHistogramName("%1 : %2"); - aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName); - aHistogram->setName(aHistogramName); - aHistogram->setHorTitle(functorName); - aHistogram->setVerTitle(QObject::tr("DISTRIBUTION_NB_ENT")); - aPlot->displayObject(aHistogram, true); - } - } - } - } + void PlotDistribution() + { + SalomeApp_Application* app = + dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if( !app ) + return; + + LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr(); + SALOME_ListIO selected; + if ( aSel ) + aSel->selectedObjects( selected ); + + if ( selected.Extent() == 1 ) { + Handle(SALOME_InteractiveObject) anIO = selected.First(); + if ( anIO->hasEntry() ) { + //Find Actor by entry before getting Plot2d viewer, + //because after call getViewManager( Plot2d_Viewer::Type(), true ) active window is Plot2d Viewer + SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ); + + SUIT_ViewManager* aViewManager = + app->getViewManager( Plot2d_Viewer::Type(), true ); // create if necessary + if( !aViewManager ) + return; + + SPlot2d_Viewer* aView = dynamic_cast(aViewManager->getViewModel()); + if ( !aView ) + return; + + Plot2d_ViewFrame* aPlot = aView->getActiveViewFrame(); + if ( !aPlot ) + return; + + if ( anActor && anActor->GetControlMode() != SMESH_Actor::eNone ) + { + SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram(); + QString functorName = functorToString( anActor->GetFunctor()); + QString aHistogramName("%1 : %2"); + aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName); + aHistogram->setName(aHistogramName); + aHistogram->setHorTitle(functorName); + aHistogram->setVerTitle(QObject::tr("DISTRIBUTION_NB_ENT")); + aPlot->displayObject(aHistogram, true); + } + } + } + } #endif //DISABLE_PLOT2DVIEWER - void DisableAutoColor(){ + void DisableAutoColor() + { LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); SALOME_ListIO selected; - if( aSel ) + if ( aSel ) aSel->selectedObjects( selected ); - if(selected.Extent()){ + if ( selected.Extent() ) { Handle(SALOME_InteractiveObject) anIObject = selected.First(); SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface(anIObject); if ( !aMesh->_is_nil() ) { @@ -1268,13 +1282,14 @@ namespace } } - void sortChildren(){ + void sortChildren() + { LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); SALOME_ListIO selected; - if( aSel ) { + if ( aSel ) { aSel->selectedObjects( selected ); - - if(selected.Extent()){ + if ( selected.Extent() ) + { Handle(SALOME_InteractiveObject) anIObject = selected.First(); _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); _PTR(SObject) aSObj = aStudy->FindObjectID(anIObject->getEntry()); @@ -1290,17 +1305,18 @@ namespace void SetDisplayMode(int theCommandID, SMESHGUI_StudyId2MarkerMap& theMarkerMap) { SALOME_ListIO selected; - SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); - if( !app ) + SalomeApp_Application* app = + dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) return; LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); - SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); - if( !aSel || !appStudy ) + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + if ( !aSel || !appStudy ) return; - if( theCommandID == SMESHOp::OpClipping ) { // Clipping dialog can be activated without selection - if( SMESHGUI* aModule = SMESHGUI::GetSMESHGUI() ) { + if ( theCommandID == SMESHOp::OpClipping ) { // Clipping dialog can be activated without selection + if ( SMESHGUI* aModule = SMESHGUI::GetSMESHGUI() ) { aModule->EmitSignalDeactivateDialog(); if( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( aModule ) ) (new SMESHGUI_ClippingDlg( aModule, aViewWindow ))->show(); @@ -1312,14 +1328,17 @@ namespace aSel->selectedObjects( selected ); - if(selected.Extent() >= 1){ - switch(theCommandID){ - case SMESHOp::OpTransparency:{ + if ( selected.Extent() >= 1 ) + { + switch ( theCommandID ) { + case SMESHOp::OpTransparency: + { SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog(); (new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI() ))->show(); return; } - case SMESHOp::OpProperties: { + case SMESHOp::OpProperties: + { double color[3]; QColor faceColor, edgeColor, nodeColor, elem0dColor, ballColor; QColor orientationColor, outlineColor, volumeColor; @@ -1579,96 +1598,50 @@ namespace } } + int ActionToControl( int theID, bool theReversed ) + { + NCollection_DoubleMap ActionControl; + ActionControl.Bind( 0, SMESH_Actor::eNone ); + ActionControl.Bind( SMESHOp::OpFreeNode, SMESH_Actor::eFreeNodes ); + ActionControl.Bind( SMESHOp::OpEqualNode, SMESH_Actor::eCoincidentNodes ); + ActionControl.Bind( SMESHOp::OpFreeEdge, SMESH_Actor::eFreeEdges ); + ActionControl.Bind( SMESHOp::OpFreeBorder, SMESH_Actor::eFreeBorders ); + ActionControl.Bind( SMESHOp::OpLength, SMESH_Actor::eLength ); + ActionControl.Bind( SMESHOp::OpConnection, SMESH_Actor::eMultiConnection ); + ActionControl.Bind( SMESHOp::OpEqualEdge, SMESH_Actor::eCoincidentElems1D ); + ActionControl.Bind( SMESHOp::OpFreeFace, SMESH_Actor::eFreeFaces ); + ActionControl.Bind( SMESHOp::OpBareBorderFace, SMESH_Actor::eBareBorderFace ); + ActionControl.Bind( SMESHOp::OpOverConstrainedFace, SMESH_Actor::eOverConstrainedFace ); + ActionControl.Bind( SMESHOp::OpLength2D, SMESH_Actor::eLength2D ); + ActionControl.Bind( SMESHOp::OpConnection2D, SMESH_Actor::eMultiConnection2D ); + ActionControl.Bind( SMESHOp::OpArea, SMESH_Actor::eArea ); + ActionControl.Bind( SMESHOp::OpTaper, SMESH_Actor::eTaper ); + ActionControl.Bind( SMESHOp::OpAspectRatio, SMESH_Actor::eAspectRatio ); + ActionControl.Bind( SMESHOp::OpMinimumAngle, SMESH_Actor::eMinimumAngle ); + ActionControl.Bind( SMESHOp::OpWarpingAngle, SMESH_Actor::eWarping ); + ActionControl.Bind( SMESHOp::OpSkew, SMESH_Actor::eSkew ); + ActionControl.Bind( SMESHOp::OpMaxElementLength2D, SMESH_Actor::eMaxElementLength2D ); + ActionControl.Bind( SMESHOp::OpEqualFace, SMESH_Actor::eCoincidentElems2D ); + ActionControl.Bind( SMESHOp::OpAspectRatio3D, SMESH_Actor::eAspectRatio3D ); + ActionControl.Bind( SMESHOp::OpVolume, SMESH_Actor::eVolume3D ); + ActionControl.Bind( SMESHOp::OpMaxElementLength3D, SMESH_Actor::eMaxElementLength3D ); + ActionControl.Bind( SMESHOp::OpBareBorderVolume, SMESH_Actor::eBareBorderVolume ); + ActionControl.Bind( SMESHOp::OpOverConstrainedVolume, SMESH_Actor::eOverConstrainedVolume ); + ActionControl.Bind( SMESHOp::OpEqualVolume, SMESH_Actor::eCoincidentElems3D ); + + return theReversed ? ActionControl.Find2( theID ) : ActionControl.Find1( theID ); + } + void Control( int theCommandID ) { - SMESH_Actor::eControl aControl = SMESH_Actor::eNone; - switch ( theCommandID ){ - case SMESHOp::OpFreeNode: - aControl = SMESH_Actor::eFreeNodes; - break; - case SMESHOp::OpEqualNode: - aControl = SMESH_Actor::eCoincidentNodes; - break; - case SMESHOp::OpFreeEdge: - aControl = SMESH_Actor::eFreeEdges; - break; - case SMESHOp::OpFreeBorder: - aControl = SMESH_Actor::eFreeBorders; - break; - case SMESHOp::OpLength: - aControl = SMESH_Actor::eLength; - break; - case SMESHOp::OpConnection: - aControl = SMESH_Actor::eMultiConnection; - break; - case SMESHOp::OpEqualEdge: - aControl = SMESH_Actor::eCoincidentElems1D; - break; - case SMESHOp::OpFreeFace: - aControl = SMESH_Actor::eFreeFaces; - break; - case SMESHOp::OpBareBorderFace: - aControl = SMESH_Actor::eBareBorderFace; - break; - case SMESHOp::OpOverConstrainedFace: - aControl = SMESH_Actor::eOverConstrainedFace; - break; - case SMESHOp::OpLength2D: - aControl = SMESH_Actor::eLength2D; - break; - case SMESHOp::OpConnection2D: - aControl = SMESH_Actor::eMultiConnection2D; - break; - case SMESHOp::OpArea: - aControl = SMESH_Actor::eArea; - break; - case SMESHOp::OpTaper: - aControl = SMESH_Actor::eTaper; - break; - case SMESHOp::OpAspectRatio: - aControl = SMESH_Actor::eAspectRatio; - break; - case SMESHOp::OpMinimumAngle: - aControl = SMESH_Actor::eMinimumAngle; - break; - case SMESHOp::OpWarpingAngle: - aControl = SMESH_Actor::eWarping; - break; - case SMESHOp::OpSkew: - aControl = SMESH_Actor::eSkew; - break; - case SMESHOp::OpMaxElementLength2D: - aControl = SMESH_Actor::eMaxElementLength2D; - break; - case SMESHOp::OpEqualFace: - aControl = SMESH_Actor:: eCoincidentElems2D; - break; - case SMESHOp::OpAspectRatio3D: - aControl = SMESH_Actor::eAspectRatio3D; - break; - case SMESHOp::OpVolume: - aControl = SMESH_Actor::eVolume3D; - break; - case SMESHOp::OpMaxElementLength3D: - aControl = SMESH_Actor::eMaxElementLength3D; - break; - case SMESHOp::OpBareBorderVolume: - aControl = SMESH_Actor::eBareBorderVolume; - break; - case SMESHOp::OpOverConstrainedVolume: - aControl = SMESH_Actor::eOverConstrainedVolume; - break; - case SMESHOp::OpEqualVolume: - aControl = SMESH_Actor::eCoincidentElems3D; - break; - } + SMESH_Actor::eControl aControl = SMESH_Actor::eControl( ActionToControl( theCommandID ) ); _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); SALOME_ListIO selected; - if( aSel ) + if ( aSel ) aSel->selectedObjects( selected ); - if( !selected.IsEmpty() ){ + if ( !selected.IsEmpty() ) { SALOME_ListIteratorOfListIO It(selected); for ( ; It.More(); It.Next()) { @@ -1676,24 +1649,22 @@ namespace if(!anIO.IsNull()){ _PTR(SObject) SO = aStudy->FindObjectID( It.Value()->getEntry() ); if ( SO ) { - CORBA::Object_var aObject = SMESH::SObjectToObject( SO ); - SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( aObject ); - SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( aObject ); - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( aObject ); - if ( !aMesh->_is_nil() || !aSubMesh->_is_nil() || !aGroup->_is_nil() ) { - if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIO->getEntry())) { - anActor->SetControlMode(aControl); - anActor->GetScalarBarActor()->SetTitle( functorToString( anActor->GetFunctor() ).toLatin1().constData() ); + CORBA::Object_var aObject = SMESH::SObjectToObject( SO ); + SMESH::SMESH_IDSource_var anIDSrc = SMESH::SMESH_IDSource::_narrow( aObject ); + if ( !anIDSrc->_is_nil() ) { + if ( SMESH_Actor *anActor = SMESH::FindActorByEntry( anIO->getEntry()) ) { + QString functorName = functorToString( anActor->GetFunctor() ); + anActor->SetControlMode( aControl ); + anActor->GetScalarBarActor()->SetTitle( functorName.toLatin1().constData() ); SMESH::RepaintCurrentView(); #ifndef DISABLE_PLOT2DVIEWER - if(anActor->GetPlot2Histogram()) { + if ( anActor->GetPlot2Histogram() ) { SPlot2d_Histogram* aHistogram = anActor->UpdatePlot2Histogram(); - QString functorName = functorToString( anActor->GetFunctor()); QString aHistogramName("%1 : %2"); - aHistogramName = aHistogramName.arg(anIO->getName()).arg(functorName); - aHistogram->setName(aHistogramName); - aHistogram->setHorTitle(functorName); - SMESH::ProcessIn2DViewers(anActor); + aHistogramName = aHistogramName.arg( anIO->getName() ).arg( functorName ); + aHistogram->setName( aHistogramName ); + aHistogram->setHorTitle( functorName ); + SMESH::ProcessIn2DViewers( anActor ); } #endif } @@ -1706,13 +1677,13 @@ namespace bool CheckOIType(const Handle(SALOME_InteractiveObject) & theIO, - SMESH::MeshObjectType theType, + SMESH::MeshObjectType theType, const QString theInTypeName, QString & theOutTypeName) { SMESH_TypeFilter aTypeFilter( theType ); QString entry; - if( !theIO.IsNull() ) + if ( !theIO.IsNull() ) { entry = theIO->getEntry(); LightApp_DataOwner owner( entry ); @@ -1727,12 +1698,12 @@ namespace QString CheckTypeObject(const Handle(SALOME_InteractiveObject) & theIO) { - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); _PTR(SObject) aSObj = aStudy->FindObjectID(theIO->getEntry()); if (aSObj) { _PTR(SComponent) aSComp = aSObj->GetFatherComponent(); - CORBA::String_var anID = aSComp->GetID().c_str(); - if (!strcmp(anID.in(),theIO->getEntry())) + CORBA::String_var anID = aSComp->GetID().c_str(); + if ( !strcmp(anID.in(),theIO->getEntry()) ) return "Component"; } @@ -1752,10 +1723,9 @@ namespace QString CheckHomogeneousSelection() { - //SUIT_Study* aStudy = SMESH::GetActiveStudy(); LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); SALOME_ListIO selected; - if( aSel ) + if ( aSel ) aSel->selectedObjects( selected ); QString RefType = CheckTypeObject(selected.First()); @@ -1764,7 +1734,7 @@ namespace { Handle(SALOME_InteractiveObject) IObject = It.Value(); QString Type = CheckTypeObject(IObject); - if (Type.compare(RefType) != 0) + if ( Type.compare(RefType) != 0 ) return "Heterogeneous Selection"; } @@ -1984,7 +1954,7 @@ SalomeApp_Module( "SMESH" ) { CORBA::Boolean anIsEmbeddedMode; myComponentSMESH = SMESH_Client::GetSMESHGen(getApp()->orb(),anIsEmbeddedMode); - MESSAGE("-------------------------------> anIsEmbeddedMode=" << anIsEmbeddedMode); + //MESSAGE("-------------------------------> anIsEmbeddedMode=" << anIsEmbeddedMode); // 0019923: EDF 765 SMESH : default values of hypothesis SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this); @@ -1993,7 +1963,7 @@ SalomeApp_Module( "SMESH" ) nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 ); myComponentSMESH->SetDefaultNbSegments( nbSeg ); - const char* options[] = { "historical_python_dump", "forget_mesh_on_hyp_modif" }; + const char* options[] = { "historical_python_dump", "forget_mesh_on_hyp_modif", "default_grp_color" }; for ( size_t i = 0; i < sizeof(options)/sizeof(char*); ++i ) if ( aResourceMgr->hasValue( "SMESH", options[i] )) { @@ -2486,8 +2456,9 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if( aSel ) aSel->selectedObjects( selected ); - if( selected.Extent() ) { - Handle(SALOME_InteractiveObject) anIO = selected.First(); + SALOME_ListIteratorOfListIO it(selected); + for( ; it.More(); it.Next()) { + Handle(SALOME_InteractiveObject) anIO = it.Value(); if( anIO->hasEntry() ) { if( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) { anActor->SetControlMode( SMESH_Actor::eNone ); @@ -2497,6 +2468,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } } } + SMESH::UpdateView(); break; } case SMESHOp::OpScalarBarProperties: @@ -2622,10 +2594,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) case SMESHOp::OpShow: case SMESHOp::OpShowOnly: { + SUIT_OverrideCursor wc; SMESH::EDisplaing anAction; switch (theCommandID) { - case SMESHOp::OpHide: anAction = SMESH::eErase; break; - case SMESHOp::OpShow: anAction = SMESH::eDisplay; break; + case SMESHOp::OpHide: anAction = SMESH::eErase; break; + case SMESHOp::OpShow: anAction = SMESH::eDisplay; break; case SMESHOp::OpShowOnly: anAction = SMESH::eDisplayOnly; break; } @@ -2634,9 +2607,9 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if (aSel) aSel->selectedObjects( sel_objects ); - if( theCommandID==SMESHOp::OpShowOnly ) + if ( theCommandID==SMESHOp::OpShowOnly ) { - MESSAGE("anAction = SMESH::eDisplayOnly"); + //MESSAGE("anAction = SMESH::eDisplayOnly"); startOperation( myEraseAll ); } @@ -2648,27 +2621,23 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) #endif if (vtkwnd) { SALOME_ListIteratorOfListIO It( to_process ); - for ( ; It.More(); It.Next()) { - MESSAGE("---"); + for ( ; It.More(); It.Next()) + { Handle(SALOME_InteractiveObject) IOS = It.Value(); - if (IOS->hasEntry()) { - MESSAGE("---"); - if (!SMESH::UpdateView(anAction, IOS->getEntry())) { + if ( IOS->hasEntry() ) + { + if ( !SMESH::UpdateView( anAction, IOS->getEntry() )) { SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged(); break; // PAL16774 (Crash after display of many groups) } if (anAction == SMESH::eDisplayOnly) - { - MESSAGE("anAction = SMESH::eDisplayOnly"); anAction = SMESH::eDisplay; - } } } } // PAL13338 + PAL15161 --> if ( ( theCommandID==SMESHOp::OpShow || theCommandID==SMESHOp::OpShowOnly ) && !checkLock(aStudy)) { - MESSAGE("anAction = SMESH::eDisplayOnly"); SMESH::UpdateView(); SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged(); } @@ -2679,7 +2648,6 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } if (anAction == SMESH::eErase) { - MESSAGE("anAction == SMESH::eErase"); SALOME_ListIO l1; aSel->setSelectedObjects( l1 ); } @@ -2699,9 +2667,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) ( new SMESHGUI_NodesDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"),tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -2735,8 +2701,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if ( !vtkwnd ) { - SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -2766,8 +2731,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if ( !vtkwnd ) { - SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -2796,8 +2760,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) ( new SMESHGUI_SmoothingDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(), tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -2808,8 +2771,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) EmitSignalDeactivateDialog(); ( new SMESHGUI_ExtrusionDlg ( this ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -2820,8 +2782,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) EmitSignalDeactivateDialog(); ( new SMESHGUI_ExtrusionAlongPathDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -2833,8 +2794,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) ( new SMESHGUI_RevolutionDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -2848,11 +2808,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) ( new SMESHGUI_MeshPatternDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } + case SMESHOp::OpSplitBiQuadratic: case SMESHOp::OpConvertMeshToQuadratic: case SMESHOp::OpCreateBoundaryElements: // create 2D mesh from 3D case SMESHOp::OpReorientFaces: @@ -2865,8 +2825,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if ( !vtkwnd ) { - SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -2893,8 +2852,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if ( !vtkwnd ) { - SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -2971,8 +2929,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if ( !vtkwnd ) { - SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -3028,8 +2985,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if ( !vtkwnd ) { - SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -3069,8 +3025,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if ( !vtkwnd ) { - SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -3108,8 +3063,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if ( !vtkwnd ) { - SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ),tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -3251,8 +3205,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) ( new SMESHGUI_AddMeshElementDlg( this, type ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -3264,8 +3217,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) ( new SMESHGUI_CreatePolyhedralVolumeDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(),tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -3942,6 +3894,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( SMESHOp::OpUnionOfTriangles, "UNION", "ICON_UNIONTRI" ); createSMESHAction( SMESHOp::OpCuttingOfQuadrangles, "CUT", "ICON_CUTQUAD" ); createSMESHAction( SMESHOp::OpSplitVolumes, "SPLIT_TO_TETRA", "ICON_SPLIT_TO_TETRA" ); + createSMESHAction( SMESHOp::OpSplitBiQuadratic, "SPLIT_BIQUAD", "ICON_SPLIT_BIQUAD" ); createSMESHAction( SMESHOp::OpSmoothing, "SMOOTH", "ICON_DLG_SMOOTHING" ); createSMESHAction( SMESHOp::OpExtrusion, "EXTRUSION", "ICON_EXTRUSION" ); createSMESHAction( SMESHOp::OpExtrusionAlongAPath, "EXTRUSION_ALONG", "ICON_EXTRUSION_ALONG" ); @@ -4026,12 +3979,14 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( separator(), fileId ); + QMenu* nodeMenu = new QMenu(); QMenu* edgeMenu = new QMenu(); + QMenu* faceMenu = new QMenu(); QMenu* volumeMenu = new QMenu(); int importId = createMenu( tr( "MEN_IMPORT" ), fileId, -1, 10 ), exportId = createMenu( tr( "MEN_EXPORT" ), fileId, -1, 10 ), - nodeId = createMenu( tr( "MEN_NODE_CTRL" ), ctrlId, -1, 10 ), - edgeId = createMenu( tr( "MEN_EDGE_CTRL" ), ctrlId, -1, 10 ), - faceId = createMenu( tr( "MEN_FACE_CTRL" ), ctrlId, -1, 10 ), - volumeId = createMenu( tr( "MEN_VOLUME_CTRL" ), ctrlId, -1, 10 ), + nodeId = createMenu( tr( "MEN_NODE_CTRL" ), ctrlId, -1, 10, -1, nodeMenu ), + edgeId = createMenu( tr( "MEN_EDGE_CTRL" ), ctrlId, -1, 10, -1, edgeMenu ), + faceId = createMenu( tr( "MEN_FACE_CTRL" ), ctrlId, -1, 10, -1, faceMenu ), + volumeId = createMenu( tr( "MEN_VOLUME_CTRL" ), ctrlId, -1, 10, -1, volumeMenu ), addId = createMenu( tr( "MEN_ADD" ), modifyId, 402 ), removeId = createMenu( tr( "MEN_REMOVE" ), modifyId, 403 ), //renumId = createMenu( tr( "MEN_RENUM" ), modifyId, 404 ), @@ -4093,11 +4048,11 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( SMESHOp::OpFreeNode, nodeId, -1 ); createMenu( SMESHOp::OpEqualNode, nodeId, -1 ); - createMenu( SMESHOp::OpFreeEdge, edgeId, -1 ); createMenu( SMESHOp::OpFreeBorder, edgeId, -1 ); createMenu( SMESHOp::OpLength, edgeId, -1 ); createMenu( SMESHOp::OpConnection, edgeId, -1 ); createMenu( SMESHOp::OpEqualEdge, edgeId, -1 ); + createMenu( SMESHOp::OpFreeEdge, faceId, -1 ); createMenu( SMESHOp::OpFreeFace, faceId, -1 ); createMenu( SMESHOp::OpBareBorderFace, faceId, -1 ); createMenu( SMESHOp::OpOverConstrainedFace, faceId, -1 ); @@ -4177,6 +4132,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( SMESHOp::OpUnionOfTriangles, modifyId, -1 ); createMenu( SMESHOp::OpCuttingOfQuadrangles, modifyId, -1 ); createMenu( SMESHOp::OpSplitVolumes, modifyId, -1 ); + createMenu( SMESHOp::OpSplitBiQuadratic, modifyId, -1 ); createMenu( SMESHOp::OpSmoothing, modifyId, -1 ); createMenu( SMESHOp::OpExtrusion, modifyId, -1 ); createMenu( SMESHOp::OpExtrusionAlongAPath , modifyId, -1 ); @@ -4192,6 +4148,11 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( SMESHOp::OpPropertiesVolume, basicPropId, -1 ); createMenu( SMESHOp::OpUpdate, viewId, -1 ); + connect( nodeMenu, SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) ); + connect( edgeMenu, SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) ); + connect( faceMenu, SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) ); + connect( volumeMenu, SIGNAL( aboutToShow() ), this, SLOT( onUpdateControlActions() ) ); + // ----- create toolbars -------------- int meshTb = createTool( tr( "TB_MESH" ), QString( "SMESHMeshToolbar" ) ), info = createTool( tr( "TB_INFO" ), QString( "SMESHInformationToolbar" ) ), @@ -4233,12 +4194,12 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( SMESHOp::OpFreeNode, ctrl0dTb ); createTool( SMESHOp::OpEqualNode, ctrl0dTb ); - createTool( SMESHOp::OpFreeEdge, ctrl1dTb ); createTool( SMESHOp::OpFreeBorder, ctrl1dTb ); createTool( SMESHOp::OpLength, ctrl1dTb ); createTool( SMESHOp::OpConnection, ctrl1dTb ); createTool( SMESHOp::OpEqualEdge, ctrl1dTb ); + createTool( SMESHOp::OpFreeEdge, ctrl2dTb ); createTool( SMESHOp::OpFreeFace, ctrl2dTb ); createTool( SMESHOp::OpBareBorderFace, ctrl2dTb ); createTool( SMESHOp::OpOverConstrainedFace, ctrl2dTb ); @@ -4312,6 +4273,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( SMESHOp::OpUnionOfTriangles, modifyTb ); createTool( SMESHOp::OpCuttingOfQuadrangles, modifyTb ); createTool( SMESHOp::OpSplitVolumes, modifyTb ); + createTool( SMESHOp::OpSplitBiQuadratic, modifyTb ); createTool( SMESHOp::OpSmoothing, modifyTb ); createTool( SMESHOp::OpExtrusion, modifyTb ); createTool( SMESHOp::OpExtrusionAlongAPath, modifyTb ); @@ -4361,38 +4323,39 @@ void SMESHGUI::initialize( CAM_Application* app ) hasElems0d("({'Elem0d'} in elemTypes)"), hasEdges("({'Edge'} in elemTypes)"), hasFaces("({'Face'} in elemTypes)"), - hasVolumes("({'Volume'} in elemTypes)"); + hasVolumes("({'Volume'} in elemTypes)"), + hasFacesOrVolumes("(({'Face'} in elemTypes) || ({'Volume'} in elemTypes)) "); createPopupItem( SMESHOp::OpFileInformation, OB, mesh, "&& selcount=1 && isImported" ); - createPopupItem( SMESHOp::OpCreateSubMesh, OB, mesh, "&& isComputable"); - createPopupItem( SMESHOp::OpEditMeshOrSubMesh, OB, mesh, "&& isComputable"); - createPopupItem( SMESHOp::OpEditMeshOrSubMesh, OB, subMesh, "&& isComputable" ); + createPopupItem( SMESHOp::OpCreateSubMesh, OB, mesh, "&& hasGeomReference"); + createPopupItem( SMESHOp::OpEditMeshOrSubMesh, OB, mesh ); + createPopupItem( SMESHOp::OpEditMeshOrSubMesh, OB, subMesh, "&& hasGeomReference" ); createPopupItem( SMESHOp::OpEditGroup, OB, group ); createPopupItem( SMESHOp::OpEditGeomGroupAsGroup, OB, group, "&& groupType != 'Group'" ); popupMgr()->insert( separator(), -1, 0 ); createPopupItem( SMESHOp::OpCompute, OB, mesh, "&& isComputable" ); - createPopupItem( SMESHOp::OpPreCompute, OB, mesh, "&& isComputable && isPreComputable" ); + createPopupItem( SMESHOp::OpPreCompute, OB, mesh, "&& isPreComputable" ); createPopupItem( SMESHOp::OpEvaluate, OB, mesh, "&& isComputable" ); - createPopupItem( SMESHOp::OpMeshOrder, OB, mesh, "&& isComputable" ); + createPopupItem( SMESHOp::OpMeshOrder, OB, mesh, "&& isComputable && hasGeomReference" ); createPopupItem( SMESHOp::OpUpdate, OB, mesh_part ); createPopupItem( SMESHOp::OpMeshInformation, OB, mesh_part ); createPopupItem( SMESHOp::OpFindElementByPoint, OB, mesh_group ); createPopupItem( SMESHOp::OpOverallMeshQuality, OB, mesh_part ); popupMgr()->insert( separator(), -1, 0 ); createPopupItem( SMESHOp::OpCreateGroup, OB, mesh ); - createPopupItem( SMESHOp::OpCreateGeometryGroup, OB, mesh ); + createPopupItem( SMESHOp::OpCreateGeometryGroup, OB, mesh, "&& hasGeomReference" ); createPopupItem( SMESHOp::OpConstructGroup, OB, subMesh ); popupMgr()->insert( separator(), -1, 0 ); - createPopupItem( SMESHOp::OpEditHypothesis, OB, hypo); + createPopupItem( SMESHOp::OpEditHypothesis, OB, hypo, "&& isEditableHyp"); createPopupItem( SMESHOp::OpUnassign, OB, hyp_alg ); // REMOVE HYPOTHESIS / ALGORITHMS popupMgr()->insert( separator(), -1, 0 ); - createPopupItem( SMESHOp::OpClearMesh, OB, mesh ); - popupMgr()->insert( separator(), -1, 0 ); createPopupItem( SMESHOp::OpConvertMeshToQuadratic, OB, mesh + " " + subMesh ); // convert to quadratic createPopupItem( SMESHOp::OpCreateBoundaryElements, OB, mesh + " " + group, // create 2D mesh from 3D "&& dim>=2"); popupMgr()->insert( separator(), -1, 0 ); + createPopupItem( SMESHOp::OpClearMesh, OB, mesh ); + popupMgr()->insert( separator(), -1, 0 ); QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( dc ); QString multiple_non_empty = QString( " && %1>0 && numberOfNodes>0" ).arg( dc ); @@ -4518,11 +4481,11 @@ void SMESHGUI::initialize( CAM_Application* app ) //------------------------------------------------- anId = popupMgr()->insert( tr( "MEN_QUADRATIC_REPRESENT" ), -1, -1 ); popupMgr()->insert( action( SMESHOp::OpRepresentationLines ), anId, -1 ); - popupMgr()->setRule( action( SMESHOp::OpRepresentationLines ), aMeshInVTK + "and isVisible",QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( SMESHOp::OpRepresentationLines ), aMeshInVTK + "&& isVisible && isQuadratic",QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( SMESHOp::OpRepresentationLines ), "quadratic2DMode = 'eLines'", QtxPopupMgr::ToggleRule ); popupMgr()->insert( action( SMESHOp::OpRepresentationArcs ), anId, -1 ); - popupMgr()->setRule( action( SMESHOp::OpRepresentationArcs ), aMeshInVTK + "and isVisible", QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( SMESHOp::OpRepresentationArcs ), aMeshInVTK + "&& isVisible && isQuadratic", QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( SMESHOp::OpRepresentationArcs ), "quadratic2DMode = 'eArcs'", QtxPopupMgr::ToggleRule ); //------------------------------------------------- @@ -4572,12 +4535,8 @@ void SMESHGUI::initialize( CAM_Application* app ) aSubId = popupMgr()->insert( tr( "MEN_EDGE_CTRL" ), anId, -1 ); // EDGE CONTROLS - popupMgr()->insert( action( SMESHOp::OpFreeEdge ), aSubId, -1 ); - popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule ); - popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), "controlMode = 'eFreeEdges'", QtxPopupMgr::ToggleRule ); - popupMgr()->insert( action( SMESHOp::OpFreeBorder ), aSubId, -1 ); - popupMgr()->setRule( action( SMESHOp::OpFreeBorder ), aMeshInVtkHasEdges, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( SMESHOp::OpFreeBorder ), aMeshInVTK + "&&" + hasEdges + "&&" + hasFacesOrVolumes, QtxPopupMgr::VisibleRule ); popupMgr()->setRule( action( SMESHOp::OpFreeBorder ), "controlMode = 'eFreeBorders'", QtxPopupMgr::ToggleRule ); popupMgr()->insert( action( SMESHOp::OpLength ), aSubId, -1 ); @@ -4593,6 +4552,10 @@ void SMESHGUI::initialize( CAM_Application* app ) aSubId = popupMgr()->insert( tr( "MEN_FACE_CTRL" ), anId, -1 ); // FACE CONTROLS + popupMgr()->insert( action( SMESHOp::OpFreeEdge ), aSubId, -1 ); + popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), aMeshInVtkHasFaces, QtxPopupMgr::VisibleRule ); + popupMgr()->setRule( action( SMESHOp::OpFreeEdge ), "controlMode = 'eFreeEdges'", QtxPopupMgr::ToggleRule ); + popupMgr()->insert ( action( SMESHOp::OpFreeFace ), aSubId, -1 ); popupMgr()->setRule( action( SMESHOp::OpFreeFace ), aMeshInVtkHasFaces /*aMeshInVtkHasVolumes*/, QtxPopupMgr::VisibleRule ); @@ -4932,7 +4895,7 @@ void SMESHGUI::ProcessEvents( vtkObject* theObject, void* theCallData ) { if( SMESHGUI* aSMESHGUI = reinterpret_cast( theClientData ) ) { - if( theObject && theEvent == SMESH::DeleteActorEvent ) { + if( theObject && (int) theEvent == SMESH::DeleteActorEvent ) { if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( theObject ) ) { SMESHGUI_ClippingPlaneInfoMap& aClippingPlaneInfoMap = aSMESHGUI->getClippingPlaneInfoMap(); SMESHGUI_ClippingPlaneInfoMap::iterator anIter1 = aClippingPlaneInfoMap.begin(); @@ -5143,7 +5106,8 @@ void SMESHGUI::createPreferences() QStringList aMarkerScaleValuesList; for ( int i = VTK::MS_10; i <= VTK::MS_70; i++ ) { aMarkerScaleIndicesList << i; - aMarkerScaleValuesList << QString::number( (i-(int)VTK::MS_10)*0.5 + 1.0 ); + //aMarkerScaleValuesList << QString::number( (i-(int)VTK::MS_10)*0.5 + 1.0 ); + aMarkerScaleValuesList << QString::number( i ); } setPreferenceProperty( markerScale, "strings", aMarkerScaleValuesList ); setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList ); @@ -5336,79 +5300,92 @@ void SMESHGUI::createPreferences() void SMESHGUI::preferencesChanged( const QString& sect, const QString& name ) { - if( sect=="SMESH" ) { - float sbX1,sbY1,sbW,sbH; + if ( sect=="SMESH" ) { + float sbX1 = 0.01, sbY1 = 0.01, sbW = 0.08, sbH = 0.08; float aTol = 1.00000009999999; std::string aWarning; SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr(this); - if( name=="selection_object_color" || name=="selection_element_color" || - name=="highlight_color" || - name=="selection_precision_node" || name=="selection_precision_element" || - name=="selection_precision_object") + + if ( name== "selection_object_color" || + name=="selection_element_color" || + name== "highlight_color" || + name=="selection_precision_node" || + name=="selection_precision_element" || + name=="selection_precision_object" ) + { SMESH::UpdateSelectionProp( this ); - else if (name == QString("scalar_bar_vertical_x") || name == QString("scalar_bar_vertical_width")){ - sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_x", sbX1); - sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_width", sbW); - if(sbX1+sbW > aTol){ + } + else if (name == "scalar_bar_vertical_x" || name == "scalar_bar_vertical_width") + { + sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_x", sbX1); + sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_width", sbW); + if ( sbX1+sbW > aTol ) { aWarning = "Origin and Size Vertical: X+Width > 1\n"; - sbX1=0.01; - sbW=0.08; - aResourceMgr->setValue("SMESH", "scalar_bar_vertical_x", sbX1); + sbX1 = 0.01; + sbW = 0.08; + aResourceMgr->setValue("SMESH", "scalar_bar_vertical_x", sbX1); aResourceMgr->setValue("SMESH", "scalar_bar_vertical_width", sbW); } } - else if(name == QString("scalar_bar_vertical_y") || name == QString("scalar_bar_vertical_height")){ - sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_y", sbY1); - sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_height",sbH); - if(sbY1+sbH > aTol){ + else if (name == "scalar_bar_vertical_y" || name == "scalar_bar_vertical_height" ) + { + sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_y", sbY1); + sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_height",sbH); + if ( sbY1 + sbH > aTol ) { aWarning = "Origin and Size Vertical: Y+Height > 1\n"; - aResourceMgr->setValue("SMESH", "scalar_bar_vertical_y", sbY1); + aResourceMgr->setValue("SMESH", "scalar_bar_vertical_y", sbY1); aResourceMgr->setValue("SMESH", "scalar_bar_vertical_height",sbH); } } - else if(name == QString("scalar_bar_horizontal_x") || name == QString("scalar_bar_horizontal_width")){ - sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_x", sbX1); - sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_width", sbW); - if(sbX1+sbW > aTol){ + else if (name == "scalar_bar_horizontal_x" || name == "scalar_bar_horizontal_width") + { + sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_x", sbX1); + sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_width", sbW); + if ( sbX1 + sbW > aTol ) { aWarning = "Origin and Size Horizontal: X+Width > 1\n"; sbX1=0.1; - sbW=0.08; + sbW =0.08; aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_x", sbX1); aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_width", sbW); } } - else if(name == QString("scalar_bar_horizontal_y") || name == QString("scalar_bar_horizontal_height")){ - sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_y", sbY1); - sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_height",sbH); - if(sbY1+sbH > aTol){ + else if (name == "scalar_bar_horizontal_y" || name == "scalar_bar_horizontal_height") + { + sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_y", sbY1); + sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_height",sbH); + if ( sbY1 + sbH > aTol ) { aWarning = "Origin and Size Horizontal: Y+Height > 1\n"; sbY1=0.01; - sbH=0.08; + sbH =0.08; aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_y", sbY1); aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_height",sbH); } } - else if ( name == "segmentation" ) { + else if ( name == "segmentation" ) + { int nbSeg = aResourceMgr->integerValue( "SMESH", "segmentation", 10 ); myComponentSMESH->SetBoundaryBoxSegmentation( nbSeg ); } - else if ( name == "nb_segments_per_edge" ) { + else if ( name == "nb_segments_per_edge" ) + { int nbSeg = aResourceMgr->integerValue( "SMESH", "nb_segments_per_edge", 15 ); myComponentSMESH->SetDefaultNbSegments( nbSeg ); } - else if ( name == "historical_python_dump" || - name == "forget_mesh_on_hyp_modif") { + else if ( name == "historical_python_dump" || name == "forget_mesh_on_hyp_modif" || name == "default_grp_color" ) + { QString val = aResourceMgr->stringValue( "SMESH", name ); myComponentSMESH->SetOption( name.toLatin1().constData(), val.toLatin1().constData() ); } - else if ( name == QString( "numbering_node_color" ) || name == QString( "numbering_node_font" ) ) { - SMESH::UpdateFontProp( this ); + else if ( name == "numbering_node_color" || name == "numbering_node_font" ) + { + SMESH::UpdateFontProp( this ); } - else if ( name == QString( "numbering_elem_color" ) || name == QString( "numbering_elem_font" ) ) { + else if ( name == "numbering_elem_color" || name == "numbering_elem_font" ) + { SMESH::UpdateFontProp( this ); } - if(aWarning.size() != 0){ + if ( aWarning.size() != 0 ) { aWarning += "The default values are applied instead."; SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_ERR_SCALARBAR_PARAMS"), @@ -5480,6 +5457,9 @@ LightApp_Operation* SMESHGUI::createOperation( const int id ) const // to do : create operation here switch( id ) { + case SMESHOp::OpSplitBiQuadratic: + op = new SMESHGUI_SplitBiQuadOp(); + break; case SMESHOp::OpConvertMeshToQuadratic: op = new SMESHGUI_ConvToQuadOp(); break; @@ -6840,6 +6820,47 @@ void SMESHGUI::onHypothesisEdit( int result ) updateObjBrowser( true ); } +/*! + \brief Actions after choosing menu of control modes + Updates control mode actions according to current selection +*/ +void SMESHGUI::onUpdateControlActions() +{ + LightApp_SelectionMgr* aSel = SMESHGUI::selectionMgr(); + SALOME_ListIO selected; + if ( aSel ) + aSel->selectedObjects( selected ); + + SMESH_Actor::eControl aControl = SMESH_Actor::eNone; + if ( selected.Extent() ) { + if ( selected.First()->hasEntry() ) { + aControl = SMESH::FindActorByEntry( selected.First()->getEntry() )->GetControlMode(); + SALOME_ListIteratorOfListIO it(selected); + for ( ; it.More(); it.Next() ) { + Handle(SALOME_InteractiveObject) anIO = it.Value(); + if ( anIO->hasEntry() ) { + if ( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) { + if ( aControl != anActor->GetControlMode() ) { + aControl = SMESH_Actor::eNone; + break; + } + } + } + } + } + } + + int anAction = ActionToControl( aControl, true ); + if ( anAction) + action( anAction )->setChecked( true ); + else { + QMenu* send = (QMenu*)sender(); + QList actions = send->actions(); + for ( int i = 0; i < actions.size(); i++ ) + actions[i]->setChecked( false ); + } +} + /*! \brief Signal handler closing(SUIT_ViewWindow*) of a view