4 #include <QApplication.h>
6 #include <QMessagebox.h>
10 #include <WNT_Window.hxx>
11 #include <Graphic3d_WNTGraphicDevice.hxx>
13 #include <Voxel_Prs.hxx>
14 #include <AIS_ListOfInteractive.hxx>
15 #include <AIS_ListIteratorOfListOfInteractive.hxx>
17 static Handle(Graphic3d_WNTGraphicDevice) device;
19 Viewer::Viewer(QWidget* parent):QWidget(parent)
22 device = new Graphic3d_WNTGraphicDevice();
24 Handle(V3d_Viewer) aViewer = new V3d_Viewer(device, TCollection_ExtendedString("Visu3D").ToExtString(), "",
25 1000, V3d_XposYnegZpos,
26 Quantity_NOC_GRAY30, V3d_ZBUFFER, V3d_GOURAUD, V3d_WAIT,
27 true, true, V3d_TEX_NONE);
30 aViewer->SetDefaultBackgroundColor(Quantity_NOC_BLACK);
32 myView = aViewer->CreateView();
33 myIC = new AIS_InteractiveContext(aViewer);
34 myIC->SetDeviationCoefficient(1.e-3);
36 int windowHandle = (int) winId();
39 lo = (short) windowHandle;
40 hi = (short) (windowHandle >> 16);
41 Handle(WNT_Window) hWnd =
42 new WNT_Window(Handle(Graphic3d_WNTGraphicDevice)::DownCast(aViewer->Device()), (int) hi, (int) lo);
44 myView->SetWindow(hWnd);
48 myView->MustBeResized();
49 myView->SetSurfaceDetail(V3d_TEX_NONE);
50 myView->SetTransparency(Standard_True);
51 myView->SetSize(10000.0);
52 myView->SetZSize(10000.0);
53 myView->SetViewMappingDefault();
58 setMouseTracking(true);
60 setMinimumSize(400, 200);
62 myView->ZBufferTriedronSetup();
63 myView->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_BLACK, 0.1, V3d_ZBUFFER);
65 mySelector.Init(myView);
67 setBackgroundRole( QPalette::NoRole );//NoBackground );
68 // set focus policy to threat QContextMenuEvent from keyboard
69 setFocusPolicy( Qt::StrongFocus );
70 setAttribute( Qt::WA_PaintOnScreen );
71 setAttribute( Qt::WA_NoSystemBackground );
79 void Viewer::paintEvent(QPaintEvent * pEvent)
87 Get paint engine for the OpenGL viewer. [ virtual public ]
89 QPaintEngine* Viewer::paintEngine() const
94 void Viewer::resizeEvent(QResizeEvent * e)
98 myView->MustBeResized();
102 void Viewer::mousePressEvent(QMouseEvent * mpEvent)
104 // Memorize start point
105 myStartPnt.setX(mpEvent->x());
106 myStartPnt.setY(mpEvent->y());
108 // Inform IC that the mouse cursor is at the point
109 myIC->MoveTo(myStartPnt.x(), myStartPnt.y(), myView);
111 // In case of rotation, define the start rotation point
112 if ((mpEvent->modifiers() & Qt::ControlModifier) && (mpEvent->buttons() & Qt::RightButton))
114 myView->StartRotation(myStartPnt.x(), myStartPnt.y());
117 // Start degenerate mode
118 setDegenerateMode(true);
120 emit mousePressed(mpEvent->modifiers(), mpEvent->x(), mpEvent->y());
123 void Viewer::mouseMoveEvent(QMouseEvent * mmEvent)
125 QPoint currentPnt(mmEvent->x(), mmEvent->y());
127 if (mmEvent->modifiers() & Qt::ControlModifier)
129 if (mmEvent->buttons() & Qt::LeftButton)
131 myView->Zoom(myStartPnt.x(), myStartPnt.y(), currentPnt.x(), currentPnt.y());
132 myStartPnt = currentPnt;
134 else if (mmEvent->buttons() & Qt::MidButton)
136 myView->Pan(currentPnt.x() - myStartPnt.x(), myStartPnt.y() - currentPnt.y());
137 myStartPnt = currentPnt;
139 else if (mmEvent->buttons() & Qt::RightButton)
141 myView->Rotation(currentPnt.x(), currentPnt.y());
146 myIC->MoveTo(currentPnt.x(), currentPnt.y(), myView);
149 emit mouseMoved(mmEvent->modifiers(), currentPnt.x(), currentPnt.y());
152 void Viewer::mouseReleaseEvent(QMouseEvent * mrEvent)
154 if(mrEvent->button() == Qt::LeftButton)
156 if(!myZoom && !myPan && !myRotate)
158 if(mrEvent->modifiers() & Qt::ShiftModifier)
164 int ix = -1, iy = -1, iz = -1;
165 bool detected = mySelector.Detect(mrEvent->x(), mrEvent->y(), ix, iy, iz);
168 cout<<"("<<ix<<", "<<iy<<", "<<iz<<")"<<endl;
171 myPrs->Highlight(ix, iy, iz);
174 else if(mrEvent->button() == Qt::RightButton)
181 // Finish degenerate mode
182 setDegenerateMode(false);
184 emit mouseReleased(mrEvent->modifiers(), mrEvent->x(), mrEvent->y());
187 void Viewer::mouseDoubleClickEvent(QMouseEvent * mdcEvent)
189 emit mouseDoubleClick(mdcEvent->modifiers(), mdcEvent->x(), mdcEvent->y());
192 void Viewer::setDegenerateMode(const bool on)
194 AIS_ListOfInteractive displayed;
195 myIC->DisplayedObjects(displayed);
196 AIS_ListIteratorOfListOfInteractive itri(displayed);
197 for (; itri.More(); itri.Next())
199 if (itri.Value()->DynamicType() == STANDARD_TYPE(Voxel_Prs))
201 Handle(Voxel_Prs) prs = Handle(Voxel_Prs)::DownCast(itri.Value());
202 prs->SetDegenerateMode(on);