0031918: Application Framework - New binary format for fast reading part of OCAF...
[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 <Draw_ProgressIndicator.hxx>
28 #include <Geom_Axis2Placement.hxx>
29 #include <Prs3d_Drawer.hxx>
30 #include <Prs3d_LineAspect.hxx>
31 #include <Quantity_Color.hxx>
32 #include <STEPCAFControl_Controller.hxx>
33 #include <TCollection_AsciiString.hxx>
34 #include <TCollection_ExtendedString.hxx>
35 #include <TCollection_HAsciiString.hxx>
36 #include <TColStd_HArray1OfInteger.hxx>
37 #include <TColStd_HArray1OfReal.hxx>
38 #include <TColStd_HSequenceOfExtendedString.hxx>
39 #include <TDataStd_AsciiString.hxx>
40 #include <TDataStd_ByteArray.hxx>
41 #include <TDataStd_Comment.hxx>
42 #include <TDataStd_Integer.hxx>
43 #include <TDataStd_IntegerArray.hxx>
44 #include <TDataStd_Name.hxx>
45 #include <TDataStd_Real.hxx>
46 #include <TDataStd_RealArray.hxx>
47 #include <TDataStd_TreeNode.hxx>
48 #include <TDataStd_UAttribute.hxx>
49 #include <TDF_AttributeIterator.hxx>
50 #include <TDF_ChildIterator.hxx>
51 #include <TDF_Data.hxx>
52 #include <TDF_LabelSequence.hxx>
53 #include <TDF_Reference.hxx>
54 #include <TDF_Tool.hxx>
55 #include <TDocStd_Application.hxx>
56 #include <TDocStd_Document.hxx>
57 #include <TDocStd_Owner.hxx>
58 #include <PCDM_ReaderFilter.hxx>
59 #include <TNaming_NamedShape.hxx>
60 #include <TopoDS_Shape.hxx>
61 #include <TPrsStd_AISPresentation.hxx>
62 #include <TPrsStd_AISViewer.hxx>
63 #include <TPrsStd_DriverTable.hxx>
64 #include <TPrsStd_NamedShapeDriver.hxx>
65 #include <V3d_View.hxx>
66 #include <V3d_Viewer.hxx>
67 #include <ViewerTest.hxx>
68 #include <ViewerTest_AutoUpdater.hxx>
69 #include <XCAFDoc.hxx>
70 #include <XCAFDoc_Area.hxx>
71 #include <XCAFDoc_Centroid.hxx>
72 #include <XCAFDoc_Color.hxx>
73 #include <XCAFDoc_ColorTool.hxx>
74 #include <XCAFDoc_DimTol.hxx>
75 #include <XCAFDoc_Dimension.hxx>
76 #include <XCAFDoc_Datum.hxx>
77 #include <XCAFDoc_GeomTolerance.hxx>
78 #include <XCAFDoc_DocumentTool.hxx>
79 #include <XCAFDoc_GraphNode.hxx>
80 #include <XCAFDoc_LayerTool.hxx>
81 #include <XCAFDoc_Material.hxx>
82 #include <XCAFDoc_ShapeTool.hxx>
83 #include <XCAFDoc_Volume.hxx>
84 #include <XCAFPrs.hxx>
85 #include <XCAFPrs_AISObject.hxx>
86 #include <XCAFPrs_Driver.hxx>
87 #include <XDEDRAW.hxx>
88 #include <XDEDRAW_Colors.hxx>
89 #include <XDEDRAW_Common.hxx>
90 #include <XDEDRAW_Layers.hxx>
91 #include <XDEDRAW_Props.hxx>
92 #include <XDEDRAW_Shapes.hxx>
93 #include <XDEDRAW_GDTs.hxx>
94 #include <XDEDRAW_Views.hxx>
95 #include <XDEDRAW_Notes.hxx>
96 #include <XSDRAW.hxx>
97 #include <XSDRAWIGES.hxx>
98 #include <XSDRAWSTEP.hxx>
99
100 #include <BinXCAFDrivers.hxx>
101 #include <XmlXCAFDrivers.hxx>
102
103 #include <stdio.h>
104
105 //=======================================================================
106 // Section: General commands
107 //=======================================================================
108
109 //=======================================================================
110 //function : newDoc
111 //purpose  :
112 //=======================================================================
113 static Standard_Integer newDoc (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
114 {
115   if (argc < 2) {di<<"Give document name\n";return 1;}
116
117   Handle(TDocStd_Document) D;
118   Handle(DDocStd_DrawDocument) DD;
119   Handle(TDocStd_Application) A = DDocStd::GetApplication();
120
121   if (!DDocStd::GetDocument(argv[1],D,Standard_False)) {
122     A->NewDocument(  "BinXCAF"  ,D);
123     DD = new DDocStd_DrawDocument(D);
124     TDataStd_Name::Set(D->GetData()->Root(),argv[1]);
125     Draw::Set(argv[1],DD);
126     di << "document " << argv[1] << " created\n";
127     //DDocStd::ReturnLabel(di,D->Main());
128   }
129   else di << argv[1] << " is already a document\n";
130
131   return 0;
132 }
133
134
135 //=======================================================================
136 //function : saveDoc
137 //purpose  :
138 //=======================================================================
139 static Standard_Integer saveDoc (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
140 {
141   Handle(TDocStd_Document) D;
142   Handle(TDocStd_Application) A = DDocStd::GetApplication();
143
144   if (argc == 1) {
145     if (A->NbDocuments() < 1) return 1;
146     A->GetDocument(1, D);
147   }
148   else {
149     if (!DDocStd::GetDocument(argv[1],D)) return 1;
150   }
151
152   Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (di);
153
154   PCDM_StoreStatus aStatus = PCDM_SS_Doc_IsNull;
155   if (argc == 3)
156   {
157     TCollection_ExtendedString path (argv[2]);
158     aStatus = A->SaveAs (D, path, aProgress->Start());
159   }
160   else if (!D->IsSaved())
161   {
162     std::cout << "Storage error: this document has never been saved\n";
163     return 1;
164   }
165   else
166   {
167     aStatus = A->Save (D, aProgress->Start());
168   }
169
170   switch (aStatus)
171   {
172     case PCDM_SS_OK:
173       break;
174     case PCDM_SS_DriverFailure:
175       di << "Storage error: driver failure\n";
176       break;
177     case PCDM_SS_WriteFailure:
178       di << "Storage error: write failure\n";
179       break;
180     case PCDM_SS_Failure:
181       di << "Storage error: general failure\n";
182       break;
183     case PCDM_SS_Doc_IsNull:
184       di << "Storage error: document is NULL\n";
185       break;
186     case PCDM_SS_No_Obj:
187       di << "Storage error: no object\n";
188       break;
189     case PCDM_SS_Info_Section_Error:
190       di << "Storage error: section error\n";
191       break;
192     case PCDM_SS_UserBreak:
193       di << "Storage error: user break\n";
194       break;
195   }
196
197   return 0;
198 }
199
200 //=======================================================================
201 //function : openDoc
202 //purpose  :
203 //=======================================================================
204 static Standard_Integer openDoc (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
205 {
206   Handle(TDocStd_Document) D;
207   Handle(DDocStd_DrawDocument) DD;
208   Handle(TDocStd_Application) A = DDocStd::GetApplication();
209
210   if ( argc < 3 )
211   {
212     di << "invalid number of arguments. Usage:\t XOpen filename docname [-skipAttribute] [-readAttribute] [-readPath] [-append|-overwrite]\n";
213     return 1;
214   }
215
216   TCollection_AsciiString Filename = argv[1];
217   Standard_CString DocName = argv[2];
218
219   Handle(PCDM_ReaderFilter) aFilter = new PCDM_ReaderFilter;
220   for (Standard_Integer i = 3; i < argc; i++)
221   {
222     TCollection_AsciiString anArg(argv[i]);
223     if (anArg == "-append")
224     {
225       aFilter->Mode() = PCDM_ReaderFilter::AppendMode_Protect;
226     }
227     else if (anArg == "-overwrite")
228     {
229       aFilter->Mode() = PCDM_ReaderFilter::AppendMode_Overwrite;
230     }
231     else if (anArg.StartsWith("-skip"))
232     {
233       TCollection_AsciiString anAttrType = anArg.SubString(6, anArg.Length());
234       aFilter->AddSkipped(anAttrType);
235     }
236     else if (anArg.StartsWith("-read"))
237     {
238       TCollection_AsciiString aValue = anArg.SubString(6, anArg.Length());
239       if (aValue.Value(1) == '0') // path
240       {
241         aFilter->AddPath(aValue);
242       }
243       else // attribute to read
244       {
245         aFilter->AddRead(aValue);
246       }
247     }
248   }
249
250   if (aFilter->IsAppendMode() && !DDocStd::GetDocument (DocName, D, Standard_False))
251   {
252     di << "for append mode document " << DocName << " must be already created\n";
253     return 1;
254   }
255
256   Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (di);
257   if ( A->Open (Filename, D, aFilter, aProgress->Start()) != PCDM_RS_OK )
258   {
259     di << "cannot open XDE document\n";
260     return 1;
261   }
262
263   if (!aFilter->IsAppendMode())
264   {
265     DD = new DDocStd_DrawDocument (D);
266     TDataStd_Name::Set (D->GetData()->Root(), DocName);
267     Draw::Set (DocName, DD);
268   }
269
270   di << "document " << DocName << " opened\n";
271
272   return 0;
273 }
274
275 //=======================================================================
276 //function : dump
277 //purpose  :
278 //=======================================================================
279 static Standard_Integer dump (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
280 {
281   if (argc<2) {
282     di<<"Use: "<<argv[0]<<" Doc [int deep (0/1)]\n";
283     return 1;
284   }
285   Handle(TDocStd_Document) Doc;
286   DDocStd::GetDocument(argv[1], Doc);
287   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
288
289   Handle(XCAFDoc_ShapeTool) myAssembly = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
290   Standard_Boolean deep = Standard_False;
291   if ( (argc==3) && (Draw::Atoi(argv[2])==1) ) deep = Standard_True;
292   Standard_SStream aDumpLog;
293   myAssembly->Dump(aDumpLog, deep);
294   di<<aDumpLog;
295   return 0;
296 }
297
298
299 //=======================================================================
300 //function : StatAssembly
301 //purpose  : recursive part of statistics
302 //=======================================================================
303
304 static void StatAssembly(const TDF_Label L,
305                          const Standard_Integer level,
306                          Handle(TColStd_HArray1OfInteger) &HAI,
307                          Standard_Integer &NbCentroidProp,
308                          Standard_Integer &NbVolumeProp,
309                          Standard_Integer &NbAreaProp,
310                          Standard_Integer &NbShapesWithName,
311                          Standard_Integer &NbShapesWithColor,
312                          Standard_Integer &NbShapesWithLayer,
313                          Handle(TDocStd_Document) &aDoc,
314                          Standard_Boolean &PrintStructMode,
315                          Draw_Interpretor& di)
316 {
317   if(PrintStructMode) {
318     for(Standard_Integer j=0; j<=level; j++)
319       di<<"  ";
320   }
321   TCollection_AsciiString Entry;
322   TDF_Tool::Entry(L, Entry);
323   if(PrintStructMode) di<<Entry.ToCString();
324
325   Handle(TDataStd_Name) Name;
326   if(L.FindAttribute(TDataStd_Name::GetID(), Name)) {
327     NbShapesWithName++;
328     if(PrintStructMode) {
329       di << " " << Name->Get() << "  has attributes: ";
330     }
331   }
332   else {
333     if(PrintStructMode) di<<" NoName  has attributes: ";
334   }
335
336   Handle(XCAFDoc_Centroid) aCentroid = new (XCAFDoc_Centroid);
337   if(L.FindAttribute(XCAFDoc_Centroid::GetID(), aCentroid)) {
338     if(PrintStructMode) di<<"Centroid ";
339     NbCentroidProp++;
340   }
341   Standard_Real tmp;
342   if(XCAFDoc_Volume::Get(L,tmp)) {
343     if(PrintStructMode) di<<"Volume("<<tmp<<") ";
344     NbVolumeProp++;
345   }
346   if(XCAFDoc_Area::Get(L,tmp)) {
347     if(PrintStructMode) di<<"Area("<<tmp<<") ";
348     NbAreaProp++;
349   }
350   Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool(aDoc->Main());
351   Handle(XCAFDoc_LayerTool) LTool = XCAFDoc_DocumentTool::LayerTool(aDoc->Main());
352   Quantity_ColorRGBA col;
353   Standard_Boolean IsColor = Standard_False;
354   Standard_Boolean IsByLayer = Standard_False;
355   if(CTool->GetColor(L,XCAFDoc_ColorGen,col))
356     IsColor = Standard_True;
357   else if(CTool->GetColor(L,XCAFDoc_ColorSurf,col))
358     IsColor = Standard_True;
359   else if(CTool->GetColor(L,XCAFDoc_ColorCurv,col))
360     IsColor = Standard_True;
361   else if(CTool->IsColorByLayer(L))
362     IsByLayer = Standard_True;
363   if(IsColor || IsByLayer) {
364     if(IsByLayer)
365     {
366       Handle(TColStd_HSequenceOfExtendedString) aLayerS;
367       LTool->GetLayers(L, aLayerS);
368       // Currently for DXF pnly, thus
369       // only 1 Layer should be.
370       if(aLayerS->Length() == 1)
371       {
372         TDF_Label aLayer = LTool->FindLayer (aLayerS->First());
373         Quantity_ColorRGBA aColor;
374         if (CTool->GetColor (aLayer, XCAFDoc_ColorGen, aColor))
375         {
376           TCollection_AsciiString aColorName = aColor.GetRGB().StringName(aColor.GetRGB().Name());
377           di<<"Color(" << aColorName.ToCString() << ") ";
378         }
379         else
380         {
381           di<<"Color(ByLayer) ";
382         }
383       }
384       NbShapesWithColor++;
385     }
386     else
387     {
388       TCollection_AsciiString Entry1;
389       Entry1 = col.GetRGB().StringName(col.GetRGB().Name());
390       if(PrintStructMode) di<<"Color("<<Entry1.ToCString()<<" "<<col.Alpha()<<") ";
391       NbShapesWithColor++;
392     }
393   }
394   Handle(TColStd_HSequenceOfExtendedString) aLayerS;
395   LTool->GetLayers(L, aLayerS);
396   if(!aLayerS.IsNull() && aLayerS->Length()>0) {
397     if(PrintStructMode) {
398       di<<"Layer(";
399       for(Standard_Integer i=1; i<=aLayerS->Length(); i++) {
400         TCollection_AsciiString Entry2(aLayerS->Value(i));
401         if(i==1)
402           di<<"\""<<Entry2.ToCString()<<"\"";
403         else
404           di<<" \""<<Entry2.ToCString()<<"\"";
405       }
406       di<<") ";
407     }
408     NbShapesWithLayer++;
409   }
410   if(PrintStructMode) di<<"\n";
411   
412   HAI->SetValue(level, HAI->Value(level)+1 );
413   if(L.HasChild()) {
414     for(Standard_Integer i=1; i<=L.NbChildren(); i++) {
415       StatAssembly(L.FindChild(i), level+1, HAI, NbCentroidProp, NbVolumeProp,
416                    NbAreaProp, NbShapesWithName, NbShapesWithColor,
417                    NbShapesWithLayer, aDoc, PrintStructMode, di);
418     }
419   }
420
421 }
422
423
424 //=======================================================================
425 //function : statdoc
426 //purpose  : 
427 //=======================================================================
428 static Standard_Integer statdoc (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
429 {
430   if (argc<2) {
431     di<<"Use: "<<argv[0]<<" Doc \n";
432     return 1;
433   }
434   Handle(TDocStd_Document) Doc;   
435   DDocStd::GetDocument(argv[1], Doc);
436   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
437
438   Standard_Boolean PrintStructMode = (argc==3);
439   Handle(XCAFDoc_ShapeTool) aTool = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
440
441   TDF_LabelSequence SeqLabels;
442   aTool->GetShapes(SeqLabels);
443   if(SeqLabels.Length()<=0) return 0;
444   if(PrintStructMode) di<<"\nStructure of shapes in the document:\n";
445   Standard_Integer level=0;
446   Standard_Integer NbCentroidProp=0, NbVolumeProp=0, NbAreaProp=0;
447   Standard_Integer NbShapesWithName=0, NbShapesWithColor=0, NbShapesWithLayer=0;
448   Handle(TColStd_HArray1OfInteger) HAI = new TColStd_HArray1OfInteger(0,20);
449   Standard_Integer i=0;
450   for(i=0; i<=20; i++) HAI->SetValue(i,0);
451   for(i=1; i<=SeqLabels.Length(); i++) {
452     StatAssembly(SeqLabels.Value(i), level, HAI, NbCentroidProp, NbVolumeProp,
453                  NbAreaProp, NbShapesWithName, NbShapesWithColor,
454                  NbShapesWithLayer, Doc, PrintStructMode, di);
455   }
456   Standard_Integer NbLabelsShape = 0;
457   di<<"\nStatistis of shapes in the document:\n";
458   for(i=0; i<=20; i++) {
459     if(HAI->Value(i)==0) break;
460     //di<<"level N "<<i<<" :  number of labels with shape = "<<HAI->Value(i)<<"\n";
461     di<<"level N "<<i<<" : "<<HAI->Value(i)<<"\n";
462     NbLabelsShape = NbLabelsShape + HAI->Value(i);
463   }
464   di<<"Total number of labels for shapes in the document = "<<NbLabelsShape<<"\n";
465   di<<"Number of labels with name = "<<NbShapesWithName<<"\n";
466   di<<"Number of labels with color link = "<<NbShapesWithColor<<"\n";
467   di<<"Number of labels with layer link = "<<NbShapesWithLayer<<"\n";
468
469   di<<"\nStatistis of Props in the document:\n";
470   di<<"Number of Centroid Props = "<<NbCentroidProp<<"\n";
471   di<<"Number of Volume Props = "<<NbVolumeProp<<"\n";
472   di<<"Number of Area Props = "<<NbAreaProp<<"\n";
473
474   Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
475   TDF_LabelSequence CLabels;
476   CTool->GetColors(CLabels);
477   di<<"\nNumber of colors = "<<CLabels.Length()<<"\n";
478   if(CLabels.Length()>0) {
479     for(i=1; i<=CLabels.Length(); i++) {
480       TDF_Label aLabel = CLabels.Value(i);
481       Quantity_Color col;
482       CTool->GetColor(aLabel, col);
483       di<<col.StringName(col.Name())<<" ";
484     }
485     di<<"\n";
486   }
487
488   Handle(XCAFDoc_LayerTool) LTool = XCAFDoc_DocumentTool::LayerTool(Doc->Main());
489   TDF_LabelSequence LLabels;
490   LTool->GetLayerLabels(LLabels);
491   di<<"\nNumber of layers = "<<LLabels.Length()<<"\n";
492   if(LLabels.Length()>0) {
493     for(i=1; i<=LLabels.Length(); i++) {
494       TDF_Label aLabel = LLabels.Value(i);
495       TCollection_ExtendedString layerName;
496       LTool->GetLayer(aLabel, layerName);
497       di << "\"" << layerName << "\" ";
498     }
499     di<<"\n";
500   }
501
502   di<<"\n";
503   return 0;
504 }
505
506
507 //=======================================================================
508 //function : setPrs
509 //purpose  :
510 //=======================================================================
511 static Standard_Integer setPrs (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
512 {
513   if (argc <2) {
514     di<<"Use: "<<argv[0]<<" DocName [label1 label2 ...] \n";
515     return 1;
516   }
517
518   Handle(TDocStd_Document) Doc;
519   DDocStd::GetDocument(argv[1], Doc);
520   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
521
522   // collect sequence of labels to set presentation
523   Handle(XCAFDoc_ShapeTool) shapes = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
524   TDF_LabelSequence seq;
525   if ( argc >2 ) {
526     for ( Standard_Integer i=2; i < argc; i++ ) {
527       TDF_Label aLabel;
528       TDF_Tool::Label(Doc->GetData(), argv[i], aLabel);
529       if ( aLabel.IsNull() || ! shapes->IsShape ( aLabel ) ) {
530         di << argv[i] << " is not a valid shape label!";
531         continue;
532       }
533       seq.Append ( aLabel );
534     }
535   }
536   else {
537     shapes->GetShapes ( seq );
538   }
539
540   // set presentations
541   Handle(XCAFDoc_ColorTool) colors = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
542   for ( Standard_Integer i=1; i <= seq.Length(); i++ ) {
543     Handle(TPrsStd_AISPresentation) prs;
544     if ( ! seq.Value(i).FindAttribute ( TPrsStd_AISPresentation::GetID(), prs ) ) {
545       prs = TPrsStd_AISPresentation::Set(seq.Value(i),XCAFPrs_Driver::GetID());
546       prs->SetMaterial (Graphic3d_NameOfMaterial_Plastified);
547     }
548 //    Quantity_Color Col;
549 //    if ( colors.GetColor ( seq.Value(i), XCAFDoc_ColorSurf, Col ) )
550 //      prs->SetColor ( Col.Name() );
551 //    else if ( colors.GetColor ( seq.Value(i), XCAFDoc_ColorCurv, Col ) )
552 //      prs->SetColor ( Col.Name() );
553   }
554   return 0;
555 }
556
557
558 //=======================================================================
559 //function : show
560 //purpose  :
561 //=======================================================================
562 static Standard_Integer show (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
563 {
564   if (argc <2) {
565     di<<"Use: "<<argv[0]<<" DocName [label1 label2 ...] \n";
566     return 1;
567   }
568
569   Handle(TDocStd_Document) aDoc;
570   DDocStd::GetDocument (argv[1], aDoc);
571   if (aDoc.IsNull())
572   {
573     std::cout << argv[1] << " is not a document\n";
574     return 1;
575   }
576
577   // init viewer
578   TDF_Label aRoot = aDoc->GetData()->Root();
579   Handle(TPrsStd_AISViewer) aDocViewer;
580   TCollection_AsciiString   aViewName = TCollection_AsciiString ("Driver1/Document_") + argv[1] + "/View1";
581   if (!TPrsStd_AISViewer::Find (aRoot, aDocViewer))
582   {
583     ViewerTest::ViewerInit (0, 0, 0, 0, aViewName.ToCString(), "");
584     aDocViewer = TPrsStd_AISViewer::New (aRoot, ViewerTest::GetAISContext());
585   }
586
587   // collect sequence of labels to display
588   Handle(XCAFDoc_ShapeTool) shapes = XCAFDoc_DocumentTool::ShapeTool (aDoc->Main());
589   TDF_LabelSequence seq;
590   if ( argc >2 ) {
591     for ( Standard_Integer i=2; i < argc; i++ ) {
592       TDF_Label aLabel;
593       TDF_Tool::Label (aDoc->GetData(), argv[i], aLabel);
594       if ( aLabel.IsNull() || ! shapes->IsShape ( aLabel ) ) {
595         di << argv[i] << " is not a valid shape label!";
596         continue;
597       }
598       seq.Append ( aLabel );
599     }
600   }
601   else {
602     shapes->GetFreeShapes ( seq );
603   }
604
605   // set presentations and show
606   //Handle(XCAFDoc_ColorTool) colors = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
607   for ( Standard_Integer i=1; i <= seq.Length(); i++ ) {
608     Handle(TPrsStd_AISPresentation) prs;
609     if ( ! seq.Value(i).FindAttribute ( TPrsStd_AISPresentation::GetID(), prs ) ) {
610       prs = TPrsStd_AISPresentation::Set(seq.Value(i),XCAFPrs_Driver::GetID());
611       prs->SetMaterial (Graphic3d_NameOfMaterial_Plastified);
612     }
613 //    Quantity_Color Col;
614 //    if ( colors.GetColor ( seq.Value(i), XCAFDoc_ColorSurf, Col ) )
615 //      prs->SetColor ( Col.Name() );
616 //    else if ( colors.GetColor ( seq.Value(i), XCAFDoc_ColorCurv, Col ) )
617 //      prs->SetColor ( Col.Name() );
618     prs->Display(Standard_True);
619   }
620   TPrsStd_AISViewer::Update (aDoc->GetData()->Root());
621   return 0;
622 }
623
624 //! XDisplay command implementation.
625 class XDEDRAW_XDisplayTool
626 {
627 public:
628   //! XDisplay command interface.
629   static Standard_Integer XDisplay (Draw_Interpretor& theDI,
630                                     Standard_Integer theNbArgs,
631                                     const char** theArgVec)
632   {
633     XDEDRAW_XDisplayTool aTool;
634     return aTool.xdisplay (theDI, theNbArgs, theArgVec);
635   }
636
637 private:
638   //! Constructor.
639   XDEDRAW_XDisplayTool()
640   : myDispMode(-2),
641     myHiMode  (-2),
642     myToPrefixDocName (Standard_True),
643     myToGetNames (Standard_True),
644     myToExplore  (Standard_False) {}
645
646   //! Display single label.
647   Standard_Integer displayLabel (const TDF_Label& theLabel,
648                                  const TCollection_AsciiString& theNamePrefix,
649                                  const TopLoc_Location& theLoc,
650                                  TCollection_AsciiString& theOutDispList)
651   {
652     TCollection_AsciiString aName;
653     if (myToGetNames)
654     {
655       Handle(TDataStd_Name) aNodeName;
656       if (theLabel.FindAttribute (TDataStd_Name::GetID(), aNodeName))
657       {
658         aName = aNodeName->Get();
659       }
660       if (aName.IsEmpty())
661       {
662         TDF_Label aRefLabel;
663         if (XCAFDoc_ShapeTool::GetReferredShape (theLabel, aRefLabel)
664          && aRefLabel.FindAttribute (TDataStd_Name::GetID(), aNodeName))
665         {
666           aName = aNodeName->Get();
667         }
668       }
669
670       if (aName.IsEmpty())
671       {
672         TDF_Tool::Entry (theLabel, aName);
673       }
674       for (Standard_Integer aNameIndex = 1;; ++aNameIndex)
675       {
676         if (myNameMap.Add (aName))
677         {
678           break;
679         }
680         aName = aNodeName->Get() + "_" + aNameIndex;
681       }
682     }
683     else
684     {
685       TDF_Tool::Entry (theLabel, aName);
686     }
687     aName = theNamePrefix + aName;
688
689     if (myToExplore)
690     {
691       TDF_Label aRefLabel = theLabel;
692       XCAFDoc_ShapeTool::GetReferredShape (theLabel, aRefLabel);
693       if (XCAFDoc_ShapeTool::IsAssembly (aRefLabel))
694       {
695         aName += "/";
696         const TopLoc_Location aLoc = theLoc * XCAFDoc_ShapeTool::GetLocation (theLabel);
697         for (TDF_ChildIterator aChildIter (aRefLabel); aChildIter.More(); aChildIter.Next())
698         {
699           if (displayLabel (aChildIter.Value(), aName, aLoc, theOutDispList) == 1)
700           {
701             return 1;
702           }
703         }
704         return 0;
705       }
706     }
707
708     Handle(XCAFPrs_AISObject) aPrs = new XCAFPrs_AISObject (theLabel);
709     if (!theLoc.IsIdentity())
710     {
711       aPrs->SetLocalTransformation (theLoc);
712     }
713     if (myDispMode != -2)
714     {
715       if (myDispMode == -1)
716       {
717         aPrs->UnsetDisplayMode();
718       }
719       if (!aPrs->AcceptDisplayMode (myDispMode))
720       {
721         std::cout << "Syntax error: " << aPrs->DynamicType()->Name() << " rejects " << myDispMode << " display mode\n";
722         return 1;
723       }
724       else
725       {
726         aPrs->SetDisplayMode (myDispMode);
727       }
728     }
729     if (myHiMode != -2)
730     {
731       if (myHiMode != -1
732       && !aPrs->AcceptDisplayMode (myHiMode))
733       {
734         std::cout << "Syntax error: " << aPrs->DynamicType()->Name() << " rejects " << myHiMode << " display mode\n";
735         return 1;
736       }
737       aPrs->SetHilightMode (myHiMode);
738     }
739
740     ViewerTest::Display (aName, aPrs, false);
741     theOutDispList += aName + " ";
742     return 0;
743   }
744
745   //! XDisplay command implementation.
746   Standard_Integer xdisplay (Draw_Interpretor& theDI,
747                              Standard_Integer theNbArgs,
748                              const char** theArgVec)
749   {
750     Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
751     if (aContext.IsNull())
752     {
753       std::cout << "Error: no active view!\n";
754       return 1;
755     }
756
757     ViewerTest_AutoUpdater anAutoUpdater (aContext, ViewerTest::CurrentView());
758     for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter)
759     {
760       TCollection_AsciiString anArgCase (theArgVec[anArgIter]);
761       anArgCase.LowerCase();
762       if (anAutoUpdater.parseRedrawMode (anArgCase))
763       {
764         continue;
765       }
766       else if (anArgIter + 1 < theNbArgs
767             && myDispMode == -2
768             && (anArgCase == "-dispmode"
769              || anArgCase == "-displaymode")
770             && TCollection_AsciiString (theArgVec[anArgIter + 1]).IsIntegerValue())
771       {
772         myDispMode = TCollection_AsciiString (theArgVec[++anArgIter]).IntegerValue();
773       }
774       else if (anArgIter + 1 < theNbArgs
775             && myHiMode == -2
776             && (anArgCase == "-himode"
777              || anArgCase == "-highmode"
778              || anArgCase == "-highlightmode")
779             && TCollection_AsciiString (theArgVec[anArgIter + 1]).IsIntegerValue())
780       {
781         myHiMode = TCollection_AsciiString (theArgVec[++anArgIter]).IntegerValue();
782       }
783       else if (anArgCase == "-docprefix"
784             || anArgCase == "-nodocprefix")
785       {
786         myToPrefixDocName = Standard_True;
787         if (anArgIter + 1 < theNbArgs
788          && Draw::ParseOnOff (theArgVec[anArgIter + 1], myToPrefixDocName))
789         {
790           ++anArgIter;
791         }
792         if (anArgCase.StartsWith ("-no"))
793         {
794           myToPrefixDocName = !myToPrefixDocName;
795         }
796       }
797       else if (anArgCase == "-names"
798             || anArgCase == "-nonames")
799       {
800         myToGetNames = Standard_True;
801         if (anArgIter + 1 < theNbArgs
802          && Draw::ParseOnOff (theArgVec[anArgIter + 1], myToGetNames))
803         {
804           ++anArgIter;
805         }
806         if (anArgCase.StartsWith ("-no"))
807         {
808           myToGetNames = !myToGetNames;
809         }
810       }
811       else if (anArgCase == "-explore"
812             || anArgCase == "-noexplore")
813       {
814         myToExplore = Standard_True;
815         if (anArgIter + 1 < theNbArgs
816          && Draw::ParseOnOff (theArgVec[anArgIter + 1], myToExplore))
817         {
818           ++anArgIter;
819         }
820         if (anArgCase.StartsWith ("-no"))
821         {
822           myToExplore = !myToExplore;
823         }
824       }
825       else if (anArgCase == "-outdisplist"
826             && anArgIter + 1 < theNbArgs)
827       {
828         myOutDispListVar = theArgVec[++anArgIter];
829         myOutDispList.Clear();
830       }
831       else
832       {
833         if (myDoc.IsNull()
834          && DDocStd::GetDocument (theArgVec[anArgIter], myDoc, Standard_False))
835         {
836           myDocName = theArgVec[anArgIter];
837           continue;
838         }
839
840         TCollection_AsciiString aValue (theArgVec[anArgIter]);
841         const Standard_Integer aFirstSplit = aValue.Search (":");
842         if (!IsDigit (aValue.Value (1))
843           && aFirstSplit >= 2
844           && aFirstSplit < aValue.Length())
845         {
846           TCollection_AsciiString aDocName = aValue.SubString (1, aFirstSplit - 1);
847           Standard_CString aDocNameStr = aDocName.ToCString();
848           Handle(TDocStd_Document) aDoc;
849           if (DDocStd::GetDocument (aDocNameStr, aDoc, Standard_False))
850           {
851             aValue = aValue.SubString (aFirstSplit + 1, aValue.Length());
852             if (!myDoc.IsNull()
853               && myDoc != aDoc)
854             {
855               std::cout << "Syntax error at '" << theArgVec[anArgIter] << "'\n";
856               return 1;
857             }
858             myDoc = aDoc;
859             myDocName = aDocName;
860           }
861         }
862         if (myDoc.IsNull())
863         {
864           std::cout << "Syntax error at '" << theArgVec[anArgIter] << "'\n";
865           return 1;
866         }
867
868         TDF_Label aLabel;
869         TDF_Tool::Label (myDoc->GetData(), aValue.ToCString(), aLabel);
870         if (aLabel.IsNull()
871         || !XCAFDoc_ShapeTool::IsShape (aLabel))
872         {
873           std::cout << "Syntax error: " << aValue << " is not a valid shape label\n";
874           return 1;
875         }
876         myLabels.Append (aLabel);
877       }
878     }
879     if (myDoc.IsNull())
880     {
881       std::cout << "Syntax error: not enough arguments\n";
882       return 1;
883     }
884     if (myLabels.IsEmpty())
885     {
886       XCAFDoc_DocumentTool::ShapeTool (myDoc->Main())->GetFreeShapes (myLabels);
887     }
888
889     for (TDF_LabelSequence::Iterator aLabIter (myLabels); aLabIter.More(); aLabIter.Next())
890     {
891       const TDF_Label& aLabel = aLabIter.Value();
892       if (displayLabel (aLabel, myToPrefixDocName ? myDocName + ":" : "", TopLoc_Location(), myOutDispList) == 1)
893       {
894         return 1;
895       }
896     }
897     if (myOutDispListVar.IsEmpty())
898     {
899       theDI << myOutDispList;
900     }
901     else
902     {
903       Draw::Set (myOutDispListVar.ToCString(), myOutDispList.ToCString());
904     }
905     return 0;
906   }
907
908 private:
909   NCollection_Map<TCollection_AsciiString, TCollection_AsciiString>
910                            myNameMap;         //!< names map to handle collisions
911   Handle(TDocStd_Document) myDoc;             //!< document
912   TCollection_AsciiString  myDocName;         //!< document name
913   TCollection_AsciiString  myOutDispListVar;  //!< tcl variable to print the result objects
914   TCollection_AsciiString  myOutDispList;     //!< string with list of all displayed object names
915   TDF_LabelSequence        myLabels;          //!< labels to display
916   Standard_Integer         myDispMode;        //!< shape display mode
917   Standard_Integer         myHiMode;          //!< shape highlight mode
918   Standard_Boolean         myToPrefixDocName; //!< flag to prefix objects with document name
919   Standard_Boolean         myToGetNames;      //!< flag to use label names or tags
920   Standard_Boolean         myToExplore;       //!< flag to explore assembles
921 };
922
923 //=======================================================================
924 //function : xwd
925 //purpose  :
926 //=======================================================================
927 static Standard_Integer xwd (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
928 {
929   if (argc <3) {
930     di<<"Use: "<<argv[0]<<" DocName filename.{xwd|gif|bmp}\n";
931     return 1;
932   }
933
934   Handle(TDocStd_Document) Doc;
935   DDocStd::GetDocument(argv[1], Doc);
936   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
937
938   Handle(AIS_InteractiveContext) IC;
939   if ( ! TPrsStd_AISViewer::Find ( Doc->GetData()->Root(), IC ) ) {
940     di << "Cannot find viewer for document " << argv[1] << "\n";
941     return 1;
942   }
943
944   Handle(V3d_Viewer) aViewer = IC->CurrentViewer();
945   V3d_ListOfViewIterator aViewIter = aViewer->ActiveViewIterator();
946   if (aViewIter.More())
947   {
948     aViewIter.Value()->Dump ( argv[2] );
949   }
950   else {
951     di << "Cannot find an active view in a viewer " << argv[1] << "\n";
952     return 1;
953   }
954
955   return 0;
956 }
957
958
959 //=======================================================================
960 //function : XAttributeValue
961 //purpose  :
962 //=======================================================================
963 static Standard_Integer XAttributeValue (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
964 {
965   if ( argc < 4 ) { std::cout << "Syntax error: Too few args\n"; return 1; }
966   Handle(DDF_Browser) browser = Handle(DDF_Browser)::DownCast (Draw::GetExisting (argv[1]));
967   if ( browser.IsNull() ) { std::cout << "Syntax error: Not a browser: " << argv[1] << "\n"; return 1; }
968
969   TDF_Label lab;
970   TDF_Tool::Label(browser->Data(),argv[2],lab);
971   if ( lab.IsNull() ) { std::cout << "Syntax error: label is Null: " << argv[2] << "\n"; return 1; }
972
973   Standard_Integer num = Draw::Atoi ( argv[3] );
974   TDF_AttributeIterator itr(lab,Standard_False);
975   for (Standard_Integer i=1; itr.More() && i < num; i++) itr.Next();
976
977   if ( ! itr.More() ) { std::cout << "Syntax error: Attribute #" << num << " not found\n"; return 1; }
978
979   TCollection_AsciiString anInfo = XCAFDoc::AttributeInfo ( itr.Value() );
980   if (!anInfo.IsEmpty())
981   {
982     di << anInfo.ToCString();
983   }
984   return 0;
985 }
986
987
988 //=======================================================================
989 //function : setviewName
990 //purpose  :
991 //=======================================================================
992 static Standard_Integer setviewName (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
993 {
994   if (argc <2) {
995     di<<"Use: "<<argv[0]<<" (1/0)\n";
996     return 1;
997   }
998   Standard_Boolean mode = Standard_False;
999   if (Draw::Atoi(argv[1]) == 1) mode = Standard_True;
1000   XCAFPrs::SetViewNameMode(mode);
1001   return 0;
1002 }
1003
1004
1005 //=======================================================================
1006 //function : getviewName
1007 //purpose  : auxiliary
1008 //=======================================================================
1009
1010 static Standard_Integer getviewName (Draw_Interpretor&  di, Standard_Integer /*argc*/, const char** /*argv*/)
1011 {
1012   if ( XCAFPrs::GetViewNameMode() ) di << "Display names ON\n";
1013   else di << "Display names OFF\n";
1014   return 0;
1015 }
1016
1017
1018 //=======================================================================
1019 //function : XSetTransparency
1020 //purpose  :
1021 //=======================================================================
1022 static Standard_Integer XSetTransparency (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1023 {
1024   if (argc < 3) {
1025     di<<"Use: "<<argv[0]<<" Doc Transparency [label1 label2 ...] \n";
1026     return 1;
1027   }
1028
1029   Handle(TDocStd_Document) Doc;
1030   DDocStd::GetDocument(argv[1], Doc);
1031   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1032
1033   const Standard_Real aTransparency = Draw::Atof(argv[2]);
1034
1035   // collect sequence of labels
1036   Handle(XCAFDoc_ShapeTool) shapes = XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1037   TDF_LabelSequence seq;
1038   if ( argc > 3 ) {
1039     for ( Standard_Integer i=3; i < argc; i++ ) {
1040       TDF_Label aLabel;
1041       TDF_Tool::Label(Doc->GetData(), argv[i], aLabel);
1042       if ( aLabel.IsNull() || ! shapes->IsShape ( aLabel ) ) {
1043         di << argv[i] << " is not a valid shape label!";
1044         continue;
1045       }
1046       seq.Append ( aLabel );
1047     }
1048   }
1049   else {
1050     shapes->GetFreeShapes ( seq );
1051   }
1052
1053   // find presentations and set transparency
1054   for ( Standard_Integer i=1; i <= seq.Length(); i++ ) {
1055     Handle(TPrsStd_AISPresentation) prs;
1056     if ( ! seq.Value(i).FindAttribute ( TPrsStd_AISPresentation::GetID(), prs ) ) {
1057       prs = TPrsStd_AISPresentation::Set(seq.Value(i),XCAFPrs_Driver::GetID());
1058       prs->SetMaterial (Graphic3d_NameOfMaterial_Plastified);
1059     }
1060     prs->SetTransparency( aTransparency );
1061   }
1062   TPrsStd_AISViewer::Update(Doc->GetData()->Root());
1063   return 0;
1064 }
1065
1066 //=======================================================================
1067 //function : XShowFaceBoundary
1068 //purpose  : Set face boundaries on/off
1069 //=======================================================================
1070 static Standard_Integer XShowFaceBoundary (Draw_Interpretor& di,
1071                                            Standard_Integer argc,
1072                                            const char ** argv)
1073 {
1074   if (( argc != 4 && argc < 7 ) || argc > 9)
1075   {
1076     di << "Usage :\n " << argv[0]
1077        << " Doc Label IsOn [R G B [LineWidth [LineStyle]]]\n"
1078        << "   Doc       - is the document name. \n"
1079        << "   Label     - is the shape label. \n"
1080        << "   IsOn      - flag indicating whether the boundaries\n"
1081        << "                should be turned on or off (can be set\n"
1082        << "                to 0 (off) or 1 (on)).\n"
1083        << "   R, G, B   - red, green and blue components of boundary\n"
1084        << "                color in range (0 - 255).\n"
1085        << "                (default is (0, 0, 0)\n"
1086        << "   LineWidth - line width\n"
1087        << "                (default is 1)\n"
1088        << "   LineStyle - line fill style :\n"
1089        << "                 0 - solid  \n"
1090        << "                 1 - dashed \n"
1091        << "                 2 - dot    \n"
1092        << "                 3 - dashdot\n"
1093        << "                (default is solid)";
1094
1095     return 1;
1096   }
1097
1098   // get specified document
1099   Handle(TDocStd_Document) aDoc;
1100   DDocStd::GetDocument (argv[1], aDoc);
1101   if (aDoc.IsNull())
1102   {
1103     di << argv[1] << " is not a document\n"; 
1104     return 1;
1105   }
1106
1107   Handle(AIS_InteractiveContext) aContext;
1108   if (!TPrsStd_AISViewer::Find (aDoc->GetData()->Root(), aContext)) 
1109   {
1110     di << "Cannot find viewer for document " << argv[1] << "\n";
1111     return 1;
1112   }
1113
1114   // get shape tool for shape verification
1115   Handle(XCAFDoc_ShapeTool) aShapes =
1116     XCAFDoc_DocumentTool::ShapeTool (aDoc->Main());
1117
1118   // get label and validate that it is a shape label
1119   TDF_Label aLabel;
1120   TDF_Tool::Label (aDoc->GetData(), argv[2], aLabel);
1121   if (aLabel.IsNull() || !aShapes->IsShape (aLabel))
1122   {
1123     di << argv[2] << " is not a valid shape label!";
1124     return 1;
1125   }
1126
1127   // get presentation from label
1128   Handle(TPrsStd_AISPresentation) aPrs;
1129   if (!aLabel.FindAttribute (TPrsStd_AISPresentation::GetID (), aPrs))
1130   {
1131     aPrs = TPrsStd_AISPresentation::Set (aLabel,XCAFPrs_Driver::GetID ());
1132   }
1133
1134   Handle(AIS_InteractiveObject) anInteractive = aPrs->GetAIS ();
1135   if (anInteractive.IsNull ())
1136   {
1137     di << "Can't set drawer attributes.\n"
1138           "Interactive object for shape label doesn't exists.";
1139     return 1;
1140   }
1141
1142   // get drawer
1143   const Handle(Prs3d_Drawer)& aDrawer = anInteractive->Attributes ();
1144
1145   // default attributes
1146   Standard_Real aRed   = 0.0;
1147   Standard_Real aGreen = 0.0;
1148   Standard_Real aBlue  = 0.0;
1149   Standard_Real aWidth = 1.0;
1150   Aspect_TypeOfLine aLineType = Aspect_TOL_SOLID;
1151   
1152   // turn boundaries on/off
1153   Standard_Boolean isBoundaryDraw = (Draw::Atoi (argv[3]) == 1);
1154   aDrawer->SetFaceBoundaryDraw (isBoundaryDraw);
1155   
1156   // set boundary color
1157   if (argc >= 7)
1158   {
1159     // Text color
1160     aRed   = Draw::Atof (argv[4])/255.;
1161     aGreen = Draw::Atof (argv[5])/255.;
1162     aBlue  = Draw::Atof (argv[6])/255.;
1163   }
1164
1165   // set line width
1166   if (argc >= 8)
1167   {
1168     aWidth = (Standard_Real)Draw::Atof (argv[7]);
1169   }
1170
1171   // select appropriate line type
1172   if (argc == 9)
1173   {
1174     if (!ViewerTest::ParseLineType (argv[8], aLineType))
1175     {
1176       std::cout << "Syntax error: unknown line type '" << argv[8] << "'\n";
1177     }
1178   }
1179
1180   Quantity_Color aColor (aRed, aGreen, aBlue, Quantity_TOC_RGB);
1181
1182   Handle(Prs3d_LineAspect) aBoundaryAspect = 
1183     new Prs3d_LineAspect (aColor, aLineType, aWidth);
1184
1185   aDrawer->SetFaceBoundaryAspect (aBoundaryAspect);
1186
1187   aContext->Redisplay (anInteractive, Standard_True);
1188   
1189   return 0;
1190 }
1191
1192 //=======================================================================
1193 //function : testDoc
1194 //purpose  : Method to test destruction of document
1195 //=======================================================================
1196 static Standard_Integer testDoc (Draw_Interpretor&,
1197                                  Standard_Integer argc,
1198                                  const char ** argv)
1199 {
1200   if( argc < 2 )
1201   {
1202     std::cout<<"Invalid numbers of arguments should be: XTestDoc shape"<<std::endl;
1203     return 1;
1204   }
1205   TopoDS_Shape shape = DBRep::Get(argv[1]);
1206   if( shape.IsNull())
1207     return 1;
1208  
1209   Handle(TDocStd_Application) anApp = DDocStd::GetApplication();
1210  
1211   Handle(TDocStd_Document) aD1 = new TDocStd_Document("BinXCAF");
1212   aD1->Open(anApp);
1213   
1214   TCollection_AsciiString  aViewName ("Driver1/DummyDocument/View1");
1215   ViewerTest::ViewerInit (0, 0, 0, 0, aViewName.ToCString(), "");
1216   TPrsStd_AISViewer::New (aD1->GetData()->Root(), ViewerTest::GetAISContext());
1217
1218   // get shape tool for shape verification
1219   Handle(XCAFDoc_ShapeTool) aShapes =
1220     XCAFDoc_DocumentTool::ShapeTool (aD1->Main());
1221   TDF_Label aLab = aShapes->AddShape(shape);
1222
1223   Handle(Geom_Axis2Placement) aPlacement = 
1224     new Geom_Axis2Placement (gp::Origin(), gp::DZ(),gp::DX());
1225   Handle(AIS_Trihedron) aTriShape = new AIS_Trihedron (aPlacement);
1226   
1227   Handle(TNaming_NamedShape) NS;
1228   Handle(TPrsStd_AISPresentation) prs;
1229   if( aLab.FindAttribute( TNaming_NamedShape::GetID(), NS) ) {
1230     prs = TPrsStd_AISPresentation::Set( NS );
1231   }
1232    
1233   if( aLab.FindAttribute(TPrsStd_AISPresentation::GetID(), prs) ) 
1234     prs->Display();
1235
1236   TPrsStd_AISViewer::Update(aLab);
1237   ViewerTest::GetAISContext()->Display (aTriShape, Standard_True);
1238   aD1->BeforeClose();
1239   aD1->Close();
1240   ViewerTest::RemoveView (aViewName);
1241   return 0;
1242 }
1243
1244
1245 //=======================================================================
1246 //function : Init
1247 //purpose  :
1248 //=======================================================================
1249
1250 void XDEDRAW::Init(Draw_Interpretor& di)
1251 {
1252   static Standard_Boolean initactor = Standard_False;
1253   if (initactor)
1254   {
1255     return;
1256   }
1257   initactor = Standard_True;
1258
1259   // Load static variables for STEPCAF (ssv; 16.08.2012)
1260   STEPCAFControl_Controller::Init();
1261
1262   // Initialize XCAF formats
1263   Handle(TDocStd_Application) anApp = DDocStd::GetApplication();
1264   BinXCAFDrivers::DefineFormat(anApp);
1265   XmlXCAFDrivers::DefineFormat(anApp);
1266
1267   // Register driver in global table for displaying XDE documents 
1268   // in 3d viewer using OCAF mechanics
1269   TPrsStd_DriverTable::Get()->AddDriver (XCAFPrs_Driver::GetID(), new XCAFPrs_Driver);
1270
1271   //=====================================
1272   // General commands
1273   //=====================================
1274
1275   Standard_CString g = "XDE general commands";
1276
1277   di.Add ("XNewDoc","DocName \t: Create new DECAF document",
1278                    __FILE__, newDoc, g);
1279
1280   di.Add ("XSave","[Doc Path] \t: Save Doc or first document in session",
1281                    __FILE__, saveDoc, g);
1282
1283   di.Add ("XOpen","Path Doc [-skipAttribute] [-readAttribute] [-readPath] [-append|-overwrite]\t: Open XDE Document with name Doc from Path"
1284           "\n\t\t The options are:"
1285           "\n\t\t   -skipAttribute : class name of the attribute to skip during open, for example -skipTDF_Reference"
1286           "\n\t\t   -readAttribute : class name of the attribute to read only during open, for example -readTDataStd_Name loads only such attributes"
1287           "\n\t\t   -append : to read file into already existing document once again, append new attributes and don't touch existing"
1288           "\n\t\t   -overwrite : to read file into already existing document once again, overwriting existing attributes",
1289     __FILE__, openDoc, g);
1290
1291   di.Add ("Xdump","Doc [int deep (0/1)] \t: Print information about tree's structure",
1292                    __FILE__, dump, g);
1293
1294   di.Add ("XStat","Doc \t: Print statistics of document",
1295                    __FILE__, statdoc, g);
1296
1297   di.Add ("XSetPrs","Doc [label1 lavbel2 ...] \t: Set presentation for given label(s) or whole doc",
1298                    __FILE__, setPrs, g);
1299
1300   di.Add ("XShow","Doc [label1 lavbel2 ...] \t: Display document (or some labels) in a graphical window",
1301                    __FILE__, show, g);
1302
1303   di.Add ("XDisplay",
1304           "XDisplay Doc [label1 [label2 [...]]] [-explore {on|off}] [-docPrefix {on|off}] [-names {on|off}]"
1305           "\n\t\t:      [-noupdate] [-dispMode Mode] [-highMode Mode]"
1306           "\n\t\t: Displays document (parts) in 3D Viewer."
1307           "\n\t\t:  -dispMode    Presentation display mode."
1308           "\n\t\t:  -highMode    Presentation highlight mode."
1309           "\n\t\t:  -docPrefix   Prepend document name to object names; TRUE by default."
1310           "\n\t\t:  -names       Use object names instead of label tag; TRUE by default."
1311           "\n\t\t:  -explore     Explode labels to leaves; FALSE by default."
1312           "\n\t\t:  -outDispList Set the TCL variable to the list of displayed object names."
1313           "\n\t\t:               (instead of printing them to draw interpreter)",
1314           __FILE__, XDEDRAW_XDisplayTool::XDisplay, g);
1315
1316   di.Add ("XWdump","Doc filename.{gif|xwd|bmp} \t: Dump contents of viewer window to XWD, GIF or BMP file",
1317                    __FILE__, xwd, g);
1318
1319   di.Add ("XAttributeValue", "Doc label #attribute: internal command for browser",
1320                    __FILE__, XAttributeValue, g);
1321
1322   di.Add ("XSetViewNameMode", "(1/0) \t: Set/Unset mode of displaying names.",
1323                    __FILE__, setviewName, g);
1324
1325   di.Add ("XGetViewNameMode", "\t: Print if  mode of displaying names is turn on.",
1326                    __FILE__, getviewName, g);
1327
1328   di.Add ("XSetTransparency", "Doc Transparency [label1 label2 ...]\t: Set transparency for given label(s) or whole doc",
1329                    __FILE__, XSetTransparency, g);
1330
1331   di.Add ("XShowFaceBoundary", 
1332           "Doc Label IsOn [R G B [LineWidth [LineStyle]]]:"
1333           "- turns on/off drawing of face boundaries and defines boundary line style",
1334           __FILE__, XShowFaceBoundary, g);
1335    di.Add ("XTestDoc", "XTestDoc shape", __FILE__, testDoc, g);
1336
1337   // Specialized commands
1338   XDEDRAW_Shapes::InitCommands ( di );
1339   XDEDRAW_Colors::InitCommands ( di );
1340   XDEDRAW_Layers::InitCommands ( di );
1341   XDEDRAW_Props::InitCommands ( di );
1342   XDEDRAW_GDTs::InitCommands ( di );
1343   XDEDRAW_Views::InitCommands(di);
1344   XDEDRAW_Notes::InitCommands(di);
1345   XDEDRAW_Common::InitCommands ( di );//moved from EXE
1346
1347 }
1348
1349
1350 //==============================================================================
1351 // XDEDRAW::Factory
1352 //==============================================================================
1353 void XDEDRAW::Factory(Draw_Interpretor& theDI)
1354 {
1355   XSDRAWIGES::InitSelect();
1356   XSDRAWIGES::InitToBRep(theDI);
1357   XSDRAWIGES::InitFromBRep(theDI);
1358
1359   XSDRAWSTEP::InitCommands(theDI);
1360
1361   XSDRAW::LoadDraw(theDI);
1362
1363   XDEDRAW::Init(theDI);
1364
1365 #ifdef OCCT_DEBUG
1366       theDI << "Draw Plugin : All TKXDEDRAW commands are loaded\n";
1367 #endif
1368 }
1369
1370 // Declare entry point PLUGINFACTORY
1371 DPLUGIN(XDEDRAW)