Porting samples for OCCT 6.5.2
[occt.git] / samples / mfc / standard / 07_Triangulation / src / OCCDemo_Presentation.cpp
CommitLineData
7fd59977 1// OCCDemo_Presentation.cpp: implementation of the OCCDemo_Presentation class.
2// This is a base class for all presentations
3//////////////////////////////////////////////////////////////////////
4
5#include "stdafx.h"
6#include "OCCDemo_Presentation.h"
7#include <OCC_3dView.h>
8#include "TriangulationDoc.h"
9#include "ISession_Curve.h"
10
11#include <AIS_InteractiveObject.hxx>
12#include <Geom_Surface.hxx>
13#include <Geom_Curve.hxx>
14#include <Geom2d_Curve.hxx>
15#include <Quantity_Color.hxx>
16#include <AIS_Shape.hxx>
17#include <BRepBuilderAPI_MakeFace.hxx>
18#include <Precision.hxx>
19#include <Geom_Line.hxx>
20#include <Geom_TrimmedCurve.hxx>
21#include <AIS_Drawer.hxx>
22#include <Prs3d_ArrowAspect.hxx>
23#include <AIS_Point.hxx>
24#include <Geom_CartesianPoint.hxx>
25#include <Geom2d_OffsetCurve.hxx>
26#include <GeomAPI.hxx>
27#include <gp_Pln.hxx>
28#include <Geom_OffsetCurve.hxx>
29
30#define MAX_PARAM 1000 // if a surface parameter is infinite, it is assingned
31// this value in order to display the "infinit" object in the viewer.
32
33
34Standard_Boolean OCCDemo_Presentation::WaitForInput (unsigned long aMilliSeconds)
35{
36 //::WaitForSingleObject(::CreateEvent (NULL, FALSE, FALSE, NULL), aMilliSeconds);
37 if (::MsgWaitForMultipleObjects(0, NULL, FALSE, aMilliSeconds,
38 QS_KEY | QS_MOUSEBUTTON) != WAIT_TIMEOUT)
39 {
40 MSG msg;
41 if (::PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
42 {
43 if (msg.message == WM_KEYUP)
44 {
45 ::PeekMessage (&msg, NULL, 0, 0, PM_REMOVE);
46 return WaitForInput (aMilliSeconds);
47 }
48 else
49 return Standard_True;
50 }
51 }
52 return Standard_False;
53}
54
55//================================================================
56// Function : fixParam
57// Purpose : assings a finite value to theParam if it intinite
58// (equal to +- Precision::Infinite())
59//================================================================
60static Standard_Boolean fixParam(Standard_Real& theParam)
61{
62 Standard_Boolean aResult = Standard_False;
63 if (Precision::IsNegativeInfinite(theParam))
64 {
65 theParam = -MAX_PARAM;
66 aResult = Standard_True;
67 }
68 if (Precision::IsPositiveInfinite(theParam))
69 {
70 theParam = MAX_PARAM;
71 aResult = Standard_True;
72 }
73 return aResult;
74}
75
76//================================================================
77// Function : DrawSurface
78// Purpose : displays a given geometric surface in 3d viewer
79// (creates a finite face and displays it)
80//================================================================
81Handle_AIS_InteractiveObject OCCDemo_Presentation::drawSurface
82 (const Handle_Geom_Surface& theSurface,
83 const Quantity_Color& theColor,
84 const Standard_Boolean toDisplay)
85{
86 Standard_Real u1, u2, v1, v2;
87 theSurface->Bounds(u1,u2,v1,v2);
88 fixParam(u1);
89 fixParam(u2);
90 fixParam(v1);
91 fixParam(v2);
92
93 Handle_AIS_Shape aGraphicSurface =
9181b66d 94 new AIS_Shape(BRepBuilderAPI_MakeFace (theSurface, u1, u2, v1, v2, Precision::Confusion()));
7fd59977 95
96 getAISContext()->SetMaterial(aGraphicSurface, Graphic3d_NOM_PLASTIC, toDisplay);
97 getAISContext()->SetColor(aGraphicSurface, theColor, toDisplay);
98 if (toDisplay) {
99 if (FitMode){
100 getAISContext()->Display (aGraphicSurface, Standard_False);
101 CTriangulationDoc::Fit();
102 }
103 else
104 getAISContext()->Display (aGraphicSurface);
105 }
106
107 return aGraphicSurface;
108}
109
110//================================================================
111// Function : DrawCurve
112// Purpose : displays a given curve 3d
113//================================================================
114Handle_AIS_InteractiveObject OCCDemo_Presentation::drawCurve
115 (const Handle_Geom_Curve& theCurve,
116 const Quantity_Color& theColor,
117 const Standard_Boolean toDisplay)
118{
119 Handle(ISession_Curve) aGraphicCurve = new ISession_Curve (theCurve);
120
121 getAISContext()->SetColor (aGraphicCurve, theColor, toDisplay);
122 aGraphicCurve->Attributes()->Link()->SetLineArrowDraw(Standard_False);
123 if (toDisplay){
124 if (FitMode){
125 getAISContext()->Display (aGraphicCurve, Standard_False);
126 CTriangulationDoc::Fit();
127 }
128 else
129 getAISContext()->Display (aGraphicCurve);
130 }
131
132 return aGraphicCurve;
133}
134
135//================================================================
136// Function : DrawCurve
137// Purpose : displays a given curve 2d
138//================================================================
139Handle_AIS_InteractiveObject OCCDemo_Presentation::drawCurve
140 (const Handle_Geom2d_Curve& theCurve,
141 const Quantity_Color& theColor,
142 const Standard_Boolean toDisplay,
143 const gp_Ax2& aPosition)
144{
145 // create 3D curve in plane
146 Handle(Geom_Curve) aCurve3d;
147 if (theCurve->IsKind(STANDARD_TYPE(Geom2d_OffsetCurve)))
148 {
149 Handle(Geom2d_OffsetCurve) aOffCurve =
150 Handle(Geom2d_OffsetCurve)::DownCast(theCurve);
151 Handle(Geom_Curve) aBasCurve3d =
152 GeomAPI::To3d (aOffCurve->BasisCurve(), gp_Pln(aPosition));
153 Standard_Real aDist = aOffCurve->Offset();
154 aCurve3d = new Geom_OffsetCurve (aBasCurve3d, aDist, aPosition.Direction());
155 }
156 else
157 {
158 aCurve3d = GeomAPI::To3d (theCurve, gp_Pln(aPosition));
159 }
160 return drawCurve (aCurve3d, theColor, toDisplay);
161}
162
163//================================================================
164// Function : drawPoint
165// Purpose : displays a given point
166//================================================================
167Handle_AIS_Point OCCDemo_Presentation::drawPoint
168 (const gp_Pnt& aPnt,
169 const Quantity_Color& theColor,
170 const Standard_Boolean toDisplay)
171{
172 Handle(AIS_Point) aGraphicPoint = new AIS_Point (new Geom_CartesianPoint(aPnt));
173
174 getAISContext()->SetColor (aGraphicPoint, theColor, toDisplay);
175 if (toDisplay) {
176 getAISContext()->Display (aGraphicPoint);
177 //COCCDemoDoc::Fit();
178 }
179
180 return aGraphicPoint;
181}
182
183//================================================================
184// Function : drawVector
185// Purpose : displays a given vector in 3d viewer
186// (segment of line starting at thePnt with the arrow at the end,
187// the length of segment is the length of the vector)
188//================================================================
189Handle_AIS_InteractiveObject OCCDemo_Presentation::drawVector
190 (const gp_Pnt& thePnt,
191 const gp_Vec& theVec,
192 const Quantity_Color& theColor,
193 const Standard_Boolean toDisplay)
194{
195 Standard_Real aLength = theVec.Magnitude();
196 if (aLength < Precision::Confusion())
197 return Handle(AIS_InteractiveObject)();
198
199 Handle(Geom_Curve) aCurve = new Geom_Line (thePnt, theVec);
200 aCurve = new Geom_TrimmedCurve (aCurve, 0, aLength);
201
202 Handle(ISession_Curve) aGraphicCurve = new ISession_Curve (aCurve);
203
204 getAISContext()->SetColor (aGraphicCurve, theColor, toDisplay);
205 Handle(Prs3d_Drawer) aDrawer = aGraphicCurve->Attributes()->Link();
206 aDrawer->SetLineArrowDraw(Standard_True);
207 aDrawer->ArrowAspect()->SetLength(aLength/10);
208 if (toDisplay) {
209 if (FitMode){
210 getAISContext()->Display (aGraphicCurve, Standard_False);
211 CTriangulationDoc::Fit();
212 }
213 else
214 getAISContext()->Display (aGraphicCurve);
215 }
216
217 return aGraphicCurve;
218}
219
220
221Handle_AIS_Shape OCCDemo_Presentation::drawShape
222 (const TopoDS_Shape& theShape,const Quantity_Color& theColor,
223 const Standard_Boolean toDisplay)
224{
225 Handle_AIS_Shape aGraphicShape = new AIS_Shape(theShape);
226
227 getAISContext()->SetMaterial(aGraphicShape, Graphic3d_NOM_PLASTIC, toDisplay);
228 getAISContext()->SetColor (aGraphicShape, theColor, toDisplay);
229 if (toDisplay){
230 if (FitMode){
231 getAISContext()->Display (aGraphicShape, Standard_False);
232 CTriangulationDoc::Fit();
233 }
234 else
235 getAISContext()->Display (aGraphicShape);
236 }
237
238 return aGraphicShape;
239}
240
241Handle_AIS_Shape OCCDemo_Presentation::drawShape
242 (const TopoDS_Shape& theShape,
243 const Graphic3d_NameOfMaterial theMaterial,
244 const Standard_Boolean toDisplay)
245{
246 Handle_AIS_Shape aGraphicShape = new AIS_Shape(theShape);
247
248 getAISContext()->SetMaterial(aGraphicShape, theMaterial, toDisplay);
249 if (toDisplay) {
250 if (FitMode){
251 getAISContext()->Display (aGraphicShape, Standard_False);
252 CTriangulationDoc::Fit();
253 }
254 else
255 getAISContext()->Display (aGraphicShape);
256 }
257
258 return aGraphicShape;
259}
260/*
261void OCCDemo_Presentation::GetViewCenter(V3d_Coordinate& Xc, V3d_Coordinate& Yc)
262{
263 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
264 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
265 OCC_3dView *pView = (OCC_3dView*)pChild->GetActiveView();
266 pView->GetViewCenter(Xc,Yc);
267}
268
269void OCCDemo_Presentation::SetViewCenter(V3d_Coordinate Xc, V3d_Coordinate Yc)
270{
271 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
272 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
273 COCCDemoView *pView = (COCCDemoView *) pChild->GetActiveView();
274 pView->SetViewCenter(Xc,Yc);
275}
276
277void OCCDemo_Presentation::GetViewEye(V3d_Coordinate& X, V3d_Coordinate& Y, V3d_Coordinate& Z)
278{
279 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
280 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
281 COCCDemoView *pView = (COCCDemoView *) pChild->GetActiveView();
282 pView->GetViewEye(X,Y,Z);
283}
284
285void OCCDemo_Presentation::SetViewEye(V3d_Coordinate X, V3d_Coordinate Y, V3d_Coordinate Z)
286{
287 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
288 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
289 COCCDemoView *pView = (COCCDemoView *) pChild->GetActiveView();
290 pView->SetViewEye(X,Y,Z);
291}
292
293Quantity_Factor OCCDemo_Presentation::GetViewScale()
294{
295 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
296 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
297 COCCDemoView *pView = (COCCDemoView *) pChild->GetActiveView();
298 return pView->GetViewScale();
299}
300
301void OCCDemo_Presentation::SetViewScale(Quantity_Factor Coef)
302{
303 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
304 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
305 COCCDemoView *pView = (COCCDemoView *) pChild->GetActiveView();
306 pView->SetViewScale(Coef);
307}
308
309void OCCDemo_Presentation::ResetView()
310{
311 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
312 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
313 COCCDemoView *pView = (COCCDemoView *) pChild->GetActiveView();
314 pView->Reset();
315}
316*/
317Handle_AIS_InteractiveContext OCCDemo_Presentation::getAISContext() const
318{
319 return myDoc->GetAISContext();
320}
321
322Handle_V3d_Viewer OCCDemo_Presentation::getViewer() const
323{
324 return myDoc->GetViewer();
325}
326
327
328Standard_CString OCCDemo_Presentation::GetDataDir()
329{
330 return myDoc->GetDataDir();
331}