4 #include <QApplication.h>
6 #include <QMessagebox.h>
10 #include <WNT_Window.hxx>
12 #include <Voxel_Prs.hxx>
13 #include <AIS_ListOfInteractive.hxx>
14 #include <AIS_ListIteratorOfListOfInteractive.hxx>
15 #include <Aspect_DisplayConnection.hxx>
16 #include <OpenGl_GraphicDriver.hxx>
17 #include <V3d_DirectionalLight.hxx>
18 #include <V3d_AmbientLight.hxx>
20 static Handle(Graphic3d_GraphicDriver) Viewer_aGraphicDriver;
22 Viewer::Viewer(QWidget* parent):QWidget(parent)
24 if (myGraphicDriver.IsNull())
26 if (Viewer_aGraphicDriver.IsNull())
28 Handle(Aspect_DisplayConnection) aDisplayConnection;
29 Viewer_aGraphicDriver = new OpenGl_GraphicDriver (aDisplayConnection);
31 myGraphicDriver = Handle(OpenGl_GraphicDriver)::DownCast(Viewer_aGraphicDriver);
34 Handle(V3d_Viewer) aViewer = new V3d_Viewer(myGraphicDriver, TCollection_ExtendedString("Visu3D").ToExtString(), "",
35 1000, V3d_XposYnegZpos,
36 Quantity_NOC_GRAY30, V3d_ZBUFFER, V3d_GOURAUD, V3d_WAIT,
37 true, true, V3d_TEX_NONE);
39 aViewer->SetDefaultBackgroundColor(Quantity_NOC_BLACK);
41 myView = aViewer->CreateView();
42 myIC = new AIS_InteractiveContext(aViewer);
43 myIC->SetDeviationCoefficient(1.e-3);
45 Aspect_Handle aWindowHandle = (Aspect_Handle )winId();
46 Handle(WNT_Window) hWnd = new WNT_Window (aWindowHandle);
48 myView->SetWindow(hWnd);
52 myView->MustBeResized();
53 myView->SetSurfaceDetail(V3d_TEX_NONE);
54 myView->SetTransparency(Standard_True);
55 myView->SetSize(10000.0);
56 myView->SetZSize(10000.0);
57 myView->SetViewMappingDefault();
62 setMouseTracking(true);
64 setMinimumSize(400, 200);
66 myView->ZBufferTriedronSetup();
67 myView->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_BLACK, 0.1, V3d_ZBUFFER);
69 mySelector.Init(myView);
71 setBackgroundRole( QPalette::NoRole );//NoBackground );
72 // set focus policy to threat QContextMenuEvent from keyboard
73 setFocusPolicy( Qt::StrongFocus );
74 setAttribute( Qt::WA_PaintOnScreen );
75 setAttribute( Qt::WA_NoSystemBackground );
77 aViewer->SetLightOn(new V3d_DirectionalLight(aViewer, V3d_XnegYnegZneg, Quantity_NOC_WHITE, Standard_True));
78 aViewer->SetLightOn(new V3d_AmbientLight(aViewer, Quantity_NOC_WHITE));
86 void Viewer::paintEvent(QPaintEvent * pEvent)
94 Get paint engine for the OpenGL viewer. [ virtual public ]
96 QPaintEngine* Viewer::paintEngine() const
101 void Viewer::resizeEvent(QResizeEvent * e)
103 if (!myView.IsNull())
105 myView->MustBeResized();
109 void Viewer::mousePressEvent(QMouseEvent * mpEvent)
111 // Memorize start point
112 myStartPnt.setX(mpEvent->x());
113 myStartPnt.setY(mpEvent->y());
115 // Inform IC that the mouse cursor is at the point
116 myIC->MoveTo(myStartPnt.x(), myStartPnt.y(), myView);
118 // In case of rotation, define the start rotation point
119 if ((mpEvent->modifiers() & Qt::ControlModifier) && (mpEvent->buttons() & Qt::RightButton))
121 myView->StartRotation(myStartPnt.x(), myStartPnt.y());
124 // Start degenerate mode
125 setDegenerateMode(true);
127 emit mousePressed(mpEvent->modifiers(), mpEvent->x(), mpEvent->y());
130 void Viewer::mouseMoveEvent(QMouseEvent * mmEvent)
132 QPoint currentPnt(mmEvent->x(), mmEvent->y());
134 if (mmEvent->modifiers() & Qt::ControlModifier)
136 if (mmEvent->buttons() & Qt::LeftButton)
138 myView->Zoom(myStartPnt.x(), myStartPnt.y(), currentPnt.x(), currentPnt.y());
139 myStartPnt = currentPnt;
141 else if (mmEvent->buttons() & Qt::MidButton)
143 myView->Pan(currentPnt.x() - myStartPnt.x(), myStartPnt.y() - currentPnt.y());
144 myStartPnt = currentPnt;
146 else if (mmEvent->buttons() & Qt::RightButton)
148 myView->Rotation(currentPnt.x(), currentPnt.y());
153 myIC->MoveTo(currentPnt.x(), currentPnt.y(), myView);
156 emit mouseMoved(mmEvent->modifiers(), currentPnt.x(), currentPnt.y());
159 void Viewer::mouseReleaseEvent(QMouseEvent * mrEvent)
161 if(mrEvent->button() == Qt::LeftButton)
163 if(!myZoom && !myPan && !myRotate)
165 if(mrEvent->modifiers() & Qt::ShiftModifier)
171 int ix = -1, iy = -1, iz = -1;
172 bool detected = mySelector.Detect(mrEvent->x(), mrEvent->y(), ix, iy, iz);
175 cout<<"("<<ix<<", "<<iy<<", "<<iz<<")"<<endl;
178 myPrs->Highlight(ix, iy, iz);
181 else if(mrEvent->button() == Qt::RightButton)
188 // Finish degenerate mode
189 setDegenerateMode(false);
191 emit mouseReleased(mrEvent->modifiers(), mrEvent->x(), mrEvent->y());
194 void Viewer::mouseDoubleClickEvent(QMouseEvent * mdcEvent)
196 emit mouseDoubleClick(mdcEvent->modifiers(), mdcEvent->x(), mdcEvent->y());
199 void Viewer::setDegenerateMode(const bool on)
201 AIS_ListOfInteractive displayed;
202 myIC->DisplayedObjects(displayed);
203 AIS_ListIteratorOfListOfInteractive itri(displayed);
204 for (; itri.More(); itri.Next())
206 if (itri.Value()->DynamicType() == STANDARD_TYPE(Voxel_Prs))
208 Handle(Voxel_Prs) prs = Handle(Voxel_Prs)::DownCast(itri.Value());
209 prs->SetDegenerateMode(on);