0031668: Visualization - WebGL sample doesn't work on Emscripten 1.39
[occt.git] / src / DDocStd / DDocStd_ApplicationCommands.cxx
1 // Created on: 2000-03-01
2 // Created by: Denis PASCAL
3 // Copyright (c) 2000-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <DDocStd.hxx>
17 #include <Draw.hxx>
18 #include <Draw_Interpretor.hxx>
19 #include <Draw_Viewer.hxx>
20 #include <DDocStd_DrawDocument.hxx>
21 #include <TDocStd_Application.hxx>
22 #include <TDocStd_Document.hxx>
23 #include <TDataStd_Name.hxx>
24 #include <Draw.hxx>
25 #include <Standard_GUID.hxx>
26 #include <Standard_ExtString.hxx>
27 #include <TCollection_AsciiString.hxx>
28 #include <TCollection_ExtendedString.hxx>
29 #include <TDF.hxx>
30 #include <TDF_Data.hxx>
31 #include <TDF_ChildIterator.hxx>
32 #include <TDF_Tool.hxx> 
33
34 #include <OSD_Path.hxx>
35 #include <OSD_OpenFile.hxx>
36 #include <TDocStd_PathParser.hxx>
37 #include <XmlLDrivers.hxx>
38
39 #include <AIS_InteractiveContext.hxx>
40 #include <TPrsStd_AISViewer.hxx>
41 #include <ViewerTest.hxx>
42 #include <V3d_Viewer.hxx>
43
44 #ifndef _WIN32
45 extern Draw_Viewer dout;
46 #else
47 Standard_IMPORT Draw_Viewer dout;
48 #endif
49
50 //=======================================================================
51 //function : ListDocuments
52 //purpose  : 
53 //=======================================================================
54
55 static Standard_Integer DDocStd_ListDocuments (Draw_Interpretor& di,
56                                                Standard_Integer nb,
57                                                const char** /*a*/)
58 {  
59   if (nb == 1) {
60     Handle(TDocStd_Application) A = DDocStd::GetApplication();
61     Handle(TDocStd_Document) D;
62     Standard_Integer nbdoc = A->NbDocuments();
63     for (Standard_Integer i = 1; i <= nbdoc; i++) {
64       A->GetDocument(i,D);
65       di <<"document " << i;
66       if (D->IsSaved()) {
67         TCollection_AsciiString GetNameAsciiString(D->GetName().ToExtString(),'?');
68         TCollection_AsciiString GetPathAsciiString(D->GetPath().ToExtString(),'?');
69         //std::cout << " name : " << D->GetName();
70         //std::cout << " path : " << D->GetPath();
71         di << " name : " << GetNameAsciiString.ToCString();
72         di << " path : " << GetPathAsciiString.ToCString();
73       }
74       else di << " not saved";
75       di << "\n";
76     }
77     return 0;
78   }
79   di << "DDocStd_ListDocuments : Error\n";
80   return 1; 
81 }
82
83
84 //=======================================================================
85 //function : NewDocument
86 //purpose  : 
87 //=======================================================================
88
89 static Standard_Integer DDocStd_NewDocument (Draw_Interpretor& di,
90                                              Standard_Integer nb,
91                                              const char** a)
92 {    
93   Handle(TDocStd_Document) D; 
94   Handle(DDocStd_DrawDocument) DD;
95   if (nb == 2) {
96     if (!DDocStd::GetDocument(a[1],D,Standard_False)) { 
97       D = new TDocStd_Document("dummy");  
98       DD = new DDocStd_DrawDocument(D);  
99       Draw::Set(a[1],DD);       
100       di << "document (not handled by application)  " << a[1] << " created\n";  
101       DDocStd::ReturnLabel(di,D->Main()); 
102     }    
103     else di << a[1] << " is already a document\n";
104     return 0;
105   }
106   if (nb == 3) {   
107     if (!DDocStd::GetDocument(a[1],D,Standard_False)) {  
108       Handle(TDocStd_Application) A = DDocStd::GetApplication();
109       A->NewDocument(a[2],D);  
110       DD = new DDocStd_DrawDocument(D);  
111       TDataStd_Name::Set(D->GetData()->Root(),a[1]);  
112       Draw::Set(a[1],DD);    
113       di << "document " << a[1] << " created\n";    
114       DDocStd::ReturnLabel(di,D->Main()); 
115     }
116     else di << a[1] << " is already a document\n";
117     return 0;
118   }   
119   di << "DDocStd_NewDocument : Error\n";
120   return 1;
121 }
122
123 //=======================================================================
124 //function : Open
125 //purpose  : 
126 //=======================================================================
127
128 static Standard_Integer DDocStd_Open (Draw_Interpretor& di,
129                                       Standard_Integer nb,
130                                       const char** a)
131 {   
132   if (nb >= 3) {
133     TCollection_ExtendedString path (a[1]); 
134     Handle(TDocStd_Application) A = DDocStd::GetApplication();
135     Handle(TDocStd_Document) D;
136     Standard_Integer insession = A->IsInSession(path);
137     if (insession > 0) {  
138       di <<"document " << insession << "  is already in session\n";
139       return 0;
140     }
141     PCDM_ReaderStatus theStatus;
142
143     Standard_Boolean anUseStream = Standard_False;
144     for ( Standard_Integer i = 3; i < nb; i++ )
145     {
146       if (!strcmp (a[i], "-stream"))
147       {
148         di << "standard SEEKABLE stream is used\n";
149         anUseStream = Standard_True;
150         break;
151       }
152     }
153
154     if (anUseStream)
155     {
156       std::ifstream aFileStream;
157       OSD_OpenStream (aFileStream, path, std::ios::in | std::ios::binary);
158
159       theStatus = A->Open (aFileStream, D);
160     }
161     else
162     {
163       theStatus = A->Open(path,D);
164     }
165     if (theStatus == PCDM_RS_OK && !D.IsNull()) {
166       Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(D);
167       TDataStd_Name::Set(D->GetData()->Root(),a[2]);
168       Draw::Set(a[2],DD);
169       return 0; 
170     } else {
171       switch ( theStatus ) {
172       case PCDM_RS_AlreadyRetrieved: 
173       case PCDM_RS_AlreadyRetrievedAndModified: {
174         di << " already retrieved \n" ;  
175         break;
176       }
177       case PCDM_RS_NoDriver: {
178         di << " could not retrieve , no Driver to make it \n" ;
179         break ;
180       }
181       case PCDM_RS_UnknownDocument:
182       case PCDM_RS_NoModel: {
183         di << " could not retrieve , Unknown Document or No Model \n";
184         break ; 
185       }
186       case PCDM_RS_TypeNotFoundInSchema:
187       case PCDM_RS_UnrecognizedFileFormat: {
188         di << " could not retrieve , Type not found or Unrecognized File Format\n";
189         break ;
190       }
191       case PCDM_RS_PermissionDenied: {
192         di << " could not retrieve , permission denied \n" ;  
193         break;
194       }
195       default:
196         di << " could not retrieve \n" ;  
197         break;
198       }
199       di << "DDocStd_Open : Error\n";
200     }   
201   }
202   return 1;
203 }
204
205 //=======================================================================
206 //function : Save
207 //purpose  : 
208 //=======================================================================
209
210 static Standard_Integer DDocStd_Save (Draw_Interpretor& di,
211                                       Standard_Integer nb,
212                                       const char** a)
213 {  
214   if (nb == 2) {
215     Handle(TDocStd_Document) D;    
216     if (!DDocStd::GetDocument(a[1],D)) return 1;
217     Handle(TDocStd_Application) A = DDocStd::GetApplication();
218     if (!D->IsSaved()) {
219       di << "this document has never been saved\n";
220       return 0;
221     }
222     A->Save(D);
223     return 0; 
224   }
225   di << "DDocStd_Save : Error\n";
226   return 1;
227 }
228
229 //=======================================================================
230 //function : SaveAs
231 //purpose  : 
232 //=======================================================================
233
234 static Standard_Integer DDocStd_SaveAs (Draw_Interpretor& di,
235                                         Standard_Integer nb,
236                                         const char** a)
237 {
238   if (nb >= 3) {
239     Handle(TDocStd_Document) D;    
240     if (!DDocStd::GetDocument(a[1],D)) return 1;  
241     TCollection_ExtendedString path (a[2]); 
242     Handle(TDocStd_Application) A = DDocStd::GetApplication();
243     PCDM_StoreStatus theStatus;
244
245     Standard_Boolean anUseStream(Standard_False), isSaveEmptyLabels(Standard_False);
246     for ( Standard_Integer i = 3; i < nb; i++ )
247     {
248       if (!strcmp (a[i], "-stream"))
249       {
250         di << "standard SEEKABLE stream is used\n";
251         anUseStream = Standard_True;
252         break;
253       } else {
254         isSaveEmptyLabels =  ((atoi (a[3])) != 0);
255         D->SetEmptyLabelsSavingMode(isSaveEmptyLabels);
256       }
257     }
258     if (anUseStream)
259     {
260       std::ofstream aFileStream;
261       OSD_OpenStream (aFileStream, path, std::ios::out | std::ios::binary);
262       theStatus = A->SaveAs (D, aFileStream);
263     }
264     else
265     {
266       theStatus = A->SaveAs(D,path);
267     }
268
269     if (theStatus != PCDM_SS_OK ) {
270       switch ( theStatus ) {
271       case PCDM_SS_DriverFailure: {
272         di << "Error saving document: Could not store , no driver found to make it\n";
273         break ;
274                                   }
275       case PCDM_SS_WriteFailure: {
276         di << "Error saving document: Write access failure\n";
277         break;
278                                  }
279       case PCDM_SS_Failure: {
280         di << "Error saving document: Write failure\n" ;
281         break;
282                             }
283       case PCDM_SS_Doc_IsNull: {
284         di << "Error saving document: No document to save\n";
285         break ;
286                                }
287       case PCDM_SS_No_Obj: {
288         di << "Error saving document: No objects written\n";
289         break;
290                            }
291       case PCDM_SS_Info_Section_Error: {
292         di << "Error saving document: Write info section failure\n" ;
293         break;
294                                        }
295       default:
296         break;
297       }
298       return 1;
299     } else {
300       return 0; 
301     }
302   }
303   di << "DDocStd_SaveAs : Error not enough argument\n";
304   return 1;
305 }
306
307 //=======================================================================
308 //function : Close
309 //purpose  : 
310 //=======================================================================
311
312 static Standard_Integer DDocStd_Close (Draw_Interpretor& /*theDI*/,
313                                        Standard_Integer  theArgNb,
314                                        const char**      theArgVec)
315 {   
316   if (theArgNb != 2)
317   {
318     std::cout << "DDocStd_Close : Error\n";
319     return 1;
320   }
321
322   Handle(TDocStd_Document) aDoc;
323   Standard_CString aDocName = theArgVec[1];
324   if (!DDocStd::GetDocument (aDocName, aDoc))
325   {
326     return 1;
327   }
328
329   TDF_Label aRoot = aDoc->GetData()->Root();
330   Handle(TPrsStd_AISViewer) aDocViewer;
331   if (TPrsStd_AISViewer::Find (aRoot, aDocViewer)
332    && !aDocViewer->GetInteractiveContext().IsNull())
333   {
334     Handle(V3d_Viewer) aViewer = aDocViewer->GetInteractiveContext()->CurrentViewer();
335     V3d_ListOfView aViews;
336     for (V3d_ListOfViewIterator aViewIter (aDocViewer->GetInteractiveContext()->CurrentViewer()->DefinedViewIterator()); aViewIter.More(); aViewIter.Next())
337     {
338       aViews.Append (aViewIter.Value());
339     }
340     for (V3d_ListOfViewIterator aViewIter (aViews); aViewIter.More(); aViewIter.Next())
341     {
342       Handle(V3d_View) aView = aViewIter.Value();
343       ViewerTest::RemoveView (aView);
344     }
345   }
346
347   Handle(TDocStd_Application) aDocApp = DDocStd::GetApplication();
348
349   aDocApp->Close (aDoc);
350
351   if (Handle(Draw_Drawable3D) aDrawable = Draw::GetExisting (aDocName))
352   {
353     dout.RemoveDrawable (aDrawable);
354   }
355   Draw::Set (theArgVec[1], Handle(Draw_Drawable3D)());
356   return 0;
357 }
358
359 //=======================================================================
360 //function : IsInSession
361 //purpose  : 
362 //=======================================================================
363
364 static Standard_Integer DDocStd_IsInSession (Draw_Interpretor& di,
365                                              Standard_Integer nb,
366                                              const char** a)
367 {   
368   if (nb == 2) {   
369     Handle(TDocStd_Application) A = DDocStd::GetApplication();
370     di << A->IsInSession(a[1]);
371     return 0;
372   }  
373   di << "DDocStd_IsInSession : Error\n";
374   return 1;
375 }
376
377  
378 //=======================================================================
379 //function : OSDPath
380 //purpose  : 
381 //=======================================================================
382
383 static Standard_Integer DDocStd_OSDPath (Draw_Interpretor& di,
384                                          Standard_Integer nb,
385                                          const char** a)
386 {   
387   if (nb == 2) { 
388     OSD_Path path (a[1]);
389     di << "Node      : " << path.Node().ToCString() << "\n";  
390     di << "UserName  : " << path.UserName().ToCString() << "\n"; 
391     di << "Password  : " << path.Password().ToCString() << "\n";  
392     di << "Disk      : " << path.Disk().ToCString() << "\n";
393     di << "Trek      : " << path.Trek().ToCString() << "\n"; 
394     di << "Name      : " << path.Name().ToCString() << "\n";  
395     di << "Extension : " << path.Extension().ToCString() << "\n";
396     return 0;
397   }
398   di << "DDocStd_OSDPath : Error\n";
399   return 1;
400 }
401
402
403 //=======================================================================
404 //function : Path
405 //purpose  : 
406 //=======================================================================
407
408 static Standard_Integer DDocStd_Path (Draw_Interpretor& di,
409                                        Standard_Integer nb,
410                                        const char** a)
411 {   
412   if (nb == 2) { 
413     TDocStd_PathParser path (a[1]);
414     //std::cout << "Trek      : " << path.Trek() << std::endl;  
415     //std::cout << "Name      : " << path.Name() << std::endl; 
416     //std::cout << "Extension : " << path.Extension() << std::endl;
417     //std::cout << "Path      : " << path.Path() << std::endl;
418     TCollection_AsciiString TrekAsciiString(path.Trek().ToExtString(),'?');
419     TCollection_AsciiString NameAsciiString(path.Name().ToExtString(),'?');
420     TCollection_AsciiString ExtensionAsciiString(path.Extension().ToExtString(),'?');
421     TCollection_AsciiString PathAsciiString(path.Path().ToExtString(),'?');
422     di << "Trek      : " << TrekAsciiString.ToCString() << "\n";  
423     di << "Name      : " << NameAsciiString.ToCString() << "\n"; 
424     di << "Extension : " << ExtensionAsciiString.ToCString() << "\n";
425     di << "Path      : " << PathAsciiString.ToCString() << "\n";
426     return 0;
427   }
428   di << "DDocStd_Path : Error\n";
429   return 1;
430 }
431
432 //=======================================================================
433 //function : AddComment
434 //purpose  : 
435 //=======================================================================
436 static Standard_Integer DDocStd_AddComment (Draw_Interpretor& di,
437                                             Standard_Integer nb,
438                                             const char** a)
439 {  
440   if (nb == 3) {
441     Handle(TDocStd_Document) D;    
442     if (!DDocStd::GetDocument(a[1],D)) return 1;  
443     TCollection_ExtendedString comment (a[2]); 
444 //    Handle(TDocStd_Application) A = DDocStd::GetApplication();
445 //    A->AddComment(D,comment);
446     D->AddComment(comment);
447     return 0; 
448   }
449   di << "DDocStd_AddComment : Wrong arguments number\n";
450   return 1;
451 }
452
453 //=======================================================================
454 //function : PrintComments
455 //purpose  : 
456 //=======================================================================
457 static Standard_Integer DDocStd_PrintComments (Draw_Interpretor& di,
458                                                Standard_Integer nb,
459                                                const char** a)
460 {  
461   if (nb == 2) {
462     Handle(TDocStd_Document) D;    
463     if (!DDocStd::GetDocument(a[1],D)) return 1;  
464
465     TColStd_SequenceOfExtendedString comments;
466     D->Comments(comments);
467
468     for (int i = 1; i <= comments.Length(); i++)
469     {
470       //std::cout << comments(i) << std::endl;
471       TCollection_AsciiString commentAsciiString(comments(i).ToExtString(),'?');
472       di << commentAsciiString.ToCString() << "\n";
473     }
474
475     return 0; 
476   }
477   di << "DDocStd_PrintComments : Wrong arguments number\n";
478   return 1;
479 }
480
481 //=======================================================================
482 //function : SetStorageVerison
483 //purpose  : 
484 //=======================================================================
485 static Standard_Integer DDocStd_SetStorageVersion (Draw_Interpretor& ,
486                                                    Standard_Integer nb,
487                                                    const char** a)
488 {  
489   if (nb == 3)
490   {
491     Handle(TDocStd_Document) D;
492     if (!DDocStd::GetDocument(a[1], D)) return 1;
493     const int version = atoi(a[2]);
494     D->ChangeStorageFormatVersion(version);
495     return 0;
496   }
497   return 1;
498 }
499
500 //=======================================================================
501 //function : GetStorageVerison
502 //purpose  : 
503 //=======================================================================
504 static Standard_Integer DDocStd_GetStorageVersion (Draw_Interpretor& di,
505                                                    Standard_Integer nb,
506                                                    const char** a)
507
508   if (nb == 2) {
509     Handle(TDocStd_Document) D;
510     if (!DDocStd::GetDocument(a[1], D)) return 1;
511     di << D->StorageFormatVersion() << "\n";
512     return 0;
513   }
514   return 1;
515 }
516
517 //=======================================================================
518 //function : ApplicationCommands
519 //purpose  : 
520 //=======================================================================
521
522 void DDocStd::ApplicationCommands(Draw_Interpretor& theCommands) 
523 {
524   
525   static Standard_Boolean done = Standard_False;
526   if (done) return;
527   done = Standard_True;
528
529   const char* g = "DDocStd application commands";
530
531   // user application commands
532   theCommands.Add("ListDocuments",
533                   "ListDocuments",
534                   __FILE__, DDocStd_ListDocuments, g);  
535
536   theCommands.Add("NewDocument",
537                   "NewDocument docname format",
538                   __FILE__, DDocStd_NewDocument, g);  
539
540   theCommands.Add("Open",
541                   "Open path docname [-stream]",
542                   __FILE__, DDocStd_Open, g);   
543
544   theCommands.Add("SaveAs",
545                   "SaveAs DOC path [saveEmptyLabels: 0|1] [-stream]",
546                   __FILE__, DDocStd_SaveAs, g);  
547
548   theCommands.Add("Save",
549                   "Save",
550                   __FILE__, DDocStd_Save, g);  
551
552   theCommands.Add("Close",
553                   "Close DOC",
554                   __FILE__, DDocStd_Close, g);   
555
556   theCommands.Add("IsInSession",
557                   "IsInSession path",
558                   __FILE__, DDocStd_IsInSession, g);  
559
560   theCommands.Add("OSDPath",
561                   "OSDPath string",
562                   __FILE__, DDocStd_OSDPath, g);  
563
564   theCommands.Add("Path",
565                   "Path string",
566                   __FILE__, DDocStd_Path, g);
567
568   theCommands.Add("AddComment",
569                   "AddComment Doc string",
570                   __FILE__, DDocStd_AddComment, g);
571
572   theCommands.Add("PrintComments",
573                   "PrintComments Doc",
574                   __FILE__, DDocStd_PrintComments, g);
575
576   theCommands.Add("GetStorageVersion",
577                   "GetStorageVersion Doc",
578                   __FILE__, DDocStd_GetStorageVersion, g);
579   theCommands.Add("SetStorageVersion",
580                   "SetStorageVersion Doc Version",
581                   __FILE__, DDocStd_SetStorageVersion, g);
582 }