1 // OcafDoc.cpp : implementation of the COcafDoc class
2 //
3 
4 #include "StdAfx.h"
5 
6 #include "OcafDoc.h"
7 
8 #include "OcafApp.h"
9 #include <ImportExport/ImportExport.h>
10 #include "AISDialogs.h"
11 
12 // Dialog boxes classes
13 #include <ResultDialog.h>
14 #include <NewBoxDlg.h>
15 #include <NewCylDlg.h>
16 
17 #include <TDF_Tool.hxx>
18 
19 #include <DebugBrowser.hxx>
20 
21 #ifdef _DEBUG
22 //#define new DEBUG_NEW  // by cascade
23 #undef THIS_FILE
24 static char THIS_FILE[] = __FILE__;
25 #endif
26 
27 /////////////////////////////////////////////////////////////////////////////
28 // COcafDoc
29 
IMPLEMENT_DYNCREATE(COcafDoc,CDocument)30 IMPLEMENT_DYNCREATE(COcafDoc, CDocument)
31 
32 BEGIN_MESSAGE_MAP(COcafDoc, OCC_3dBaseDoc)
33 	//{{AFX_MSG_MAP(COcafDoc)
34 	ON_COMMAND(ID_CREATEBOX, OnCreatebox)
35 	ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
36 	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
37 	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
38 	ON_COMMAND(ID_MODIFY, OnModify)
39 	ON_UPDATE_COMMAND_UI(ID_MODIFY, OnUpdateModify)
40 	ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
41 	ON_COMMAND(ID_CUT, OnCut)
42 	ON_COMMAND(ID_OBJECT_DELETE, OnObjectDelete)
43 	ON_UPDATE_COMMAND_UI(ID_OBJECT_DELETE, OnUpdateObjectDelete)
44 	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
45 	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
46 	ON_COMMAND(ID_CREATECYL, OnCreatecyl)
47 //	ON_COMMAND(ID_DFBR, OnDfbr)
48 	//}}AFX_MSG_MAP
49 
50 END_MESSAGE_MAP()
51 
52 /////////////////////////////////////////////////////////////////////////////
53 // COcafDoc construction/destruction
54 
55 COcafDoc::COcafDoc()
56 {
57 }
58 
~COcafDoc()59 COcafDoc::~COcafDoc()
60 {
61 }
62 
OnNewDocument()63  BOOL COcafDoc::OnNewDocument()
64  {
65  	if (!CDocument::OnNewDocument())
66  		return FALSE;
67 
68  	// Get an Handle on the current TOcaf_Application (which is initialized in the "Ocaf.h" file)
69  	Handle(TOcaf_Application) OcafApp = ((COcafApp*)AfxGetApp())->GetApp();
70 
71  	// Create a new Ocaf document
72  	OcafApp->NewDocument("BinOcaf",myOcafDoc);
73  	TPrsStd_AISViewer::New(myOcafDoc->Main(),myViewer);
74 
75  	Handle(AIS_InteractiveContext) CTX;
76  	TPrsStd_AISViewer::Find(myOcafDoc->Main(), CTX);
77  	CTX->SetDisplayMode (AIS_Shaded, Standard_True);
78  	myAISContext=CTX;
79 
80  	// Set the maximum number of available "undo" actions
81  	myOcafDoc->SetUndoLimit(10);
82 
83 
84  		TCollection_AsciiString Message ("\
85  //  Creation of a new document \n\
86   \n\
87  Handle(TOcaf_Application) OcafApp= ((COcafApp*)AfxGetApp())->GetApp(); \n\
88   \n\
89  //  Creating the new document \n\
90  OcafApp->NewDocument(\"BinOcaf\", myOcafDoc); \n\
91   \n\
92  //  Creation of a new TPrsStd_AISViewer connected to the current V3d_Viewer\n\
93  TPrsStd_AISViewer::New(myOcafDoc->Main(),myViewer); \n\
94   \n\
95  //  Setting the number of memorized undos \n\
96  myOcafDoc->SetUndoLimit(10); \n\
97  \n");
98 
99   myCResultDialog.SetTitle("New document");
100  	CString text(Message.ToCString());
101  	myCResultDialog.SetText(text);
102 
103  	PathName="";
104 
105  	return TRUE;
106  }
107 
ActivateFrame(CRuntimeClass * pViewClass,int nCmdShow)108 void COcafDoc::ActivateFrame(CRuntimeClass* pViewClass,int nCmdShow)
109 {
110   POSITION position = GetFirstViewPosition();
111   while (position != (POSITION)NULL)
112   {
113     CView* pCurrentView = (CView*)GetNextView(position);
114      if(pCurrentView->IsKindOf(pViewClass) )
115     {
116         ASSERT_VALID(pCurrentView);
117         CFrameWnd* pParentFrm = pCurrentView->GetParentFrame();
118 	    ASSERT(pParentFrm != (CFrameWnd *)NULL);
119         // simply make the frame window visible
120 	    pParentFrm->ActivateFrame(nCmdShow);
121     }
122   }
123 
124 }
125 
126 /////////////////////////////////////////////////////////////////////////////
127 // COcafDoc diagnostics
128 
129 #ifdef _DEBUG
AssertValid() const130 void COcafDoc::AssertValid() const
131 {
132 	CDocument::AssertValid();
133 }
134 
Dump(CDumpContext & dc) const135 void COcafDoc::Dump(CDumpContext& dc) const
136 {
137 	CDocument::Dump(dc);
138 }
139 #endif //_DEBUG
140 
141 /////////////////////////////////////////////////////////////////////////////
142 // COcafDoc commands
143 
OnEditRedo()144 void COcafDoc::OnEditRedo()
145 {
146 	myOcafDoc->Redo();
147 	myOcafDoc->CommitCommand();
148 	myAISContext->UpdateCurrentViewer();
149 
150 	UpdateAllViews(NULL);
151 
152 	TCollection_AsciiString Message = TCollection_AsciiString("\
153 //  Redo last undoes operation \n\
154  \n\
155 myOcafDoc->Redo(); \n\
156  \n\
157 myOcafDoc->CommitCommand(); \n\
158  \n\
159 \n");
160 
161 	myCResultDialog.SetTitle("Redo");
162 	CString text(Message.ToCString());
163 	myCResultDialog.SetText(text);
164 }
165 
OnEditUndo()166 void COcafDoc::OnEditUndo()
167 {
168 	myOcafDoc->Undo();
169 	myOcafDoc->CommitCommand();
170 	myAISContext->UpdateCurrentViewer();
171 
172 	UpdateAllViews(NULL);
173 
174 	TCollection_AsciiString Message = TCollection_AsciiString("\
175 //  Undo last operation \n\
176  \n\
177 myOcafDoc->Undo(); \n\
178  \n\
179 myOcafDoc->CommitCommand(); \n\
180  \n\
181 \n");
182 
183 	myCResultDialog.SetTitle("Undo");
184 	CString text(Message.ToCString());
185 	myCResultDialog.SetText(text);
186 }
187 
OnUpdateEditRedo(CCmdUI * pCmdUI)188 void COcafDoc::OnUpdateEditRedo(CCmdUI* pCmdUI)
189 {
190 	// Disable the "redo" button if there is no availlables redo actions
191 	if (myOcafDoc->GetAvailableRedos()>0) pCmdUI->Enable(Standard_True);
192 	else pCmdUI->Enable(Standard_False);
193 }
194 
OnUpdateEditUndo(CCmdUI * pCmdUI)195 void COcafDoc::OnUpdateEditUndo(CCmdUI* pCmdUI)
196 {
197 	// Disable the "undo" button if there is no availlables undo actions
198 	if (myOcafDoc->GetAvailableUndos()>0) pCmdUI->Enable(Standard_True);
199 	else pCmdUI->Enable(Standard_False);
200 }
201 
OnCreatebox()202 void COcafDoc::OnCreatebox()
203 {
204 	EraseAll();
205 	CNewBoxDlg Dlg;
206 	if(Dlg.DoModal()!=IDOK) return;
207 
208 	Handle(TDocStd_Document) D = GetOcafDoc();
209 
210 	// Open a new command (for undo)
211 	D->NewCommand();
212 	TOcaf_Commands TSC(D->Main());
213 
214 	// Create a new box using the CNewBoxDlg Dialog parameters as attributes
215   TDF_Label L = TSC.CreateBox (Dlg.m_x, Dlg.m_y, Dlg.m_z, Dlg.m_w, Dlg.m_l, Dlg.m_h,
216                                TCollection_ExtendedString ((const wchar_t* )Dlg.m_Name));
217 
218 	// Get the TPrsStd_AISPresentation of the new box TNaming_NamedShape
219 	Handle(TPrsStd_AISPresentation) prs= TPrsStd_AISPresentation::Set(L, TNaming_NamedShape::GetID());
220 	// Display it
221 	prs->Display(1);
222 	Fit3DViews();
223 	// Attach an integer attribute to L to memorize it's displayed
224 	TDataStd_Integer::Set(L, 1);
225 	myAISContext->UpdateCurrentViewer();
226 
227 	// Close the command (for undo)
228 	D->CommitCommand();
229 
230 
231 		TCollection_AsciiString Message ("\
232 //  Creation of a new box using Ocaf attributes \n\
233  \n\
234 Handle(TDocStd_Document) D = GetOcafDoc(); \n\
235  \n\
236 //  Opening a new command (for undo/redo) \n\
237 D->NewCommand(); \n\
238  \n\
239 TOcaf_Commands TSC(D->Main()); \n\
240 // Look at the TOcaf_Commands::CreateBox() function \n\
241 TDF_Label L=TSC.CreateBox(m_x, m_y, m_z, m_w, m_l, m_h, Name); \n\
242  \n\
243 // Set the TPrsStd_AISPresentation of the box \n\
244 Handle(TPrsStd_AISPresentation) prs; \n\
245 prs= TPrsStd_AISPresentation::Set(L, TNaming_NamedShape::GetID()); \n\
246  \n\
247 //  Displaying the box \n\
248 prs->Display(1); \n\
249  \n\
250 //  Commint the command (for undo/redo) \n\
251 D->CommitCommand(); \n\
252 \n");
253 
254 	myCResultDialog.SetTitle("Create box");
255 	CString text(Message.ToCString());
256 	myCResultDialog.SetText(text);
257 }
258 
OnCreatecyl()259 void COcafDoc::OnCreatecyl()
260 {
261 	EraseAll();
262 	CNewCylDlg Dlg;
263 	if(Dlg.DoModal()!=IDOK) return;
264 
265 	Handle(TDocStd_Document) D = GetOcafDoc();
266 
267 	// Open a new command (for undo)
268 	D->NewCommand();
269 	TOcaf_Commands TSC(D->Main());
270 
271 	// Create a new box using the CNewCylDlg Dialog parameters as attributes
272   TDF_Label L = TSC.CreateCyl (Dlg.m_x, Dlg.m_y, Dlg.m_z, Dlg.m_r, Dlg.m_h,
273                                TCollection_ExtendedString ((const wchar_t* )Dlg.m_Name));
274 
275 	// Get the TPrsStd_AISPresentation of the new cylinder TNaming_NamedShape
276 	Handle(TPrsStd_AISPresentation) prs= TPrsStd_AISPresentation::Set(L, TNaming_NamedShape::GetID());
277 	// Display it
278 	prs->Display(1);
279 	Fit3DViews();
280 	// Attach an integer attribute to L to memorize it's displayed
281 	TDataStd_Integer::Set(L, 1);
282 	myAISContext->UpdateCurrentViewer();
283 
284 	// Close the command (for undo)
285 	D->CommitCommand();
286 
287 
288 		TCollection_AsciiString Message ("\
289 //  Creation of a new cylinder using Ocaf attributes \n\
290  \n\
291 Handle(TDocStd_Document) D = GetOcafDoc(); \n\
292  \n\
293 //  Opening a new command (for undo/redo) \n\
294 D->NewCommand(); \n\
295  \n\
296 TOcaf_Commands TSC(D->Main()); \n\
297 // Look at the TOcaf_Commands::CreateCyl() function \n\
298 TDF_Label L=TSC.CreateCyl(m_x, m_y, m_z, m_r, m_h, Name); \n\
299  \n\
300 // Set the TPrsStd_AISPresentation of the cylinder \n\
301 Handle(TPrsStd_AISPresentation) prs; \n\
302 prs= TPrsStd_AISPresentation::Set(L, TNaming_NamedShape::GetID()); \n\
303  \n\
304 //  Displaying the cylinder \n\
305 prs->Display(1); \n\
306  \n\
307 //  Commint the command (for undo/redo) \n\
308 D->CommitCommand(); \n\
309 \n");
310 
311 	myCResultDialog.SetTitle("Create cylinder");
312 	CString text(Message.ToCString());
313 	myCResultDialog.SetText(text);
314 }
315 
OnModify()316 void COcafDoc::OnModify()
317 {
318 	// Get the selected interactive object
319 	myAISContext->InitSelected();
320 	Handle(AIS_InteractiveObject) curAISObject = myAISContext->SelectedInteractive();
321 
322 
323 	// Get the main label of the selected object
324 	Handle(TPrsStd_AISPresentation) ObjectPrs =
325 		Handle(TPrsStd_AISPresentation)::DownCast(curAISObject->GetOwner());
326 	TDF_Label LabObject = ObjectPrs->Label();
327 
328 	// Get the TFunction_Function attribute of the selected object
329 	Handle(TFunction_Function) TFF;
330 	if ( !LabObject.FindAttribute(TFunction_Function::GetID(),TFF) )
331 	{
332 		MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"Object cannot be modify.", L"Modification", MB_ICONEXCLAMATION);
333 		return;
334 	}
335 	// Get the Standard_GUID of the TFunction_FunctionDriver of the selected object TFunction_Function attribute
336 	Standard_GUID myDriverID=TFF->GetDriverGUID();
337 
338 	Handle(TDocStd_Document) D = GetOcafDoc();
339 	Handle(TFunction_Logbook) log = TFunction_Logbook::Set(D->Main());
340 
341 	TCollection_AsciiString Message("\
342 //  Modification and recomputation of the selected object \n\
343  \n\
344 Handle(TDocStd_Document) D = GetOcafDoc(); \n\
345  \n\
346 //  Getting the TPrsStd_AISPresentation of the selected object \n\
347 Handle(TPrsStd_AISPresentation) ObjectPrs =  \n\
348 	Handle(TPrsStd_AISPresentation)::DownCast(curAISObject->GetOwner()); \n\
349  \n\
350 //  Getting the Label of the selected object using the TPrsStd_AISPresentation \n\
351 TDF_Label LabObject = ObjectPrs->Label(); \n\
352  \n\
353 //  Getting the TFunction_FunctionDriver ID attached to this label \n\
354 Handle(TFunction_Function) TFF; \n\
355 \n");
356 	TCollection_AsciiString Suite;
357 
358 	// Case of a box created with the box function driver
359 	if(myDriverID==TOcafFunction_BoxDriver::GetID())
360 	{
361 		CNewBoxDlg Dlg;
362 		Standard_Real x, y, z, w, l, h;
363 
364 		// Get the attributes values of the current box
365 		Handle(TDataStd_Real) curReal;
366 		LabObject.FindChild(1).FindAttribute(TDataStd_Real::GetID(),curReal);
367 		w=curReal->Get();
368 		LabObject.FindChild(2).FindAttribute(TDataStd_Real::GetID(),curReal);
369 		l=curReal->Get();
370 		LabObject.FindChild(3).FindAttribute(TDataStd_Real::GetID(),curReal);
371 		h=curReal->Get();
372 		LabObject.FindChild(4).FindAttribute(TDataStd_Real::GetID(),curReal);
373 		x=curReal->Get();
374 		LabObject.FindChild(5).FindAttribute(TDataStd_Real::GetID(),curReal);
375 		y=curReal->Get();
376 		LabObject.FindChild(6).FindAttribute(TDataStd_Real::GetID(),curReal);
377 		z=curReal->Get();
378 		Handle(TDataStd_Name) stdName;
379 		LabObject.FindAttribute(TDataStd_Name::GetID(),stdName);
380 
381 		// Initialize the dialog box with the values of the current box
382 		Dlg.InitFields(x, y, z, w, l, h, stdName->Get());
383 
384 		if(Dlg.DoModal()!=IDOK) return;
385 
386 		// Open a new command (for undo)
387 		D->NewCommand();
388 
389 		// Modify the box
390 		TOcaf_Commands TSC(LabObject);
391 		TSC.ModifyBox (Dlg.m_x, Dlg.m_y, Dlg.m_z, Dlg.m_w, Dlg.m_l, Dlg.m_h,
392                    TCollection_ExtendedString ((const wchar_t* )Dlg.m_Name), log);
393 
394 		// Get the presentation of the box, display it and set it selected
395 		Handle(TPrsStd_AISPresentation) prs= TPrsStd_AISPresentation::Set(LabObject, TNaming_NamedShape::GetID());
396 		TDataStd_Integer::Set(LabObject, 1);
397 		prs->Display(1);
398 		myAISContext->UpdateCurrentViewer();
399 		// Close the command (for undo)
400 		D->CommitCommand();
401 
402 		Message+=("\
403  \n\
404 //  In this case the TFunction_FunctionDriver ID is a BoxDriver \n\
405 if(myDriverID==TOcafFunction_BoxDriver::GetID()){ \n\
406  \n\
407 //  Getting values of box attributes \n\
408 Handle(TDataStd_Real) curReal; \n\
409 LabObject.FindChild(1).FindAttribute(TDataStd_Real::GetID(),curReal); \n\
410 w=curReal->Get(); \n\
411 LabObject.FindChild(2).FindAttribute(TDataStd_Real::GetID(),curReal); \n\
412 l=curReal->Get(); \n\
413 LabObject.FindChild(3).FindAttribute(TDataStd_Real::GetID(),curReal); \n\
414 h=curReal->Get(); \n\
415 LabObject.FindChild(4).FindAttribute(TDataStd_Real::GetID(),curReal); \n\
416 x=curReal->Get(); \n\
417 LabObject.FindChild(5).FindAttribute(TDataStd_Real::GetID(),curReal); \n\
418 y=curReal->Get(); \n\
419 LabObject.FindChild(6).FindAttribute(TDataStd_Real::GetID(),curReal); \n\
420 z=curReal->Get(); \n\
421 Handle(TDataStd_Name) stdName; \n\
422 LabObject.FindAttribute(TDataStd_Name::GetID(),stdName); \n\
423  \n\
424 //  Opening a new command \n\
425 D->NewCommand(); \n\
426  \n\
427 TOcaf_Commands TSC(LabObject); \n\
428 // Look at the TOcaf_Commands::ModifyBox() function \n\
429 TSC.ModifyBox(m_x, m_y, m_z, m_w, m_l, m_h, Name); \n\
430  \n\
431 // Set the TPrsStd_AISPresentation of the box \n\
432 Handle(TPrsStd_AISPresentation) prs; \n\
433 prs= TPrsStd_AISPresentation::Set(LabObject, TNaming_NamedShape::GetID()); \n\
434  \n\
435 // Display the box \n\
436 prs->Display(1); \n\
437  \n\
438 // Commit the command \n\
439 D->CommitCommand(); \n\
440 } \n\
441 \n");
442 
443 		myCResultDialog.SetTitle("Modify Box");
444 	}
445 	// Case of a cylinder created with the box function driver
446 	else if(myDriverID==TOcafFunction_CylDriver::GetID())
447 	{
448 		CNewCylDlg Dlg;
449 		Standard_Real x, y, z, r, h;
450 
451 		// Get the attributes values of the current box
452 		Handle(TDataStd_Real) curReal;
453 		LabObject.FindChild(1).FindAttribute(TDataStd_Real::GetID(),curReal);
454 		r=curReal->Get();
455 		LabObject.FindChild(2).FindAttribute(TDataStd_Real::GetID(),curReal);
456 		h=curReal->Get();
457 		LabObject.FindChild(3).FindAttribute(TDataStd_Real::GetID(),curReal);
458 		x=curReal->Get();
459 		LabObject.FindChild(4).FindAttribute(TDataStd_Real::GetID(),curReal);
460 		y=curReal->Get();
461 		LabObject.FindChild(5).FindAttribute(TDataStd_Real::GetID(),curReal);
462 		z=curReal->Get();
463 		Handle(TDataStd_Name) stdName;
464 		LabObject.FindAttribute(TDataStd_Name::GetID(),stdName);
465 
466 		// Initialize the dialog cylinder with the values of the current cylinder
467 		Dlg.InitFields(x, y, z, r, h, stdName->Get());
468 
469 		if(Dlg.DoModal()!=IDOK) return;
470 
471 		// Open a new command (for undo)
472 		D->NewCommand();
473 
474 		// Modify the cylinder
475 		TOcaf_Commands TSC(LabObject);
476 		TSC.ModifyCyl (Dlg.m_x, Dlg.m_y, Dlg.m_z, Dlg.m_r, Dlg.m_h,
477                    TCollection_ExtendedString ((const wchar_t* )Dlg.m_Name), log);
478 
479 		// Get the presentation of the cylinder, display it and set it selected
480 		Handle(TPrsStd_AISPresentation) prs= TPrsStd_AISPresentation::Set(LabObject, TNaming_NamedShape::GetID());
481 		TDataStd_Integer::Set(LabObject, 1);
482 		prs->Display(1);
483 		myAISContext->UpdateCurrentViewer();
484 		// Close the command (for undo)
485 		D->CommitCommand();
486 
487 		Message+=("\
488  \n\
489 //  In this case the TFunction_FunctionDriver ID is a CylDriver \n\
490 if(myDriverID==TOcafFunction_CylDriver::GetID()){ \n\
491  \n\
492 //  Getting values of box cylinder \n\
493 Handle(TDataStd_Real) curReal; \n\
494 LabObject.FindChild(1).FindAttribute(TDataStd_Real::GetID(),curReal); \n\
495 r=curReal->Get(); \n\
496 LabObject.FindChild(2).FindAttribute(TDataStd_Real::GetID(),curReal); \n\
497 h=curReal->Get(); \n\
498 LabObject.FindChild(3).FindAttribute(TDataStd_Real::GetID(),curReal); \n\
499 x=curReal->Get(); \n\
500 LabObject.FindChild(4).FindAttribute(TDataStd_Real::GetID(),curReal); \n\
501 y=curReal->Get(); \n\
502 LabObject.FindChild(5).FindAttribute(TDataStd_Real::GetID(),curReal); \n\
503 z=curReal->Get(); \n\
504 Handle(TDataStd_Name) stdName; \n\
505 LabObject.FindAttribute(TDataStd_Name::GetID(),stdName); \n\
506  \n\
507 //  Opening a new command \n\
508 D->NewCommand(); \n\
509  \n\
510 TOcaf_Commands TSC(LabObject); \n\
511 // Look at the TOcaf_Commands::ModifyCyl() function \n\
512 TSC.ModifyCyl(m_x, m_y, m_z, m_r, m_h, Name); \n\
513  \n\
514 // Set the TPrsStd_AISPresentation of the cylinder \n\
515 Handle(TPrsStd_AISPresentation) prs; \n\
516 prs= TPrsStd_AISPresentation::Set(LabObject, TNaming_NamedShape::GetID()); \n\
517  \n\
518 // Display the cylinder \n\
519 prs->Display(1); \n\
520  \n\
521 // Commit the command \n\
522 D->CommitCommand(); \n\
523 } \n\
524 \n");
525 
526 		myCResultDialog.SetTitle("Modify cylinder");
527 	}
528 	// Case of a cut solid created with the cut function driver
529 	else if(myDriverID==TOcafFunction_CutDriver::GetID())
530 	{
531 		// Open a new command (for undo)
532 		D->NewCommand();
533 
534 		// Get the reference of the Original object used to make the cut object,
535 		// this reference is here attached to the first child of the cut object label
536 		Handle(TDF_Reference) OriginalRef;
537 		LabObject.FindChild(1).FindAttribute(TDF_Reference::GetID(),OriginalRef);
538 
539 		// Get the presentation of the Original object
540 		Handle(TPrsStd_AISPresentation) OriginalPrs= TPrsStd_AISPresentation::Set(OriginalRef->Get(), TNaming_NamedShape::GetID());
541 
542 		// Get the reference of the Tool object used to make the cut object,
543 		// this reference is here attached to the second child of the cut object label
544 		Handle(TDF_Reference) ToolRef;
545 		LabObject.FindChild(2).FindAttribute(TDF_Reference::GetID(),ToolRef);
546 		TDF_Label ToolLab=ToolRef->Get();
547 
548 
549 		// Get the presentation of the Tool object
550 		Handle(TPrsStd_AISPresentation) ToolPrs= TPrsStd_AISPresentation::Set(ToolLab, TNaming_NamedShape::GetID());
551 
552 		// Display the Original object and the Tool object, erase the cut object.
553 		TDataStd_Integer::Set(OriginalRef->Get(), 1);
554 		OriginalPrs->Display(1);
555 		TDataStd_Integer::Set(ToolLab, 1);
556 		ToolPrs->Display(1);
557 		TDataStd_Integer::Set(LabObject, 0);
558 		ObjectPrs->Erase(1);
559 		myAISContext->UpdateCurrentViewer();
560 
561 		// In this  we decided to modify the tool object which is a cylinder,
562 		// so we open the cylinder parameters dialog box
563 		CNewCylDlg Dlg;
564 		Standard_Real x, y, z, h, r;
565 
566 		// Get the attributes values of the tool cylinder
567 		Handle(TDataStd_Real) curReal;
568 		ToolLab.FindChild(1).FindAttribute(TDataStd_Real::GetID(),curReal);
569 		r=curReal->Get();
570 		ToolLab.FindChild(2).FindAttribute(TDataStd_Real::GetID(),curReal);
571 		h=curReal->Get();
572 		ToolLab.FindChild(3).FindAttribute(TDataStd_Real::GetID(),curReal);
573 		x=curReal->Get();
574 		ToolLab.FindChild(4).FindAttribute(TDataStd_Real::GetID(),curReal);
575 		y=curReal->Get();
576 		ToolLab.FindChild(5).FindAttribute(TDataStd_Real::GetID(),curReal);
577 		z=curReal->Get();
578 		Handle(TDataStd_Name) stdName;
579 		ToolLab.FindAttribute(TDataStd_Name::GetID(),stdName);
580 
581 		// Initialize the dialog box with the values of the tool cylinder
582 		Dlg.InitFields(x, y, z, r, h, stdName->Get());
583 
584 		if(Dlg.DoModal()!=IDOK)
585 		{
586 			D->AbortCommand();
587 			myAISContext->UpdateCurrentViewer();
588 			return;
589 		}
590 
591 		// Modify the cylinder
592 		TOcaf_Commands ToolTSC(ToolLab);
593 		ToolTSC.ModifyCyl (Dlg.m_x, Dlg.m_y, Dlg.m_z, Dlg.m_r, Dlg.m_h,
594                        TCollection_ExtendedString ((const wchar_t* )Dlg.m_Name), log);
595 
596 		// Redisplay the modified Tool object
597 		TDataStd_Integer::Set(ToolLab, 1);
598 		ToolPrs->Display(1);
599 		myAISContext->UpdateCurrentViewer();
600 		Sleep(1000);
601 
602 		// Get the TOcafFunction_CutDriver using its Standard_GUID in the TFunction_DriverTable
603 		Handle(TFunction_Driver) myCutDriver;
604 		if (TFunction_DriverTable::Get()->FindDriver(myDriverID, myCutDriver))
605             myCutDriver->Init(LabObject);
606 
607 		// Recompute the cut object if it must be (look at the MustExecute function code)
608 //		if (myCutDriver->MustExecute(log))
609 //		{
610 			log->SetTouched(LabObject);
611 			if(myCutDriver->Execute(log))
612 				MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"Recompute failed", L"Modify cut", MB_ICONEXCLAMATION);
613 //		}
614 
615 		// Erase the Original object and the Tool objectedisplay the modified Tool object
616 		TDataStd_Integer::Set(ToolLab, 0);
617 		ToolPrs->Erase(0);
618 		TDataStd_Integer::Set(OriginalRef->Get(), 0);
619 		OriginalPrs->Erase(0);
620 		ObjectPrs=TPrsStd_AISPresentation::Set(LabObject, TNaming_NamedShape::GetID());
621 		TDataStd_Integer::Set(LabObject, 1);
622 		ObjectPrs->Display(1);
623 		myAISContext->UpdateCurrentViewer();
624 		// Close the command (for undo)
625 		D->CommitCommand();
626 
627 		Message+=("\
628  \n\
629 //  In this case the TFunction_FunctionDriver ID is a CutDriver \n\
630 if(myDriverID==TOcafFunction_CutDriver::GetID()){ \n\
631  \n\
632 //  Getting values of cut attributes (which are reference to the shapes)\n\
633 Handle(TDF_Reference) OriginalRef; \n\
634 LabObject.FindChild(1).FindAttribute(TDF_Reference::GetID(),OriginalRef); \n\
635 Handle(TDF_Reference) ToolRef; \n\
636 LabObject.FindChild(2).FindAttribute(TDF_Reference::GetID(),ToolRef); \n\
637  \n\
638 //  Getting the label of the tool shape (to modify it)\n\
639 TDF_Label ToolLab=ToolRef->Get(); \n\
640  \n\
641 TOcaf_Commands TSC(ToolLab); \n\
642 // Look at the TOcaf_Commands::ModifyBox() function \n\
643 TSC.ModifyBox(m_x, m_y, m_z, m_w, m_l, m_h, Name); \n\
644  \n\
645 //  Getting the TOcafFunction_CutDriver used to create the cut\n\
646 Handle(TFunction_Driver) myCutDriver; \n\
647 TFunction_DriverTable::Get()->FindDriver(myDriverID, myCutDriver); \n\
648  \n\
649 //  Recompute the cut if it must be (if an attribute was modified)\n\
650 if (myCutDriver->MustExecute(log)) { \n\
651 	log.SetTouched(LabObject); \n\
652 	myCutDriver->Execute(log) \n\
653 } \n\
654 Handle(TPrsStd_AISPresentation) prs; \n\
655  \n\
656 //  Setting the TPrsStd_AISPresentation of the cut object\n\
657 prs= TPrsStd_AISPresentation::Set(LabObject, TNaming_NamedShape::GetID()); \n\
658  \n\
659 //  Display the TPrsStd_AISPresentation of the cut object\n\
660 prs->Display(1); \n\
661  \n\
662 //  Commit the command\n\
663 D->CommitCommand(); \n\
664 } \n\
665 \n");
666 
667 		myCResultDialog.SetTitle("Modify Cut");
668 	}
669 	else
670 	{
671 		MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"No associated function driver", L"Modify", MB_OK);
672 	}
673 
674 	CString text(Message.ToCString());
675 	myCResultDialog.SetText(text);
676 }
677 
OnUpdateModify(CCmdUI * pCmdUI)678 void COcafDoc::OnUpdateModify(CCmdUI* pCmdUI)
679 {
680 	// Disable the "modify" button if there is no selected object or several selected objects
681 	myAISContext->InitSelected();
682 	if(myAISContext->NbSelected()!=1)
683 	{
684 		pCmdUI->Enable(Standard_False);
685 		return;
686 	}
687 
688 	// Get the root label of the selected object using its TPrsStd_AISPresentation
689 	myAISContext->InitSelected();
690 	Handle(TPrsStd_AISPresentation) ObjectPrs =
691 		Handle(TPrsStd_AISPresentation)::DownCast(myAISContext->SelectedInteractive()->GetOwner());
692 	if (!ObjectPrs.IsNull()){
693 		TDF_Label LabObject = ObjectPrs->Label();
694 
695 
696 		// Disable the "modify" button if selected object don't have a TFunction_Function attribute
697 		Handle(TFunction_Function) TFF;
698 		pCmdUI->Enable(LabObject.FindAttribute(TFunction_Function::GetID(),TFF) );
699 	}
700 	else
701 		pCmdUI->Enable(FALSE);
702 }
703 
704 
OnCut()705 void COcafDoc::OnCut()
706 {
707 	EraseAll();
708 	Handle(TDocStd_Document) D = GetOcafDoc();
709 	TDF_Label L = D->Main();
710 
711 	TOcaf_Commands TSC(L);
712 
713 	// Open a new command (for undo)
714 	D->NewCommand();
715 
716 	// Create a new cyl (10*20 dimensions)
717 	TDF_Label L2=TSC.CreateCyl(0, 10, -10, 5, 80, "Cylinder");
718 	Handle(TPrsStd_AISPresentation) prs1= TPrsStd_AISPresentation::Set(L2, TNaming_NamedShape::GetID());
719 	prs1->SetColor(Quantity_NOC_MATRABLUE);
720 	TDataStd_Integer::Set(L2, 1);
721 	prs1->Display(1);
722 	Fit3DViews();
723 
724 	// Wait a second to see the construction
725 	Sleep(500);
726 
727 	// Create a new box (20*20*20 dimensions, at the (-12,0,10) position)
728 	TDF_Label L1=TSC.CreateBox(-12, 0, 10, 20, 30, 40, "Box");
729 	Handle(TPrsStd_AISPresentation) prs2= TPrsStd_AISPresentation::Set(L1, TNaming_NamedShape::GetID());
730 	prs2->SetColor(Quantity_NOC_YELLOW);
731 	TDataStd_Integer::Set(L1, 1);
732 	prs2->Display(1);
733 	Fit3DViews();
734 
735 	Sleep(1000);
736 
737 	// Cut the boxes
738 	L=TSC.Cut(L1, L2);
739 	Handle(TPrsStd_AISPresentation) prs= TPrsStd_AISPresentation::Set(L, TNaming_NamedShape::GetID());
740 
741 	// Erase the two boxes and display the cut object
742 	TDataStd_Integer::Set(L1, 0);
743 	prs1->Erase(0);
744 	TDataStd_Integer::Set(L2, 0);
745 	prs2->Erase(0);
746 	TDataStd_Integer::Set(L, 1);
747 	prs->Display(1);
748 	myAISContext->UpdateCurrentViewer();
749 
750 	// Close the cut operation command (for undo)
751 	D->CommitCommand();
752 
753 
754 		TCollection_AsciiString Message ("\
755 //  Cut operation between a cylinder and a box \n\
756  \n\
757 Handle(TDocStd_Document) D = GetOcafDoc(); \n\
758 TDF_Label L = D->Main(); \n\
759  \n\
760 //  Opening a new command\n\
761 D->NewCommand(); \n\
762  \n\
763 TOcaf_Commands TSC(D->Main()); \n\
764  \n\
765 //  Create a box \n\
766 // Look at the TOcaf_Commands::CreateBox() function \n\
767 TDF_Label L1=TSC.CreateBox(-12, 0, 10, 24, 20, 20, '\"'Box'\"'); \n\
768 // Look at the TOcaf_Commands::Cut() function \n\
769  \n\
770 //  Create a cylinder \n\
771 // Look at the TOcaf_Commands::CreateCyl() function \n\
772 //  Create two boxes \n\
773 TDF_Label L2=TSC.CreateCyl(0, 0, 0, 10, 20, '\"'Cylinder'\"'); \n\
774  \n\
775 //  Cut the cylinder with the box \n\
776 L=TSC.Cut(L1, L2); \n\
777 Handle(TPrsStd_AISPresentation) prs; \n\
778  \n\
779 //  Setting the TPrsStd_AISPresentation of the cut object\n\
780 prs= TPrsStd_AISPresentation::Set(L, TNaming_NamedShape::GetID()); \n\
781  \n\
782 //  Displaying the TPrsStd_AISPresentation of the cut object\n\
783 prs->Display(1); \n\
784  \n\
785 //  Commit the command\n\
786 D->CommitCommand(); \n\
787 \n");
788 
789 	myCResultDialog.SetTitle("Cut operation");
790 	CString text(Message.ToCString());
791 	myCResultDialog.SetText(text);
792 }
793 
794 
Fit3DViews()795 void COcafDoc::Fit3DViews()
796 {
797   POSITION position = GetFirstViewPosition();
798   while (position != (POSITION)NULL)
799   {
800     CView* pCurrentView = (CView*)GetNextView(position);
801      if(pCurrentView->IsKindOf( RUNTIME_CLASS( OCC_3dView ) ) )
802     {
803         ASSERT_VALID(pCurrentView);
804         OCC_3dView* aOCC_3dView = (OCC_3dView*)pCurrentView;
805         aOCC_3dView->FitAll();
806     }
807   }
808 
809 }
810 
OnObjectDelete()811 void COcafDoc::OnObjectDelete()
812 {
813 	Handle(TDocStd_Document) D = GetOcafDoc();
814 
815 	D->NewCommand();
816 
817 	AIS_SequenceOfInteractive aSequence;
818 	for(myAISContext->InitSelected();
819       myAISContext->MoreSelected();
820       myAISContext->NextSelected())
821         aSequence.Append(myAISContext->SelectedInteractive());
822 
823 	for(int iter=1;iter <=aSequence.Length();iter++)
824 	{
825 		if (myAISContext->DisplayStatus(aSequence(iter)) == AIS_DS_Displayed)
826  		{
827  			Handle(TPrsStd_AISPresentation) CurrentPrs
828  				= Handle(TPrsStd_AISPresentation)::DownCast(aSequence(iter)->GetOwner());
829  			TDataStd_Integer::Set(CurrentPrs->Label(), 0);
830  			CurrentPrs->Erase(1);
831  		}
832  	}
833 
834  	D->CommitCommand();
835  	myAISContext->UpdateCurrentViewer();
836 
837  		TCollection_AsciiString Message ("\
838  // Delete selected object \n\
839   \n\
840  Handle(TDocStd_Document) D = GetOcafDoc(); \n\
841   \n\
842  //  Opening a new command\n\
843  D->NewCommand(); \n\
844   \n\
845  // Getting the  TPrsStd_AISPresentation of the selected object\n\
846  Handle(TPrsStd_AISPresentation) CurrentPrs \n\
847      =Handle(TPrsStd_AISPresentation)::DownCast(myAISContext->Current()->GetOwner());  \n\
848   \n\
849  // Erasing the  TPrsStd_AISPresentation of the selected object\n\
850  CurrentPrs->Erase(1); \n\
851   \n\
852  //  Commit the command\n\
853  D->CommitCommand(); \n\
854  \n");
855 
856   myCResultDialog.SetTitle("Delete");
857  	CString text(Message.ToCString());
858  	myCResultDialog.SetText(text);
859  }
860 
OnUpdateObjectDelete(CCmdUI * pCmdUI)861  void COcafDoc::OnUpdateObjectDelete(CCmdUI* pCmdUI)
862  {
863      myAISContext->InitSelected();
864 	pCmdUI->Enable (myAISContext->MoreSelected());
865  }
866 
DisplayPrs()867  void COcafDoc::DisplayPrs()
868  {
869  	TDF_Label LabSat = myOcafDoc->Main();
870 
871  	for (TDF_ChildIterator it(LabSat); it.More(); it.Next())
872  	{
873  		TDF_Label L = it.Value();
874  		Handle(TNaming_NamedShape) TNS;
875 		if (!L.FindAttribute(TNaming_NamedShape::GetID(), TNS)) continue;
876 		Handle(TDataStd_Integer) TDI;
877 
878 		// To know if the object was displayed
879 		if (L.FindAttribute(TDataStd_Integer::GetID(), TDI))
880 			if(!TDI->Get())  continue;
881 
882 		Handle(TPrsStd_AISPresentation) prs;
883 		if (!L.FindAttribute(TPrsStd_AISPresentation::GetID(),prs))
884 			prs = TPrsStd_AISPresentation::Set(L,TNaming_NamedShape::GetID());
885 		prs->SetColor(Quantity_NOC_ORANGE);
886 		prs->Display(1);
887     }
888 
889 	myAISContext->UpdateCurrentViewer();
890 }
891 
OnCloseDocument()892 void COcafDoc::OnCloseDocument()
893 {
894 	Handle(TOcaf_Application) OcafApp = ((COcafApp*)AfxGetApp())->GetApp();
895 	OcafApp->Close(myOcafDoc);
896 	CDocument::OnCloseDocument();
897 }
898 
OnFileSaveAs()899 void COcafDoc::OnFileSaveAs()
900 {
901 	const wchar_t* SPathName = PathName;
902 	TCollection_ExtendedString TPathName (SPathName);
903 
904 	CString Filter;
905 
906 	if (TPathName.SearchFromEnd(".xml") > 0){
907 		Filter = "OCAFSample(XML) (*.xml)|*.xml|OCAFSample(Binary) (*.cbf)|*.cbf||";
908 	} else {
909 		Filter = "OCAFSample(Binary) (*.cbf)|*.cbf|OCAFSample(XML) (*.xml)|*.xml||";
910 	}
911 
912 	CFileDialog dlg(FALSE,
913 			L"cbf",
914 			GetTitle(),
915 			OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
916 			Filter,
917 			NULL );
918 
919 
920 	Handle(TOcaf_Application) m_App= ((COcafApp*)AfxGetApp())->GetApp();
921 	if (dlg.DoModal() != IDOK) return;
922 
923 	SetTitle(dlg.GetFileTitle());
924 
925 	CWaitCursor aWaitCursor;
926 	CString CSPath = dlg.GetPathName();
927 
928 	std::cout << "Save As " << CSPath << std::endl;
929 	PathName=CSPath;
930         const wchar_t* SPath = CSPath;
931 	TCollection_ExtendedString TPath (SPath);
932 
933 	    if (TPath.SearchFromEnd(".xml") > 0)
934 		{
935 		  // The document must be saved in XML format
936 			myOcafDoc->ChangeStorageFormat("XmlOcaf");
937 		}
938 		else if (TPath.SearchFromEnd(".cbf") > 0)
939 		{
940 			// The document must be saved in binary format
941 			myOcafDoc->ChangeStorageFormat("BinOcaf");
942 		}
943 
944 		try
945 		{
946 			// Saves the document in the current application
947 			m_App->SaveAs(myOcafDoc,TPath);
948 		}
949 		catch(...)
950 		{
951 			AfxMessageBox (L"Error! The file wasn't saved.");
952     		return;
953 		}
954 //	// save the document in the current application
955 //	m_App->SaveAs(myOcafDoc,TPath);
956 
957 	SetPathName(SPath);
958 
959 	TCollection_AsciiString Message = TCollection_AsciiString("\
960 //  Storing the document as \n\
961  \n\
962 Handle(TOcaf_Application) m_App= ((COcafApp*)AfxGetApp())->GetApp(); \n\
963  \n\
964 //  Saving current OCAF document at TPath \n\
965 m_App->SaveAs(myOcafDoc,(TCollection_ExtendedString) TPath); \n\
966 \n");
967 
968 	myCResultDialog.SetTitle("Save a document");
969 	CString text(Message.ToCString());
970 	myCResultDialog.SetText(text);
971 }
972 
OnFileSave()973 void COcafDoc::OnFileSave()
974 {
975 	Handle(TOcaf_Application) m_App= ((COcafApp*)AfxGetApp())->GetApp();
976 
977 
978 	if (myOcafDoc.IsNull())
979 	{
980 	  AfxMessageBox (L"Error during saving! Empty document.");
981 	  return;
982 	}
983 
984 	if(PathName!="")
985 	{
986           const wchar_t* SPath = PathName;
987           TCollection_ExtendedString TPath (SPath);
988 
989 	    if (TPath.SearchFromEnd(".xml") > 0)
990 		{
991 		  // The document must be saved in XML format
992 			myOcafDoc->ChangeStorageFormat("XmlOcaf");
993 		}
994 		else if (TPath.SearchFromEnd(".cbf") > 0)
995 		{
996 			// The document must be saved in binary format
997 			myOcafDoc->ChangeStorageFormat("BinOcaf");
998 		}
999 
1000 		try
1001 		{
1002 			// Saves the document in the current application
1003 			m_App->SaveAs(myOcafDoc,TPath);
1004 		}
1005 		catch(...)
1006 		{
1007 			AfxMessageBox (L"Error! The file wasn't saved.");
1008    		    return;
1009 		}
1010 
1011 	TCollection_AsciiString Message = TCollection_AsciiString("\
1012 //  Storing the document \n\
1013  \n\
1014 Handle(TOcaf_Application) m_App= ((COcafApp*)AfxGetApp())->GetApp(); \n\
1015  \n\
1016 //  Saving current OCAF document at TPath \n\
1017 m_App->SaveAs(myOcafDoc,(TCollection_ExtendedString) TPath); \n\
1018 \n");
1019 
1020 		myCResultDialog.SetTitle("Save a document");
1021 		CString text(Message.ToCString());
1022 		myCResultDialog.SetText(text);
1023 		return;
1024 	}
1025 
1026 	CFileDialog dlg(FALSE,
1027 			L"cbf",
1028 			GetTitle(),
1029 			OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
1030 			L"OCAFSample(Binary) (*.cbf)|*.cbf|OCAFSample(XML) (*.xml)|*.xml||",
1031 			NULL );
1032 
1033 	if (dlg.DoModal() != IDOK) return;
1034 
1035 	SetTitle(dlg.GetFileTitle());
1036 
1037 	CWaitCursor aWaitCursor;
1038 	CString CSPath = dlg.GetPathName();
1039 
1040 	const wchar_t* SPath = CSPath;
1041     TCollection_ExtendedString TPath (SPath);
1042 
1043     // Choose storage format
1044     if (TPath.SearchFromEnd(".xml") > 0)
1045 	{
1046 	  // The document must be saved in XML format
1047 	  myOcafDoc->ChangeStorageFormat("XmlOcaf");
1048 	}
1049 	else if (TPath.SearchFromEnd(".cbf") > 0)
1050 	{
1051 	  // The document must be saved in binary format
1052 	  myOcafDoc->ChangeStorageFormat("BinOcaf");
1053 	}
1054 
1055    try
1056    {
1057 	  // Saves the document in the current application
1058 	  m_App->SaveAs(myOcafDoc,TPath);
1059    }
1060    catch(...)
1061    {
1062 	  AfxMessageBox (L"Error! The file wasn't saved.");
1063 	  return;
1064    }
1065 
1066 	SetPathName(SPath);
1067 	PathName=CSPath;
1068 
1069 
1070 	TCollection_AsciiString Message = TCollection_AsciiString("\
1071 //  Storing the document as \n\
1072  \n\
1073 Handle(TOcaf_Application) m_App= ((COcafApp*)AfxGetApp())->GetApp(); \n\
1074  \n\
1075 //  Saving current OCAF document at TPath \n\
1076 m_App->SaveAs(myOcafDoc,(TCollection_ExtendedString) TPath); \n\
1077 \n");
1078 
1079 	myCResultDialog.SetTitle("Save a document");
1080 	CString text(Message.ToCString());
1081 	myCResultDialog.SetText(text);
1082 }
1083 
OnOpenDocument(LPCTSTR lpszPathName)1084 BOOL COcafDoc::OnOpenDocument(LPCTSTR lpszPathName)
1085 {
1086   if (!CDocument::OnOpenDocument(lpszPathName))
1087   {
1088     return FALSE;
1089   }
1090 
1091   Handle(TOcaf_Application) m_App= ((COcafApp*)AfxGetApp())->GetApp();
1092 
1093   CWaitCursor aWaitCursor;
1094   PathName = lpszPathName;
1095 
1096   const wchar_t* aPathName = lpszPathName;
1097   TCollection_ExtendedString anOccPathName (aPathName);
1098 
1099   // Open the document in the current application
1100   //PCDM_ReaderStatus RS = m_App->Open(TPath,myOcafDoc);
1101   m_App->Open(anOccPathName, myOcafDoc);
1102   //CDF_RetrievableStatus RS = m_App->Open(TPath,myOcafDoc);
1103 
1104   // Connect the document CAF (myDoc) with the AISContext (myAISContext)
1105   TPrsStd_AISViewer::New (myOcafDoc->Main(), myViewer);
1106   myOcafDoc->SetUndoLimit (10);
1107 
1108   Handle(AIS_InteractiveContext) aContext;
1109   TPrsStd_AISViewer::Find (myOcafDoc->Main(), aContext);
1110   aContext->SetDisplayMode (AIS_Shaded, Standard_True);
1111   myAISContext = aContext;
1112 
1113   // Display the presentations (which was not stored in the document)
1114   DisplayPrs();
1115 
1116   TCollection_AsciiString Message = TCollection_AsciiString("\
1117 //  Retrieve a document \n\
1118  \n\
1119  Handle(TOcaf_Application) m_App= ((COcafApp*)AfxGetApp())->GetApp(); \n\
1120  \n\
1121 //  Opening the OCAF document from the TPath file\n\
1122 m_App->Open((TCollection_ExtendedString) TPath,myOcafDoc); \n\
1123  \n\
1124 //  Creation of a new TPrsStd_AISViewer connected to the current V3d_Viewer\n\
1125 TPrsStd_AISViewer::New(myOcafDoc->Main(),myViewer); \n\
1126  \n\
1127 //  Setting the number of memorized undos \n\
1128 myOcafDoc->SetUndoLimit(10); \n\
1129  \n\
1130 \n");
1131 
1132   myCResultDialog.SetTitle ("Open a document");
1133   CString text (Message.ToCString());
1134   myCResultDialog.SetText (text);
1135 
1136   return TRUE;
1137 
1138 }
1139 
1140 
EraseAll()1141 void COcafDoc::EraseAll()
1142 {
1143 	myOcafDoc->NewCommand();
1144 
1145 	TDF_Label LabSat = myOcafDoc->Main();
1146 
1147 	for (TDF_ChildIterator it(LabSat); it.More(); it.Next())
1148 	{
1149 		TDF_Label L = it.Value();
1150 		Handle(TNaming_NamedShape) TNS;
1151 		if (!L.FindAttribute(TNaming_NamedShape::GetID(), TNS)) continue;
1152 		Handle(TDataStd_Integer) TDI;
1153 
1154 		// To know if the object was displayed
1155 		if (L.FindAttribute(TDataStd_Integer::GetID(), TDI))
1156 			if(!TDI->Get())  continue;
1157 
1158 		Handle(TPrsStd_AISPresentation) prs;
1159 		if (!L.FindAttribute(TPrsStd_AISPresentation::GetID(),prs))
1160 			prs = TPrsStd_AISPresentation::Set(L,TNaming_NamedShape::GetID());
1161 		prs->SetColor(Quantity_NOC_ORANGE);
1162 		prs->Erase(1);
1163     }
1164 
1165 	myAISContext->UpdateCurrentViewer();
1166 
1167 	myOcafDoc->CommitCommand();
1168 }
1169 
Popup(const Standard_Integer x,const Standard_Integer y,const Handle (V3d_View)& aView)1170 void  COcafDoc::Popup(const Standard_Integer  x,
1171 							   const Standard_Integer  y ,
1172                                const Handle(V3d_View)& aView   )
1173 {
1174   Standard_Integer PopupMenuNumber=0;
1175  myAISContext->InitSelected();
1176   if (myAISContext->MoreSelected())
1177     PopupMenuNumber=1;
1178 
1179   CMenu menu;
1180   VERIFY(menu.LoadMenu(IDR_Popup3D));
1181   CMenu* pPopup = menu.GetSubMenu(PopupMenuNumber);
1182 
1183   ASSERT(pPopup != NULL);
1184    if (PopupMenuNumber == 1) // more than 1 object.
1185   {
1186     bool OneOrMoreInShading = false;
1187 	for (myAISContext->InitSelected();myAISContext->MoreSelected ();myAISContext->NextSelected ())
1188     if (myAISContext->IsDisplayed(myAISContext->SelectedInteractive(),1)) OneOrMoreInShading=true;
1189 	if(!OneOrMoreInShading)
1190    	pPopup->EnableMenuItem(5, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
1191    }
1192 
1193   POINT winCoord = { x , y };
1194   Handle(WNT_Window) aWNTWindow=
1195   Handle(WNT_Window)::DownCast(aView->Window());
1196   ClientToScreen ( (HWND)(aWNTWindow->HWindow()),&winCoord);
1197   pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON , winCoord.x, winCoord.y ,
1198                          AfxGetMainWnd());
1199 
1200 
1201 }
1202 
1203 
1204 //void COcafDoc::OnDfbr()
1205 //{
1206 //	// TODO: Add your command handler code here
1207 //	DebugBrowser::DFBrowser(myOcafDoc);
1208 //
1209 //}
1210