0027900: Coding rules - drop redundant Name parameter from V3d_Viewer constructor
[occt.git] / samples / mfc / standard / 09_Animation / src / AnimationDoc.cpp
CommitLineData
7fd59977 1// AnimationDocApp.cpp : implementation of the CAnimationDoc class
2//
3
4#include "stdafx.h"
5
6#include "AnimationApp.h"
7#include "AnimationDoc.h"
8#include "AnimationView3D.h"
9#include "AISDialogs.h"
10#include "ShadingDialog.h"
11#include "ThreadDialog.h"
12#include "Fonc.hxx"
13
14#define DEFAULT_COLOR Quantity_NOC_CYAN1
15#define DEFAULT_MATERIAL Graphic3d_NOM_PLASTER
16#define DEFAULT_DEVIATIONCOEFFICIENT 0.001
17#define DEFAULT_HILIGHTCOLOR Quantity_NOC_YELLOW
18
19
20#ifdef _DEBUG
21//#define new DEBUG_NEW // by cascade
22#undef THIS_FILE
23static char THIS_FILE[] = __FILE__;
24#endif
25
26/////////////////////////////////////////////////////////////////////////////
27// CAnimationDoc
28
29IMPLEMENT_DYNCREATE(CAnimationDoc, CDocument)
30
31BEGIN_MESSAGE_MAP(CAnimationDoc, CDocument)
32 //{{AFX_MSG_MAP(CAnimationDoc)
33 ON_COMMAND(ID_SHADING, OnShading)
34 ON_COMMAND(ID_Thread, OnThread)
35 ON_COMMAND(ID_FILE_LOADGRID, OnFileLoadgrid)
36 ON_UPDATE_COMMAND_UI(ID_WALK_WALKTHRU, OnUpdateWalkWalkthru)
37 //}}AFX_MSG_MAP
38
39END_MESSAGE_MAP()
40
41/////////////////////////////////////////////////////////////////////////////
42// CAnimationDoc construction/destruction
43
44CAnimationDoc::CAnimationDoc()
45{
46 // TODO: add one-time construction code here
47
48 static Standard_Integer StaticCount=1;
49 StaticCount++;
50 myCount = StaticCount;
51
dc3fe572 52 Handle(Graphic3d_GraphicDriver) aGraphicDriver =
53 ((CAnimationApp*)AfxGetApp())->GetGraphicDriver();
7fd59977 54
6a24c6de 55 myViewer = new V3d_Viewer(aGraphicDriver);
7fd59977 56 myViewer->SetDefaultLights();
57 myViewer->SetLightOn();
58
59 myAISContext =new AIS_InteractiveContext(myViewer);
60
61 myDeviation = 0.0008;
62 thread = 4;
63 myAngle = 0;
64
65 BRep_Builder B;
66 TopoDS_Shape CrankArm;
67 TopoDS_Shape CylinderHead;
68 TopoDS_Shape Propeller;
69 TopoDS_Shape Piston;
70 TopoDS_Shape EngineBlock;
71
576f8b11 72 /*wchar_t AbloluteExecutableFileName[200];
73 HMODULE hModule = GetModuleHandleW (NULL);
74 GetModuleFileNameW (hModule, AbloluteExecutableFileName, 200);
75 CString aDataDirPath (AbloluteExecutableFileName);
76 int index = aDataDirPath.ReverseFind ('\\');
77 aDataDirPath.Delete (index + 1, aDataDirPath.GetLength() - index - 1);*/
78
4b3541c6 79 CString SHAREPATHValue;
80 SHAREPATHValue.GetEnvironmentVariable (L"CSF_OCCTDataPath");
81 CString aDataDirPath = (SHAREPATHValue + "\\occ");
576f8b11 82
83 std::filebuf aFileBuf;
84 std::istream aStream (&aFileBuf);
85 CString aPathCrankArm = aDataDirPath + "\\CrankArm.rle";
86 if (aFileBuf.open (aPathCrankArm, ios::in))
87 {
88 BRepTools::Read (CrankArm, aStream, B);
89 aFileBuf.close();
90 }
91
92 CString aPathCylinderHead = aDataDirPath + "\\CylinderHead.rle";
93 if (aFileBuf.open (aPathCylinderHead, ios::in))
94 {
95 BRepTools::Read (CylinderHead, aStream, B);
96 aFileBuf.close();
97 }
98
99 CString aPathPropeller = aDataDirPath + "\\Propeller.rle";
100 if (aFileBuf.open (aPathPropeller, ios::in))
101 {
102 BRepTools::Read (Propeller, aStream, B);
103 aFileBuf.close();
104 }
105
106 CString aPathPiston = aDataDirPath + "\\Piston.rle";
107 if (aFileBuf.open (aPathPiston, ios::in))
108 {
109 BRepTools::Read (Piston, aStream, B);
110 aFileBuf.close();
111 }
112
113 CString aPathEngineBlock = aDataDirPath + "\\EngineBlock.rle";
114 if (aFileBuf.open (aPathEngineBlock, ios::in))
115 {
116 BRepTools::Read (EngineBlock, aStream, B);
117 aFileBuf.close();
118 }
7fd59977 119
7fd59977 120 if (CrankArm.IsNull() || CylinderHead.IsNull() ||
121 Propeller.IsNull() || Piston.IsNull() || EngineBlock.IsNull())
122 {
576f8b11 123 int rep = MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"Shape(s) not found.\nCheck the Data directory path!", L"Error", MB_OK | MB_ICONERROR);
7fd59977 124 if (rep == IDOK)
125 exit(0);
126 }
127 myAISContext->SetDeviationCoefficient(myDeviation);
128
129 myAisCylinderHead = new AIS_Shape (CylinderHead);
130 myAISContext->SetColor (myAisCylinderHead, Quantity_NOC_WHITE);
131 myAISContext->SetMaterial (myAisCylinderHead, Graphic3d_NOM_PLASTIC);
132 myAisEngineBlock = new AIS_Shape (EngineBlock);
133 myAISContext->SetColor(myAisEngineBlock, Quantity_NOC_WHITE);
134 myAISContext->SetMaterial(myAisEngineBlock,Graphic3d_NOM_PLASTIC);
135
136 myAISContext->Display(myAisCylinderHead ,1,-1,Standard_False,Standard_False);
137 myAISContext->Display(myAisEngineBlock ,1,-1,Standard_False,Standard_False);
138
139 myAisCrankArm = new AIS_Shape (CrankArm);
140 myAISContext->SetColor (myAisCrankArm, Quantity_NOC_HOTPINK);
141 myAISContext->SetMaterial(myAisCrankArm, Graphic3d_NOM_PLASTIC);
142 myAisPiston = new AIS_Shape (Piston);
143 myAISContext->SetColor (myAisPiston , Quantity_NOC_WHITE);
144 myAISContext->SetMaterial(myAisPiston , Graphic3d_NOM_PLASTIC);
145 myAisPropeller = new AIS_Shape (Propeller);
146 myAISContext->SetColor (myAisPropeller, Quantity_NOC_RED);
147 myAISContext->SetMaterial(myAisPropeller, Graphic3d_NOM_PLASTIC);
148
149 myAISContext->Display(myAisCrankArm ,1,-1,Standard_False,Standard_False);
150 myAISContext->Display(myAisPropeller ,1,-1,Standard_False,Standard_False);
151 myAISContext->Display(myAisPiston ,1,-1,Standard_True,Standard_False);
152
153 m_Xmin = -300. ;
154 m_Ymin = -300. ;
155 m_Zmin = -300. ;
156 m_Xmax = +300. ;
157 m_Ymax = +300. ;
158 m_Zmax = +300. ;
159
160 m_bIsGridLoaded = FALSE;
161}
162
163CAnimationDoc::~CAnimationDoc()
164{
165}
166
167/////////////////////////////////////////////////////////////////////////////
168// CAnimationDoc diagnostics
169
170#ifdef _DEBUG
171void CAnimationDoc::AssertValid() const
172{
173 CDocument::AssertValid();
174}
175
176void CAnimationDoc::Dump(CDumpContext& dc) const
177{
178 CDocument::Dump(dc);
179}
180#endif //_DEBUG
181
182/////////////////////////////////////////////////////////////////////////////
183// CAnimationDoc commands
184//-----------------------------------------------------------------------------------------
185//
186//-----------------------------------------------------------------------------------------
187void CAnimationDoc::DragEvent(const Standard_Integer x ,
188 const Standard_Integer y ,
189 const Standard_Integer TheState ,
190 const Handle(V3d_View)& aView )
191{
192
193 // TheState == -1 button down
194 // TheState == 0 move
195 // TheState == 1 button up
196
197 static Standard_Integer theButtonDownX=0;
198 static Standard_Integer theButtonDownY=0;
199
200 if (TheState == -1)
201 {
202 theButtonDownX=x;
203 theButtonDownY=y;
204 }
205
62a0addb 206 if (TheState == 1)
7fd59977 207 myAISContext->Select(theButtonDownX,theButtonDownY,x,y,aView);
208}
209
210//-----------------------------------------------------------------------------------------
211//
212//-----------------------------------------------------------------------------------------
5c573e69 213void CAnimationDoc::InputEvent(const Standard_Integer /*x*/,
214 const Standard_Integer /*y*/,
215 const Handle(V3d_View)& /*aView*/ )
7fd59977 216{
217 myAISContext->Select();
218}
219
220//-----------------------------------------------------------------------------------------
221//
222//-----------------------------------------------------------------------------------------
223void CAnimationDoc::MoveEvent(const Standard_Integer x ,
224 const Standard_Integer y ,
225 const Handle(V3d_View)& aView )
226{
227 myAISContext->MoveTo(x,y,aView);
228}
229
230//-----------------------------------------------------------------------------------------
231//
232//-----------------------------------------------------------------------------------------
233void CAnimationDoc::ShiftMoveEvent(const Standard_Integer x ,
234 const Standard_Integer y ,
235 const Handle(V3d_View)& aView )
236{
237 myAISContext->MoveTo(x,y,aView);
238}
239
240//-----------------------------------------------------------------------------------------
241//
242//-----------------------------------------------------------------------------------------
243void CAnimationDoc::ShiftDragEvent(const Standard_Integer x ,
244 const Standard_Integer y ,
245 const Standard_Integer TheState ,
246 const Handle(V3d_View)& aView )
247{
248 static Standard_Integer theButtonDownX=0;
249 static Standard_Integer theButtonDownY=0;
250
251 if (TheState == -1)
252 {
253 theButtonDownX=x;
254 theButtonDownY=y;
255 }
256
257 if (TheState == 0)
258 myAISContext->ShiftSelect(theButtonDownX,theButtonDownY,x,y,aView);
259}
260
261
262//-----------------------------------------------------------------------------------------
263//
264//-----------------------------------------------------------------------------------------
5c573e69 265void CAnimationDoc::ShiftInputEvent(const Standard_Integer /*x*/,
266 const Standard_Integer /*y*/,
267 const Handle(V3d_View)& /*aView*/)
7fd59977 268{
5c573e69 269 myAISContext->ShiftSelect();
7fd59977 270}
271
272//-----------------------------------------------------------------------------------------
273//
274//-----------------------------------------------------------------------------------------
5c573e69 275void CAnimationDoc::Popup(const Standard_Integer /*x*/,
276 const Standard_Integer /*y*/ ,
277 const Handle(V3d_View)& /*aView*/)
7fd59977 278{
279}
280
281void CAnimationDoc::OnMyTimer()
282{
283 // TODO: Add your message handler code here and/or call default
284
285 Standard_Real angleA;
286 Standard_Real angleB;
287 Standard_Real X;
288 gp_Ax1 Ax1(gp_Pnt(0,0,0),gp_Vec(0,0,1));
289
290 myAngle++;
291
42e4630c 292 angleA = thread*myAngle*M_PI/180;
7fd59977 293 X = Sin(angleA)*3/8;
294 angleB = atan(X / Sqrt(-X * X + 1));
295 Standard_Real decal(25*0.6);
296
297
298 //Build a transformation on the display
299 gp_Trsf aPropellerTrsf;
300 aPropellerTrsf.SetRotation(Ax1,angleA);
301 myAISContext->SetLocation(myAisPropeller,aPropellerTrsf);
302
303 gp_Ax3 base(gp_Pnt(3*decal*(1-Cos(angleA)),-3*decal*Sin(angleA),0),gp_Vec(0,0,1),gp_Vec(1,0,0));
304 gp_Trsf aCrankArmTrsf;
305 aCrankArmTrsf.SetTransformation( base.Rotated(gp_Ax1(gp_Pnt(3*decal,0,0),gp_Dir(0,0,1)),angleB));
306 myAISContext->SetLocation(myAisCrankArm,aCrankArmTrsf);
307
308 gp_Trsf aPistonTrsf;
309 aPistonTrsf.SetTranslation(gp_Vec(-3*decal*(1-Cos(angleA))-8*decal*(1-Cos(angleB)),0,0));
310 myAISContext->SetLocation(myAisPiston,aPistonTrsf);
311
312 myAISContext->UpdateCurrentViewer();
313}
314
315void CAnimationDoc::OnShading()
316{
317
318 POSITION position = GetFirstViewPosition();
319 CView* pCurrentView = (CView*)GetNextView(position);
320 ((CAnimationView3D *)pCurrentView) ->OnStop();
321
322 CShadingDialog aDial(NULL);
323
324 aDial.myvalue=int((myDeviation-0.00003)/0.00003);
325
326 if (aDial.DoModal()==IDOK) {
327 Standard_Real dev(aDial.myvalue);
328 myDeviation = 0.00003+0.00003*dev;
329
330 myAISContext->SetDeviationCoefficient(myDeviation);
331 TopoDS_Shape Propeller=myAisPropeller->Shape();
332 BRepTools::Clean(Propeller);
333
334 myAisPropeller->Set(Propeller);
335 myAISContext->Deactivate(myAisPropeller);
336 myAISContext->Redisplay(myAisPropeller);
337 }
338 ((CAnimationView3D *)pCurrentView)->OnRestart();
339}
340
341
342void CAnimationDoc::OnThread()
343{
344 POSITION position = GetFirstViewPosition();
345 CView* pCurrentView = (CView*)GetNextView(position);
346 ((CAnimationView3D *)pCurrentView) ->OnStop();
347 CThreadDialog aThreadDial(NULL);
348 if (aThreadDial.DoModal()==IDOK) {
349 thread = aThreadDial.m_Angle;
350 }
351
352 ((CAnimationView3D *)pCurrentView)->OnRestart();
353}
354
355
356void CAnimationDoc::OnFileLoadgrid()
357{
358 // TODO: Add your command handler code here
359
360 CFileDialog dlg(TRUE,
361 NULL,
362 NULL,
363 OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
576f8b11 364 L"Points Files (*.pnt;*.pnts)|*.pnt; *.pnts|All Files (*.*)|*.*||",
7fd59977 365 NULL );
366
5c1f974e 367 CString initdir(((OCC_App*) AfxGetApp())->GetInitDataDir());
b3837d74 368 initdir += "\\Data\\";
7fd59977 369
370 dlg.m_ofn.lpstrInitialDir = initdir;
371
372
373 if (dlg.DoModal() == IDOK)
374 {
375 CString C = dlg.GetPathName();
376 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
377
92efcf78 378 Handle(Geom_BSplineSurface) mySurface;
7fd59977 379
380 if(grid2surf(C,mySurface ))
381 {
382 //To set the minimum value of the surface to Z=0
383 Standard_Real Tolerance = 0.0;
384 Bnd_Box B;
385 TopoDS_Face myFace;
386 GeomAdaptor_Surface GAS(mySurface);
387
388
389 BndLib_AddSurface::Add(GAS,Tolerance,B);
390
391 Standard_Real Xmin,Xmax,Ymin,Ymax,Zmin,Zmax;
392 B.Get(Xmin,Ymin,Zmin,Xmax,Ymax,Zmax);
393 TopoDS_Solid Box = BRepPrimAPI_MakeBox(gp_Pnt(Xmin,Ymin,0),Xmax-Xmin,Ymax-Ymin,50).Solid();
394
395 gp_Vec V(gp_Pnt(0,0,Zmin),gp_Pnt(0,0,0));
396
397 gp_Trsf T;
398 T.SetTranslation(V);
399 mySurface->Transform(T);
9181b66d 400 BRepBuilderAPI_MakeFace aMkFace(mySurface, Precision::Confusion());
7fd59977 401 myFace = aMkFace.Face();
402
403 // Remove all other shapes
404 myAISContext->RemoveAll();
405
406 Handle(AIS_Shape) myAISSurface = new AIS_Shape(myFace);
407
408 myAISContext->Display(myAISSurface, Standard_False);
409 myAISContext->Deactivate(myAISSurface,Standard_False);
410 myAISContext->SetColor (myAISSurface,Quantity_NOC_WHITE,Standard_False);
411 myAISContext->SetMaterial (myAISSurface,Graphic3d_NOM_STONE,Standard_False);
412 myAISContext->SetDisplayMode (myAISSurface,1,Standard_False);
413 myAISContext->SetDeviationCoefficient (0.001);
414 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
415 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
416 CAnimationView3D *pView = (CAnimationView3D *) pChild->GetActiveView();
417 pView->FitAll();
418
419 Bnd_Box Boite;
420 BRepBndLib::Add(myFace, Boite);
421 Boite.Get(m_Xmin, m_Ymin, m_Zmin, m_Xmax, m_Ymax, m_Zmax);
422
423 m_bIsGridLoaded = TRUE;
424 }
425 SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
426}
427
428
429}
430
431void CAnimationDoc::OnUpdateWalkWalkthru(CCmdUI* pCmdUI)
432{
433 // TODO: Add your command update UI handler code here
576f8b11 434 CString aValue;
435 pCmdUI->SetCheck (aValue.GetEnvironmentVariable (L"CSF_WALKTHROUGH") ? 1 : 0);
7fd59977 436}