mirror of
https://github.com/Open-Cascade-SAS/OCCT.git
synced 2026-05-10 09:30:48 +08:00
Majority of functions now simply call same functions from std namespace. Functions that duplicate std namespace functionality are declared deprecated. Calls of deprecated functions are replaced with std functions calls.
867 lines
24 KiB
C++
Executable File
867 lines
24 KiB
C++
Executable File
#if !defined _WIN32
|
|
#define QT_CLEAN_NAMESPACE /* avoid definition of INT32 and INT8 */
|
|
#endif
|
|
|
|
#include "View.h"
|
|
#include "ApplicationCommon.h"
|
|
|
|
#include <Standard_WarningsDisable.hxx>
|
|
#include <QApplication>
|
|
#include <QPainter>
|
|
#include <QMenu>
|
|
#include <QColorDialog>
|
|
#include <QCursor>
|
|
#include <QFileInfo>
|
|
#include <QFileDialog>
|
|
#include <QMouseEvent>
|
|
#include <QRubberBand>
|
|
#include <QMdiSubWindow>
|
|
#include <QStyleFactory>
|
|
#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && QT_VERSION < 0x050000
|
|
#include <QX11Info>
|
|
#endif
|
|
#include <Standard_WarningsRestore.hxx>
|
|
|
|
#include <Graphic3d_GraphicDriver.hxx>
|
|
#include <Graphic3d_TextureEnv.hxx>
|
|
|
|
#include <OcctWindow.h>
|
|
#include <Aspect_DisplayConnection.hxx>
|
|
|
|
namespace
|
|
{
|
|
//! Map Qt buttons bitmask to virtual keys.
|
|
Aspect_VKeyMouse qtMouseButtons2VKeys(Qt::MouseButtons theButtons)
|
|
{
|
|
Aspect_VKeyMouse aButtons = Aspect_VKeyMouse_NONE;
|
|
if ((theButtons & Qt::LeftButton) != 0)
|
|
{
|
|
aButtons |= Aspect_VKeyMouse_LeftButton;
|
|
}
|
|
if ((theButtons & Qt::MiddleButton) != 0)
|
|
{
|
|
aButtons |= Aspect_VKeyMouse_MiddleButton;
|
|
}
|
|
if ((theButtons & Qt::RightButton) != 0)
|
|
{
|
|
aButtons |= Aspect_VKeyMouse_RightButton;
|
|
}
|
|
return aButtons;
|
|
}
|
|
|
|
//! Map Qt mouse modifiers bitmask to virtual keys.
|
|
Aspect_VKeyFlags qtMouseModifiers2VKeys(Qt::KeyboardModifiers theModifiers)
|
|
{
|
|
Aspect_VKeyFlags aFlags = Aspect_VKeyFlags_NONE;
|
|
if ((theModifiers & Qt::ShiftModifier) != 0)
|
|
{
|
|
aFlags |= Aspect_VKeyFlags_SHIFT;
|
|
}
|
|
if ((theModifiers & Qt::ControlModifier) != 0)
|
|
{
|
|
aFlags |= Aspect_VKeyFlags_CTRL;
|
|
}
|
|
if ((theModifiers & Qt::AltModifier) != 0)
|
|
{
|
|
aFlags |= Aspect_VKeyFlags_ALT;
|
|
}
|
|
return aFlags;
|
|
}
|
|
} // namespace
|
|
|
|
static QCursor* defCursor = NULL;
|
|
static QCursor* handCursor = NULL;
|
|
static QCursor* panCursor = NULL;
|
|
static QCursor* globPanCursor = NULL;
|
|
static QCursor* zoomCursor = NULL;
|
|
static QCursor* rotCursor = NULL;
|
|
|
|
View::View(Handle(AIS_InteractiveContext) theContext, QWidget* parent)
|
|
: QWidget(parent),
|
|
myIsRaytracing(false),
|
|
myIsShadowsEnabled(true),
|
|
myIsReflectionsEnabled(false),
|
|
myIsAntialiasingEnabled(false),
|
|
myViewActions(0),
|
|
myRaytraceActions(0),
|
|
myBackMenu(NULL)
|
|
{
|
|
#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && QT_VERSION < 0x050000
|
|
XSynchronize(x11Info().display(), true);
|
|
#endif
|
|
myContext = theContext;
|
|
|
|
myCurZoom = 0;
|
|
setAttribute(Qt::WA_PaintOnScreen);
|
|
setAttribute(Qt::WA_NoSystemBackground);
|
|
setAttribute(Qt::WA_NativeWindow);
|
|
|
|
myDefaultGestures = myMouseGestureMap;
|
|
myCurrentMode = CurAction3d_Nothing;
|
|
setMouseTracking(true);
|
|
|
|
initViewActions();
|
|
initCursors();
|
|
|
|
setBackgroundRole(QPalette::NoRole); // NoBackground );
|
|
// set focus policy to threat QContextMenuEvent from keyboard
|
|
setFocusPolicy(Qt::StrongFocus);
|
|
init();
|
|
}
|
|
|
|
View::~View()
|
|
{
|
|
delete myBackMenu;
|
|
}
|
|
|
|
void View::init()
|
|
{
|
|
if (myView.IsNull())
|
|
myView = myContext->CurrentViewer()->CreateView();
|
|
|
|
Handle(OcctWindow) hWnd = new OcctWindow(this);
|
|
myView->SetWindow(hWnd);
|
|
if (!hWnd->IsMapped())
|
|
{
|
|
hWnd->Map();
|
|
}
|
|
myView->SetBackgroundColor(Quantity_NOC_BLACK);
|
|
myView->MustBeResized();
|
|
|
|
if (myIsRaytracing)
|
|
myView->ChangeRenderingParams().Method = Graphic3d_RM_RAYTRACING;
|
|
}
|
|
|
|
void View::paintEvent(QPaintEvent*)
|
|
{
|
|
// QApplication::syncX();
|
|
myView->InvalidateImmediate();
|
|
FlushViewEvents(myContext, myView, true);
|
|
}
|
|
|
|
void View::resizeEvent(QResizeEvent*)
|
|
{
|
|
// QApplication::syncX();
|
|
if (!myView.IsNull())
|
|
{
|
|
myView->MustBeResized();
|
|
}
|
|
}
|
|
|
|
void View::OnSelectionChanged(const Handle(AIS_InteractiveContext)&, const Handle(V3d_View)&)
|
|
{
|
|
ApplicationCommonWindow::getApplication()->onSelectionChanged();
|
|
}
|
|
|
|
void View::fitAll()
|
|
{
|
|
myView->FitAll();
|
|
myView->ZFitAll();
|
|
myView->Redraw();
|
|
}
|
|
|
|
void View::fitArea()
|
|
{
|
|
setCurrentAction(CurAction3d_WindowZooming);
|
|
}
|
|
|
|
void View::zoom()
|
|
{
|
|
setCurrentAction(CurAction3d_DynamicZooming);
|
|
}
|
|
|
|
void View::pan()
|
|
{
|
|
setCurrentAction(CurAction3d_DynamicPanning);
|
|
}
|
|
|
|
void View::rotation()
|
|
{
|
|
setCurrentAction(CurAction3d_DynamicRotation);
|
|
}
|
|
|
|
void View::globalPan()
|
|
{
|
|
// save the current zoom value
|
|
myCurZoom = myView->Scale();
|
|
// Do a Global Zoom
|
|
myView->FitAll();
|
|
// Set the mode
|
|
setCurrentAction(CurAction3d_GlobalPanning);
|
|
}
|
|
|
|
void View::front()
|
|
{
|
|
myView->SetProj(V3d_Yneg);
|
|
}
|
|
|
|
void View::back()
|
|
{
|
|
myView->SetProj(V3d_Ypos);
|
|
}
|
|
|
|
void View::top()
|
|
{
|
|
myView->SetProj(V3d_Zpos);
|
|
}
|
|
|
|
void View::bottom()
|
|
{
|
|
myView->SetProj(V3d_Zneg);
|
|
}
|
|
|
|
void View::left()
|
|
{
|
|
myView->SetProj(V3d_Xneg);
|
|
}
|
|
|
|
void View::right()
|
|
{
|
|
myView->SetProj(V3d_Xpos);
|
|
}
|
|
|
|
void View::axo()
|
|
{
|
|
myView->SetProj(V3d_XposYnegZpos);
|
|
}
|
|
|
|
void View::reset()
|
|
{
|
|
myView->Reset();
|
|
}
|
|
|
|
void View::hlrOff()
|
|
{
|
|
QApplication::setOverrideCursor(Qt::WaitCursor);
|
|
myView->SetComputedMode(false);
|
|
myView->Redraw();
|
|
QApplication::restoreOverrideCursor();
|
|
}
|
|
|
|
void View::hlrOn()
|
|
{
|
|
QApplication::setOverrideCursor(Qt::WaitCursor);
|
|
myView->SetComputedMode(true);
|
|
myView->Redraw();
|
|
QApplication::restoreOverrideCursor();
|
|
}
|
|
|
|
void View::SetRaytracedShadows(bool theState)
|
|
{
|
|
myView->ChangeRenderingParams().IsShadowEnabled = theState;
|
|
|
|
myIsShadowsEnabled = theState;
|
|
|
|
myContext->UpdateCurrentViewer();
|
|
}
|
|
|
|
void View::SetRaytracedReflections(bool theState)
|
|
{
|
|
myView->ChangeRenderingParams().IsReflectionEnabled = theState;
|
|
|
|
myIsReflectionsEnabled = theState;
|
|
|
|
myContext->UpdateCurrentViewer();
|
|
}
|
|
|
|
void View::onRaytraceAction()
|
|
{
|
|
QAction* aSentBy = (QAction*)sender();
|
|
|
|
if (aSentBy == myRaytraceActions->at(ToolRaytracingId))
|
|
{
|
|
bool aState = myRaytraceActions->at(ToolRaytracingId)->isChecked();
|
|
|
|
QApplication::setOverrideCursor(Qt::WaitCursor);
|
|
if (aState)
|
|
EnableRaytracing();
|
|
else
|
|
DisableRaytracing();
|
|
QApplication::restoreOverrideCursor();
|
|
}
|
|
|
|
if (aSentBy == myRaytraceActions->at(ToolShadowsId))
|
|
{
|
|
bool aState = myRaytraceActions->at(ToolShadowsId)->isChecked();
|
|
SetRaytracedShadows(aState);
|
|
}
|
|
|
|
if (aSentBy == myRaytraceActions->at(ToolReflectionsId))
|
|
{
|
|
bool aState = myRaytraceActions->at(ToolReflectionsId)->isChecked();
|
|
SetRaytracedReflections(aState);
|
|
}
|
|
|
|
if (aSentBy == myRaytraceActions->at(ToolAntialiasingId))
|
|
{
|
|
bool aState = myRaytraceActions->at(ToolAntialiasingId)->isChecked();
|
|
SetRaytracedAntialiasing(aState);
|
|
}
|
|
}
|
|
|
|
void View::SetRaytracedAntialiasing(bool theState)
|
|
{
|
|
myView->ChangeRenderingParams().IsAntialiasingEnabled = theState;
|
|
|
|
myIsAntialiasingEnabled = theState;
|
|
|
|
myContext->UpdateCurrentViewer();
|
|
}
|
|
|
|
void View::EnableRaytracing()
|
|
{
|
|
if (!myIsRaytracing)
|
|
myView->ChangeRenderingParams().Method = Graphic3d_RM_RAYTRACING;
|
|
|
|
myIsRaytracing = true;
|
|
|
|
myContext->UpdateCurrentViewer();
|
|
}
|
|
|
|
void View::DisableRaytracing()
|
|
{
|
|
if (myIsRaytracing)
|
|
myView->ChangeRenderingParams().Method = Graphic3d_RM_RASTERIZATION;
|
|
|
|
myIsRaytracing = false;
|
|
|
|
myContext->UpdateCurrentViewer();
|
|
}
|
|
|
|
void View::updateToggled(bool isOn)
|
|
{
|
|
QAction* sentBy = (QAction*)sender();
|
|
|
|
if (!isOn)
|
|
return;
|
|
|
|
for (int i = ViewFitAllId; i < ViewHlrOffId; i++)
|
|
{
|
|
QAction* anAction = myViewActions->at(i);
|
|
|
|
if ((anAction == myViewActions->at(ViewFitAreaId))
|
|
|| (anAction == myViewActions->at(ViewZoomId)) || (anAction == myViewActions->at(ViewPanId))
|
|
|| (anAction == myViewActions->at(ViewGlobalPanId))
|
|
|| (anAction == myViewActions->at(ViewRotationId)))
|
|
{
|
|
if (anAction && (anAction != sentBy))
|
|
{
|
|
anAction->setCheckable(true);
|
|
anAction->setChecked(false);
|
|
}
|
|
else
|
|
{
|
|
if (sentBy == myViewActions->at(ViewFitAreaId))
|
|
setCursor(*handCursor);
|
|
else if (sentBy == myViewActions->at(ViewZoomId))
|
|
setCursor(*zoomCursor);
|
|
else if (sentBy == myViewActions->at(ViewPanId))
|
|
setCursor(*panCursor);
|
|
else if (sentBy == myViewActions->at(ViewGlobalPanId))
|
|
setCursor(*globPanCursor);
|
|
else if (sentBy == myViewActions->at(ViewRotationId))
|
|
setCursor(*rotCursor);
|
|
else
|
|
setCursor(*defCursor);
|
|
|
|
sentBy->setCheckable(false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void View::initCursors()
|
|
{
|
|
if (!defCursor)
|
|
defCursor = new QCursor(Qt::ArrowCursor);
|
|
if (!handCursor)
|
|
handCursor = new QCursor(Qt::PointingHandCursor);
|
|
if (!panCursor)
|
|
panCursor = new QCursor(Qt::SizeAllCursor);
|
|
if (!globPanCursor)
|
|
globPanCursor = new QCursor(Qt::CrossCursor);
|
|
if (!zoomCursor)
|
|
zoomCursor = new QCursor(QPixmap(ApplicationCommonWindow::getResourceDir() + QString("/")
|
|
+ QObject::tr("ICON_CURSOR_ZOOM")));
|
|
if (!rotCursor)
|
|
rotCursor = new QCursor(QPixmap(ApplicationCommonWindow::getResourceDir() + QString("/")
|
|
+ QObject::tr("ICON_CURSOR_ROTATE")));
|
|
}
|
|
|
|
QList<QAction*>* View::getViewActions()
|
|
{
|
|
initViewActions();
|
|
return myViewActions;
|
|
}
|
|
|
|
QList<QAction*>* View::getRaytraceActions()
|
|
{
|
|
initRaytraceActions();
|
|
return myRaytraceActions;
|
|
}
|
|
|
|
/*!
|
|
Get paint engine for the OpenGL viewer. [ virtual public ]
|
|
*/
|
|
QPaintEngine* View::paintEngine() const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void View::initViewActions()
|
|
{
|
|
if (myViewActions)
|
|
return;
|
|
|
|
myViewActions = new QList<QAction*>();
|
|
QString dir = ApplicationCommonWindow::getResourceDir() + QString("/");
|
|
QAction* a;
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_FITALL")), QObject::tr("MNU_FITALL"), this);
|
|
a->setToolTip(QObject::tr("TBR_FITALL"));
|
|
a->setStatusTip(QObject::tr("TBR_FITALL"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(fitAll()));
|
|
myViewActions->insert(ViewFitAllId, a);
|
|
|
|
a =
|
|
new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_FITAREA")), QObject::tr("MNU_FITAREA"), this);
|
|
a->setToolTip(QObject::tr("TBR_FITAREA"));
|
|
a->setStatusTip(QObject::tr("TBR_FITAREA"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(fitArea()));
|
|
|
|
a->setCheckable(true);
|
|
connect(a, SIGNAL(toggled(bool)), this, SLOT(updateToggled(bool)));
|
|
myViewActions->insert(ViewFitAreaId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_ZOOM")), QObject::tr("MNU_ZOOM"), this);
|
|
a->setToolTip(QObject::tr("TBR_ZOOM"));
|
|
a->setStatusTip(QObject::tr("TBR_ZOOM"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(zoom()));
|
|
|
|
a->setCheckable(true);
|
|
connect(a, SIGNAL(toggled(bool)), this, SLOT(updateToggled(bool)));
|
|
myViewActions->insert(ViewZoomId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_PAN")), QObject::tr("MNU_PAN"), this);
|
|
a->setToolTip(QObject::tr("TBR_PAN"));
|
|
a->setStatusTip(QObject::tr("TBR_PAN"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(pan()));
|
|
|
|
a->setCheckable(true);
|
|
connect(a, SIGNAL(toggled(bool)), this, SLOT(updateToggled(bool)));
|
|
myViewActions->insert(ViewPanId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_GLOBALPAN")),
|
|
QObject::tr("MNU_GLOBALPAN"),
|
|
this);
|
|
a->setToolTip(QObject::tr("TBR_GLOBALPAN"));
|
|
a->setStatusTip(QObject::tr("TBR_GLOBALPAN"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(globalPan()));
|
|
|
|
a->setCheckable(true);
|
|
connect(a, SIGNAL(toggled(bool)), this, SLOT(updateToggled(bool)));
|
|
myViewActions->insert(ViewGlobalPanId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_FRONT")), QObject::tr("MNU_FRONT"), this);
|
|
a->setToolTip(QObject::tr("TBR_FRONT"));
|
|
a->setStatusTip(QObject::tr("TBR_FRONT"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(front()));
|
|
myViewActions->insert(ViewFrontId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_BACK")), QObject::tr("MNU_BACK"), this);
|
|
a->setToolTip(QObject::tr("TBR_BACK"));
|
|
a->setStatusTip(QObject::tr("TBR_BACK"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(back()));
|
|
myViewActions->insert(ViewBackId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_TOP")), QObject::tr("MNU_TOP"), this);
|
|
a->setToolTip(QObject::tr("TBR_TOP"));
|
|
a->setStatusTip(QObject::tr("TBR_TOP"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(top()));
|
|
myViewActions->insert(ViewTopId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_BOTTOM")), QObject::tr("MNU_BOTTOM"), this);
|
|
a->setToolTip(QObject::tr("TBR_BOTTOM"));
|
|
a->setStatusTip(QObject::tr("TBR_BOTTOM"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(bottom()));
|
|
myViewActions->insert(ViewBottomId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_LEFT")), QObject::tr("MNU_LEFT"), this);
|
|
a->setToolTip(QObject::tr("TBR_LEFT"));
|
|
a->setStatusTip(QObject::tr("TBR_LEFT"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(left()));
|
|
myViewActions->insert(ViewLeftId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_RIGHT")), QObject::tr("MNU_RIGHT"), this);
|
|
a->setToolTip(QObject::tr("TBR_RIGHT"));
|
|
a->setStatusTip(QObject::tr("TBR_RIGHT"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(right()));
|
|
myViewActions->insert(ViewRightId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_AXO")), QObject::tr("MNU_AXO"), this);
|
|
a->setToolTip(QObject::tr("TBR_AXO"));
|
|
a->setStatusTip(QObject::tr("TBR_AXO"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(axo()));
|
|
myViewActions->insert(ViewAxoId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_ROTATION")),
|
|
QObject::tr("MNU_ROTATION"),
|
|
this);
|
|
a->setToolTip(QObject::tr("TBR_ROTATION"));
|
|
a->setStatusTip(QObject::tr("TBR_ROTATION"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(rotation()));
|
|
a->setCheckable(true);
|
|
connect(a, SIGNAL(toggled(bool)), this, SLOT(updateToggled(bool)));
|
|
myViewActions->insert(ViewRotationId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_RESET")), QObject::tr("MNU_RESET"), this);
|
|
a->setToolTip(QObject::tr("TBR_RESET"));
|
|
a->setStatusTip(QObject::tr("TBR_RESET"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(reset()));
|
|
myViewActions->insert(ViewResetId, a);
|
|
|
|
QActionGroup* ag = new QActionGroup(this);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_HLROFF")), QObject::tr("MNU_HLROFF"), this);
|
|
a->setToolTip(QObject::tr("TBR_HLROFF"));
|
|
a->setStatusTip(QObject::tr("TBR_HLROFF"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(hlrOff()));
|
|
a->setCheckable(true);
|
|
ag->addAction(a);
|
|
myViewActions->insert(ViewHlrOffId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_VIEW_HLRON")), QObject::tr("MNU_HLRON"), this);
|
|
a->setToolTip(QObject::tr("TBR_HLRON"));
|
|
a->setStatusTip(QObject::tr("TBR_HLRON"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(hlrOn()));
|
|
|
|
a->setCheckable(true);
|
|
ag->addAction(a);
|
|
myViewActions->insert(ViewHlrOnId, a);
|
|
}
|
|
|
|
void View::initRaytraceActions()
|
|
{
|
|
if (myRaytraceActions)
|
|
return;
|
|
|
|
myRaytraceActions = new QList<QAction*>();
|
|
QString dir = ApplicationCommonWindow::getResourceDir() + QString("/");
|
|
QAction* a;
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_TOOL_RAYTRACING")),
|
|
QObject::tr("MNU_TOOL_RAYTRACING"),
|
|
this);
|
|
a->setToolTip(QObject::tr("TBR_TOOL_RAYTRACING"));
|
|
a->setStatusTip(QObject::tr("TBR_TOOL_RAYTRACING"));
|
|
a->setCheckable(true);
|
|
a->setChecked(false);
|
|
connect(a, SIGNAL(triggered()), this, SLOT(onRaytraceAction()));
|
|
myRaytraceActions->insert(ToolRaytracingId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_TOOL_SHADOWS")),
|
|
QObject::tr("MNU_TOOL_SHADOWS"),
|
|
this);
|
|
a->setToolTip(QObject::tr("TBR_TOOL_SHADOWS"));
|
|
a->setStatusTip(QObject::tr("TBR_TOOL_SHADOWS"));
|
|
a->setCheckable(true);
|
|
a->setChecked(true);
|
|
connect(a, SIGNAL(triggered()), this, SLOT(onRaytraceAction()));
|
|
myRaytraceActions->insert(ToolShadowsId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_TOOL_REFLECTIONS")),
|
|
QObject::tr("MNU_TOOL_REFLECTIONS"),
|
|
this);
|
|
a->setToolTip(QObject::tr("TBR_TOOL_REFLECTIONS"));
|
|
a->setStatusTip(QObject::tr("TBR_TOOL_REFLECTIONS"));
|
|
a->setCheckable(true);
|
|
a->setChecked(false);
|
|
connect(a, SIGNAL(triggered()), this, SLOT(onRaytraceAction()));
|
|
myRaytraceActions->insert(ToolReflectionsId, a);
|
|
|
|
a = new QAction(QPixmap(dir + QObject::tr("ICON_TOOL_ANTIALIASING")),
|
|
QObject::tr("MNU_TOOL_ANTIALIASING"),
|
|
this);
|
|
a->setToolTip(QObject::tr("TBR_TOOL_ANTIALIASING"));
|
|
a->setStatusTip(QObject::tr("TBR_TOOL_ANTIALIASING"));
|
|
a->setCheckable(true);
|
|
a->setChecked(false);
|
|
connect(a, SIGNAL(triggered()), this, SLOT(onRaytraceAction()));
|
|
myRaytraceActions->insert(ToolAntialiasingId, a);
|
|
}
|
|
|
|
void View::activateCursor(const CurrentAction3d mode)
|
|
{
|
|
switch (mode)
|
|
{
|
|
case CurAction3d_DynamicPanning:
|
|
setCursor(*panCursor);
|
|
break;
|
|
case CurAction3d_DynamicZooming:
|
|
setCursor(*zoomCursor);
|
|
break;
|
|
case CurAction3d_DynamicRotation:
|
|
setCursor(*rotCursor);
|
|
break;
|
|
case CurAction3d_GlobalPanning:
|
|
setCursor(*globPanCursor);
|
|
break;
|
|
case CurAction3d_WindowZooming:
|
|
setCursor(*handCursor);
|
|
break;
|
|
case CurAction3d_Nothing:
|
|
default:
|
|
setCursor(*defCursor);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void View::mousePressEvent(QMouseEvent* theEvent)
|
|
{
|
|
const Graphic3d_Vec2i aPnt(theEvent->pos().x(), theEvent->pos().y());
|
|
const Aspect_VKeyFlags aFlags = qtMouseModifiers2VKeys(theEvent->modifiers());
|
|
if (!myView.IsNull()
|
|
&& UpdateMouseButtons(aPnt, qtMouseButtons2VKeys(theEvent->buttons()), aFlags, false))
|
|
{
|
|
updateView();
|
|
}
|
|
myClickPos = aPnt;
|
|
}
|
|
|
|
void View::mouseReleaseEvent(QMouseEvent* theEvent)
|
|
{
|
|
const Graphic3d_Vec2i aPnt(theEvent->pos().x(), theEvent->pos().y());
|
|
const Aspect_VKeyFlags aFlags = qtMouseModifiers2VKeys(theEvent->modifiers());
|
|
if (!myView.IsNull()
|
|
&& UpdateMouseButtons(aPnt, qtMouseButtons2VKeys(theEvent->buttons()), aFlags, false))
|
|
{
|
|
updateView();
|
|
}
|
|
|
|
if (myCurrentMode == CurAction3d_GlobalPanning)
|
|
{
|
|
myView->Place(aPnt.x(), aPnt.y(), myCurZoom);
|
|
}
|
|
if (myCurrentMode != CurAction3d_Nothing)
|
|
{
|
|
setCurrentAction(CurAction3d_Nothing);
|
|
}
|
|
if (theEvent->button() == Qt::RightButton && (aFlags & Aspect_VKeyFlags_CTRL) == 0
|
|
&& (myClickPos - aPnt).cwiseAbs().maxComp() <= 4)
|
|
{
|
|
Popup(aPnt.x(), aPnt.y());
|
|
}
|
|
}
|
|
|
|
void View::mouseMoveEvent(QMouseEvent* theEvent)
|
|
{
|
|
const Graphic3d_Vec2i aNewPos(theEvent->pos().x(), theEvent->pos().y());
|
|
if (!myView.IsNull()
|
|
&& UpdateMousePosition(aNewPos,
|
|
qtMouseButtons2VKeys(theEvent->buttons()),
|
|
qtMouseModifiers2VKeys(theEvent->modifiers()),
|
|
false))
|
|
{
|
|
updateView();
|
|
}
|
|
}
|
|
|
|
//==============================================================================
|
|
// function : wheelEvent
|
|
// purpose :
|
|
//==============================================================================
|
|
void View::wheelEvent(QWheelEvent* theEvent)
|
|
{
|
|
const Graphic3d_Vec2i aPos(theEvent->pos().x(), theEvent->pos().y());
|
|
if (!myView.IsNull() && UpdateZoom(Aspect_ScrollDelta(aPos, theEvent->delta() / 8)))
|
|
{
|
|
updateView();
|
|
}
|
|
}
|
|
|
|
// =======================================================================
|
|
// function : updateView
|
|
// purpose :
|
|
// =======================================================================
|
|
void View::updateView()
|
|
{
|
|
update();
|
|
}
|
|
|
|
void View::defineMouseGestures()
|
|
{
|
|
myMouseGestureMap.Clear();
|
|
AIS_MouseGesture aRot = AIS_MouseGesture_RotateOrbit;
|
|
activateCursor(myCurrentMode);
|
|
switch (myCurrentMode)
|
|
{
|
|
case CurAction3d_Nothing: {
|
|
noActiveActions();
|
|
myMouseGestureMap = myDefaultGestures;
|
|
break;
|
|
}
|
|
case CurAction3d_DynamicZooming: {
|
|
myMouseGestureMap.Bind(Aspect_VKeyMouse_LeftButton, AIS_MouseGesture_Zoom);
|
|
break;
|
|
}
|
|
case CurAction3d_GlobalPanning: {
|
|
break;
|
|
}
|
|
case CurAction3d_WindowZooming: {
|
|
myMouseGestureMap.Bind(Aspect_VKeyMouse_LeftButton, AIS_MouseGesture_ZoomWindow);
|
|
break;
|
|
}
|
|
case CurAction3d_DynamicPanning: {
|
|
myMouseGestureMap.Bind(Aspect_VKeyMouse_LeftButton, AIS_MouseGesture_Pan);
|
|
break;
|
|
}
|
|
case CurAction3d_DynamicRotation: {
|
|
myMouseGestureMap.Bind(Aspect_VKeyMouse_LeftButton, aRot);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void View::Popup(const int /*x*/, const int /*y*/)
|
|
{
|
|
ApplicationCommonWindow* stApp = ApplicationCommonWindow::getApplication();
|
|
QMdiArea* ws = ApplicationCommonWindow::getWorkspace();
|
|
QMdiSubWindow* w = ws->activeSubWindow();
|
|
if (myContext->NbSelected())
|
|
{
|
|
QList<QAction*>* aList = stApp->getToolActions();
|
|
QMenu* myToolMenu = new QMenu(0);
|
|
myToolMenu->addAction(aList->at(ApplicationCommonWindow::ToolWireframeId));
|
|
myToolMenu->addAction(aList->at(ApplicationCommonWindow::ToolShadingId));
|
|
myToolMenu->addAction(aList->at(ApplicationCommonWindow::ToolColorId));
|
|
|
|
QMenu* myMaterMenu = new QMenu(myToolMenu);
|
|
|
|
QList<QAction*>* aMeterActions =
|
|
ApplicationCommonWindow::getApplication()->getMaterialActions();
|
|
|
|
QString dir = ApplicationCommonWindow::getResourceDir() + QString("/");
|
|
myMaterMenu =
|
|
myToolMenu->addMenu(QPixmap(dir + QObject::tr("ICON_TOOL_MATER")), QObject::tr("MNU_MATER"));
|
|
for (int i = 0; i < aMeterActions->size(); i++)
|
|
myMaterMenu->addAction(aMeterActions->at(i));
|
|
|
|
myToolMenu->addAction(aList->at(ApplicationCommonWindow::ToolTransparencyId));
|
|
myToolMenu->addAction(aList->at(ApplicationCommonWindow::ToolDeleteId));
|
|
addItemInPopup(myToolMenu);
|
|
myToolMenu->exec(QCursor::pos());
|
|
delete myToolMenu;
|
|
}
|
|
else
|
|
{
|
|
if (!myBackMenu)
|
|
{
|
|
myBackMenu = new QMenu(0);
|
|
|
|
QAction* a = new QAction(QObject::tr("MNU_CH_BACK"), this);
|
|
a->setToolTip(QObject::tr("TBR_CH_BACK"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(onBackground()));
|
|
myBackMenu->addAction(a);
|
|
addItemInPopup(myBackMenu);
|
|
|
|
a = new QAction(QObject::tr("MNU_CH_ENV_MAP"), this);
|
|
a->setToolTip(QObject::tr("TBR_CH_ENV_MAP"));
|
|
connect(a, SIGNAL(triggered()), this, SLOT(onEnvironmentMap()));
|
|
a->setCheckable(true);
|
|
a->setChecked(false);
|
|
myBackMenu->addAction(a);
|
|
addItemInPopup(myBackMenu);
|
|
}
|
|
|
|
myBackMenu->exec(QCursor::pos());
|
|
}
|
|
if (w)
|
|
w->setFocus();
|
|
}
|
|
|
|
void View::addItemInPopup(QMenu* /*theMenu*/) {}
|
|
|
|
void View::noActiveActions()
|
|
{
|
|
for (int i = ViewFitAllId; i < ViewHlrOffId; i++)
|
|
{
|
|
QAction* anAction = myViewActions->at(i);
|
|
if ((anAction == myViewActions->at(ViewFitAreaId))
|
|
|| (anAction == myViewActions->at(ViewZoomId)) || (anAction == myViewActions->at(ViewPanId))
|
|
|| (anAction == myViewActions->at(ViewGlobalPanId))
|
|
|| (anAction == myViewActions->at(ViewRotationId)))
|
|
{
|
|
setCursor(*defCursor);
|
|
anAction->setCheckable(true);
|
|
anAction->setChecked(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
void View::onBackground()
|
|
{
|
|
QColor aColor;
|
|
Standard_Real R1;
|
|
Standard_Real G1;
|
|
Standard_Real B1;
|
|
myView->BackgroundColor(Quantity_TOC_RGB, R1, G1, B1);
|
|
aColor.setRgb((Standard_Integer)(R1 * 255),
|
|
(Standard_Integer)(G1 * 255),
|
|
(Standard_Integer)(B1 * 255));
|
|
|
|
QColor aRetColor = QColorDialog::getColor(aColor);
|
|
|
|
if (aRetColor.isValid())
|
|
{
|
|
R1 = aRetColor.red() / 255.;
|
|
G1 = aRetColor.green() / 255.;
|
|
B1 = aRetColor.blue() / 255.;
|
|
myView->SetBackgroundColor(Quantity_TOC_RGB, R1, G1, B1);
|
|
}
|
|
myView->Redraw();
|
|
}
|
|
|
|
void View::onEnvironmentMap()
|
|
{
|
|
if (myBackMenu->actions().at(1)->isChecked())
|
|
{
|
|
QString fileName =
|
|
QFileDialog::getOpenFileName(this,
|
|
tr("Open File"),
|
|
"",
|
|
tr("All Image Files (*.bmp *.gif *.jpg *.jpeg *.png *.tga)"));
|
|
|
|
const TCollection_AsciiString anUtf8Path(fileName.toUtf8().data());
|
|
|
|
Handle(Graphic3d_TextureEnv) aTexture = new Graphic3d_TextureEnv(anUtf8Path);
|
|
|
|
myView->SetTextureEnv(aTexture);
|
|
}
|
|
else
|
|
{
|
|
myView->SetTextureEnv(Handle(Graphic3d_TextureEnv)());
|
|
}
|
|
|
|
myView->Redraw();
|
|
}
|
|
|
|
bool View::dump(Standard_CString theFile)
|
|
{
|
|
return myView->Dump(theFile);
|
|
}
|
|
|
|
Handle(V3d_View)& View::getView()
|
|
{
|
|
return myView;
|
|
}
|
|
|
|
Handle(AIS_InteractiveContext)& View::getContext()
|
|
{
|
|
return myContext;
|
|
}
|
|
|
|
View::CurrentAction3d View::getCurrentMode()
|
|
{
|
|
return myCurrentMode;
|
|
}
|