X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Module.cxx;h=b36585e22f5de3e928030780271e0b060830d6c4;hb=de7cf9bb0a7a41d6487013c87f4a54d0664cd303;hp=509fc2e357c31af76299d8ea46cf3b6f89fe1794;hpb=e867556dcc52065557442970feb3b4698cd3cc13;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Module.cxx b/src/HYDROGUI/HYDROGUI_Module.cxx index 509fc2e3..b36585e2 100644 --- a/src/HYDROGUI/HYDROGUI_Module.cxx +++ b/src/HYDROGUI/HYDROGUI_Module.cxx @@ -28,14 +28,18 @@ #include "HYDROGUI_GVSelector.h" #include "HYDROGUI_InputPanel.h" #include "HYDROGUI_ObjSelector.h" +#include "HYDROGUI_OCCDisplayer.h" +#include "HYDROGUI_OCCSelector.h" #include "HYDROGUI_Operations.h" #include "HYDROGUI_PrsImage.h" #include "HYDROGUI_Tool.h" #include "HYDROGUI_UpdateFlags.h" +#include "HYDROGUI_Shape.h" #include +#include -#include +#include #include #include @@ -52,6 +56,10 @@ #include #include +#include +#include +#include + #include #include @@ -78,6 +86,7 @@ extern "C" HYDRO_EXPORT char* getModuleVersion() HYDROGUI_Module::HYDROGUI_Module() : LightApp_Module( "HYDRO" ), myDisplayer( 0 ), + myOCCDisplayer( 0 ), myIsUpdateEnabled( true ) { } @@ -106,6 +115,7 @@ void HYDROGUI_Module::initialize( CAM_Application* theApp ) setToolShown( false ); myDisplayer = new HYDROGUI_Displayer( this ); + myOCCDisplayer = new HYDROGUI_OCCDisplayer( this ); } bool HYDROGUI_Module::activateModule( SUIT_Study* theStudy ) @@ -141,6 +151,7 @@ bool HYDROGUI_Module::deactivateModule( SUIT_Study* theStudy ) myViewManagerMap.clear(); myObjectStateMap.clear(); + myShapesMap.clear(); // clear the data model's list of copying objects HYDROGUI_DataModel::changeCopyingObjects( HYDROData_SequenceOfObjects() ); @@ -165,7 +176,7 @@ void HYDROGUI_Module::windows( QMap& theMap ) const void HYDROGUI_Module::viewManagers( QStringList& theTypesList ) const { - theTypesList << GraphicsView_Viewer::Type(); + theTypesList << OCCViewer_Viewer::Type() << GraphicsView_Viewer::Type(); } void HYDROGUI_Module::contextMenuPopup( const QString& theClient, @@ -175,11 +186,12 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, HYDROGUI_DataModel* aModel = getDataModel(); bool anIsObjectBrowser = theClient == "ObjectBrowser"; - bool anIsGraphicsView = theClient == "GraphicsView"; - if( !anIsObjectBrowser && !anIsGraphicsView ) + bool anIsGraphicsView = theClient == GraphicsView_Viewer::Type(); + bool anIsOCCView = theClient == OCCViewer_Viewer::Type(); + if( !anIsObjectBrowser && !anIsGraphicsView && !anIsOCCView ) return; - size_t aViewId = HYDROGUI_Tool::GetActiveGraphicsViewId( this ); + size_t anActiveViewId = HYDROGUI_Tool::GetActiveViewId( this ); bool anIsSelectedDataObjects = false; bool anIsVisibleInSelection = false; @@ -187,26 +199,26 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, bool anIsImage = false; bool anIsImportedImage = false; - bool anIsCompositeImage = false; + bool anIsImageHasRefs = false; bool anIsFusedImage = false; bool anIsCutImage = false; bool anIsSplittedImage = false; bool anIsMustBeUpdatedImage = false; bool anIsPolyline = false; bool anIsCalculation = false; - bool anIsZone = false; + bool anIsImmersibleZone = false; bool anIsVisualState = false; // check the selected data model objects HYDROData_SequenceOfObjects aSeq = HYDROGUI_Tool::GetSelectedObjects( this ); for( Standard_Integer anIndex = 1, aLength = aSeq.Length(); anIndex <= aLength; anIndex++ ) { - Handle(HYDROData_Object) anObject = aSeq.Value( anIndex ); + Handle(HYDROData_Entity) anObject = aSeq.Value( anIndex ); if( !anObject.IsNull() ) { anIsSelectedDataObjects = true; - bool aVisibility = isObjectVisible( aViewId, anObject ); + bool aVisibility = isObjectVisible( anActiveViewId, anObject ); anIsVisibleInSelection |= aVisibility; anIsHiddenInSelection |= !aVisibility; @@ -216,9 +228,9 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, Handle(HYDROData_Image) anImage = Handle(HYDROData_Image)::DownCast( anObject ); if( !anImage.IsNull() ) { - anIsImportedImage = anImage->HasTrsfPoints() && !anImage->IsSelfSplitted(); - anIsCompositeImage = anImage->NbReferences() > 0; - if( HYDROOperations_Factory* aFactory = HYDROOperations_Factory::Factory() ) + anIsImportedImage = anImage->HasLocalPoints() && !anImage->IsSelfSplitted(); + anIsImageHasRefs = anImage->HasReferences(); + if( HYDROData_OperationsFactory* aFactory = HYDROData_OperationsFactory::Factory() ) { if( ImageComposer_Operator* anOperator = aFactory->Operator( anImage ) ) { @@ -231,15 +243,15 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, anIsSplittedImage = true; } } - anIsMustBeUpdatedImage = anImage->MustBeUpdated(); + anIsMustBeUpdatedImage = anImage->IsMustBeUpdated(); } } else if( anObject->GetKind() == KIND_POLYLINE ) anIsPolyline = true; else if( anObject->GetKind() == KIND_CALCULATION ) anIsCalculation = true; - else if( anObject->GetKind() == KIND_ZONE ) - anIsZone = true; + else if( anObject->GetKind() == KIND_IMMERSIBLE_ZONE ) + anIsImmersibleZone = true; else if( anObject->GetKind() == KIND_VISUAL_STATE ) anIsVisualState = true; } @@ -268,8 +280,8 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, case KIND_CALCULATION: theMenu->addAction( action( CreateCalculationId ) ); break; - case KIND_ZONE: - theMenu->addAction( action( CreateZoneId ) ); + case KIND_IMMERSIBLE_ZONE: + theMenu->addAction( action( CreateImmersibleZoneId ) ); break; } theMenu->addSeparator(); @@ -288,7 +300,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, { if( anIsImportedImage ) theMenu->addAction( action( EditImportedImageId ) ); - else if( anIsCompositeImage ) + else if( anIsImageHasRefs ) { if( anIsFusedImage ) theMenu->addAction( action( EditFusedImageId ) ); @@ -302,6 +314,12 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addAction( action( ExportImageId ) ); theMenu->addSeparator(); + if( anIsImageHasRefs ) + { + theMenu->addAction( action( RemoveImageRefsId ) ); + theMenu->addSeparator(); + } + theMenu->addAction( action( FuseImagesId ) ); theMenu->addAction( action( CutImagesId ) ); theMenu->addAction( action( SplitImageId ) ); @@ -317,9 +335,9 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addAction( action( EditCalculationId ) ); theMenu->addSeparator(); } - else if( anIsZone ) + else if( anIsImmersibleZone ) { - theMenu->addAction( action( EditZoneId ) ); + theMenu->addAction( action( EditImmersibleZoneId ) ); theMenu->addSeparator(); } else if( anIsVisualState && anIsObjectBrowser ) @@ -336,7 +354,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addSeparator(); } - if( anIsSelectedDataObjects && ( anIsImage || anIsPolyline || anIsZone ) ) + if( anIsSelectedDataObjects && ( anIsImage || anIsPolyline || anIsImmersibleZone ) ) { if( anIsHiddenInSelection ) theMenu->addAction( action( ShowId ) ); @@ -346,7 +364,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addSeparator(); } - if( anIsObjectBrowser || anIsGraphicsView ) + if( anIsObjectBrowser || anIsGraphicsView || anIsOCCView ) { theMenu->addAction( action( ShowAllId ) ); theMenu->addAction( action( HideAllId ) ); @@ -372,6 +390,10 @@ void HYDROGUI_Module::update( const int flags ) updateGV( flags & UF_GV_Init, flags & UF_GV_Forced ); + if( ( flags & UF_OCCViewer ) ) + updateOCCViewer( flags & UF_OCC_Init, + flags & UF_OCC_Forced ); + if( ( flags & UF_Model ) && getDataModel() && getApp() ) { getDataModel()->update( getStudyId() ); @@ -380,7 +402,7 @@ void HYDROGUI_Module::update( const int flags ) // the selection in the object browser. // Note: processEvents() should be called after updateGV(), // otherwise the application crashes from time to time. - qApp->processEvents(); + //RKV: qApp->processEvents(); getApp()->updateObjectBrowser( true ); } @@ -425,6 +447,11 @@ HYDROGUI_Displayer* HYDROGUI_Module::getDisplayer() const return myDisplayer; } +HYDROGUI_OCCDisplayer* HYDROGUI_Module::getOCCDisplayer() const +{ + return myOCCDisplayer; +} + GraphicsView_Viewer* HYDROGUI_Module::getViewer( const int theId ) const { if( myViewManagerMap.contains( theId ) ) @@ -438,6 +465,19 @@ GraphicsView_Viewer* HYDROGUI_Module::getViewer( const int theId ) const return NULL; } +OCCViewer_Viewer* HYDROGUI_Module::getOCCViewer( const int theId ) const +{ + if( myViewManagerMap.contains( theId ) ) + { + ViewManagerInfo anInfo = myViewManagerMap[ theId ]; + OCCViewer_ViewManager* aViewManager = + ::qobject_cast( anInfo.first ); + if( aViewManager ) + return aViewManager->getOCCViewer(); + } + return NULL; +} + int HYDROGUI_Module::getViewManagerId( SUIT_ViewManager* theViewManager ) { ViewManagerMapIterator anIter( myViewManagerMap ); @@ -474,7 +514,7 @@ void HYDROGUI_Module::setViewManagerRole( SUIT_ViewManager* theViewManager, } bool HYDROGUI_Module::isObjectVisible( const int theViewId, - const Handle(HYDROData_Object)& theObject ) + const Handle(HYDROData_Entity)& theObject ) const { if( theObject.IsNull() ) return false; @@ -494,7 +534,7 @@ bool HYDROGUI_Module::isObjectVisible( const int theViewId, } void HYDROGUI_Module::setObjectVisible( const int theViewId, - const Handle(HYDROData_Object)& theObject, + const Handle(HYDROData_Entity)& theObject, const bool theState ) { if( !theObject.IsNull() ) @@ -505,6 +545,79 @@ void HYDROGUI_Module::setObjectVisible( const int theViewId, } } +HYDROGUI_Shape* HYDROGUI_Module::getObjectShape( const int theViewId, + const Handle(HYDROData_Entity)& theObject ) const +{ + HYDROGUI_Shape* aResShape = NULL; + if( theObject.IsNull() ) + return aResShape; + + if ( myShapesMap.contains( theViewId ) ) + { + const ListOfShapes& aViewShapes = myShapesMap.value( theViewId ); + foreach ( HYDROGUI_Shape* aShape, aViewShapes ) + { + if ( !aShape || !IsEqual( aShape->getObject(), theObject ) ) + continue; + + aResShape = aShape; + break; + } + } + + return aResShape; +} + +void HYDROGUI_Module::setObjectShape( const int theViewId, + const Handle(HYDROData_Entity)& theObject, + HYDROGUI_Shape* theShape ) +{ + if( theObject.IsNull() ) + return; + + ListOfShapes& aViewShapes = myShapesMap[ theViewId ]; + aViewShapes.append( theShape ); +} + +void HYDROGUI_Module::removeObjectShape( const int theViewId, + const Handle(HYDROData_Entity)& theObject ) +{ + if ( !myShapesMap.contains( theViewId ) ) + return; + + ListOfShapes& aViewShapes = myShapesMap[ theViewId ]; + Handle(HYDROData_Entity) anObject; + for ( int i = 0; i < aViewShapes.length(); ) + { + HYDROGUI_Shape* aShape = aViewShapes.at( i ); + anObject = aShape->getObject(); + if ( aShape && (!anObject.IsNull()) && IsEqual( anObject, theObject ) ) + { + delete aShape; + aViewShapes.removeAt( i ); + continue; + } + + ++i; + } +} + +void HYDROGUI_Module::removeViewShapes( const int theViewId ) +{ + if ( !myShapesMap.contains( theViewId ) ) + return; + + const ListOfShapes& aViewShapes = myShapesMap.value( theViewId ); + for ( int i = 0, n = aViewShapes.length(); i < n; ++i ) + { + HYDROGUI_Shape* aShape = aViewShapes.at( i ); + if ( aShape ) + delete aShape; + } + + myShapesMap.remove( theViewId ); +} + CAM_DataModel* HYDROGUI_Module::createDataModel() { return new HYDROGUI_DataModel( this ); @@ -520,8 +633,14 @@ void HYDROGUI_Module::customEvent( QEvent* e ) { if( GraphicsView_Viewer* aViewer = dynamic_cast( aViewFrame->getViewer() ) ) { + SUIT_ViewManager* aViewManager = aViewer->getViewManager(); + ViewManagerRole aRole = getViewManagerRole( aViewManager ); + if( GraphicsView_ViewPort* aViewPort = aViewer->getActiveViewPort() ) { + if( aRole != VMR_TransformImage && aRole != VMR_ReferenceImage ) + aViewPort->scale( 1, -1 ); // invert the Y axis direction from down to up + aViewPort->setInteractionFlag( GraphicsView_ViewPort::TraceBoundingRect ); aViewPort->setInteractionFlag( GraphicsView_ViewPort::ImmediateContextMenu ); aViewPort->setInteractionFlag( GraphicsView_ViewPort::ImmediateSelection ); @@ -530,9 +649,7 @@ void HYDROGUI_Module::customEvent( QEvent* e ) //aViewPort->setViewLabelPosition( GraphicsView_ViewPort::VLP_BottomLeft, true ); } - SUIT_ViewManager* aViewManager = aViewer->getViewManager(); - ViewManagerRole aRole = getViewManagerRole( aViewManager ); - if( aRole != VMR_TransformImage ) + if( aRole != VMR_TransformImage && aRole != VMR_ReferenceImage ) update( UF_Viewer ); aViewer->activateTransform( GraphicsView_Viewer::FitAll ); @@ -563,12 +680,17 @@ void HYDROGUI_Module::onViewManagerAdded( SUIT_ViewManager* theViewManager ) if( theViewManager->getType() == GraphicsView_Viewer::Type() ) { - createSelector( theViewManager ); // replace the default selector - + connect( theViewManager, SIGNAL( viewCreated( SUIT_ViewWindow* ) ), + this, SLOT( onViewCreated( SUIT_ViewWindow* ) ) ); + } + else if( theViewManager->getType() == OCCViewer_Viewer::Type() ) + { connect( theViewManager, SIGNAL( viewCreated( SUIT_ViewWindow* ) ), this, SLOT( onViewCreated( SUIT_ViewWindow* ) ) ); } + createSelector( theViewManager ); // replace the default selector + ViewManagerInfo anInfo( theViewManager, VMR_General ); myViewManagerMap.insert( ViewManagerId++, anInfo ); } @@ -581,7 +703,18 @@ void HYDROGUI_Module::onViewManagerRemoved( SUIT_ViewManager* theViewManager ) int anId = getViewManagerId( theViewManager ); if( anId != -1 ) + { + OCCViewer_ViewManager* anOCCViewManager = + ::qobject_cast( myViewManagerMap[ anId ].first ); + if ( anOCCViewManager ) + { + OCCViewer_Viewer* anOCCViewer = anOCCViewManager->getOCCViewer(); + if ( anOCCViewer ) + removeViewShapes( (size_t)anOCCViewer ); + } + myViewManagerMap.remove( anId ); + } } void HYDROGUI_Module::onViewCreated( SUIT_ViewWindow* theViewWindow ) @@ -596,13 +729,20 @@ void HYDROGUI_Module::onViewCreated( SUIT_ViewWindow* theViewWindow ) connect( aViewPort, SIGNAL( vpMouseEvent( QGraphicsSceneMouseEvent* ) ), this, SLOT( onViewPortMouseEvent( QGraphicsSceneMouseEvent* ) ) ); - return; + } + } + else if( theViewWindow && theViewWindow->inherits( "OCCViewer_ViewFrame" ) ) + { + if( OCCViewer_ViewFrame* aViewFrame = dynamic_cast( theViewWindow ) ) + { + aViewFrame->onTopView(); } } } void HYDROGUI_Module::onViewPortMouseEvent( QGraphicsSceneMouseEvent* theEvent ) { + /* ouv: currently unused if( GraphicsView_ViewPort* aViewPort = qobject_cast( sender() ) ) { SUIT_ViewManager* aViewManager = 0; @@ -632,8 +772,8 @@ void HYDROGUI_Module::onViewPortMouseEvent( QGraphicsSceneMouseEvent* theEvent ) int aXDeg = 0, aYDeg = 0; int aXMin = 0, aYMin = 0; double aXSec = 0, aYSec = 0; - HYDROGUI_Tool::DoubleToLambert( aMouseX, aXDeg, aXMin, aXSec ); - HYDROGUI_Tool::DoubleToLambert( aMouseY, aYDeg, aYMin, aYSec ); + HYDROData_Lambert93::secToDMS( aMouseX, aXDeg, aXMin, aXSec ); + HYDROData_Lambert93::secToDMS( aMouseY, aYDeg, aYMin, aYSec ); QString aDegSymbol( QChar( 0x00B0 ) ); QString aXStr = QString( "%1%2 %3' %4\"" ).arg( aXDeg ).arg( aDegSymbol ).arg( aXMin ).arg( aXSec ); @@ -644,6 +784,7 @@ void HYDROGUI_Module::onViewPortMouseEvent( QGraphicsSceneMouseEvent* theEvent ) else if( aRole == VMR_TransformImage ) aViewPort->setViewLabelText( QString( "X: %1\nY: %2" ).arg( (int)aMouseX ).arg( (int)aMouseY ) ); } + */ } void HYDROGUI_Module::updateGV( const bool theIsInit, @@ -657,8 +798,13 @@ void HYDROGUI_Module::updateGV( const bool theIsInit, // currently, all views are updated ViewManagerMapIterator anIter( myViewManagerMap ); while( anIter.hasNext() ) - { - int anId = anIter.next().key(); + { + GraphicsView_ViewManager* aViewManager = + dynamic_cast( anIter.next().value().first ); + if ( !aViewManager ) + continue; + + int anId = anIter.key(); aViewManagerIdList.append( anId ); } @@ -667,6 +813,33 @@ void HYDROGUI_Module::updateGV( const bool theIsInit, getDisplayer()->UpdateAll( anIdIter.next(), theIsInit, theIsForced ); } +void HYDROGUI_Module::updateOCCViewer( const bool theIsInit, + const bool theIsForced ) +{ + HYDROGUI_OCCDisplayer* anOCCDisplayer = getOCCDisplayer(); + if( !anOCCDisplayer ) + return; + + QList aViewManagerIdList; + + // currently, all views are updated + ViewManagerMapIterator anIter( myViewManagerMap ); + while( anIter.hasNext() ) + { + OCCViewer_ViewManager* aViewManager = + ::qobject_cast( anIter.next().value().first ); + if ( !aViewManager ) + continue; + + int anId = anIter.key(); + aViewManagerIdList.append( anId ); + } + + QListIterator anIdIter( aViewManagerIdList ); + while( anIdIter.hasNext() ) + anOCCDisplayer->UpdateAll( anIdIter.next(), theIsInit, theIsForced ); +} + void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager ) { if( !theViewManager ) @@ -677,12 +850,8 @@ void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager ) return; QString aViewType = theViewManager->getType(); - if( aViewType != GraphicsView_Viewer::Type() ) - return; - - GraphicsView_ViewManager* aViewManager = - dynamic_cast( theViewManager ); - if( !aViewManager ) + if( aViewType != GraphicsView_Viewer::Type() && + aViewType != OCCViewer_Viewer::Type()) return; QList aSelectorList; @@ -693,11 +862,25 @@ void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager ) for( anIter = aSelectorList.begin(); anIter != anIterEnd; anIter++ ) { SUIT_Selector* aSelector = *anIter; - if( aSelector && !dynamic_cast( aSelector ) ) + if( aSelector && ( !dynamic_cast( aSelector ) && + !dynamic_cast( aSelector ) ) ) aSelector->setEnabled( false ); } - new HYDROGUI_GVSelector( this, aViewManager->getViewer(), aSelectionMgr ); + if ( aViewType == GraphicsView_Viewer::Type() ) + { + GraphicsView_ViewManager* aViewManager = + ::qobject_cast( theViewManager ); + if( aViewManager ) + new HYDROGUI_GVSelector( this, aViewManager->getViewer(), aSelectionMgr ); + } + else if ( aViewType == OCCViewer_Viewer::Type() ) + { + OCCViewer_ViewManager* aViewManager = + ::qobject_cast( theViewManager ); + if( aViewManager ) + new HYDROGUI_OCCSelector( this, aViewManager->getOCCViewer(), aSelectionMgr ); + } } bool HYDROGUI_Module::setUpdateEnabled( const bool theState )