0029367: Visualization - simplify interface of V3d_View and V3d_Viewer
[occt.git] / samples / mfc / standard / 07_Triangulation / src / TriangulationDoc.cpp
CommitLineData
7fd59977 1// TriangulationDoc.cpp : implementation of the CTriangulationDoc class
2//
3
4#include "stdafx.h"
5
6#include "TriangulationDoc.h"
7
8#include "TriangulationApp.h"
9
10#include "OCCDemo_Presentation.h"
11
12#include <OCC_3dView.h>
13
14#include "..\res\resource.h"
15
16#include <AIS_ListOfInteractive.hxx>
17#include <AIS_ListIteratorOfListOfInteractive.hxx>
18
19/////////////////////////////////////////////////////////////////////////////
20// CTriangulationDoc
21
22IMPLEMENT_DYNCREATE(CTriangulationDoc, CDocument)
23
24BEGIN_MESSAGE_MAP(CTriangulationDoc, OCC_3dBaseDoc)
25 //{{AFX_MSG_MAP(CTriangulationDoc)
26 ON_COMMAND(ID_TRIANGU, OnTriangu)
27 ON_COMMAND(ID_Clear, OnClear)
28 ON_COMMAND(ID_Visu, OnVisu)
29 ON_COMMAND(ID_BUTTONNext, OnBUTTONNext)
30 ON_COMMAND(ID_BUTTONStart, OnBUTTONStart)
31 ON_COMMAND(ID_BUTTONRepeat, OnBUTTONRepeat)
32 ON_COMMAND(ID_BUTTONPrev, OnBUTTONPrev)
33 ON_COMMAND(ID_BUTTONEnd, OnBUTTONEnd)
34 ON_UPDATE_COMMAND_UI(ID_BUTTONNext, OnUpdateBUTTONNext)
35 ON_UPDATE_COMMAND_UI(ID_BUTTONPrev, OnUpdateBUTTONPrev)
36 ON_COMMAND(ID_FILE_NEW, OnFileNew)
37 ON_COMMAND(ID_DUMP_VIEW, OnDumpView)
38 //}}AFX_MSG_MAP
39END_MESSAGE_MAP()
40
41/////////////////////////////////////////////////////////////////////////////
42// CTriangulationDoc construction/destruction
43
44CTriangulationDoc::CTriangulationDoc()
45{
46 myPresentation = OCCDemo_Presentation::Current;
47 myPresentation->SetDocument(this);
48
49 strcpy_s(myDataDir, "Data");
50 strcpy_s(myLastPath, ".");
51}
52
53CTriangulationDoc::~CTriangulationDoc()
54{
55}
56
57/////////////////////////////////////////////////////////////////////////////
58// CTriangulationDoc diagnostics
59
60#ifdef _DEBUG
61void CTriangulationDoc::AssertValid() const
62{
63 CDocument::AssertValid();
64}
65
66void CTriangulationDoc::Dump(CDumpContext& dc) const
67{
68 CDocument::Dump(dc);
69}
70#endif //_DEBUG
71
72void CTriangulationDoc::OnTriangu()
73{
74 AIS_ListOfInteractive aList;
75 myAISContext->DisplayedObjects(aList);
76 AIS_ListIteratorOfListOfInteractive aListIterator;
77 for(aListIterator.Initialize(aList);aListIterator.More();aListIterator.Next()){
0577ae8c 78 myAISContext->Remove (aListIterator.Value(), Standard_False);
7fd59977 79 }
80
81 TopoDS_Shape theBox = BRepPrimAPI_MakeBox(200,60,60);
82 TopoDS_Shape theSphere = BRepPrimAPI_MakeSphere(gp_Pnt(100,20,20),80);
83 TopoDS_Shape ShapeFused = BRepAlgoAPI_Fuse(theSphere,theBox);
9a148b08 84 BRepMesh_IncrementalMesh(ShapeFused,1);
7fd59977 85
86 Handle (AIS_Shape) aSection = new AIS_Shape(ShapeFused);
0577ae8c 87 myAISContext->SetDisplayMode (aSection, 1, Standard_False);
88 myAISContext->SetColor (aSection, Quantity_NOC_RED, Standard_False);
89 myAISContext->SetMaterial (aSection, Graphic3d_NOM_GOLD, Standard_False);
90 myAISContext->Display (aSection, Standard_False);
7fd59977 91
92 Standard_Integer result(0);
93
94 for (TopExp_Explorer ex(ShapeFused,TopAbs_FACE) ; ex.More(); ex.Next()) {
95 TopoDS_Face F =TopoDS::Face(ex.Current());
96 TopLoc_Location L;
97 Handle (Poly_Triangulation) facing = BRep_Tool::Triangulation(F,L);
98 result = result + facing->NbTriangles();
99 }
100 Fit();
101
102 TCollection_AsciiString Message ("\
103 \n\
104TopoDS_Shape theBox = BRepPrimAPI_MakeBox(200,60,60); \n\
105TopoDS_Shape theSphere = BRepPrimAPI_MakeSphere(gp_Pnt(100,20,20),80); \n\
106 \n\
107TopoDS_Shape ShapeFused = BRepBuilderAPI_Fuse(theSphere,theBox); \n\
108 \n\
109BRepMesh::Mesh(ShapeFused,1); \n\
110 \n\
111Standard_Integer result(0); \n\
112 \n\
113for (TopExp_Explorer ex(ShapeFused,TopAbs_FACE) ; ex.More(); ex.Next()) { \n\
114 TopoDS_Face F =TopoDS::Face(ex.Current()); \n\
115 TopLoc_Location L; \n\
116 Handle (Poly_Triangulation) facing = BRep_Tool::Triangulation(F,L); \n\
117 result = result + facing->NbTriangles(); \n\
118} \n\
119\n\
120--- Number of created triangles ---\n");
121 TCollection_AsciiString nombre(result);
122 Message += nombre;
123 Message +=("\
124 \n\
125 \n");
126 PocessTextInDialog("Compute the triangulation on a shape", Message);
127}
128
129void CTriangulationDoc::OnVisu()
130{
131
132 AIS_ListOfInteractive aList;
133 myAISContext->DisplayedObjects(aList);
134 AIS_ListIteratorOfListOfInteractive aListIterator;
135 for(aListIterator.Initialize(aList);aListIterator.More();aListIterator.Next()){
0577ae8c 136 myAISContext->Remove (aListIterator.Value(), Standard_False);
7fd59977 137 }
138
576f8b11 139TopoDS_Shape theBox = BRepPrimAPI_MakeBox(200,60,60).Shape();
140TopoDS_Shape theSphere = BRepPrimAPI_MakeSphere(gp_Pnt(100, 20, 20), 80).Shape();
141TopoDS_Shape ShapeFused = BRepAlgoAPI_Fuse(theSphere, theBox).Shape();
9a148b08 142BRepMesh_IncrementalMesh(ShapeFused,1);
7fd59977 143
144Handle (AIS_Shape) aSection = new AIS_Shape(ShapeFused);
0577ae8c 145myAISContext->SetDisplayMode (aSection, 1, Standard_False);
146myAISContext->SetColor (aSection, Quantity_NOC_RED, Standard_False);
147myAISContext->SetMaterial (aSection, Graphic3d_NOM_GOLD, Standard_False);
148myAISContext->SetTransparency (aSection, 0.1, Standard_False);
149myAISContext->Display (aSection, Standard_False);
7fd59977 150
151BRep_Builder builder;
152TopoDS_Compound Comp;
153builder.MakeCompound(Comp);
154
155for (TopExp_Explorer ex(ShapeFused,TopAbs_FACE) ; ex.More(); ex.Next()) {
156
157 TopoDS_Face F =TopoDS::Face(ex.Current());
158 TopLoc_Location L;
159 Handle (Poly_Triangulation) facing = BRep_Tool::Triangulation(F,L);
160 TColgp_Array1OfPnt tab(1,(facing->NbNodes()));
161 tab = facing->Nodes();
162 Poly_Array1OfTriangle tri(1,facing->NbTriangles());
163 tri = facing->Triangles();
164
165 for (Standard_Integer i=1;i<=(facing->NbTriangles());i++) {
166 Poly_Triangle trian = tri.Value(i);
5c573e69 167 Standard_Integer index1,index2,index3,M = 0, N = 0;
7fd59977 168 trian.Get(index1,index2,index3);
169
170 for (Standard_Integer j=1;j<=3;j++) {
171 switch (j) {
172 case 1 :
173 M = index1;
174 N = index2;
175 break;
176 case 2 :
177 N = index3;
178 break;
179 case 3 :
180 M = index2;
181 }
182
183 BRepBuilderAPI_MakeEdge ME(tab.Value(M),tab.Value(N));
184 if (ME.IsDone()) {
185 builder.Add(Comp,ME.Edge());
186 }
187 }
188 }
189}
190Handle (AIS_Shape) atriangulation = new AIS_Shape(Comp);
0577ae8c 191myAISContext->SetDisplayMode (atriangulation, 0, Standard_False);
192myAISContext->SetColor (atriangulation, Quantity_NOC_WHITE, Standard_False);
193myAISContext->Display (atriangulation, Standard_False);
7fd59977 194
195Fit();
196
197 TCollection_AsciiString Message ("\
198 \n\
199TopoDS_Shape theBox = BRepPrimAPI_MakeBox(200,60,60); \n\
200TopoDS_Shape theSphere = BRepPrimAPI_MakeSphere(gp_Pnt(100,20,20),80); \n\
201TopoDS_Shape ShapeFused = BRepAlgoAPI_Fuse(theSphere,theBox); \n\
202BRepMesh::Mesh(ShapeFused,1); \n\
203 \n\
204BRep_Builder builder; \n\
205TopoDS_Compound Comp; \n\
206builder.MakeCompound(Comp); \n\
207 \n\
208for (TopExp_Explorer ex(ShapeFused,TopAbs_FACE) ; ex.More(); ex.Next()) { \n\
209 \n\
210 TopoDS_Face F =TopoDS::Face(ex.Current()); \n\
211 TopLoc_Location L; \n\
212 Handle (Poly_Triangulation) facing = BRep_Tool::Triangulation(F,L); \n\
213 TColgp_Array1OfPnt tab(1,(facing->NbNodes())); \n\
214 tab = facing->Nodes(); \n\
215 Poly_Array1OfTriangle tri(1,facing->NbTriangles()); \n\
216 tri = facing->Triangles(); \n\
217 \n\
218 for (Standard_Integer i=1;i<=(facing->NbTriangles());i++) { \n\
219 Poly_Triangle trian = tri.Value(i); \n\
220 Standard_Integer index1,index2,index3,M,N; \n\
221 trian.Get(index1,index2,index3); \n\
222 \n\
223 for (Standard_Integer j=1;j<=3;j++) { \n\
224 switch (j) { \n\
225 case 1 : \n\
226 M = index1; \n\
227 N = index2; \n\
228 break; \n\
229 case 2 : \n\
230 N = index3; \n\
231 break; \n\
232 case 3 : \n\
233 M = index2; \n\
234 } \n\
235 \n\
236 BRepBuilderAPI_MakeEdge ME(tab.Value(M),tab.Value(N)); \n\
237 if (ME.IsDone()) { \n\
238 builder.Add(Comp,ME.Edge()); \n\
239 } \n\
240 } \n\
241 } \n\
242} \n\
243 \n\
244Warning : The visualisation of the mesh is not optimised.\n\
245The shared edges between triangles are dispayed twice.\n\
246The purpose here is only to show how to decode the data structure of triangulation.\n\
247 \n");
248 PocessTextInDialog("Visualize the triangulation on a shape", Message);
249
250}
251
252
253
254
255void CTriangulationDoc::OnClear()
256{
257 AIS_ListOfInteractive aList;
258 myAISContext->DisplayedObjects(aList);
259 AIS_ListIteratorOfListOfInteractive aListIterator;
260 for(aListIterator.Initialize(aList);aListIterator.More();aListIterator.Next()){
0577ae8c 261 myAISContext->Remove (aListIterator.Value(), Standard_False);
7fd59977 262 }
263
576f8b11 264TopoDS_Shape theBox = BRepPrimAPI_MakeBox(200, 60, 60).Shape();
265TopoDS_Shape theSphere = BRepPrimAPI_MakeSphere(gp_Pnt(100, 20, 20), 80).Shape();
7fd59977 266TopoDS_Shape ShapeFused = BRepAlgoAPI_Fuse(theSphere,theBox);
9a148b08 267BRepMesh_IncrementalMesh(ShapeFused,1);
7fd59977 268
269
270Handle (AIS_Shape) aSection = new AIS_Shape(ShapeFused);
0577ae8c 271myAISContext->SetDisplayMode (aSection, 1, Standard_False);
272myAISContext->SetColor (aSection, Quantity_NOC_RED, Standard_False);
273myAISContext->SetMaterial (aSection, Graphic3d_NOM_GOLD, Standard_False);
274myAISContext->Display (aSection, Standard_False);
7fd59977 275
276BRepTools::Clean(ShapeFused);
277
278TCollection_AsciiString test;
279if (!BRepTools::Triangulation(ShapeFused,1)) {
280 test = ("In fact the triangulation has been removed\n");
281}
282
283Fit();
284 TCollection_AsciiString Message ("\
285 \n\
286TopoDS_Shape theBox = BRepPrimAPI_MakeBox(200,60,60); \n\
287TopoDS_Shape theSphere = BRepPrimAPI_MakeSphere(gp_Pnt(100,20,20),80); \n\
288TopoDS_Shape ShapeFused = BRepAlgoAPI_Fuse(theSphere,theBox); \n\
289BRepMesh::Mesh(ShapeFused,1); \n\
290 \n\
291BRepTools::Clean(ShapeFused); \n\
292 \n\
293if (!BRepTools::Triangulation(ShapeFused,1)) { \n\
294 TCollection_AsciiString test(<In fact the triangulation has been removed>); \n\
295} \n\
296 \n\
297 --- Result ---\n");
298
299 Message += test;
300 Message +=("\
301 \n\
302 \n");
303
304 PocessTextInDialog("Remove the triangulation", Message);
305
306}
307
308/*******************************************************************************
309********************* T E S S E L A T E **************************************
310*******************************************************************************/
311
312void CTriangulationDoc::Start()
313{
314 myPresentation->Init();
315 OnBUTTONStart();
316}
317
318void CTriangulationDoc::OnFileNew()
319{
320 OnNewDocument();
321 Start();
322}
323
324void CTriangulationDoc::InitViewButtons()
325{
5c573e69 326 //POSITION pos = GetFirstViewPosition();
7fd59977 327/* LLS
328 while (pos != NULL)
329 {
330 COCCDemoView* pView = (COCCDemoView*) GetNextView(pos);
331 pView->InitButtons();
332 }
333*/
334}
335
336void CTriangulationDoc::DoSample()
337{
338 InitViewButtons();
339
340 HCURSOR hOldCursor = ::GetCursor();
341 HCURSOR hNewCursor = AfxGetApp()->LoadStandardCursor(IDC_APPSTARTING);
342
343 SetCursor(hNewCursor);
344 {
345 try
346 {
347 myPresentation->DoSample();
348 }
9775fa61 349 catch (Standard_Failure const& anException)
7fd59977 350 {
351 Standard_SStream aSStream;
04232180 352 aSStream << "An exception was caught: " << anException << std::ends;
576f8b11 353 CString aMsg = aSStream.str().c_str();
7fd59977 354// aSStream.rdbuf()->freeze(0); // allow deletion of dynamic array
355 AfxMessageBox (aMsg);
356 }
357 }
358 SetCursor(hOldCursor);
359}
360
361void CTriangulationDoc::OnBUTTONStart()
362{
0577ae8c 363 myAISContext->EraseAll (Standard_True);
7fd59977 364 myPresentation->FirstSample();
365 DoSample();
366}
367
368void CTriangulationDoc::OnBUTTONEnd()
369{
0577ae8c 370 myAISContext->EraseAll (Standard_True);
7fd59977 371 myPresentation->LastSample();
372 DoSample();
373}
374
375void CTriangulationDoc::OnBUTTONRepeat()
376{
377 DoSample();
378}
379
380void CTriangulationDoc::OnBUTTONNext()
381{
382 if (!myPresentation->AtLastSample())
383 {
384 myPresentation->NextSample();
385 DoSample();
386 }
387}
388
389void CTriangulationDoc::OnBUTTONPrev()
390{
391 if (!myPresentation->AtFirstSample())
392 {
393 myPresentation->PrevSample();
394 DoSample();
395 }
396}
397
398void CTriangulationDoc::OnUpdateBUTTONNext(CCmdUI* pCmdUI)
399{
400 pCmdUI->Enable (!myPresentation->AtLastSample());
401}
402
403void CTriangulationDoc::OnUpdateBUTTONPrev(CCmdUI* pCmdUI)
404{
405 pCmdUI->Enable (!myPresentation->AtFirstSample());
406}
407
12c76bee 408void CTriangulationDoc::OnDumpView()
7fd59977 409{
5c1f974e 410 for (POSITION aPos = GetFirstViewPosition(); aPos != NULL;)
411 {
412 OCC_3dView* pView = (OCC_3dView* )GetNextView (aPos);
413 pView->UpdateWindow();
7fd59977 414 }
12c76bee 415
f7fc0c03 416 Handle(V3d_View) aView = myViewer->ActiveViews().First();
12c76bee 417 ExportView (aView);
7fd59977 418}
419
420void CTriangulationDoc::Fit()
421{
422 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
423 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();
424 OCC_3dView *pView = (OCC_3dView*)pChild->GetActiveView();
425 pView->FitAll();
576f8b11 426}