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