ecb0f0b6a72f710ecb448b660339bc1ccaf0322d
[occt.git] / samples / mfc / standard / 09_Animation / src / AnimationDoc.cpp
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
23 static char THIS_FILE[] = __FILE__;
24 #endif
25
26 /////////////////////////////////////////////////////////////////////////////
27 // CAnimationDoc
28
29 IMPLEMENT_DYNCREATE(CAnimationDoc, CDocument)
30
31 BEGIN_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
39 END_MESSAGE_MAP()
40
41 /////////////////////////////////////////////////////////////////////////////
42 // CAnimationDoc construction/destruction
43
44 CAnimationDoc::CAnimationDoc()
45 {
46         // TODO: add one-time construction code here
47
48         Handle(Graphic3d_GraphicDriver) aGraphicDriver = 
49                 ((CAnimationApp*)AfxGetApp())->GetGraphicDriver();
50
51         myViewer = new V3d_Viewer(aGraphicDriver);
52         myViewer->SetDefaultLights();
53         myViewer->SetLightOn();
54
55         myAISContext =new AIS_InteractiveContext(myViewer);
56
57         myDeviation = 0.0008;
58         thread = 4;
59
60         BRep_Builder B;
61         TopoDS_Shape CrankArm;
62         TopoDS_Shape CylinderHead;
63         TopoDS_Shape Propeller;
64         TopoDS_Shape Piston;
65         TopoDS_Shape EngineBlock;
66         
67         /*wchar_t AbloluteExecutableFileName[200];
68         HMODULE hModule = GetModuleHandleW (NULL);
69         GetModuleFileNameW (hModule, AbloluteExecutableFileName, 200);
70   CString aDataDirPath (AbloluteExecutableFileName);
71   int index = aDataDirPath.ReverseFind ('\\');
72   aDataDirPath.Delete (index + 1, aDataDirPath.GetLength() - index - 1);*/
73
74   CString SHAREPATHValue;
75   SHAREPATHValue.GetEnvironmentVariable (L"CSF_OCCTDataPath");
76   CString aDataDirPath = (SHAREPATHValue + "\\occ");
77
78   std::filebuf aFileBuf;
79   std::istream aStream (&aFileBuf);
80   CString aPathCrankArm = aDataDirPath + "\\CrankArm.rle";
81   if (aFileBuf.open (aPathCrankArm, std::ios::in))
82   {
83     BRepTools::Read (CrankArm, aStream, B);
84     aFileBuf.close();
85   }
86
87   CString aPathCylinderHead = aDataDirPath + "\\CylinderHead.rle";
88   if (aFileBuf.open (aPathCylinderHead, std::ios::in))
89   {
90     BRepTools::Read (CylinderHead, aStream, B);
91     aFileBuf.close();
92   }
93
94   CString aPathPropeller = aDataDirPath + "\\Propeller.rle";
95   if (aFileBuf.open (aPathPropeller, std::ios::in))
96   {
97     BRepTools::Read (Propeller, aStream, B);
98     aFileBuf.close();
99   }
100
101   CString aPathPiston = aDataDirPath + "\\Piston.rle";
102   if (aFileBuf.open (aPathPiston, std::ios::in))
103   {
104     BRepTools::Read (Piston, aStream, B);
105     aFileBuf.close();
106   }
107
108   CString aPathEngineBlock = aDataDirPath + "\\EngineBlock.rle";
109   if (aFileBuf.open (aPathEngineBlock, std::ios::in))
110   {
111     BRepTools::Read (EngineBlock, aStream, B);
112     aFileBuf.close();
113   }
114
115         if (CrankArm.IsNull() || CylinderHead.IsNull() || 
116         Propeller.IsNull() || Piston.IsNull() || EngineBlock.IsNull())
117         {
118                 int rep = MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"Shape(s) not found.\nCheck the Data directory path!", L"Error", MB_OK | MB_ICONERROR);
119                 if (rep == IDOK)
120                         exit(0);
121         }
122         myAISContext->SetDeviationCoefficient(myDeviation);
123
124         myAisCylinderHead = new AIS_Shape (CylinderHead);
125         myAISContext->SetColor    (myAisCylinderHead, Quantity_NOC_WHITE, Standard_False);
126         myAISContext->SetMaterial (myAisCylinderHead, Graphic3d_NOM_PLASTIC, Standard_False);
127         myAisEngineBlock  = new AIS_Shape (EngineBlock);
128         myAISContext->SetColor(myAisEngineBlock,   Quantity_NOC_WHITE, Standard_False);
129         myAISContext->SetMaterial(myAisEngineBlock,Graphic3d_NOM_PLASTIC, Standard_False);
130
131         myAISContext->Display(myAisCylinderHead ,1,-1,Standard_False);
132         myAISContext->Display(myAisEngineBlock  ,1,-1,Standard_False);
133
134         myAisCrankArm     = new AIS_Shape (CrankArm);
135         myAISContext->SetColor   (myAisCrankArm, Quantity_NOC_HOTPINK, Standard_False);
136         myAISContext->SetMaterial(myAisCrankArm, Graphic3d_NOM_PLASTIC, Standard_False);
137         myAisPiston       = new AIS_Shape (Piston);
138         myAISContext->SetColor   (myAisPiston  , Quantity_NOC_WHITE, Standard_False);
139         myAISContext->SetMaterial(myAisPiston  , Graphic3d_NOM_PLASTIC, Standard_False);
140         myAisPropeller    = new AIS_Shape (Propeller);
141         myAISContext->SetColor   (myAisPropeller, Quantity_NOC_RED, Standard_False);
142         myAISContext->SetMaterial(myAisPropeller, Graphic3d_NOM_PLASTIC, Standard_False);
143
144         myAISContext->Display(myAisCrankArm,  1,-1,Standard_False);
145         myAISContext->Display(myAisPropeller, 1,-1,Standard_False);
146         myAISContext->Display(myAisPiston,    1,-1,Standard_True);
147
148         m_Xmin = -300. ;
149         m_Ymin = -300. ;
150         m_Zmin = -300. ;
151         m_Xmax = +300. ;
152         m_Ymax = +300. ;
153         m_Zmax = +300. ;
154
155         m_bIsGridLoaded = FALSE;
156 }
157
158 CAnimationDoc::~CAnimationDoc()
159 {
160 }
161
162 /////////////////////////////////////////////////////////////////////////////
163 // CAnimationDoc diagnostics
164
165 #ifdef _DEBUG
166 void CAnimationDoc::AssertValid() const
167 {
168         CDocument::AssertValid();
169 }
170
171 void CAnimationDoc::Dump(CDumpContext& dc) const
172 {
173         CDocument::Dump(dc);
174 }
175 #endif //_DEBUG
176
177 /////////////////////////////////////////////////////////////////////////////
178 // CAnimationDoc commands
179 //-----------------------------------------------------------------------------------------
180 //
181 //-----------------------------------------------------------------------------------------
182
183 //-----------------------------------------------------------------------------------------
184 //
185 //-----------------------------------------------------------------------------------------
186 void  CAnimationDoc::Popup(const Standard_Integer  /*x*/,
187                            const Standard_Integer  /*y*/ ,
188                            const Handle(V3d_View)& /*aView*/)
189 {
190 }
191
192 void CAnimationDoc::OnMyTimer (double theTimeSec) 
193 {
194         // TODO: Add your message handler code here and/or call default
195         
196         Standard_Real angleA;
197         Standard_Real angleB;
198         Standard_Real X;
199         gp_Ax1 Ax1(gp_Pnt(0,0,0),gp_Vec(0,0,1));
200
201         angleA = thread * theTimeSec;
202         X = Sin(angleA)*3/8;
203         angleB = atan(X / Sqrt(-X * X + 1));
204         Standard_Real decal(25*0.6);
205
206         
207         //Build a transformation on the display
208     gp_Trsf aPropellerTrsf;
209     aPropellerTrsf.SetRotation(Ax1,angleA);
210         myAISContext->SetLocation(myAisPropeller,aPropellerTrsf);
211         
212         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));
213     gp_Trsf aCrankArmTrsf;
214     aCrankArmTrsf.SetTransformation(   base.Rotated(gp_Ax1(gp_Pnt(3*decal,0,0),gp_Dir(0,0,1)),angleB));
215         myAISContext->SetLocation(myAisCrankArm,aCrankArmTrsf);
216
217     gp_Trsf aPistonTrsf;
218     aPistonTrsf.SetTranslation(gp_Vec(-3*decal*(1-Cos(angleA))-8*decal*(1-Cos(angleB)),0,0));
219         myAISContext->SetLocation(myAisPiston,aPistonTrsf);
220 }
221
222 void CAnimationDoc::OnShading() 
223 {
224         
225         POSITION position = GetFirstViewPosition();
226         CView* pCurrentView = (CView*)GetNextView(position);
227         ((CAnimationView3D *)pCurrentView)              ->OnStop();
228
229         CShadingDialog aDial(NULL);
230
231         aDial.myvalue=int((myDeviation-0.00003)/0.00003);
232         
233         if (aDial.DoModal()==IDOK) {
234                 Standard_Real dev(aDial.myvalue);
235                 myDeviation = 0.00003+0.00003*dev;
236
237                 myAISContext->SetDeviationCoefficient(myDeviation);
238         TopoDS_Shape Propeller=myAisPropeller->Shape();
239                 BRepTools::Clean(Propeller);
240                 
241         myAisPropeller->Set(Propeller);
242         myAISContext->Deactivate(myAisPropeller);
243         myAISContext->Redisplay (myAisPropeller, Standard_True);
244         }
245         ((CAnimationView3D *)pCurrentView)->OnRestart();
246 }
247
248
249 void CAnimationDoc::OnThread() 
250 {
251         POSITION position = GetFirstViewPosition();
252     CView* pCurrentView = (CView*)GetNextView(position);
253         ((CAnimationView3D *)pCurrentView)              ->OnStop();
254         CThreadDialog aThreadDial(NULL);
255         if (aThreadDial.DoModal()==IDOK) {
256                 thread = aThreadDial.m_Angle;
257         }
258
259         ((CAnimationView3D *)pCurrentView)->OnRestart();
260 }
261
262
263 void CAnimationDoc::OnFileLoadgrid() 
264 {
265         // TODO: Add your command handler code here
266
267   CFileDialog dlg(TRUE,
268                   NULL,
269                   NULL,
270                   OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
271                   L"Points Files (*.pnt;*.pnts)|*.pnt; *.pnts|All Files (*.*)|*.*||",
272                   NULL );
273
274         CString initdir;
275         initdir.GetEnvironmentVariable (L"CSF_OCCTDataPath");
276         initdir += L"\\occ\\";
277
278         dlg.m_ofn.lpstrInitialDir = initdir;
279
280
281   if (dlg.DoModal() == IDOK)
282     {
283       CString C = dlg.GetPathName();
284       SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
285
286       Handle(Geom_BSplineSurface) mySurface;
287
288       if(grid2surf(C,mySurface ))
289         {
290           //To set the minimum value of the surface to Z=0 
291           Standard_Real Tolerance = 0.0;
292           Bnd_Box B;
293       TopoDS_Face myFace;
294           GeomAdaptor_Surface GAS(mySurface);
295
296           
297           BndLib_AddSurface::Add(GAS,Tolerance,B);
298
299           Standard_Real Xmin,Xmax,Ymin,Ymax,Zmin,Zmax;
300           B.Get(Xmin,Ymin,Zmin,Xmax,Ymax,Zmax);
301           TopoDS_Solid Box = BRepPrimAPI_MakeBox(gp_Pnt(Xmin,Ymin,0),Xmax-Xmin,Ymax-Ymin,50).Solid();
302
303           gp_Vec V(gp_Pnt(0,0,Zmin),gp_Pnt(0,0,0));
304           
305           gp_Trsf T;
306           T.SetTranslation(V);
307           mySurface->Transform(T);
308           BRepBuilderAPI_MakeFace aMkFace(mySurface, Precision::Confusion());
309           myFace = aMkFace.Face();
310
311           // Remove all other shapes
312           myAISContext->RemoveAll (Standard_False);
313
314           Handle(AIS_Shape) myAISSurface = new AIS_Shape(myFace);
315
316           myAISContext->Display(myAISSurface, Standard_False);
317           myAISContext->Deactivate(myAISSurface,Standard_False);
318           myAISContext->SetColor (myAISSurface,Quantity_NOC_WHITE,Standard_False);
319           myAISContext->SetMaterial (myAISSurface,Graphic3d_NOM_STONE,Standard_False);
320           myAISContext->SetDisplayMode (myAISSurface,1,Standard_False);
321           myAISContext->SetDeviationCoefficient (0.001);
322         CMDIFrameWnd *pFrame =  (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
323         CMDIChildWnd *pChild =  (CMDIChildWnd *) pFrame->GetActiveFrame();
324         CAnimationView3D *pView = (CAnimationView3D *) pChild->GetActiveView();
325         pView->FitAll();
326
327       Bnd_Box Boite;
328       BRepBndLib::Add(myFace, Boite);
329       Boite.Get(m_Xmin, m_Ymin, m_Zmin, m_Xmax, m_Ymax, m_Zmax);
330           
331           m_bIsGridLoaded = TRUE;
332         }       
333       SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
334 }
335
336
337 }
338
339 void CAnimationDoc::OnUpdateWalkWalkthru(CCmdUI* pCmdUI) 
340 {
341         // TODO: Add your command update UI handler code here
342   CString aValue;
343   pCmdUI->SetCheck (aValue.GetEnvironmentVariable (L"CSF_WALKTHROUGH") ? 1 : 0);
344 }