#include "HYDROGUI.h"
#include "HYDROGUI_DataModel.h"
+#include "HYDROGUI_DataObject.h"
#include "HYDROGUI_Displayer.h"
#include "HYDROGUI_GVSelector.h"
#include "HYDROGUI_InputPanel.h"
#include <SVTK_ViewModel.h>
#include <SVTK_ViewWindow.h>
#include <SVTK_Selector.h>
-#include <SVTK_RenderWindowInteractor.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderer.h>
+#include <vtkWorldPointPicker.h>
+#include <vtkCamera.h>
#include <OCCViewer_ViewPort3d.h>
#include <QMouseEvent>
#include <QStatusBar>
+const double LOCAL_SELECTION_TOLERANCE = 0.0001;
+
static int ViewManagerId = 0;
extern "C" HYDRO_EXPORT CAM_Module* createModule()
foreach ( const int anId, anObsoleteIds ) {
myViewManagerMap.remove( anId );
myObjectStateMap.remove( anId );
+ myObjectDisplayOrderMap.remove( anId );
myShapesMap.remove( anId );
myVTKPrsMap.remove( anId );
}
theMenu->addAction( action( SetColorId ) );
theMenu->addSeparator();
}
-
- // Add copy action
- if( aModel->canCopy() ) {
- theMenu->addAction( action( CopyId ) );
- theMenu->addSeparator();
- }
} else if ( anAllAreProfiles ) {
theMenu->addAction( action( SelectedGeoreferencementId ) );
theMenu->addSeparator();
}
+ // Add copy action
+ QAction* aCopyAction = action( CopyId );
+ if( aCopyAction && aCopyAction->isEnabled() ) {
+ theMenu->addAction( action( CopyId ) );
+ theMenu->addSeparator();
+ }
+
+ // Add delete action
if( !anIsDummyObject3D )
theMenu->addAction( action( DeleteId ) );
+
theMenu->addSeparator();
if( anIsImage || anIsPolyline || anIsPolyline3D ||
theMenu->addAction( action( HideAllId ) );
theMenu->addSeparator();
}
+ if ( anIsOCCView ) {
+ theMenu->addSeparator();
+ theMenu->addAction( action( CopyViewerPositionId ) );
+ }
}
void HYDROGUI_Module::update( const int flags )
if( theObject.IsNull() )
return false;
- ViewId2Name2ObjectStateMap::const_iterator anIter1 = myObjectStateMap.find( theViewId );
+ ViewId2Entry2ObjectStateMap::const_iterator anIter1 = myObjectStateMap.find( theViewId );
if( anIter1 != myObjectStateMap.end() )
{
- const Name2ObjectStateMap& aName2ObjectStateMap = anIter1.value();
- Name2ObjectStateMap::const_iterator anIter2 = aName2ObjectStateMap.find( theObject->GetName());
- if( anIter2 != aName2ObjectStateMap.end() )
+ const Entry2ObjectStateMap& aEntry2ObjectStateMap = anIter1.value();
+ QString anEntry = HYDROGUI_DataObject::dataObjectEntry( theObject );
+
+ Entry2ObjectStateMap::const_iterator anIter2 = aEntry2ObjectStateMap.find( anEntry );
+ if( anIter2 != aEntry2ObjectStateMap.end() )
{
const ObjectState& anObjectState = anIter2.value();
return anObjectState.Visibility;
{
if( !theObject.IsNull() )
{
- Name2ObjectStateMap& aName2ObjectStateMap = myObjectStateMap[ theViewId ];
- ObjectState& anObjectState = aName2ObjectStateMap[ theObject->GetName() ];
+ Entry2ObjectStateMap& aEntry2ObjectStateMap = myObjectStateMap[ theViewId ];
+ QString anEntry = HYDROGUI_DataObject::dataObjectEntry( theObject );
+
+ ObjectState& anObjectState = aEntry2ObjectStateMap[ anEntry ];
anObjectState.Visibility = theState;
+
+ // Remember the display order ( needed for Z layers assignment only )
+ QStringList& anObjectEntries = myObjectDisplayOrderMap[ theViewId ];
+ anObjectEntries.removeAll( anEntry );
+ if ( theState ) {
+ anObjectEntries.append( anEntry );
+ }
}
}
{
OCCViewer_ViewWindow* anOCCViewWindow =
dynamic_cast<OCCViewer_ViewWindow*>(theViewWindow);
+ bool doShow = false;
+ gp_Pnt aPnt;
if ( anOCCViewWindow ) {
// Get the selected point coordinates
OCCViewer_ViewPort3d* aViewPort = anOCCViewWindow->getViewPort();
return;
}
- gp_Pnt aPnt = CurveCreator_Utils::ConvertClickToPoint( theEvent->x(), theEvent->y(),
+ aPnt = CurveCreator_Utils::ConvertClickToPoint( theEvent->x(), theEvent->y(),
aViewPort->getView() );
- // Show the coordinates in the status bar
- SUIT_Desktop* aDesktop = getApp()->desktop();
- if ( aDesktop && aDesktop->statusBar() ) {
- QString aX = HYDROGUI_Tool::GetCoordinateString( aPnt.X() );
- QString anY = HYDROGUI_Tool::GetCoordinateString( aPnt.Y() );
- aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aX ).arg( anY ) );
- }
+ doShow = true;
}
else
{
SVTK_ViewWindow* aViewWindow =
dynamic_cast<SVTK_ViewWindow*>(theViewWindow);
if ( aViewWindow ) {
- // Get the selected point coordinates
- double aCoords[3];
- SVTK_RenderWindowInteractor* anInteractor = aViewWindow->GetInteractor();
- if ( anInteractor )
+ vtkRenderer* aRen = aViewWindow->getRenderer();
+ if ( aRen )
{
- //TODO: Use a WorldPicker to get current coords
- //anInteractorStyle->ComputeDisplayToWorld( theEvent->x(), theEvent->y(), 0, aCoords );
- aCoords[0] = theEvent->x();
- aCoords[1] = theEvent->y();
- // Show the coordinates in the status bar
- SUIT_Desktop* aDesktop = getApp()->desktop();
- if ( aDesktop && aDesktop->statusBar() ) {
- QString aX = HYDROGUI_Tool::GetCoordinateString( aCoords[0] );
- QString anY = HYDROGUI_Tool::GetCoordinateString( aCoords[1] );
- aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aX ).arg( anY ) );
+ vtkCamera* aCamera = aRen->GetActiveCamera();
+ double* aNormal = aCamera->GetViewPlaneNormal();
+ int event_x, event_y;
+ vtkRenderWindowInteractor* anInteractor = aViewWindow->getInteractor();
+ if ( anInteractor )
+ {
+ anInteractor->GetLastEventPosition(event_x, event_y);
+ // Use a WorldPicker to get current coords
+ myPicker->Pick( event_x, event_y, 0, aRen );
+ double* aCoords = myPicker->GetPickPosition();
+ /////////////////////// Use the same algorithm as for OCC
+ double X, Y, Z;
+ double aXp, aYp, aZp;
+ double Vx, Vy, Vz;
+ X = aCoords[0];
+ Y = aCoords[1];
+ Z = aCoords[2];
+ Vx = aNormal[0];
+ Vy = aNormal[1];
+ Vz = aNormal[2];
+ Standard_Real aPrec = LOCAL_SELECTION_TOLERANCE;
+ if ( fabs( Vz ) > aPrec ) {
+ double aT = -Z/Vz;
+ aXp = X + aT*Vx;
+ aYp = Y + aT*Vy;
+ aZp = Z + aT*Vz;
+ }
+ else { // Vz = 0 - the eyed plane is orthogonal to Z plane - XOZ, or YOZ
+ aXp = aYp = aZp = 0;
+ if ( fabs( Vy ) < aPrec ) // Vy = 0 - the YOZ plane
+ aYp = Y;
+ else if ( fabs( Vx ) < aPrec ) // Vx = 0 - the XOZ plane
+ aXp = X;
+ }
+ /////////////////////////
+ doShow = true;
+ aPnt.SetX( aXp );
+ aPnt.SetY( aYp );
}
}
}
}
+ if ( doShow )
+ {
+ // Show the coordinates in the status bar
+ SUIT_Desktop* aDesktop = getApp()->desktop();
+ if ( aDesktop && aDesktop->statusBar() ) {
+ QString aX = HYDROGUI_Tool::GetCoordinateString( aPnt.X() );
+ QString anY = HYDROGUI_Tool::GetCoordinateString( aPnt.Y() );
+ aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aX ).arg( anY ) );
+ }
+ }
+}
+
+/**
+ * Get the object display order. Needed for Z layers assignment only.
+ */
+int HYDROGUI_Module::getObjectDisplayOrder(
+ const int theViewId, const Handle(HYDROData_Entity)& theObject) const
+{
+ if( theObject.IsNull() )
+ return -1;
+
+ QString anEntry = HYDROGUI_DataObject::dataObjectEntry( theObject );
+ QStringList anObjectEntries = myObjectDisplayOrderMap.value( theViewId );
+
+ return anObjectEntries.indexOf( anEntry );
}
\ No newline at end of file