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