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 <Graphic3d.hxx>
17 #include <Graphic3d_GraphicDriver.hxx>
19 static Handle(Graphic3d_GraphicDriver) Viewer_aGraphicDriver;
21 Viewer::Viewer(QWidget* parent):QWidget(parent)
23 if (myGraphicDriver.IsNull())
25 if (Viewer_aGraphicDriver.IsNull())
27 Handle(Aspect_DisplayConnection) aDisplayConnection;
28 Viewer_aGraphicDriver = Graphic3d::InitGraphicDriver (aDisplayConnection);
30 myGraphicDriver = Handle(OpenGl_GraphicDriver)::DownCast(Viewer_aGraphicDriver);
33 Handle(V3d_Viewer) aViewer = new V3d_Viewer(myGraphicDriver, TCollection_ExtendedString("Visu3D").ToExtString(), "",
34 1000, V3d_XposYnegZpos,
35 Quantity_NOC_GRAY30, V3d_ZBUFFER, V3d_GOURAUD, V3d_WAIT,
36 true, true, V3d_TEX_NONE);
38 aViewer->SetDefaultBackgroundColor(Quantity_NOC_BLACK);
40 myView = aViewer->CreateView();
41 myIC = new AIS_InteractiveContext(aViewer);
42 myIC->SetDeviationCoefficient(1.e-3);
44 Aspect_Handle aWindowHandle = (Aspect_Handle )winId();
45 Handle(WNT_Window) hWnd = new WNT_Window (aWindowHandle);
47 myView->SetWindow(hWnd);
51 myView->MustBeResized();
52 myView->SetSurfaceDetail(V3d_TEX_NONE);
53 myView->SetTransparency(Standard_True);
54 myView->SetSize(10000.0);
55 myView->SetZSize(10000.0);
56 myView->SetViewMappingDefault();
61 setMouseTracking(true);
63 setMinimumSize(400, 200);
65 myView->ZBufferTriedronSetup();
66 myView->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_BLACK, 0.1, V3d_ZBUFFER);
68 mySelector.Init(myView);
70 setBackgroundRole( QPalette::NoRole );//NoBackground );
71 // set focus policy to threat QContextMenuEvent from keyboard
72 setFocusPolicy( Qt::StrongFocus );
73 setAttribute( Qt::WA_PaintOnScreen );
74 setAttribute( Qt::WA_NoSystemBackground );
82 void Viewer::paintEvent(QPaintEvent * pEvent)
90 Get paint engine for the OpenGL viewer. [ virtual public ]
92 QPaintEngine* Viewer::paintEngine() const
97 void Viewer::resizeEvent(QResizeEvent * e)
101 myView->MustBeResized();
105 void Viewer::mousePressEvent(QMouseEvent * mpEvent)
107 // Memorize start point
108 myStartPnt.setX(mpEvent->x());
109 myStartPnt.setY(mpEvent->y());
111 // Inform IC that the mouse cursor is at the point
112 myIC->MoveTo(myStartPnt.x(), myStartPnt.y(), myView);
114 // In case of rotation, define the start rotation point
115 if ((mpEvent->modifiers() & Qt::ControlModifier) && (mpEvent->buttons() & Qt::RightButton))
117 myView->StartRotation(myStartPnt.x(), myStartPnt.y());
120 // Start degenerate mode
121 setDegenerateMode(true);
123 emit mousePressed(mpEvent->modifiers(), mpEvent->x(), mpEvent->y());
126 void Viewer::mouseMoveEvent(QMouseEvent * mmEvent)
128 QPoint currentPnt(mmEvent->x(), mmEvent->y());
130 if (mmEvent->modifiers() & Qt::ControlModifier)
132 if (mmEvent->buttons() & Qt::LeftButton)
134 myView->Zoom(myStartPnt.x(), myStartPnt.y(), currentPnt.x(), currentPnt.y());
135 myStartPnt = currentPnt;
137 else if (mmEvent->buttons() & Qt::MidButton)
139 myView->Pan(currentPnt.x() - myStartPnt.x(), myStartPnt.y() - currentPnt.y());
140 myStartPnt = currentPnt;
142 else if (mmEvent->buttons() & Qt::RightButton)
144 myView->Rotation(currentPnt.x(), currentPnt.y());
149 myIC->MoveTo(currentPnt.x(), currentPnt.y(), myView);
152 emit mouseMoved(mmEvent->modifiers(), currentPnt.x(), currentPnt.y());
155 void Viewer::mouseReleaseEvent(QMouseEvent * mrEvent)
157 if(mrEvent->button() == Qt::LeftButton)
159 if(!myZoom && !myPan && !myRotate)
161 if(mrEvent->modifiers() & Qt::ShiftModifier)
167 int ix = -1, iy = -1, iz = -1;
168 bool detected = mySelector.Detect(mrEvent->x(), mrEvent->y(), ix, iy, iz);
171 cout<<"("<<ix<<", "<<iy<<", "<<iz<<")"<<endl;
174 myPrs->Highlight(ix, iy, iz);
177 else if(mrEvent->button() == Qt::RightButton)
184 // Finish degenerate mode
185 setDegenerateMode(false);
187 emit mouseReleased(mrEvent->modifiers(), mrEvent->x(), mrEvent->y());
190 void Viewer::mouseDoubleClickEvent(QMouseEvent * mdcEvent)
192 emit mouseDoubleClick(mdcEvent->modifiers(), mdcEvent->x(), mdcEvent->y());
195 void Viewer::setDegenerateMode(const bool on)
197 AIS_ListOfInteractive displayed;
198 myIC->DisplayedObjects(displayed);
199 AIS_ListIteratorOfListOfInteractive itri(displayed);
200 for (; itri.More(); itri.Next())
202 if (itri.Value()->DynamicType() == STANDARD_TYPE(Voxel_Prs))
204 Handle(Voxel_Prs) prs = Handle(Voxel_Prs)::DownCast(itri.Value());
205 prs->SetDegenerateMode(on);