0029296: Data Exchange - implement import of mesh data from files in OBJ format
[occt.git] / src / XDEDRAW / XDEDRAW_Common.cxx
1 // Created on: 2003-08-15
2 // Created by: Sergey ZARITCHNY
3 // Copyright (c) 2003-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
17 #include <DDocStd.hxx>
18 #include <DDocStd_DrawDocument.hxx>
19 #include <Draw.hxx>
20 #include <Draw_Interpretor.hxx>
21 #include <IFSelect_SessionPilot.hxx>
22 #include <IGESCAFControl_Reader.hxx>
23 #include <IGESCAFControl_Writer.hxx>
24 #include <IGESControl_Controller.hxx>
25 #include <Interface_Macros.hxx>
26 #include <STEPCAFControl_ExternFile.hxx>
27 #include <STEPCAFControl_Reader.hxx>
28 #include <STEPCAFControl_Writer.hxx>
29 #include <STEPControl_Controller.hxx>
30 #include <TCollection_ExtendedString.hxx>
31 #include <TDataStd_Name.hxx>
32 #include <TDF_Data.hxx>
33 #include <TDocStd_Application.hxx>
34 #include <TDocStd_Document.hxx>
35 #include <XDEDRAW.hxx>
36 #include <XDEDRAW_Common.hxx>
37 #include <XSControl_WorkSession.hxx>
38 #include <XSDRAW.hxx>
39 #include <XSDRAW_Vars.hxx>
40 #include <XSDRAWIGES.hxx>
41 #include <XSDRAWSTEP.hxx>
42 #include <VrmlAPI_Writer.hxx>
43 #include <DDF.hxx>
44
45 #include <DBRep.hxx>
46 #include <XCAFDoc_DocumentTool.hxx>
47 #include <XCAFDoc_ShapeTool.hxx>
48 #include <XCAFDoc_Editor.hxx>
49 #include <TDF_Tool.hxx>
50 #include <TopoDS_Shape.hxx>
51 #include <Interface_Static.hxx>
52 #include <UnitsMethods.hxx>
53
54 #include <stdio.h>
55
56 //============================================================
57 // Support for several models in DRAW
58 //============================================================
59 static NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)> thedictws;
60
61 static Standard_Boolean ClearDicWS()
62 {
63   thedictws.Clear();
64   return Standard_True;
65 }
66
67 static void AddWS(TCollection_AsciiString filename,
68                   const Handle(XSControl_WorkSession)& WS)
69 {
70   WS->SetVars ( new XSDRAW_Vars ); // support of DRAW variables
71   thedictws.Bind( filename, WS );
72 }
73
74
75 static Standard_Boolean FillDicWS(NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)>& dicFile)
76 {
77   ClearDicWS();
78   if ( dicFile.IsEmpty() ) {
79     return Standard_False;
80   }
81   Handle(STEPCAFControl_ExternFile) EF;
82   NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)>::Iterator DicEFIt(dicFile);
83   for (; DicEFIt.More(); DicEFIt.Next() ) {
84     TCollection_AsciiString filename = DicEFIt.Key();
85     EF = DicEFIt.Value();
86     AddWS ( filename, EF->GetWS() );
87   }
88   return Standard_True;  
89 }
90
91 static Standard_Boolean SetCurrentWS (TCollection_AsciiString filename)
92 {
93   if ( !thedictws.IsBound(filename) ) return Standard_False;
94   Handle(XSControl_WorkSession) CurrentWS = 
95     Handle(XSControl_WorkSession)::DownCast( thedictws.ChangeFind(filename) );
96   XSDRAW::Pilot()->SetSession( CurrentWS );
97   
98   return Standard_True;
99 }
100
101
102 //=======================================================================
103 //function : SetCurWS
104 //purpose  : Set current file if many files are read
105 //=======================================================================
106
107 static Standard_Integer SetCurWS (Draw_Interpretor& di , Standard_Integer argc, const char** argv)
108 {
109   if (argc <2) {
110     di<<"Use: "<<argv[0]<<" filename \n";
111     return 1;
112   }
113   TCollection_AsciiString filename (argv[1]);
114   SetCurrentWS( filename );
115   return 0;
116 }
117
118
119 //=======================================================================
120 //function : GetDicWSList
121 //purpose  : List all files recorded after translation
122 //=======================================================================
123
124 static Standard_Integer GetDicWSList (Draw_Interpretor& di, Standard_Integer /*argc*/, const char** /*argv*/)
125 {
126   NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)> DictWS = thedictws;
127   if ( DictWS.IsEmpty() ) return 1;
128   NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)>::Iterator DicIt(DictWS);
129   di << " The list of last translated files:\n";
130   Standard_Integer num = 0;
131   for (; DicIt.More() ; DicIt.Next(), num++ ) {
132     TCollection_AsciiString strng ( DicIt.Key() );
133     if ( num ) di << "\n";
134     di << "\"" << strng.ToCString() << "\"";
135   }
136   return 0;
137 }
138
139 //=======================================================================
140 //function : GetCurWS
141 //purpose  : Return name of file which is current
142 //=======================================================================
143
144 static Standard_Integer GetCurWS (Draw_Interpretor& di, Standard_Integer /*argc*/, const char** /*argv*/)
145 {
146   Handle(XSControl_WorkSession) WS = XSDRAW::Session();
147   di << "\"" << WS->LoadedFile() << "\"";
148   return 0;
149 }
150
151 //=======================================================================
152 //function : FromShape
153 //purpose  : Apply fromshape command to all the loaded WSs
154 //=======================================================================
155
156 static Standard_Integer FromShape (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
157 {
158   if ( argc <2 ) {
159     di << argv[0] << " shape: search for shape origin among all last tranalated files\n";
160     return 0;
161   }
162   
163   char command[256];
164   Sprintf ( command, "fromshape %.200s -1", argv[1] );
165   NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)> DictWS = thedictws;
166   if ( DictWS.IsEmpty() ) return di.Eval ( command );
167   
168   Handle(XSControl_WorkSession) WS = XSDRAW::Session();
169
170   NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)>::Iterator DicIt ( DictWS );
171 //  di << "Searching for shape among all the loaded files:\n";
172   Standard_Integer num = 0;
173   for (; DicIt.More() ; DicIt.Next(), num++ ) {
174     Handle(XSControl_WorkSession) CurrentWS = 
175       Handle(XSControl_WorkSession)::DownCast( DicIt.Value() );
176     XSDRAW::Pilot()->SetSession( CurrentWS );
177     di.Eval ( command );
178   }
179
180   XSDRAW::Pilot()->SetSession( WS );
181   return 0;
182 }
183
184 //=======================================================================
185 //function : ReadIges
186 //purpose  : Read IGES to DECAF document
187 //=======================================================================
188
189 static Standard_Integer ReadIges (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
190 {
191   if ( argc <3 ) {
192     di << "Use: " << argv[0] << " Doc filename [mode]: read IGES file to a document\n";
193     return 0;
194   }
195   
196   DeclareAndCast(IGESControl_Controller,ctl,XSDRAW::Controller());
197   if (ctl.IsNull()) XSDRAW::SetNorm("IGES");
198  
199   TCollection_AsciiString fnom, rnom;
200   Standard_Boolean modfic = XSDRAW::FileAndVar(argv[2], argv[1], "IGES", fnom, rnom);
201   if (modfic) di << " File IGES to read : " << fnom.ToCString() << "\n";
202   else        di << " Model taken from the session : " << fnom.ToCString() << "\n";
203   //  di<<" -- Names of variables BREP-DRAW prefixed by : "<<rnom<<"\n";
204
205   IGESCAFControl_Reader reader ( XSDRAW::Session(),modfic);
206   Standard_Integer onlyvisible = Interface_Static::IVal("read.iges.onlyvisible");
207   reader.SetReadVisible(onlyvisible == 1);
208   
209   if (argc == 4) {
210     Standard_Boolean mode = Standard_True;
211     for ( Standard_Integer i = 0; argv[3][i] ; i++ ) 
212       switch (argv[3][i]) {
213       case '-' : mode = Standard_False; break;
214       case '+' : mode = Standard_True; break;
215       case 'c' : reader.SetColorMode (mode); break;
216       case 'n' : reader.SetNameMode (mode); break;
217       case 'l' : reader.SetLayerMode (mode); break;
218       }
219   }
220   IFSelect_ReturnStatus readstat = IFSelect_RetVoid;
221   if (modfic) readstat = reader.ReadFile (fnom.ToCString());
222   else  if (XSDRAW::Session()->NbStartingEntities() > 0) readstat = IFSelect_RetDone;
223   if (readstat != IFSelect_RetDone) {
224     if (modfic) di<<"Could not read file "<<fnom.ToCString()<<" , abandon\n";
225     else di<<"No model loaded\n";
226     return 1;
227   }
228
229   Handle(TDocStd_Document) doc;
230   if (!DDocStd::GetDocument(argv[1],doc,Standard_False)) {  
231     Handle(TDocStd_Application) A = DDocStd::GetApplication();
232     A->NewDocument("BinXCAF",doc);  
233     TDataStd_Name::Set(doc->GetData()->Root(),argv[1]);  
234     Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(doc);  
235     Draw::Set(argv[1],DD);       
236 //     di << "Document saved with name " << argv[1];
237   }
238   if ( ! reader.Transfer ( doc ) ) {
239     di << "Cannot read any relevant data from the IGES file\n";
240     return 1;
241   }
242   
243 //  Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(doc);  
244 //  Draw::Set(argv[1],DD);       
245   di << "Document saved with name " << argv[1];
246   
247   return 0;
248 }
249
250 //=======================================================================
251 //function : WriteIges
252 //purpose  : Write DECAF document to IGES
253 //=======================================================================
254
255 static Standard_Integer WriteIges (Draw_Interpretor& di, Standard_Integer argc, const char** argv) 
256 {
257   if ( argc <3 ) {
258     di << "Use: " << argv[0] << " Doc filename [mode]: write document to IGES file\n";
259     return 0;
260   }
261   
262   Handle(TDocStd_Document) Doc;
263   DDocStd::GetDocument(argv[1], Doc);
264   if ( Doc.IsNull() ) {
265     di << argv[1] << " is not a document\n";
266     return 1;
267   }
268   
269   XSDRAW::SetNorm ("IGES");
270   
271 //  IGESControl_Writer ICW (Interface_Static::CVal("write.iges.unit"),
272 //                        Interface_Static::IVal("write.iges.brep.mode"));
273     
274   IGESCAFControl_Writer writer ( XSDRAW::Session(), Standard_True );
275   if (argc == 4) {
276     Standard_Boolean mode = Standard_True;
277     for ( Standard_Integer i = 0; argv[3][i] ; i++ ) 
278       switch (argv[3][i]) {
279       case '-' : mode = Standard_False; break;
280       case '+' : mode = Standard_True; break;
281       case 'c' : writer.SetColorMode (mode); break;
282       case 'n' : writer.SetNameMode (mode); break;
283       case 'l' : writer.SetLayerMode (mode); break;
284       }
285   }
286   writer.Transfer ( Doc );
287
288   TCollection_AsciiString fnom, rnom;
289   Standard_Boolean modfic = XSDRAW::FileAndVar(argv[2], argv[1], "IGES", fnom, rnom);
290   if (modfic)
291   {
292     di << "Writig IGES model to file " << argv[2] << "\n";
293     if ( writer.Write ( argv[2] ) ) di<<" Write OK\n";
294     else di<<" Write failed\n";
295   }
296   else
297   {
298     di << "Document has been translated into the session";
299   }
300   return 0;
301 }
302
303 //=======================================================================
304 //function : ReadStep
305 //purpose  : Read STEP file to DECAF document 
306 //=======================================================================
307
308 static Standard_Integer ReadStep (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
309 {
310   DeclareAndCast(STEPControl_Controller,ctl,XSDRAW::Controller());
311   if (ctl.IsNull()) XSDRAW::SetNorm("STEP");
312
313   Standard_CString aDocName = NULL;
314   TCollection_AsciiString aFilePath, aModeStr;
315   for (Standard_Integer anArgIter = 1; anArgIter < argc; ++anArgIter)
316   {
317     TCollection_AsciiString anArgCase (argv[anArgIter]);
318     anArgCase.LowerCase();
319     if (aDocName == NULL)
320     {
321       aDocName = argv[anArgIter];
322     }
323     else if (aFilePath.IsEmpty())
324     {
325       aFilePath = argv[anArgIter];
326     }
327     else if (aModeStr.IsEmpty())
328     {
329       aModeStr = argv[anArgIter];
330     }
331     else
332     {
333       std::cout << "Syntax error at '" << argv[anArgIter] << "'\n";
334       return 1;
335     }
336   }
337
338   TCollection_AsciiString fnom, rnom;
339   Standard_Boolean modfic = XSDRAW::FileAndVar (aFilePath.ToCString(), aDocName, "STEP", fnom, rnom);
340   if (modfic) di << " File STEP to read : " << fnom.ToCString() << "\n";
341   else        di << " Model taken from the session : " << fnom.ToCString() << "\n";
342   //  di<<" -- Names of variables BREP-DRAW prefixed by : "<<rnom<<"\n";
343
344   STEPCAFControl_Reader reader ( XSDRAW::Session(),modfic);
345   if (!aModeStr.IsEmpty())
346   {
347     Standard_Boolean mode = Standard_True;
348     for (Standard_Integer i = 1; aModeStr.Value (i); ++i)
349     {
350       switch (aModeStr.Value (i))
351       {
352         case '-' : mode = Standard_False; break;
353         case '+' : mode = Standard_True; break;
354         case 'c' : reader.SetColorMode (mode); break;
355         case 'n' : reader.SetNameMode (mode); break;
356         case 'l' : reader.SetLayerMode (mode); break;
357         case 'v' : reader.SetPropsMode (mode); break;
358         default:
359         {
360           std::cout << "Syntax error at '" << aModeStr << "'\n";
361           return 1;
362         }
363       }
364     }
365   }
366   
367   IFSelect_ReturnStatus readstat = IFSelect_RetVoid;
368   if (modfic) readstat = reader.ReadFile (fnom.ToCString());
369   else  if (XSDRAW::Session()->NbStartingEntities() > 0) readstat = IFSelect_RetDone;
370   if (readstat != IFSelect_RetDone) {
371     if (modfic) di<<"Could not read file "<<fnom.ToCString()<<" , abandon\n";
372     else di<<"No model loaded\n";
373     return 1;
374   }
375
376   Handle(TDocStd_Document) doc;
377   if (!DDocStd::GetDocument (aDocName, doc, Standard_False))
378   {
379     Handle(TDocStd_Application) A = DDocStd::GetApplication();
380     A->NewDocument("BinXCAF",doc);
381     TDataStd_Name::Set(doc->GetData()->Root(), aDocName);
382     Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(doc);
383     Draw::Set (aDocName, DD);
384 //     di << "Document saved with name " << aDocName;
385   }
386   if ( ! reader.Transfer ( doc ) ) {
387     di << "Cannot read any relevant data from the STEP file\n";
388     return 1;
389   }
390   
391   Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(doc);
392   Draw::Set (aDocName, DD);
393   di << "Document saved with name " << aDocName;
394
395   NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)> DicFile = reader.ExternFiles();
396   FillDicWS( DicFile );
397   AddWS ( fnom , XSDRAW::Session() );
398
399   return 0;
400 }
401
402 //=======================================================================
403 //function : WriteStep
404 //purpose  : Write DECAF document to STEP
405 //=======================================================================
406
407 static Standard_Integer WriteStep (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
408 {
409   if ( argc <3 ) {
410     di << "Use: " << argv[0] << " Doc filename [mode [multifile_prefix [label]]]: write document to the STEP file\n";
411     di << "mode can be: a or 0 : AsIs (default)\n";
412     di << "             f or 1 : FacettedBRep        s or 2 : ShellBasedSurfaceModel\n";
413     di << "             m or 3 : ManifoldSolidBrep   w or 4 : GeometricCurveSet/WireFrame\n";
414     di << "multifile_prefix: triggers writing assembly components as separate files,\n";
415     di << "                  and defines common prefix for their names\n";
416     di << "label: tag of the sub-assembly label to save only that sub-assembly\n";
417     return 0;
418   }
419   
420   Handle(TDocStd_Document) Doc;   
421   DDocStd::GetDocument(argv[1], Doc);
422   if ( Doc.IsNull() ) {
423     di << argv[1] << " is not a document\n";
424     return 1;
425   }
426   Standard_CString multifile = 0;
427   
428   Standard_Integer k = 3;
429   DeclareAndCast(STEPControl_Controller,ctl,XSDRAW::Controller());
430   if (ctl.IsNull()) XSDRAW::SetNorm("STEP");
431   STEPCAFControl_Writer writer ( XSDRAW::Session(), Standard_True );
432    
433   STEPControl_StepModelType mode = STEPControl_AsIs;
434   if ( argc > k ) {
435     switch (argv[k][0]) {
436     case 'a' :
437     case '0' : mode = STEPControl_AsIs;                    break;
438     case 'f' :
439     case '1' : mode = STEPControl_FacetedBrep;             break;
440     case 's' :
441     case '2' : mode = STEPControl_ShellBasedSurfaceModel;  break;
442     case 'm' :
443     case '3' : mode = STEPControl_ManifoldSolidBrep;       break;
444     case 'w' :
445     case '4' : mode = STEPControl_GeometricCurveSet;       break;
446     default :  di<<"3st arg = mode, incorrect [give fsmw]\n"; return 1;
447     }
448     Standard_Boolean wrmode = Standard_True;
449     for ( Standard_Integer i = 0; argv[k][i] ; i++ ) 
450       switch (argv[3][i]) {
451       case '-' : wrmode = Standard_False; break;
452       case '+' : wrmode = Standard_True; break;
453       case 'c' : writer.SetColorMode (wrmode); break;
454       case 'n' : writer.SetNameMode (wrmode); break;
455       case 'l' : writer.SetLayerMode (wrmode); break;
456       case 'v' : writer.SetPropsMode (wrmode); break;
457       }
458     k++;
459   }
460
461   TDF_Label label;
462   if( argc > k)
463   {
464     TCollection_AsciiString aStr(argv[k]);
465     if( aStr.Search(":") ==-1)
466       multifile = argv[k++];
467     
468   }
469   if( argc > k)
470   {
471       
472     if( !DDF::FindLabel(Doc->Main().Data(), argv[k], label) || label.IsNull()) {  
473       di << "No label for entry"  << "\n";
474       return 1; 
475       
476     }
477   }
478   if( !label.IsNull())
479   {  
480     di << "Translating label "<< argv[k]<<" of document " << argv[1] << " to STEP\n";
481     if(!writer.Transfer ( label, mode, multifile )) 
482     {
483       di << "The label of document cannot be translated or gives no result\n";
484       return 1;
485     }
486
487   }
488   else
489   {
490     di << "Translating document " << argv[1] << " to STEP\n";
491     if ( ! writer.Transfer ( Doc, mode, multifile ) ) {
492       di << "The document cannot be translated or gives no result\n";
493     }
494   }
495   
496   TCollection_AsciiString fnom, rnom;
497   Standard_Boolean modfic = XSDRAW::FileAndVar(argv[2], argv[1], "STEP", fnom, rnom);
498   if (modfic)
499   {
500     di << "Writing STEP file " << argv[2] << "\n";
501     IFSelect_ReturnStatus stat = writer.Write(argv[2]);
502     switch (stat) {
503       case IFSelect_RetVoid : di<<"No file written\n"; break;
504       case IFSelect_RetDone : {
505         di<<"File "<<argv[2]<<" written\n";
506
507         NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)> DicFile = writer.ExternFiles();
508         FillDicWS( DicFile );
509         AddWS( argv[2], XSDRAW::Session() );
510         break;
511       }
512       default : di<<"Error on writing file\n"; break;
513     }
514   }
515   else
516   {
517     di << "Document has been translated into the session";
518   }
519   return 0;
520 }
521
522 static Standard_Integer Expand (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
523 {
524   if (argc < 3) {
525     di<<"Use: "<<argv[0]<<" Doc recurs(0/1) or Doc recurs(0/1) label1 label2 ... or Doc recurs(0/1 shape1 shape2 ...\n";
526     return 1;
527   }
528   Handle(TDocStd_Document) Doc;   
529   DDocStd::GetDocument(argv[1], Doc);
530   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
531
532   Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
533   Standard_Boolean recurs = Standard_False;
534   if(atoi(argv[2]) != 0)
535     recurs = Standard_True;
536
537   if (argc == 3)
538   {
539     if(!XCAFDoc_Editor::Expand(Doc->Main(), recurs)){
540       di << "No suitable labels to expand\n";
541       return 1;
542     }
543   }
544   else 
545   {
546     for (Standard_Integer i = 3; i < argc; i++)
547     {
548       TDF_Label aLabel;
549       TDF_Tool::Label(Doc->GetData(), argv[i], aLabel);
550       if(aLabel.IsNull()){
551         TopoDS_Shape aShape;
552         aShape = DBRep::Get(argv[i]);
553         aLabel = aShapeTool->FindShape(aShape);
554       }
555
556       if (!aLabel.IsNull()){
557         if(!XCAFDoc_Editor::Expand(Doc->Main(), aLabel, recurs)){
558           di << "The shape is assembly or not compound\n";
559           return 1;
560         }
561       }
562       else
563       { di << argv[i] << " is not a shape\n"; return 1; }
564     }
565   }
566   return 0;
567 }
568
569
570 //=======================================================================
571 //function : WriteVrml
572 //purpose  : Write DECAF document to Vrml
573 //=======================================================================
574
575 static Standard_Integer WriteVrml(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
576 {
577   if (argc <3) {
578     di << "Use: " << argv[0] << " Doc filename: write document to Vrml file\n";
579     return 0;
580   }
581
582   Handle(TDocStd_Document) aDoc;
583   DDocStd::GetDocument(argv[1], aDoc);
584   if (aDoc.IsNull()) {
585     di << argv[1] << " is not a document\n";
586     return 1;
587   }
588
589   if (argc < 3 || argc > 5)
590   {
591     di << "wrong number of parameters\n";
592     return 0;
593   }
594
595   VrmlAPI_Writer writer;
596   writer.SetRepresentation(VrmlAPI_ShadedRepresentation);
597   Standard_Real anOCCLengthUnit =
598       UnitsMethods::GetLengthFactorValue(Interface_Static::IVal("xstep.cascade.unit"));
599   Standard_Real aScale = 0.001*anOCCLengthUnit;
600   writer.WriteDoc(aDoc, argv[2], aScale);
601
602   return 0;
603 }
604
605
606 void XDEDRAW_Common::InitCommands(Draw_Interpretor& di)
607 {
608   static Standard_Boolean initactor = Standard_False;
609   if (initactor)
610   {
611     return;
612   }
613   initactor = Standard_True;
614
615   Standard_CString g = "XDE translation commands";
616
617   di.Add("ReadIges" , "Doc filename: Read IGES file to DECAF document" ,__FILE__, ReadIges, g);
618   di.Add("WriteIges" , "Doc filename: Write DECAF document to IGES file" ,__FILE__, WriteIges, g);
619   di.Add("ReadStep" ,
620          "Doc filename [mode]"
621          "\n\t\t: Read STEP file to a document.",
622          __FILE__, ReadStep, g);
623   di.Add("WriteStep" , "Doc filename [mode=a [multifile_prefix] [label]]: Write DECAF document to STEP file" ,__FILE__, WriteStep, g);  
624   
625   di.Add("XFileList","Print list of files that was transfered by the last transfer" ,__FILE__, GetDicWSList , g);
626   di.Add("XFileCur", ": returns name of file which is set as current",__FILE__, GetCurWS, g);
627   di.Add("XFileSet", "filename: Set the specified file to be the current one",__FILE__, SetCurWS, g);
628   di.Add("XFromShape", "shape: do fromshape command for all the files",__FILE__, FromShape, g);
629
630   di.Add("XExpand", "XExpand Doc recursively(0/1) or XExpand Doc recursively(0/1) label1 label2 ..."  
631           "or XExpand Doc recursively(0/1) shape1 shape2 ...",__FILE__, Expand, g);
632
633   di.Add("WriteVrml", "Doc filename [version VRML#1.0/VRML#2.0 (1/2): 2 by default] [representation shaded/wireframe/both (0/1/2): 0 by default]", __FILE__, WriteVrml, g);
634
635 }