0026411: Necessary to improve XCAF to store and querying GD&T data.
[occt.git] / src / XDEDRAW / XDEDRAW.cxx
1 // Created on: 2000-08-04
2 // Created by: Pavel TELKOV
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
17 #include <AIS_InteractiveContext.hxx>
18 #include <AIS_InteractiveObject.hxx>
19 #include <AIS_Trihedron.hxx>
20 #include <Aspect_TypeOfLine.hxx>
21 #include <DBRep.hxx>
22 #include <DDF_Browser.hxx>
23 #include <DDocStd.hxx>
24 #include <DDocStd_DrawDocument.hxx>
25 #include <Draw.hxx>
26 #include <Draw_PluginMacro.hxx>
27 #include <Geom_Axis2Placement.hxx>
28 #include <Prs3d_Drawer.hxx>
29 #include <Prs3d_LineAspect.hxx>
30 #include <Quantity_Color.hxx>
31 #include <STEPCAFControl_Controller.hxx>
32 #include <TCollection_AsciiString.hxx>
33 #include <TCollection_ExtendedString.hxx>
34 #include <TCollection_HAsciiString.hxx>
35 #include <TColStd_HArray1OfInteger.hxx>
36 #include <TColStd_HArray1OfReal.hxx>
37 #include <TColStd_HSequenceOfExtendedString.hxx>
38 #include <TDataStd_AsciiString.hxx>
39 #include <TDataStd_ByteArray.hxx>
40 #include <TDataStd_Comment.hxx>
41 #include <TDataStd_Integer.hxx>
42 #include <TDataStd_IntegerArray.hxx>
43 #include <TDataStd_Name.hxx>
44 #include <TDataStd_Real.hxx>
45 #include <TDataStd_RealArray.hxx>
46 #include <TDataStd_TreeNode.hxx>
47 #include <TDataStd_UAttribute.hxx>
48 #include <TDF_AttributeIterator.hxx>
49 #include <TDF_Data.hxx>
50 #include <TDF_LabelSequence.hxx>
51 #include <TDF_Reference.hxx>
52 #include <TDF_Tool.hxx>
53 #include <TDocStd_Document.hxx>
54 #include <TDocStd_Owner.hxx>
55 #include <TNaming_NamedShape.hxx>
56 #include <TopoDS_Shape.hxx>
57 #include <TPrsStd_AISPresentation.hxx>
58 #include <TPrsStd_AISViewer.hxx>
59 #include <TPrsStd_NamedShapeDriver.hxx>
60 #include <V3d_View.hxx>
61 #include <V3d_Viewer.hxx>
62 #include <ViewerTest.hxx>
63 #include <XCAFApp_Application.hxx>
64 #include <XCAFDoc.hxx>
65 #include <XCAFDoc_Area.hxx>
66 #include <XCAFDoc_Centroid.hxx>
67 #include <XCAFDoc_Color.hxx>
68 #include <XCAFDoc_ColorTool.hxx>
69 #include <XCAFDoc_DimTol.hxx>
70 #include <XCAFDoc_Dimension.hxx>
71 #include <XCAFDoc_Datum.hxx>
72 #include <XCAFDoc_GeomTolerance.hxx>
73 #include <XCAFDoc_DocumentTool.hxx>
74 #include <XCAFDoc_GraphNode.hxx>
75 #include <XCAFDoc_LayerTool.hxx>
76 #include <XCAFDoc_Material.hxx>
77 #include <XCAFDoc_ShapeTool.hxx>
78 #include <XCAFDoc_Volume.hxx>
79 #include <XCAFPrs.hxx>
80 #include <XCAFPrs_Driver.hxx>
81 #include <XDEDRAW.hxx>
82 #include <XDEDRAW_Colors.hxx>
83 #include <XDEDRAW_Common.hxx>
84 #include <XDEDRAW_Layers.hxx>
85 #include <XDEDRAW_Props.hxx>
86 #include <XDEDRAW_Shapes.hxx>
87 #include <XDEDRAW_GDTs.hxx>
88 #include <XSDRAW.hxx>
89 #include <XSDRAWIGES.hxx>
90 #include <XSDRAWSTEP.hxx>
91
92 #include <stdio.h>
93 #define ZVIEW_SIZE 1000000.0
94 // avoid warnings on 'extern "C"' functions returning C++ classes
95 #ifdef WNT
96 #pragma warning(4:4190)
97 #endif
98
99 //=======================================================================
100 // Section: General commands
101 //=======================================================================
102
103 //=======================================================================
104 //function : newDoc
105 //purpose  :
106 //=======================================================================
107 static Standard_Integer newDoc (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
108 {
109   if (argc < 2) {di<<"Give document name"<<"\n";return 1;}
110
111   Handle(TDocStd_Document) D;
112   Handle(DDocStd_DrawDocument) DD;
113   Handle(TDocStd_Application) A;
114
115   if (!DDocStd::Find(A)) return 1;
116
117   if (!DDocStd::GetDocument(argv[1],D,Standard_False)) {
118     A->NewDocument(  "BinXCAF"  ,D);
119     DD = new DDocStd_DrawDocument(D);
120     TDataStd_Name::Set(D->GetData()->Root(),argv[1]);
121     Draw::Set(argv[1],DD);
122     di << "document " << argv[1] << " created" << "\n";
123     //DDocStd::ReturnLabel(di,D->Main());
124   }
125   else di << argv[1] << " is already a document" << "\n";
126
127   return 0;
128 }
129
130
131 //=======================================================================
132 //function : saveDoc
133 //purpose  :
134 //=======================================================================
135 static Standard_Integer saveDoc (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
136 {
137   Handle(TDocStd_Document) D;
138   Handle(TDocStd_Application) A;
139   if (!DDocStd::Find(A)) return 1;
140
141   if (argc == 1) {
142     if (A->NbDocuments() < 1) return 1;
143     A->GetDocument(1, D);
144   }
145   else {
146     if (!DDocStd::GetDocument(argv[1],D)) return 1;
147   }
148
149   if (argc == 3 ) {
150     TCollection_ExtendedString path (argv[2]);
151     A->SaveAs(D,path);
152     return 0;
153   }
154   if (!D->IsSaved()) {
155     di << "this document has never been saved" << "\n";
156     return 1;
157   }
158   A->Save(D);
159   return 0;
160 }
161
162 //=======================================================================
163 //function : openDoc
164 //purpose  :
165 //=======================================================================
166 static Standard_Integer openDoc (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
167 {
168   Handle(TDocStd_Document) D;
169   Handle(DDocStd_DrawDocument) DD;
170   Handle(TDocStd_Application) A;
171
172   if ( !DDocStd::Find(A) )
173     return 1;
174
175   if ( argc != 3 )
176   {
177     di << "invalid number of arguments. Usage:\t XOpen filename docname" << "\n";
178     return 1;
179   }
180
181   Standard_CString Filename = argv[1];
182   Standard_CString DocName = argv[2];
183
184   if ( DDocStd::GetDocument(DocName, D, Standard_False) )
185   {
186     di << "document with name " << DocName << " already exists" << "\n";
187     return 1;
188   }
189
190   if ( A->Open(Filename, D) != PCDM_RS_OK )
191   {
192     di << "cannot open XDE document" << "\n";
193     return 1;
194   }
195
196   DD = new DDocStd_DrawDocument(D);
197   TDataStd_Name::Set(D->GetData()->Root(), DocName);
198   Draw::Set(DocName, DD);
199
200   di << "document " << DocName << " opened" << "\n";
201
202   return 0;
203 }
204
205 //=======================================================================
206 //function : dump
207 //purpose  :
208 //=======================================================================
209 static Standard_Integer dump (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
210 {
211   if (argc<2) {
212     di<<"Use: "<<argv[0]<<" Doc [int deep (0/1)]"<<"\n";
213     return 1;
214   }
215   Handle(TDocStd_Document) Doc;
216   DDocStd::GetDocument(argv[1], Doc);
217   if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
218
219   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
220   Standard_Boolean deep = Standard_False;
221   if ( (argc==3) && (Draw::Atoi(argv[2])==1) ) deep = Standard_True;
222   Standard_SStream aDumpLog;
223   myAssembly->Dump(aDumpLog, deep);
224   di<<aDumpLog;
225   return 0;
226 }
227
228
229 //=======================================================================
230 //function : StatAssembly
231 //purpose  : recursive part of statistics
232 //=======================================================================
233
234 static void StatAssembly(const TDF_Label L,
235                          const Standard_Integer level,
236                          Handle(TColStd_HArray1OfInteger) &HAI,
237                          Standard_Integer &NbCentroidProp,
238                          Standard_Integer &NbVolumeProp,
239                          Standard_Integer &NbAreaProp,
240                          Standard_Integer &NbShapesWithName,
241                          Standard_Integer &NbShapesWithColor,
242                          Standard_Integer &NbShapesWithLayer,
243                          Handle(TDocStd_Document) &aDoc,
244                          Standard_Boolean &PrintStructMode,
245                          Draw_Interpretor& di)
246 {
247   if(PrintStructMode) {
248     for(Standard_Integer j=0; j<=level; j++)
249       di<<"  ";
250   }
251   TCollection_AsciiString Entry;
252   TDF_Tool::Entry(L, Entry);
253   if(PrintStructMode) di<<Entry.ToCString();
254
255   Handle(TDataStd_Name) Name;
256   if(L.FindAttribute(TDataStd_Name::GetID(), Name)) {
257     NbShapesWithName++;
258     if(PrintStructMode) {
259       TCollection_AsciiString AsciiStringName(Name->Get(),'?');
260       di<<" "<<AsciiStringName.ToCString()<<"  has attributes: ";
261     }
262   }
263   else {
264     if(PrintStructMode) di<<" NoName  has attributes: ";
265   }
266
267   Handle(XCAFDoc_Centroid) aCentroid = new (XCAFDoc_Centroid);
268   if(L.FindAttribute(XCAFDoc_Centroid::GetID(), aCentroid)) {
269     if(PrintStructMode) di<<"Centroid ";
270     NbCentroidProp++;
271   }
272   Standard_Real tmp;
273   if(XCAFDoc_Volume::Get(L,tmp)) {
274     if(PrintStructMode) di<<"Volume("<<tmp<<") ";
275     NbVolumeProp++;
276   }
277   if(XCAFDoc_Area::Get(L,tmp)) {
278     if(PrintStructMode) di<<"Area("<<tmp<<") ";
279     NbAreaProp++;
280   }
281   Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool(aDoc->Main());
282   Quantity_Color col;
283   Standard_Boolean IsColor = Standard_False;
284   if(CTool->GetColor(L,XCAFDoc_ColorGen,col))
285     IsColor = Standard_True;
286   else if(CTool->GetColor(L,XCAFDoc_ColorSurf,col))
287     IsColor = Standard_True;
288   else if(CTool->GetColor(L,XCAFDoc_ColorCurv,col))
289     IsColor = Standard_True;
290   if(IsColor) {
291     TCollection_AsciiString Entry1;
292     Entry1 = col.StringName(col.Name());
293     if(PrintStructMode) di<<"Color("<<Entry1.ToCString()<<") ";
294     NbShapesWithColor++;
295   }
296   Handle(XCAFDoc_LayerTool) LTool = XCAFDoc_DocumentTool::LayerTool(aDoc->Main());
297   Handle(TColStd_HSequenceOfExtendedString) aLayerS;
298   LTool->GetLayers(L, aLayerS);
299   if(!aLayerS.IsNull() && aLayerS->Length()>0) {
300     if(PrintStructMode) {
301       di<<"Layer(";
302       for(Standard_Integer i=1; i<=aLayerS->Length(); i++) {
303         TCollection_AsciiString Entry2(aLayerS->Value(i),'?');
304         if(i==1)
305           di<<"\""<<Entry2.ToCString()<<"\"";
306         else
307           di<<" "<<"\""<<Entry2.ToCString()<<"\"";
308       }
309       di<<") ";
310     }
311     NbShapesWithLayer++;
312   }
313   if(PrintStructMode) di<<"\n";
314   
315   HAI->SetValue(level, HAI->Value(level)+1 );
316   if(L.HasChild()) {
317     for(Standard_Integer i=1; i<=L.NbChildren(); i++) {
318       StatAssembly(L.FindChild(i), level+1, HAI, NbCentroidProp, NbVolumeProp,
319                    NbAreaProp, NbShapesWithName, NbShapesWithColor,
320                    NbShapesWithLayer, aDoc, PrintStructMode, di);
321     }
322   }
323
324 }
325
326
327 //=======================================================================
328 //function : statdoc
329 //purpose  : 
330 //=======================================================================
331 static Standard_Integer statdoc (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
332 {
333   if (argc<2) {
334     di<<"Use: "<<argv[0]<<" Doc "<<"\n";
335     return 1;
336   }
337   Handle(TDocStd_Document) Doc;   
338   DDocStd::GetDocument(argv[1], Doc);
339   if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
340
341   Standard_Boolean PrintStructMode = (argc==3);
342   Handle(XCAFDoc_ShapeTool) aTool = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
343
344   TDF_LabelSequence SeqLabels;
345   aTool->GetShapes(SeqLabels);
346   if(SeqLabels.Length()<=0) return 0;
347   if(PrintStructMode) di<<"\n"<<"Structure of shapes in the document:"<<"\n";
348   Standard_Integer level=0;
349   Standard_Integer NbCentroidProp=0, NbVolumeProp=0, NbAreaProp=0;
350   Standard_Integer NbShapesWithName=0, NbShapesWithColor=0, NbShapesWithLayer=0;
351   Handle(TColStd_HArray1OfInteger) HAI = new TColStd_HArray1OfInteger(0,20);
352   Standard_Integer i=0;
353   for(i=0; i<=20; i++) HAI->SetValue(i,0);
354   for(i=1; i<=SeqLabels.Length(); i++) {
355     StatAssembly(SeqLabels.Value(i), level, HAI, NbCentroidProp, NbVolumeProp,
356                  NbAreaProp, NbShapesWithName, NbShapesWithColor,
357                  NbShapesWithLayer, Doc, PrintStructMode, di);
358   }
359   Standard_Integer NbLabelsShape = 0;
360   di<<"\n"<<"Statistis of shapes in the document:"<<"\n";
361   for(i=0; i<=20; i++) {
362     if(HAI->Value(i)==0) break;
363     //di<<"level N "<<i<<" :  number of labels with shape = "<<HAI->Value(i)<<"\n";
364     di<<"level N "<<i<<" : "<<HAI->Value(i)<<"\n";
365     NbLabelsShape = NbLabelsShape + HAI->Value(i);
366   }
367   di<<"Total number of labels for shapes in the document = "<<NbLabelsShape<<"\n";
368   di<<"Number of labels with name = "<<NbShapesWithName<<"\n";
369   di<<"Number of labels with color link = "<<NbShapesWithColor<<"\n";
370   di<<"Number of labels with layer link = "<<NbShapesWithLayer<<"\n";
371
372   di<<"\n"<<"Statistis of Props in the document:"<<"\n";
373   di<<"Number of Centroid Props = "<<NbCentroidProp<<"\n";
374   di<<"Number of Volume Props = "<<NbVolumeProp<<"\n";
375   di<<"Number of Area Props = "<<NbAreaProp<<"\n";
376
377   Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
378   TDF_LabelSequence CLabels;
379   CTool->GetColors(CLabels);
380   di<<"\n"<<"Number of colors = "<<CLabels.Length()<<"\n";
381   if(CLabels.Length()>0) {
382     for(i=1; i<=CLabels.Length(); i++) {
383       TDF_Label aLabel = CLabels.Value(i);
384       Quantity_Color col;
385       CTool->GetColor(aLabel, col);
386       di<<col.StringName(col.Name())<<" ";
387     }
388     di<<"\n";
389   }
390
391   Handle(XCAFDoc_LayerTool) LTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
392   TDF_LabelSequence LLabels;
393   LTool->GetLayerLabels(LLabels);
394   di<<"\n"<<"Number of layers = "<<LLabels.Length()<<"\n";
395   if(LLabels.Length()>0) {
396     for(i=1; i<=LLabels.Length(); i++) {
397       TDF_Label aLabel = LLabels.Value(i);
398       TCollection_ExtendedString layerName;
399       LTool->GetLayer(aLabel, layerName);
400       TCollection_AsciiString Entry(layerName,'?');
401       di<<"\""<<Entry.ToCString() <<"\" ";
402     }
403     di<<"\n";
404   }
405
406   di<<"\n";
407   return 0;
408 }
409
410
411 //=======================================================================
412 //function : setPrs
413 //purpose  :
414 //=======================================================================
415 static Standard_Integer setPrs (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
416 {
417   if (argc <2) {
418     di<<"Use: "<<argv[0]<<" DocName [label1 label2 ...] "<<"\n";
419     return 1;
420   }
421
422   Handle(TDocStd_Document) Doc;
423   DDocStd::GetDocument(argv[1], Doc);
424   if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
425
426   // collect sequence of labels to set presentation
427   Handle(XCAFDoc_ShapeTool) shapes = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
428   TDF_LabelSequence seq;
429   if ( argc >2 ) {
430     for ( Standard_Integer i=2; i < argc; i++ ) {
431       TDF_Label aLabel;
432       TDF_Tool::Label(Doc->GetData(), argv[i], aLabel);
433       if ( aLabel.IsNull() || ! shapes->IsShape ( aLabel ) ) {
434         di << argv[i] << " is not a valid shape label!";
435         continue;
436       }
437       seq.Append ( aLabel );
438     }
439   }
440   else {
441     shapes->GetShapes ( seq );
442   }
443
444   // set presentations
445   Handle(XCAFDoc_ColorTool) colors = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
446   for ( Standard_Integer i=1; i <= seq.Length(); i++ ) {
447     Handle(TPrsStd_AISPresentation) prs;
448     if ( ! seq.Value(i).FindAttribute ( TPrsStd_AISPresentation::GetID(), prs ) ) {
449       prs = TPrsStd_AISPresentation::Set(seq.Value(i),XCAFPrs_Driver::GetID());
450       prs->SetMaterial ( Graphic3d_NOM_PLASTIC );
451     }
452 //    Quantity_Color Col;
453 //    if ( colors.GetColor ( seq.Value(i), XCAFDoc_ColorSurf, Col ) )
454 //      prs->SetColor ( Col.Name() );
455 //    else if ( colors.GetColor ( seq.Value(i), XCAFDoc_ColorCurv, Col ) )
456 //      prs->SetColor ( Col.Name() );
457   }
458   return 0;
459 }
460
461
462 //=======================================================================
463 //function : show
464 //purpose  :
465 //=======================================================================
466 static Standard_Integer show (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
467 {
468   if (argc <2) {
469     di<<"Use: "<<argv[0]<<" DocName [label1 label2 ...] "<<"\n";
470     return 1;
471   }
472
473   Handle(TDocStd_Document) aDoc;
474   DDocStd::GetDocument (argv[1], aDoc);
475   if (aDoc.IsNull())
476   {
477     std::cout << argv[1] << " is not a document\n";
478     return 1;
479   }
480
481   // init viewer
482   TDF_Label aRoot = aDoc->GetData()->Root();
483   Handle(TPrsStd_AISViewer) aDocViewer;
484   TCollection_AsciiString   aViewName = TCollection_AsciiString ("Driver1/Document_") + argv[1] + "/View1";
485   if (!TPrsStd_AISViewer::Find (aRoot, aDocViewer))
486   {
487     ViewerTest::ViewerInit (0, 0, 0, 0, aViewName.ToCString(), "");
488     aDocViewer = TPrsStd_AISViewer::New (aRoot, ViewerTest::GetAISContext());
489   }
490
491   //szv:CAX-TRJ7 c2-pe-214.stp was clipped
492   aDocViewer->GetInteractiveContext()->CurrentViewer()->InitActiveViews();
493   aDocViewer->GetInteractiveContext()->CurrentViewer()->ActiveView()->SetZSize(ZVIEW_SIZE);
494   //DDF::ReturnLabel(di,viewer->Label());
495
496   // collect sequence of labels to display
497   Handle(XCAFDoc_ShapeTool) shapes = XCAFDoc_DocumentTool::ShapeTool (aDoc->Main());
498   TDF_LabelSequence seq;
499   if ( argc >2 ) {
500     for ( Standard_Integer i=2; i < argc; i++ ) {
501       TDF_Label aLabel;
502       TDF_Tool::Label (aDoc->GetData(), argv[i], aLabel);
503       if ( aLabel.IsNull() || ! shapes->IsShape ( aLabel ) ) {
504         di << argv[i] << " is not a valid shape label!";
505         continue;
506       }
507       seq.Append ( aLabel );
508     }
509   }
510   else {
511     shapes->GetFreeShapes ( seq );
512   }
513
514   // set presentations and show
515   //Handle(XCAFDoc_ColorTool) colors = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
516   for ( Standard_Integer i=1; i <= seq.Length(); i++ ) {
517     Handle(TPrsStd_AISPresentation) prs;
518     if ( ! seq.Value(i).FindAttribute ( TPrsStd_AISPresentation::GetID(), prs ) ) {
519       prs = TPrsStd_AISPresentation::Set(seq.Value(i),XCAFPrs_Driver::GetID());
520       prs->SetMaterial ( Graphic3d_NOM_PLASTIC );
521     }
522 //    Quantity_Color Col;
523 //    if ( colors.GetColor ( seq.Value(i), XCAFDoc_ColorSurf, Col ) )
524 //      prs->SetColor ( Col.Name() );
525 //    else if ( colors.GetColor ( seq.Value(i), XCAFDoc_ColorCurv, Col ) )
526 //      prs->SetColor ( Col.Name() );
527     prs->Display(Standard_True);
528   }
529   TPrsStd_AISViewer::Update (aDoc->GetData()->Root());
530   return 0;
531 }
532
533
534 //=======================================================================
535 //function : xwd
536 //purpose  :
537 //=======================================================================
538 static Standard_Integer xwd (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
539 {
540   if (argc <3) {
541     di<<"Use: "<<argv[0]<<" DocName filename.{xwd|gif|bmp}"<<"\n";
542     return 1;
543   }
544
545   Handle(TDocStd_Document) Doc;
546   DDocStd::GetDocument(argv[1], Doc);
547   if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
548
549   Handle(AIS_InteractiveContext) IC;
550   if ( ! TPrsStd_AISViewer::Find ( Doc->GetData()->Root(), IC ) ) {
551     di << "Cannot find viewer for document " << argv[1] << "\n";
552     return 1;
553   }
554
555   Handle(V3d_Viewer) viewer = IC->CurrentViewer();
556   viewer->InitActiveViews();
557   if ( viewer->MoreActiveViews() ) {
558     viewer->ActiveView()->Dump ( argv[2] );
559   }
560   else {
561     di << "Cannot find an active view in a viewer " << argv[1] << "\n";
562     return 1;
563   }
564
565   return 0;
566 }
567
568
569 //=======================================================================
570 //function : XAttributeValue
571 //purpose  :
572 //=======================================================================
573 static Standard_Integer XAttributeValue (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
574 {
575   if ( argc <4 ) { di << "ERROR: Too few args" << "\n"; return 0; }
576   Handle(DDF_Browser) browser =
577     Handle(DDF_Browser)::DownCast (Draw::Get(argv[1], Standard_True));
578   if ( browser.IsNull() ) { di << "ERROR: Not a browser: " << argv[1] << "\n"; return 0; }
579
580   TDF_Label lab;
581   TDF_Tool::Label(browser->Data(),argv[2],lab);
582   if ( lab.IsNull() ) { di << "ERROR: label is Null: " << argv[2] << "\n"; return 0; }
583
584   Standard_Integer num = Draw::Atoi ( argv[3] );
585   TDF_AttributeIterator itr(lab,Standard_False);
586   for (Standard_Integer i=1; itr.More() && i < num; i++) itr.Next();
587
588   if ( ! itr.More() ) { di << "ERROR: Attribute #" << num << " not found" << "\n"; return 0; }
589
590   const Handle(TDF_Attribute)& att = itr.Value();
591   if ( att->IsKind(STANDARD_TYPE(TDataStd_TreeNode)) ) {
592     Standard_CString type = "";
593     if ( att->ID() == XCAFDoc::ShapeRefGUID() ) type = "Shape Instance Link";
594     else if ( att->ID() == XCAFDoc::ColorRefGUID(XCAFDoc_ColorGen) ) type = "Generic Color Link";
595     else if ( att->ID() == XCAFDoc::ColorRefGUID(XCAFDoc_ColorSurf) ) type = "Surface Color Link";
596     else if ( att->ID() == XCAFDoc::ColorRefGUID(XCAFDoc_ColorCurv) ) type = "Curve Color Link";
597     else if ( att->ID() == XCAFDoc::DimTolRefGUID() ) type = "DGT Link";
598     else if ( att->ID() == XCAFDoc::GeomToleranceRefGUID() ) type = "GeomTolerance Link";
599     else if ( att->ID() == XCAFDoc::DatumRefGUID() ) type = "Datum Link";
600     else if ( att->ID() == XCAFDoc::MaterialRefGUID() ) type = "Material Link";
601     Handle(TDataStd_TreeNode) TN = Handle(TDataStd_TreeNode)::DownCast(att);
602     TCollection_AsciiString ref;
603     if ( TN->HasFather() ) {
604       TDF_Tool::Entry ( TN->Father()->Label(), ref );
605       di << type << " ==> " << ref.ToCString();
606     }
607     else {
608       di << type << " <== (" << ref.ToCString();
609       Handle(TDataStd_TreeNode) child = TN->First();
610       while ( ! child.IsNull() ) {
611         TDF_Tool::Entry ( child->Label(), ref );
612         if ( child != TN->First() ) di << ", ";
613         di << ref.ToCString();
614         child = child->Next();
615       }
616       di << ")";
617     }
618   }
619   else if ( att->IsKind(STANDARD_TYPE(TDF_Reference)) ) {
620     Handle(TDF_Reference) val = Handle(TDF_Reference)::DownCast ( att );
621     TCollection_AsciiString ref;
622     TDF_Tool::Entry ( val->Get(), ref );
623     di << "==> " << ref.ToCString();
624   }
625   else if ( att->IsKind(STANDARD_TYPE(TDataStd_Integer)) ) {
626     Handle(TDataStd_Integer) val = Handle(TDataStd_Integer)::DownCast ( att );
627     TCollection_AsciiString str ( val->Get() );
628     di << str.ToCString();
629   }
630   else if ( att->IsKind(STANDARD_TYPE(TDataStd_Real)) ) {
631     Handle(TDataStd_Real) val = Handle(TDataStd_Real)::DownCast ( att );
632     TCollection_AsciiString str ( val->Get() );
633     di << str.ToCString();
634   }
635   else if ( att->IsKind(STANDARD_TYPE(TDataStd_Name)) ) {
636     Handle(TDataStd_Name) val = Handle(TDataStd_Name)::DownCast ( att );
637     TCollection_AsciiString str ( val->Get(), '?' );
638     di << str.ToCString();
639   }
640   else if ( att->IsKind(STANDARD_TYPE(TDataStd_Comment)) ) {
641     Handle(TDataStd_Comment) val = Handle(TDataStd_Comment)::DownCast ( att );
642     TCollection_AsciiString str ( val->Get(), '?' );
643     di << str.ToCString();
644   }
645   else if ( att->IsKind(STANDARD_TYPE(TDataStd_AsciiString)) ) {
646     Handle(TDataStd_AsciiString) val = Handle(TDataStd_AsciiString)::DownCast ( att );
647     TCollection_AsciiString str ( val->Get(), '?' );
648     di << str.ToCString();
649   }
650   else if ( att->IsKind(STANDARD_TYPE(TDataStd_IntegerArray)) ) {
651     Handle(TDataStd_IntegerArray) val = Handle(TDataStd_IntegerArray)::DownCast ( att );
652     for ( Standard_Integer j=val->Lower(); j <= val->Upper(); j++ ) {
653       if ( j > val->Lower() ) di << ", ";
654       TCollection_AsciiString str ( val->Value(j) );
655       di << str.ToCString();
656     }
657   }
658   else if ( att->IsKind(STANDARD_TYPE(TDataStd_RealArray)) ) {
659     Handle(TDataStd_RealArray) val = Handle(TDataStd_RealArray)::DownCast ( att );
660     for ( Standard_Integer j=val->Lower(); j <= val->Upper(); j++ ) {
661       if ( j > val->Lower() ) di << ", ";
662       TCollection_AsciiString str ( val->Value(j) );
663       di << str.ToCString();
664     }
665   }
666   else if ( att->IsKind(STANDARD_TYPE(TDataStd_ByteArray)) ) {
667     Handle(TDataStd_ByteArray) val = Handle(TDataStd_ByteArray)::DownCast ( att );
668     for ( Standard_Integer j=val->Lower(); j <= val->Upper(); j++ ) {
669       if ( j > val->Lower() ) di << ", ";
670       TCollection_AsciiString str ( val->Value(j) );
671       di << str.ToCString();
672     }
673   }
674   else if ( att->IsKind(STANDARD_TYPE(TNaming_NamedShape)) ) {
675     Handle(TNaming_NamedShape) val = Handle(TNaming_NamedShape)::DownCast ( att );
676     TopoDS_Shape S = val->Get();
677     di << S.TShape()->DynamicType()->Name();
678     if ( ! S.Location().IsIdentity() ) di << "(located)";
679   }
680   else if ( att->IsKind(STANDARD_TYPE(XCAFDoc_Volume)) ) {
681     Handle(XCAFDoc_Volume) val = Handle(XCAFDoc_Volume)::DownCast ( att );
682     TCollection_AsciiString str ( val->Get() );
683     di << str.ToCString();
684   }
685   else if ( att->IsKind(STANDARD_TYPE(XCAFDoc_Area)) ) {
686     Handle(XCAFDoc_Area) val = Handle(XCAFDoc_Area)::DownCast ( att );
687     TCollection_AsciiString str ( val->Get() );
688     di << str.ToCString();
689   }
690   else if ( att->IsKind(STANDARD_TYPE(XCAFDoc_Centroid)) ) {
691     Handle(XCAFDoc_Centroid) val = Handle(XCAFDoc_Centroid)::DownCast ( att );
692     gp_Pnt myCentroid = val->Get();
693     di << "(" ;
694     di << myCentroid.X();
695     di <<" , ";
696     di << myCentroid.Y();
697     di <<" , ";
698     di << myCentroid.Z();
699     di << ")";
700   }
701   else if ( att->IsKind(STANDARD_TYPE(TDataStd_UAttribute)) ) {
702     if ( att->ID() == XCAFDoc::AssemblyGUID() ) di << "is assembly";
703     if ( att->ID() == XCAFDoc::InvisibleGUID() ) di << "invisible";
704   }
705   else if ( att->IsKind(STANDARD_TYPE(XCAFDoc_Color)) ) {
706     Handle(XCAFDoc_Color) val = Handle(XCAFDoc_Color)::DownCast ( att );
707     Quantity_Color C = val->GetColor();
708     char string[260];
709     Sprintf ( string, "%s (%g, %g, %g)", C.StringName ( C.Name() ),
710               C.Red(), C.Green(), C.Blue() );
711     di << string;
712   }
713   else if ( att->IsKind(STANDARD_TYPE(XCAFDoc_DimTol)) ) {
714     Handle(XCAFDoc_DimTol) val = Handle(XCAFDoc_DimTol)::DownCast ( att );
715     Standard_Integer kind = val->GetKind();
716     Handle(TColStd_HArray1OfReal) HAR = val->GetVal();
717     if(kind<20) { //dimension
718       di<<"Diameter (ValueRange["<<HAR->Value(1)<<","<<HAR->Value(2)<<"])";
719     }
720     else {
721       switch(kind) {
722       case 21: di << "GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol_1 (Value="<<HAR->Value(1)<<")"; break;
723       case 22: di << "GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol_2 (Value="<<HAR->Value(1)<<")"; break;
724       case 23: di << "GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol_3 (Value="<<HAR->Value(1)<<")"; break;
725       case 24: di << "AngularityTolerance (Value="<<HAR->Value(1)<<")"; break;
726       case 25: di << "CircularRunoutTolerance (Value="<<HAR->Value(1)<<")"; break;
727       case 26: di << "CoaxialityTolerance (Value="<<HAR->Value(1)<<")"; break;
728       case 27: di << "ConcentricityTolerance (Value="<<HAR->Value(1)<<")"; break;
729       case 28: di << "ParallelismTolerance (Value="<<HAR->Value(1)<<")"; break;
730       case 29: di << "PerpendicularityTolerance (Value="<<HAR->Value(1)<<")"; break;
731       case 30: di << "SymmetryTolerance (Value="<<HAR->Value(1)<<")"; break;
732       case 31: di << "TotalRunoutTolerance (Value="<<HAR->Value(1)<<")"; break;
733       case 35: di << "ModifiedGeometricTolerance_1 (Value="<<HAR->Value(1)<<")"; break;
734       case 36: di << "ModifiedGeometricTolerance_2 (Value="<<HAR->Value(1)<<")"; break;
735       case 37: di << "ModifiedGeometricTolerance_3 (Value="<<HAR->Value(1)<<")"; break;
736       case 38: di << "CylindricityTolerance (Value="<<HAR->Value(1)<<")"; break;
737       case 39: di << "FlatnessTolerance (Value="<<HAR->Value(1)<<")"; break;
738       case 40: di << "LineProfileTolerance (Value="<<HAR->Value(1)<<")"; break;
739       case 41: di << "PositionTolerance (Value="<<HAR->Value(1)<<")"; break;
740       case 42: di << "RoundnessTolerance (Value="<<HAR->Value(1)<<")"; break;
741       case 43: di << "StraightnessTolerance (Value="<<HAR->Value(1)<<")"; break;
742       case 44: di << "SurfaceProfileTolerance (Value="<<HAR->Value(1)<<")"; break;
743       }
744     }
745   }
746   else if ( att->IsKind(STANDARD_TYPE(XCAFDoc_Material)) ) {
747     Handle(XCAFDoc_Material) val = Handle(XCAFDoc_Material)::DownCast ( att );
748     Standard_Real dens = val->GetDensity();
749     Standard_CString dimdens = "g/cu sm";
750     if(dens==0) 
751       di<<val->GetName()->ToCString();
752     else
753       di<<val->GetName()->ToCString()<<"(density="<<dens<<dimdens<<")";
754   }
755   else if ( att->IsKind(STANDARD_TYPE(XCAFDoc_GraphNode)) ) {
756     Standard_CString type;
757     if ( att->ID() == XCAFDoc::LayerRefGUID() ) {
758       type = "Layer Instance Link";
759     }
760     else if ( att->ID() == XCAFDoc::SHUORefGUID() ) {
761       type = "SHUO Instance Link";
762     }
763     else if ( att->ID() == XCAFDoc::DatumTolRefGUID() ) {
764       type = "DatumToler Link";
765     }
766     else if ( att->ID() == XCAFDoc::DimensionRefGUID() ) {
767       type = "Dimension Link";
768     }
769     else return 0;
770
771     Handle(XCAFDoc_GraphNode) DETGN = Handle(XCAFDoc_GraphNode)::DownCast(att);
772     TCollection_AsciiString ref;
773     Standard_Integer ii = 1;
774     if (DETGN->NbFathers()!=0) {
775
776       TDF_Tool::Entry ( DETGN->GetFather(ii)->Label(), ref );
777       di << type<< " ==> (" << ref.ToCString();
778       for (ii = 2; ii <= DETGN->NbFathers(); ii++) {
779         TDF_Tool::Entry ( DETGN->GetFather(ii)->Label(), ref );
780           di << ", " << ref.ToCString();
781         }
782       di << ") ";
783     }
784     ii = 1;
785     if (DETGN->NbChildren()!=0) {
786       TDF_Tool::Entry ( DETGN->GetChild(ii)->Label(), ref );
787       di << type<< " <== (" << ref.ToCString();
788       for (ii = 2; ii <= DETGN->NbChildren(); ii++) {
789         TDF_Tool::Entry ( DETGN->GetChild(ii)->Label(), ref );
790           di << ", " << ref.ToCString();
791         }
792       di << ")";
793     }
794   }
795   return 0;
796 }
797
798
799 //=======================================================================
800 //function : setviewName
801 //purpose  :
802 //=======================================================================
803 static Standard_Integer setviewName (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
804 {
805   if (argc <2) {
806     di<<"Use: "<<argv[0]<<" (1/0)"<<"\n";
807     return 1;
808   }
809   Standard_Boolean mode = Standard_False;
810   if (Draw::Atoi(argv[1]) == 1) mode = Standard_True;
811   XCAFPrs::SetViewNameMode(mode);
812   return 0;
813 }
814
815
816 //=======================================================================
817 //function : getviewName
818 //purpose  : auxilary
819 //=======================================================================
820
821 static Standard_Integer getviewName (Draw_Interpretor&  di, Standard_Integer /*argc*/, const char** /*argv*/)
822 {
823   if ( XCAFPrs::GetViewNameMode() ) di << "Display names ON"<< "\n";
824   else di << "Display names OFF"<< "\n";
825   return 0;
826 }
827
828
829 //=======================================================================
830 //function : XSetTransparency
831 //purpose  :
832 //=======================================================================
833 static Standard_Integer XSetTransparency (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
834 {
835   if (argc < 3) {
836     di<<"Use: "<<argv[0]<<" Doc Transparency [label1 label2 ...] "<<"\n";
837     return 1;
838   }
839
840   Handle(TDocStd_Document) Doc;
841   DDocStd::GetDocument(argv[1], Doc);
842   if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
843
844   const Standard_Real aTransparency = Draw::Atof(argv[2]);
845
846   // collect sequence of labels
847   Handle(XCAFDoc_ShapeTool) shapes = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
848   TDF_LabelSequence seq;
849   if ( argc > 3 ) {
850     for ( Standard_Integer i=3; i < argc; i++ ) {
851       TDF_Label aLabel;
852       TDF_Tool::Label(Doc->GetData(), argv[i], aLabel);
853       if ( aLabel.IsNull() || ! shapes->IsShape ( aLabel ) ) {
854         di << argv[i] << " is not a valid shape label!";
855         continue;
856       }
857       seq.Append ( aLabel );
858     }
859   }
860   else {
861     shapes->GetFreeShapes ( seq );
862   }
863
864   // find presentations and set transparency
865   for ( Standard_Integer i=1; i <= seq.Length(); i++ ) {
866     Handle(TPrsStd_AISPresentation) prs;
867     if ( ! seq.Value(i).FindAttribute ( TPrsStd_AISPresentation::GetID(), prs ) ) {
868       prs = TPrsStd_AISPresentation::Set(seq.Value(i),XCAFPrs_Driver::GetID());
869       prs->SetMaterial ( Graphic3d_NOM_PLASTIC );
870     }
871     prs->SetTransparency( aTransparency );
872   }
873   TPrsStd_AISViewer::Update(Doc->GetData()->Root());
874   return 0;
875 }
876
877 //=======================================================================
878 //function : XShowFaceBoundary
879 //purpose  : Set face boundaries on/off
880 //=======================================================================
881 static Standard_Integer XShowFaceBoundary (Draw_Interpretor& di,
882                                            Standard_Integer argc,
883                                            const char ** argv)
884 {
885   if (( argc != 4 && argc < 7 ) || argc > 9)
886   {
887     di << "Usage :\n " << argv[0]
888        << " Doc Label IsOn [R G B [LineWidth [LineStyle]]]\n"
889        << "   Doc       - is the document name. \n"
890        << "   Label     - is the shape label. \n"
891        << "   IsOn      - flag indicating whether the boundaries\n"
892        << "                should be turned on or off (can be set\n"
893        << "                to 0 (off) or 1 (on)).\n"
894        << "   R, G, B   - red, green and blue components of boundary\n"
895        << "                color in range (0 - 255).\n"
896        << "                (default is (0, 0, 0)\n"
897        << "   LineWidth - line width\n"
898        << "                (default is 1)\n"
899        << "   LineStyle - line fill style :\n"
900        << "                 0 - solid  \n"
901        << "                 1 - dashed \n"
902        << "                 2 - dot    \n"
903        << "                 3 - dashdot\n"
904        << "                (default is solid)";
905
906     return 1;
907   }
908
909   // get specified document
910   Handle(TDocStd_Document) aDoc;
911   DDocStd::GetDocument (argv[1], aDoc);
912   if (aDoc.IsNull())
913   {
914     di << argv[1] << " is not a document" << "\n"; 
915     return 1;
916   }
917
918   Handle(AIS_InteractiveContext) aContext;
919   if (!TPrsStd_AISViewer::Find (aDoc->GetData()->Root(), aContext)) 
920   {
921     di << "Cannot find viewer for document " << argv[1] << "\n";
922     return 1;
923   }
924
925   // get shape tool for shape verification
926   Handle(XCAFDoc_ShapeTool) aShapes =
927     XCAFDoc_DocumentTool::ShapeTool (aDoc->Main());
928
929   // get label and validate that it is a shape label
930   TDF_Label aLabel;
931   TDF_Tool::Label (aDoc->GetData(), argv[2], aLabel);
932   if (aLabel.IsNull() || !aShapes->IsShape (aLabel))
933   {
934     di << argv[2] << " is not a valid shape label!";
935     return 1;
936   }
937
938   // get presentation from label
939   Handle(TPrsStd_AISPresentation) aPrs;
940   if (!aLabel.FindAttribute (TPrsStd_AISPresentation::GetID (), aPrs))
941   {
942     aPrs = TPrsStd_AISPresentation::Set (aLabel,XCAFPrs_Driver::GetID ());
943   }
944
945   Handle(AIS_InteractiveObject) anInteractive = aPrs->GetAIS ();
946   if (anInteractive.IsNull ())
947   {
948     di << "Can't set drawer attributes.\n"
949           "Interactive object for shape label doesn't exists.";
950     return 1;
951   }
952
953   // get drawer
954   const Handle(Prs3d_Drawer)& aDrawer = anInteractive->Attributes ();
955
956   // default attributes
957   Quantity_Parameter aRed      = 0.0;
958   Quantity_Parameter aGreen    = 0.0;
959   Quantity_Parameter aBlue     = 0.0;
960   Standard_Real      aWidth    = 1.0;
961   Aspect_TypeOfLine  aLineType = Aspect_TOL_SOLID;
962   
963   // turn boundaries on/off
964   Standard_Boolean isBoundaryDraw = (Draw::Atoi (argv[3]) == 1);
965   aDrawer->SetFaceBoundaryDraw (isBoundaryDraw);
966   
967   // set boundary color
968   if (argc >= 7)
969   {
970     // Text color
971     aRed   = Draw::Atof (argv[4])/255.;
972     aGreen = Draw::Atof (argv[5])/255.;
973     aBlue  = Draw::Atof (argv[6])/255.;
974   }
975
976   // set line width
977   if (argc >= 8)
978   {
979     aWidth = (Standard_Real)Draw::Atof (argv[7]);
980   }
981
982   // select appropriate line type
983   if (argc == 9)
984   {
985     switch (Draw::Atoi (argv[8]))
986     {
987       case 1: aLineType = Aspect_TOL_DASH;    break;
988       case 2: aLineType = Aspect_TOL_DOT;     break;
989       case 3: aLineType = Aspect_TOL_DOTDASH; break;
990       default:
991         aLineType = Aspect_TOL_SOLID;
992     }
993   }
994
995   Quantity_Color aColor (aRed, aGreen, aBlue, Quantity_TOC_RGB);
996
997   Handle(Prs3d_LineAspect) aBoundaryAspect = 
998     new Prs3d_LineAspect (aColor, aLineType, aWidth);
999
1000   aDrawer->SetFaceBoundaryAspect (aBoundaryAspect);
1001
1002   aContext->Redisplay (anInteractive);
1003   
1004   return 0;
1005 }
1006
1007 //=======================================================================
1008 //function : testDoc
1009 //purpose  : Method to test destruction of document
1010 //=======================================================================
1011 static Standard_Integer testDoc (Draw_Interpretor&,
1012                                  Standard_Integer argc,
1013                                  const char ** argv)
1014 {
1015   if( argc < 2 )
1016   {
1017     cout<<"Invalid numbers of arguments should be: XTestDoc shape"<<endl;
1018     return 1;
1019   }
1020   TopoDS_Shape shape = DBRep::Get(argv[1]);
1021   if( shape.IsNull())
1022     return 1;
1023  
1024   Handle(XCAFApp_Application) A = XCAFApp_Application::GetApplication();
1025  
1026   Handle(TDocStd_Document) aD1 = new TDocStd_Document("BinXCAF");
1027   aD1->Open(A);
1028   
1029   TCollection_AsciiString  aViewName ("Driver1/DummyDocument/View1");
1030   ViewerTest::ViewerInit (0, 0, 0, 0, aViewName.ToCString(), "");
1031   TPrsStd_AISViewer::New (aD1->GetData()->Root(), ViewerTest::GetAISContext());
1032
1033   // get shape tool for shape verification
1034   Handle(XCAFDoc_ShapeTool) aShapes =
1035     XCAFDoc_DocumentTool::ShapeTool (aD1->Main());
1036   TDF_Label aLab = aShapes->AddShape(shape);
1037
1038   Handle(Geom_Axis2Placement) aPlacement = 
1039     new Geom_Axis2Placement (gp::Origin(), gp::DZ(),gp::DX());
1040   Handle(AIS_Trihedron) aTriShape = new AIS_Trihedron (aPlacement);
1041   
1042   Handle(TNaming_NamedShape) NS;
1043   Handle(TPrsStd_AISPresentation) prs;
1044   if( aLab.FindAttribute( TNaming_NamedShape::GetID(), NS) ) {
1045     prs = TPrsStd_AISPresentation::Set( NS );
1046   }
1047    
1048   if( aLab.FindAttribute(TPrsStd_AISPresentation::GetID(), prs) ) 
1049     prs->Display();
1050
1051   TPrsStd_AISViewer::Update(aLab);
1052   ViewerTest::GetAISContext()->Display (aTriShape, Standard_True);
1053   aD1->BeforeClose();
1054   aD1->Close();
1055   ViewerTest::RemoveView (aViewName);
1056   return 0;
1057 }
1058
1059
1060 //=======================================================================
1061 //function : Init
1062 //purpose  :
1063 //=======================================================================
1064
1065 void XDEDRAW::Init(Draw_Interpretor& di)
1066 {
1067
1068   static Standard_Boolean initactor = Standard_False;
1069   if (initactor) return;  initactor = Standard_True;
1070
1071   // Load static variables for STEPCAF (ssv; 16.08.2012)
1072   STEPCAFControl_Controller::Init();
1073
1074   // OCAF *** szy: use <pload> command
1075
1076 //  DDF::AllCommands(di);
1077 //  DNaming::AllCommands(di);
1078 //  DDataStd::AllCommands(di);
1079 //  DPrsStd::AllCommands(di);
1080   //DFunction::AllCommands(di);
1081 //  DDocStd::AllCommands(di);
1082
1083 //  ViewerTest::Commands (di); *** szy: use <pload> command
1084
1085   // init XCAF application (if not yet done)
1086   XCAFApp_Application::GetApplication();
1087
1088   //=====================================
1089   // General commands
1090   //=====================================
1091
1092   Standard_CString g = "XDE general commands";
1093
1094   di.Add ("XNewDoc","DocName \t: Create new DECAF document",
1095                    __FILE__, newDoc, g);
1096
1097   di.Add ("XSave","[Doc Path] \t: Save Doc or first document in session",
1098                    __FILE__, saveDoc, g);
1099
1100   di.Add ("XOpen","Path Doc \t: Open XDE Document with name Doc from Path",
1101           __FILE__, openDoc, g);
1102
1103   di.Add ("Xdump","Doc [int deep (0/1)] \t: Print information about tree's structure",
1104                    __FILE__, dump, g);
1105
1106   di.Add ("XStat","Doc \t: Print statistics of document",
1107                    __FILE__, statdoc, g);
1108
1109   di.Add ("XSetPrs","Doc [label1 lavbel2 ...] \t: Set presentation for given label(s) or whole doc",
1110                    __FILE__, setPrs, g);
1111
1112   di.Add ("XShow","Doc [label1 lavbel2 ...] \t: Display document (or some labels) in a graphical window",
1113                    __FILE__, show, g);
1114
1115   di.Add ("XWdump","Doc filename.{gif|xwd|bmp} \t: Dump contents of viewer window to XWD, GIF or BMP file",
1116                    __FILE__, xwd, g);
1117
1118   di.Add ("XAttributeValue", "Doc label #attribute: internal command for browser",
1119                    __FILE__, XAttributeValue, g);
1120
1121   di.Add ("XSetViewNameMode", "(1/0) \t: Set/Unset mode of displaying names.",
1122                    __FILE__, setviewName, g);
1123
1124   di.Add ("XGetViewNameMode", "\t: Print if  mode of displaying names is turn on.",
1125                    __FILE__, getviewName, g);
1126
1127   di.Add ("XSetTransparency", "Doc Transparency [label1 label2 ...]\t: Set transparency for given label(s) or whole doc",
1128                    __FILE__, XSetTransparency, g);
1129
1130   di.Add ("XShowFaceBoundary", 
1131           "Doc Label IsOn [R G B [LineWidth [LineStyle]]]:"
1132           "- turns on/off drawing of face boundaries and defines boundary line style",
1133           __FILE__, XShowFaceBoundary, g);
1134    di.Add ("XTestDoc", "XTestDoc shape", __FILE__, testDoc, g);
1135
1136   // Specialized commands
1137   XDEDRAW_Shapes::InitCommands ( di );
1138   XDEDRAW_Colors::InitCommands ( di );
1139   XDEDRAW_Layers::InitCommands ( di );
1140   XDEDRAW_Props::InitCommands ( di );
1141   XDEDRAW_GDTs::InitCommands ( di );
1142   XDEDRAW_Common::InitCommands ( di );//moved from EXE
1143
1144 }
1145
1146
1147 //==============================================================================
1148 // XDEDRAW::Factory
1149 //==============================================================================
1150 void XDEDRAW::Factory(Draw_Interpretor& theDI)
1151 {
1152   XSDRAWIGES::InitSelect();
1153   XSDRAWIGES::InitToBRep(theDI);
1154   XSDRAWIGES::InitFromBRep(theDI);
1155
1156   XSDRAWSTEP::InitCommands(theDI);
1157
1158   XSDRAW::LoadDraw(theDI);
1159
1160   XDEDRAW::Init(theDI);
1161
1162 #ifdef OCCT_DEBUG
1163       theDI << "Draw Plugin : All TKXDEDRAW commands are loaded" << "\n";
1164 #endif
1165 }
1166
1167 // Declare entry point PLUGINFACTORY
1168 DPLUGIN(XDEDRAW)