d6632738d33459962a00d37179fd832c4250f72c
[occt.git] / src / XDEDRAW / XDEDRAW_GDTs.cxx
1 // Created on: 2015-06-18
2 // Created by: Ilya Novikov
3 // Copyright (c) 2000-2015 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 #include <XDEDRAW_GDTs.hxx>
17
18 #include <Draw.hxx>
19 #include <DBRep.hxx>
20 #include <DDocStd.hxx>
21
22 #include <TDF_Tool.hxx>
23 #include <TDF_Label.hxx>
24 #include <TDF_LabelSequence.hxx>
25 #include <TDocStd_Document.hxx>
26 #include <XCAFDoc_GraphNode.hxx>
27
28 #include <XCAFDoc.hxx>
29 #include <XCAFDoc_DocumentTool.hxx>
30 #include <XCAFDoc_ShapeTool.hxx>
31 #include <XCAFDoc_DimTol.hxx>
32 #include <XCAFDoc_Dimension.hxx>
33 #include <XCAFDimTolObjects_DimensionObject.hxx>
34 #include <XCAFDoc_Datum.hxx>
35 #include <XCAFDimTolObjects_DatumObject.hxx>
36 #include <XCAFDoc_GeomTolerance.hxx>
37 #include <XCAFDimTolObjects_GeomToleranceObject.hxx>
38 #include <XCAFDoc_DimTolTool.hxx>
39 #include <XCAFDimTolObjects_DimensionObjectSequence.hxx>
40 #include <XCAFDimTolObjects_DatumObjectSequence.hxx>
41 #include <XCAFDimTolObjects_GeomToleranceObjectSequence.hxx>
42 #include <XCAFDimTolObjects_DatumSingleModif.hxx>
43 #include <XCAFDimTolObjects_DimensionModif.hxx>
44 #include <XCAFDimTolObjects_GeomToleranceModif.hxx>
45 #include <XCAFDimTolObjects_DatumModifiersSequence.hxx>
46 #include <XCAFDimTolObjects_DatumObject.hxx>
47 #include <XCAFDimTolObjects_Tool.hxx>
48
49 #include <TCollection_AsciiString.hxx>
50 #include <TCollection_HAsciiString.hxx>
51 #include <TColStd_HArray1OfReal.hxx>
52 #include <TColgp_HArray1OfPnt.hxx>
53
54 #include <TopoDS.hxx>
55 #include <TopoDS_Shape.hxx>
56 #include <TopoDS_Edge.hxx>
57 #include <TopoDS_Vertex.hxx>
58 #include <BRep_Tool.hxx>
59
60
61
62 static Standard_Integer DumpDGTs (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
63 {
64   if (argc < 3) {
65     di<<"Use: XDumpDGTs Doc shape/label/all\n";
66     return 1;
67   }
68   Handle(TDocStd_Document) Doc;
69   DDocStd::GetDocument(argv[1], Doc);
70   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
71   Handle(XCAFDoc_DimTolTool) aDimTolTool= XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
72   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
73
74   TCollection_AsciiString name = argv[2];
75   TDF_LabelSequence aLabels;
76   if(name.IsEqual("all"))
77   {
78     aShapeTool->GetShapes(aLabels);
79     for ( Standard_Integer i=1; i <= aLabels.Length(); i++ )
80     {
81       aShapeTool->GetSubShapes(aLabels.Value(i), aLabels);
82     }
83   }
84   else
85   {
86     TDF_Label aLabel;
87     TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
88     if ( !aLabel.IsNull() ) {
89       aLabels.Append(aLabel);
90       aShapeTool->GetSubShapes(aLabel, aLabels);
91     }
92     else
93     {
94       TopoDS_Shape aShape= DBRep::Get(argv[2]);
95       if ( !aShape.IsNull() )
96       {
97         aShapeTool->Search(aShape, aLabel);
98         if ( !aLabel.IsNull() ) {
99           aLabels.Append(aLabel);
100           aShapeTool->GetSubShapes(aLabel, aLabels);
101         }
102         else
103         {
104           di<<"Shape "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
105           return 1;
106         }
107       }
108     }
109   }
110
111   for ( Standard_Integer i=1; i <= aLabels.Length(); i++ )
112   {
113     Standard_Boolean flag = Standard_True;
114     TDF_LabelSequence aGDTs;
115     aDimTolTool->GetRefDimensionLabels(aLabels.Value(i), aGDTs);
116     for ( Standard_Integer j=1; j <= aGDTs.Length(); j++ )
117     {
118       Handle(XCAFDoc_Dimension) aDimTol;
119       if(aGDTs.Value(j).FindAttribute(XCAFDoc_Dimension::GetID(), aDimTol))
120       {
121         Handle(XCAFDimTolObjects_DimensionObject) aDimTolObj = aDimTol->GetObject();
122         if(flag)
123         {
124           TCollection_AsciiString Entry;
125           TDF_Tool::Entry(aLabels.Value(i), Entry);
126           di << "\n " << Entry << " Shape."<< i;
127           flag = Standard_False;
128         }
129         TCollection_AsciiString Entry;
130         TDF_Tool::Entry(aGDTs.Value(j), Entry);
131         di << "\n \t " << Entry;
132         flag = Standard_False;
133
134         di << " Dimension."<< i << "."<< j;
135         if (argc > 3)
136         {
137           di <<" (";
138           di << " T " << aDimTolObj->GetType();
139           if(aDimTolObj->IsDimWithRange())
140           {
141             di << ", LB " << aDimTolObj->GetLowerBound();
142             di << ", UB " << aDimTolObj->GetUpperBound();
143           }
144           else
145           {
146             di << ", V " << aDimTolObj->GetValue();
147             if (aDimTolObj->IsDimWithPlusMinusTolerance())
148             {
149               di << ", VL " << aDimTolObj->GetLowerTolValue();
150               di << ", VU " << aDimTolObj->GetUpperTolValue();
151             }
152             else if (aDimTolObj->IsDimWithClassOfTolerance())
153             {
154               Standard_Boolean isH;
155               XCAFDimTolObjects_DimensionFormVariance aFV;
156               XCAFDimTolObjects_DimensionGrade aG;
157               aDimTolObj->GetClassOfTolerance(isH, aFV, aG);
158               di << ", H " << (Standard_Integer)isH<< " F " << aFV << " G " << aG;
159             }
160           }
161           if (aDimTolObj->HasQualifier())
162             di << ", Q " << aDimTolObj->GetQualifier();
163           if (aDimTolObj->GetType() == XCAFDimTolObjects_DimensionType_Location_Oriented)
164           {
165             gp_Dir aD;
166             aDimTolObj->GetDirection(aD);
167             di << ", D (" << aD.X() << ", " << aD.Y() << ", " << aD.Z() << ")";
168           }
169           XCAFDimTolObjects_DimensionModifiersSequence aModif = 
170             aDimTolObj->GetModifiers();
171           if (!aModif.IsEmpty())
172           {
173             di << ",";
174             for (Standard_Integer k = aModif.Lower(); k <= aModif.Upper(); k++)
175             {
176               di << " M " << aModif.Value(k);
177             }
178           }
179           di << ", P " << (Standard_Integer)!aDimTolObj->GetPath().IsNull();
180           di << " )";
181         }
182       }
183     }
184     aGDTs.Clear();
185     aDimTolTool->GetRefGeomToleranceLabels(aLabels.Value(i), aGDTs);
186     for ( Standard_Integer j=1; j <= aGDTs.Length(); j++ )
187     {
188       Handle(XCAFDoc_GeomTolerance) aDimTol;
189       if(aGDTs.Value(j).FindAttribute(XCAFDoc_GeomTolerance::GetID(), aDimTol))
190       {
191         Handle(XCAFDimTolObjects_GeomToleranceObject) aDimTolObj = aDimTol->GetObject();
192         if(flag)
193         {
194           TCollection_AsciiString Entry;
195           TDF_Tool::Entry(aLabels.Value(i), Entry);
196           di << "\n " << Entry << " Shape."<< i;
197           flag = Standard_False;
198         }
199         TCollection_AsciiString Entry;
200         TDF_Tool::Entry(aGDTs.Value(j), Entry);
201         di << "\n \t " << Entry;
202         flag = Standard_False;
203
204         di << " GeomTolerance."<< i << "."<< j;
205         if (argc > 3)
206         {
207           di <<" (";
208           di << " T " << aDimTolObj->GetType();
209           di << " TV " << aDimTolObj->GetTypeOfValue();
210           di << ", V " << aDimTolObj->GetValue();
211
212           if (aDimTolObj->HasAxis())
213           {
214             gp_Ax2 anAx = aDimTolObj->GetAxis();
215             di << ", A ( L (" << anAx.Location().X() << anAx.Location().Y() << anAx.Location().Z()
216               << "), XD (" << anAx.XDirection().X() << anAx.XDirection().Y() << anAx.XDirection().Z()
217               << "), RD (" << anAx.YDirection().X() << anAx.YDirection().Y() << anAx.YDirection().Z() << "))";
218           }
219           XCAFDimTolObjects_GeomToleranceModifiersSequence aModif = 
220             aDimTolObj->GetModifiers();
221           if (!aModif.IsEmpty())
222           {
223             di << ",";
224             for (Standard_Integer k = aModif.Lower(); k <= aModif.Upper(); k++)
225             {
226               di << " M " << aModif.Value(k);
227             }
228           }
229           if (aDimTolObj->GetMaterialRequirementModifier() != XCAFDimTolObjects_GeomToleranceMatReqModif_None)
230           {
231             di << ", MR " << aDimTolObj->GetMaterialRequirementModifier();
232           }
233           if (aDimTolObj->GetMaxValueModifier() > 0)
234           {
235             di << "MaxV " << aDimTolObj->GetMaxValueModifier();
236           }
237           if ( aDimTolObj->GetZoneModifier() != XCAFDimTolObjects_GeomToleranceZoneModif_None)
238           {
239             di << ", ZM " << aDimTolObj->GetZoneModifier();
240             if (aDimTolObj->GetValueOfZoneModifier() > 0)
241             {
242               di << " ZMV " <<aDimTolObj->GetValueOfZoneModifier();
243             }
244           }
245
246           di << " )";
247         }
248         Handle(XCAFDoc_GraphNode) aNode;
249         if(aGDTs.Value(j).FindAttribute(XCAFDoc::DatumTolRefGUID(), aNode) && aNode->NbChildren() > 0)
250         {
251           for(Standard_Integer k = 1; k<=aNode->NbChildren(); k++)
252           {
253             Handle(XCAFDoc_Datum) aDatum;
254             if(aNode->GetChild(k)->Label().FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
255             {
256               Handle(XCAFDimTolObjects_DatumObject) aDatumObj = aDatum->GetObject();
257               TCollection_AsciiString anEntry;
258               TDF_Tool::Entry(aNode->GetChild(k)->Label(), anEntry);
259               di << "\n \t \t " << anEntry;
260               di << " Datum."<< i << "."<< j << "."<< k;
261               if (argc > 3)
262               {
263                 di <<" (";
264                 XCAFDimTolObjects_DatumModifiersSequence aModif = 
265                   aDatumObj->GetModifiers();
266                 if (!aModif.IsEmpty())
267                 {
268                   di << ",";
269                   for (Standard_Integer iModif = aModif.Lower(); iModif <= aModif.Upper(); iModif++)
270                   {
271                     di << " M " << aModif.Value(iModif);
272                   }
273                 }
274                 XCAFDimTolObjects_DatumModifWithValue aM;
275                 Standard_Real aV;
276                 aDatumObj->GetModifierWithValue(aM, aV);
277                 if (aM != XCAFDimTolObjects_DatumModifWithValue_None)
278                 {
279                   di << ", MV" << aM << " " << aV; 
280                 }
281                 di << " )";
282               }
283             }
284           }
285         }
286       }
287     }
288     TDF_LabelSequence aDatumL;
289     if (aDimTolTool->GetRefDatumLabel(aLabels.Value(i), aDatumL))
290     {
291       for(Standard_Integer j = aDatumL.Lower(); j <= aDatumL.Upper(); j++)
292       {
293         Handle(XCAFDoc_Datum) aDatum;
294         if(aDatumL.Value(j).FindAttribute(XCAFDoc_Datum::GetID(), aDatum) && 
295            aDatum->GetObject()->IsDatumTarget())
296         {
297           Handle(XCAFDimTolObjects_DatumObject) aDatumObj = aDatum->GetObject();
298           if(flag)
299           {
300             TCollection_AsciiString Entry;
301             TDF_Tool::Entry(aLabels.Value(i), Entry);
302             di << "\n " << Entry << " Shape."<< i;
303             flag = Standard_False;
304           }
305           TCollection_AsciiString Entry;
306           TDF_Tool::Entry(aDatumL.First(), Entry);
307           di << "\n \t " << Entry;
308           flag = Standard_False;
309
310           di << " Datum target."<< i << "."<< j;
311           if (argc > 3)
312           {
313             di <<" (";
314             di << " T " << aDatumObj->GetDatumTargetType();
315             if (aDatumObj->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Area)
316             {
317               gp_Ax2 anAx = aDatumObj->GetDatumTargetAxis();
318                di << ", A ( L (" << anAx.Location().X() << anAx.Location().Y() << anAx.Location().Z()
319                 << "), XD (" << anAx.XDirection().X() << anAx.XDirection().Y() << anAx.XDirection().Z()
320                 << "), RD (" << anAx.YDirection().X() << anAx.YDirection().Y() << anAx.YDirection().Z() << "))";
321               if (aDatumObj->GetDatumTargetType() != XCAFDimTolObjects_DatumTargetType_Point)
322               {
323                 di << ", L " << aDatumObj->GetDatumTargetLength() ;
324                 if (aDatumObj->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Rectangle)
325                 {
326                   di << ", W " << aDatumObj->GetDatumTargetWidth() ;
327                 }
328               }
329             }
330             di << " )";
331           }
332         }
333       }
334     }
335   }
336   return 0;
337 }
338
339 static Standard_Integer DumpNbDGTs (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
340 {
341   if (argc < 2) {
342     di<<"Use: XDumpNbDGTs Doc";
343     return 1;
344   }
345   Handle(TDocStd_Document) Doc;
346   DDocStd::GetDocument(argv[1], Doc);
347   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
348   Handle(XCAFDoc_DimTolTool) aDimTolTool= XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
349   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
350
351   TDF_LabelSequence aLabels;
352   aShapeTool->GetShapes(aLabels);
353   for ( Standard_Integer i=1; i <= aLabels.Length(); i++ )
354   {
355     aShapeTool->GetSubShapes(aLabels.Value(i), aLabels);
356   }
357
358   TDF_LabelSequence aGDTs;
359   aDimTolTool->GetDimensionLabels(aGDTs);
360   di << "\n NbOfDimensions          : " << aGDTs.Length();
361
362   aGDTs.Clear();
363   aDimTolTool->GetGeomToleranceLabels(aGDTs);
364   di << "\n NbOfTolerances          : " << aGDTs.Length();
365
366   Standard_Integer aCounter = 0;
367   Standard_Integer aCounter1 = 0;
368    Standard_Integer aCounter2 = 0;
369
370   for ( Standard_Integer i=1; i <= aLabels.Length(); i++ )
371   {
372     Standard_Boolean isDatum = Standard_False;
373     TDF_LabelSequence aDatL;
374     if(aDimTolTool->GetRefDatumLabel(aLabels.Value(i), aDatL))
375     {
376       for(Standard_Integer j = aDatL.Lower(); j <= aDatL.Upper(); j++)
377       {
378         Handle(XCAFDoc_Datum) aDat;
379         if(aDatL.Value(j).FindAttribute(XCAFDoc_Datum::GetID(), aDat))
380         {
381           if(aDat->GetObject()->IsDatumTarget())
382           {
383             aCounter1++;
384           }
385           else
386           {
387             aCounter2++;
388             isDatum = Standard_True;
389           }
390         }
391       }
392       if(isDatum)
393         aCounter++;
394     }
395   }
396   di << "\n NbOfDatumFeature        : " << aCounter;
397   di << "\n NbOfAttachedDatum       : " << aCounter2;
398   di << "\n NbOfDatumTarget         : " << aCounter1;
399
400   return 0;
401 }
402
403 static Standard_Integer addDim (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
404 {
405   if (argc < 3) {
406     di<<"Use: XAddDimension Doc shape/label [shape/label]\n";
407     return 1;
408   }
409   Handle(TDocStd_Document) Doc;
410   DDocStd::GetDocument(argv[1], Doc);
411   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
412   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
413   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
414
415   TDF_Label aLabel;
416   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
417   if ( aLabel.IsNull() ) 
418   {
419     TopoDS_Shape aShape= DBRep::Get(argv[2]);
420     if ( !aShape.IsNull() )
421     {
422       aShapeTool->Search(aShape, aLabel);
423       if ( aLabel.IsNull() )
424       {
425         di<<"Shape "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
426         return 1;
427       }
428     }
429   }
430   TDF_Label aLabel1;
431   if(argc == 4)
432   {
433     TDF_Tool::Label(Doc->GetData(), argv[3], aLabel1);
434     if ( aLabel1.IsNull() ) 
435     {
436       TopoDS_Shape aShape= DBRep::Get(argv[3]);
437       if ( !aShape.IsNull() )
438       {
439         aShapeTool->Search(aShape, aLabel1);
440         if ( aLabel1.IsNull() )
441         {
442           di<<"Shape "<<argv[3]<<" is absent in "<<argv[1]<<"\n";
443           return 1;
444         }
445       }
446     }
447   }
448
449   TDF_Label aDimL = aDimTolTool->AddDimension();
450   if(aLabel1.IsNull())
451     aDimTolTool->SetDimension(aLabel, aDimL);
452   else
453     aDimTolTool->SetDimension(aLabel, aLabel1, aDimL);
454   TCollection_AsciiString Entry;
455   TDF_Tool::Entry(aDimL, Entry);
456   di << Entry;
457   return 0;
458 }
459
460 static Standard_Integer addGTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
461 {
462   if (argc < 3) {
463     di<<"Use: XAddGeomTolerance Doc shape/label\n";
464     return 1;
465   }
466   Handle(TDocStd_Document) Doc;
467   DDocStd::GetDocument(argv[1], Doc);
468   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
469   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
470   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
471
472   TDF_Label aLabel;
473   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
474   if ( aLabel.IsNull() ) 
475   {
476     TopoDS_Shape aShape= DBRep::Get(argv[2]);
477     if ( !aShape.IsNull() )
478     {
479       aShapeTool->Search(aShape, aLabel);
480       if ( aLabel.IsNull() )
481       {
482         di<<"Shape "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
483         return 1;
484       }
485     }
486   }
487
488   TDF_Label aTolL = aDimTolTool->AddGeomTolerance();
489   aDimTolTool->SetGeomTolerance(aLabel, aTolL);
490   TCollection_AsciiString Entry;
491   TDF_Tool::Entry(aTolL, Entry);
492   di << Entry;
493   return 0;
494 }
495
496 static Standard_Integer addDatum (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
497 {
498   if (argc < 3) {
499     di<<"Use: XAddDatum Doc shape/label\n";
500     return 1;
501   }
502   Handle(TDocStd_Document) Doc;
503   DDocStd::GetDocument(argv[1], Doc);
504   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
505   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
506   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
507
508   TDF_Label aLabel;
509   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
510   if ( aLabel.IsNull() ) 
511   {
512     TopoDS_Shape aShape= DBRep::Get(argv[2]);
513     if ( !aShape.IsNull() )
514     {
515       aShapeTool->Search(aShape, aLabel);
516       if ( aLabel.IsNull() )
517       {
518         di<<"Shape "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
519         return 1;
520       }
521     }
522   }
523
524   TDF_Label aDatumL = aDimTolTool->AddDatum();
525   aDimTolTool->SetDatum(aLabel, aDatumL);
526   TCollection_AsciiString Entry;
527   TDF_Tool::Entry(aDatumL, Entry);
528   di << Entry;
529   return 0;
530 }
531
532 static Standard_Integer setDatum (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
533 {
534   if (argc < 4) {
535     di<<"Use: XSetDatum Doc Datum_Label GeomTol_Label\n";
536     return 1;
537   }
538   Handle(TDocStd_Document) Doc;
539   DDocStd::GetDocument(argv[1], Doc);
540   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
541   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
542   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
543
544   TDF_Label aLabel;
545   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
546   if ( aLabel.IsNull() ) 
547   {
548     di<<"Datum "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
549     return 1;
550   }
551
552   TDF_Label aTol;
553   TDF_Tool::Label(Doc->GetData(), argv[3], aTol);
554   if ( aTol.IsNull() ) 
555   {
556     di<<"GeomTolerance "<<argv[3]<<" is absent in "<<argv[1]<<"\n";
557     return 1;
558   }
559
560   aDimTolTool->SetDatumToGeomTol(aLabel, aTol);
561   return 0;
562 }
563
564 static Standard_Integer getDatum (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
565 {
566   if (argc < 3) {
567     di<<"Use: XGetDatum Doc GeomTol_Label/Shape_Label\n";
568     return 1;
569   }
570   Handle(TDocStd_Document) Doc;
571   DDocStd::GetDocument(argv[1], Doc);
572   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
573   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
574   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
575
576   TDF_Label aLabel;
577   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
578   if ( aLabel.IsNull() ) 
579   {
580     di<<"Label "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
581     return 1;
582   }
583
584   TDF_LabelSequence aD;
585   if(!aDimTolTool->GetRefDatumLabel(aLabel, aD))
586   {
587     aDimTolTool->GetDatumOfTolerLabels(aLabel, aD);
588   }
589   for(Standard_Integer i = aD.Lower(); i <= aD.Upper(); i++)
590   {
591     if(i>1) di<<", ";
592     TCollection_AsciiString Entry;
593     TDF_Tool::Entry(aD.Value(i), Entry);
594     di<<Entry;
595   }
596   return 0;
597 }
598
599 static Standard_Integer addDatumModif (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
600 {
601   if (argc < 4) {
602     di<<"Use: XAddDatumModifier Doc Datum_Label mod1 mod2 ...\n";
603     return 1;
604   }
605   Handle(TDocStd_Document) Doc;
606   DDocStd::GetDocument(argv[1], Doc);
607   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
608   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
609   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
610
611   TDF_Label aLabel;
612   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
613   if ( aLabel.IsNull() ) 
614   {
615     di<<"Datum "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
616     return 1;
617   }
618   Handle(XCAFDoc_Datum) aDatum;
619   if(aLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
620   {
621     for(Standard_Integer i = 3; i < argc; i++)
622     {
623       if(Draw::Atoi(argv[i]) < 22 && Draw::Atoi(argv[i]) > -1)
624       {
625         Handle(XCAFDimTolObjects_DatumObject) anObj = aDatum->GetObject();
626         anObj->AddModifier((XCAFDimTolObjects_DatumSingleModif)Draw::Atoi(argv[i]));
627         aDatum->SetObject(anObj);
628       }
629     }
630   }
631   return 0;
632 }
633
634 static Standard_Integer getDatumModif (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
635 {
636   if (argc < 3) {
637     di<<"Use: XGetDatumModifiers Doc Datum_Label\n";
638     return 1;
639   }
640   Handle(TDocStd_Document) Doc;
641   DDocStd::GetDocument(argv[1], Doc);
642   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
643   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
644   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
645
646   TDF_Label aLabel;
647   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
648   if ( aLabel.IsNull() ) 
649   {
650     di<<"Datum "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
651     return 1;
652   }
653   Handle(XCAFDoc_Datum) aDatum;
654   if(aLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
655   {
656     XCAFDimTolObjects_DatumModifiersSequence aS = aDatum->GetObject()->GetModifiers();
657     for(Standard_Integer i = 1; i<=aS.Length();i++)
658     {
659       if (i > 1) di<<", ";
660       switch(aS.Value(i)){
661       case 0  : di<<"AnyCrossSection"; break;
662       case 1  : di<<"AnyLongitudinalSection"; break;
663       case 2  : di<<"Basic"; break;
664       case 3  : di<<"ContactingFeature\n"; break;
665       case 4  : di<<"DegreeOfFreedomConstraintU"; break;
666       case 5  : di<<"DegreeOfFreedomConstraintV"; break;
667       case 6  : di<<"DegreeOfFreedomConstraintW"; break;
668       case 7  : di<<"DegreeOfFreedomConstraintX"; break;
669       case 8  : di<<"DegreeOfFreedomConstraintY"; break;
670       case 9  : di<<"DegreeOfFreedomConstraintZ"; break;
671       case 10 : di<<"DistanceVariable"; break;
672       case 11 : di<<"FreeState"; break;
673       case 12 : di<<"LeastMaterialRequirement"; break;
674       case 13 : di<<"Line"; break;
675       case 14 : di<<"MajorDiameter"; break;
676       case 15 : di<<"MaximumMaterialRequirement"; break;
677       case 16 : di<<"MinorDiameter"; break;
678       case 17 : di<<"Orientation"; break;
679       case 18 : di<<"PitchDiameter"; break;
680       case 19 : di<<"Plane"; break;
681       case 20 : di<<"Point"; break;
682       case 21 : di<<"Translation"; break;
683       default : break;
684       }
685     }
686   }
687   return 0;
688 }
689
690 static Standard_Integer setDatumName (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
691 {
692   if (argc < 4) {
693     di<<"Use: XSetDatumName Doc Datum_Label name\n";
694     return 1;
695   }
696   Handle(TDocStd_Document) Doc;
697   DDocStd::GetDocument(argv[1], Doc);
698   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
699   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
700   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
701
702   TDF_Label aLabel;
703   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
704   if ( aLabel.IsNull() ) 
705   {
706     di<<"Datum "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
707     return 1;
708   }
709   Handle(XCAFDoc_Datum) aDatum;
710   if(aLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
711   {
712     Handle(XCAFDimTolObjects_DatumObject) anObj = aDatum->GetObject();
713     anObj->SetName(new TCollection_HAsciiString(argv[3]));
714     aDatum->SetObject(anObj);
715   }
716   return 0;
717 }
718
719 static Standard_Integer getDatumName (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
720 {
721   if (argc < 3) {
722     di<<"Use: XGetDatumName Doc Datum_Label\n";
723     return 1;
724   }
725   Handle(TDocStd_Document) Doc;
726   DDocStd::GetDocument(argv[1], Doc);
727   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
728   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
729   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
730
731   TDF_Label aLabel;
732   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
733   if ( aLabel.IsNull() ) 
734   {
735     di<<"Datum "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
736     return 1;
737   }
738   Handle(XCAFDoc_Datum) aDatum;
739   if(aLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
740   {
741     di<<aDatum->GetObject()->GetName()->ToCString();
742   }
743   return 0;
744 }
745
746 static Standard_Integer setTypeOfTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
747 {
748   if (argc < 4) {
749     di<<"Use: XSetTypeOfTolerance Doc GTol_Label type\n";
750     return 1;
751   }
752   Handle(TDocStd_Document) Doc;
753   DDocStd::GetDocument(argv[1], Doc);
754   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
755   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
756   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
757
758   TDF_Label aLabel;
759   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
760   if ( aLabel.IsNull() ) 
761   {
762     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
763     return 1;
764   }
765   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
766   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
767   {
768     if(Draw::Atoi(argv[3]) > -1 && Draw::Atoi(argv[3]) < 16)
769     {
770       Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
771       anObj->SetType((XCAFDimTolObjects_GeomToleranceType)Draw::Atoi(argv[3]));
772       aGeomTolerance->SetObject(anObj);
773     }
774   }
775   return 0;
776 }
777
778 static Standard_Integer getTypeOfTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
779 {
780   if (argc < 3) {
781     di<<"Use: XGetTypeOfTolerance Doc GTol_Label\n";
782     return 1;
783   }
784   Handle(TDocStd_Document) Doc;
785   DDocStd::GetDocument(argv[1], Doc);
786   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
787   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
788   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
789
790   TDF_Label aLabel;
791   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
792   if ( aLabel.IsNull() ) 
793   {
794     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
795     return 1;
796   }
797   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
798   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
799   {
800       switch(aGeomTolerance->GetObject()->GetType()){
801       case 0  : di<<"type is absent"; break;
802       case 1  : di<<"Angularity"; break;
803       case 2  : di<<"CircularRunout"; break;
804       case 3  : di<<"CircularityOrRoundness"; break;
805       case 4  : di<<"Coaxiality"; break;
806       case 5  : di<<"Concentricity"; break;
807       case 6  : di<<"Cylindricity"; break;
808       case 7  : di<<"Flatness"; break;
809       case 8  : di<<"Parallelism"; break;
810       case 9  : di<<"Perpendicularity"; break;
811       case 10 : di<<"Position"; break;
812       case 11 : di<<"ProfileOfLine"; break;
813       case 12 : di<<"ProfileOfSurface"; break;
814       case 13 : di<<"Straightness"; break;
815       case 14 : di<<"Symmetry"; break;
816       case 15 : di<<"TotalRunout"; break;
817       default : break;
818       }
819   }
820   return 0;
821 }
822
823 static Standard_Integer setTypeOfTolVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
824 {
825   if (argc < 4) {
826     di<<"Use: XSetTypeOfToleranceValue Doc GTol_Label type\n";
827     return 1;
828   }
829   Handle(TDocStd_Document) Doc;
830   DDocStd::GetDocument(argv[1], Doc);
831   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
832   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
833   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
834
835   TDF_Label aLabel;
836   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
837   if ( aLabel.IsNull() ) 
838   {
839     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
840     return 1;
841   }
842   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
843   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
844   {
845     if(Draw::Atoi(argv[3]) > -1 && Draw::Atoi(argv[3]) < 3)
846     {
847       Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
848       anObj->SetTypeOfValue((XCAFDimTolObjects_GeomToleranceTypeValue)Draw::Atoi(argv[3]));
849       aGeomTolerance->SetObject(anObj);
850     }
851   }
852   return 0;
853 }
854
855 static Standard_Integer getTypeOfTolVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
856 {
857   if (argc < 3) {
858     di<<"Use: XGetTypeOfToleranceValue Doc GTol_Label\n";
859     return 1;
860   }
861   Handle(TDocStd_Document) Doc;
862   DDocStd::GetDocument(argv[1], Doc);
863   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
864   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
865   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
866
867   TDF_Label aLabel;
868   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
869   if ( aLabel.IsNull() ) 
870   {
871     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
872     return 1;
873   }
874   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
875   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
876   {
877     switch(aGeomTolerance->GetObject()->GetTypeOfValue()){
878       case 0  : di<<"type is absent"; break;
879       case 1  : di<<"Diameter"; break;
880       case 2  : di<<"SphericalDiameter"; break;
881       default : break;
882       }
883   }
884   return 0;
885 }
886
887 static Standard_Integer setTolVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
888 {
889   if (argc < 4) {
890     di<<"Use: XSetToleranceValue Doc GTol_Label value\n";
891     return 1;
892   }
893   Handle(TDocStd_Document) Doc;
894   DDocStd::GetDocument(argv[1], Doc);
895   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
896   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
897   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
898
899   TDF_Label aLabel;
900   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
901   if ( aLabel.IsNull() ) 
902   {
903     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
904     return 1;
905   }
906   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
907   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
908   {
909     Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
910     anObj->SetValue(Draw::Atof(argv[3]));
911     aGeomTolerance->SetObject(anObj);
912   }
913   return 0;
914 }
915
916 static Standard_Integer getTolVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
917 {
918   if (argc < 3) {
919     di<<"Use: XGetToleranceValue Doc GTol_Label\n";
920     return 1;
921   }
922   Handle(TDocStd_Document) Doc;
923   DDocStd::GetDocument(argv[1], Doc);
924   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
925   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
926   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
927
928   TDF_Label aLabel;
929   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
930   if ( aLabel.IsNull() ) 
931   {
932     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
933     return 1;
934   }
935   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
936   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
937   {
938     di << aGeomTolerance->GetObject()->GetValue();
939   }
940   return 0;
941 }
942
943 static Standard_Integer setMatReq (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
944 {
945   if (argc < 4) {
946     di<<"Use: XSetTolMaterialReq Doc GTol_Label mod\n";
947     return 1;
948   }
949   Handle(TDocStd_Document) Doc;
950   DDocStd::GetDocument(argv[1], Doc);
951   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
952   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
953   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
954
955   TDF_Label aLabel;
956   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
957   if ( aLabel.IsNull() ) 
958   {
959     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
960     return 1;
961   }
962   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
963   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
964   {
965     if(Draw::Atoi(argv[3]) > -1 && Draw::Atoi(argv[3]) < 3)
966     {
967       Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
968       anObj->SetMaterialRequirementModifier((XCAFDimTolObjects_GeomToleranceMatReqModif)Draw::Atoi(argv[3]));
969       aGeomTolerance->SetObject(anObj);
970     }
971   }
972   return 0;
973 }
974
975 static Standard_Integer getMatReq (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
976 {
977   if (argc < 3) {
978     di<<"Use: XGetTolMaterialReq Doc GTol_Label\n";
979     return 1;
980   }
981   Handle(TDocStd_Document) Doc;
982   DDocStd::GetDocument(argv[1], Doc);
983   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
984   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
985   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
986
987   TDF_Label aLabel;
988   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
989   if ( aLabel.IsNull() ) 
990   {
991     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
992     return 1;
993   }
994   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
995   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
996   {
997       switch(aGeomTolerance->GetObject()->GetMaterialRequirementModifier()){
998       case 0  : di<<"modifier is absent"; break;
999       case 1  : di<<"M"; break;
1000       case 2  : di<<"L"; break;
1001       default : break;
1002       }
1003   }
1004   return 0;
1005 }
1006
1007 static Standard_Integer setZoneMod (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1008 {
1009   if (argc < 4) {
1010     di<<"Use: XSetTolZoneMod Doc GTol_Label mod\n";
1011     return 1;
1012   }
1013   Handle(TDocStd_Document) Doc;
1014   DDocStd::GetDocument(argv[1], Doc);
1015   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1016   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1017   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1018
1019   TDF_Label aLabel;
1020   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1021   if ( aLabel.IsNull() ) 
1022   {
1023     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1024     return 1;
1025   }
1026   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
1027   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
1028   {
1029     if(Draw::Atoi(argv[3]) > -1 && Draw::Atoi(argv[3]) < 3)
1030     {
1031       Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
1032       anObj->SetZoneModifier((XCAFDimTolObjects_GeomToleranceZoneModif)Draw::Atoi(argv[3]));
1033       aGeomTolerance->SetObject(anObj);
1034     }
1035   }
1036   return 0;
1037 }
1038
1039 static Standard_Integer getZoneMod (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1040 {
1041   if (argc < 3) {
1042     di<<"Use: XGetTolZoneMod Doc GTol_Label\n";
1043     return 1;
1044   }
1045   Handle(TDocStd_Document) Doc;
1046   DDocStd::GetDocument(argv[1], Doc);
1047   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1048   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1049   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1050
1051   TDF_Label aLabel;
1052   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1053   if ( aLabel.IsNull() ) 
1054   {
1055     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1056     return 1;
1057   }
1058   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
1059   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
1060   {
1061       switch(aGeomTolerance->GetObject()->GetZoneModifier()){
1062       case 0  : di<<"modifier is absent"; break;
1063       case 1  : di<<"P"; break;
1064       case 2  : di<<"NonUniform"; break;
1065       default : break;
1066       }
1067   }
1068   return 0;
1069 }
1070
1071 static Standard_Integer setZoneModVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1072 {
1073   if (argc < 4) {
1074     di<<"Use: XSetTolZoneModValue Doc GTol_Label val\n";
1075     return 1;
1076   }
1077   Handle(TDocStd_Document) Doc;
1078   DDocStd::GetDocument(argv[1], Doc);
1079   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1080   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1081   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1082
1083   TDF_Label aLabel;
1084   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1085   if ( aLabel.IsNull() ) 
1086   {
1087     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1088     return 1;
1089   }
1090   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
1091   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
1092   {
1093     Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
1094     anObj->SetValueOfZoneModifier(Draw::Atof(argv[3]));
1095     aGeomTolerance->SetObject(anObj);
1096   }
1097   return 0;
1098 }
1099
1100 static Standard_Integer getZoneModVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1101 {
1102   if (argc < 3) {
1103     di<<"Use: XGetTolZoneModValue Doc GTol_Label\n";
1104     return 1;
1105   }
1106   Handle(TDocStd_Document) Doc;
1107   DDocStd::GetDocument(argv[1], Doc);
1108   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1109   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1110   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1111
1112   TDF_Label aLabel;
1113   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1114   if ( aLabel.IsNull() ) 
1115   {
1116     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1117     return 1;
1118   }
1119   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
1120   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
1121   {
1122     di << aGeomTolerance->GetObject()->GetValueOfZoneModifier();
1123   }
1124   return 0;
1125 }
1126
1127 static Standard_Integer addTolModif (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1128 {
1129   if (argc < 4) {
1130     di<<"Use: XAddTolModifier Doc Tol_Label mod1 mod2 ...\n";
1131     return 1;
1132   }
1133   Handle(TDocStd_Document) Doc;
1134   DDocStd::GetDocument(argv[1], Doc);
1135   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1136   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1137   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1138
1139   TDF_Label aLabel;
1140   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1141   if ( aLabel.IsNull() ) 
1142   {
1143     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1144     return 1;
1145   }
1146   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
1147   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
1148   {
1149     for(Standard_Integer i = 3; i < argc; i++)
1150     {
1151       if(Draw::Atoi(argv[i]) > -1 && Draw::Atoi(argv[i]) < 15)
1152       {
1153         Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
1154         anObj->AddModifier((XCAFDimTolObjects_GeomToleranceModif)Draw::Atoi(argv[i]));
1155         aGeomTolerance->SetObject(anObj);
1156       }
1157     }
1158   }
1159   return 0;
1160 }
1161
1162 static Standard_Integer getTolModif (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1163 {
1164   if (argc < 3) {
1165     di<<"Use: XGetTolModifiers Doc Tol_Label\n";
1166     return 1;
1167   }
1168   Handle(TDocStd_Document) Doc;
1169   DDocStd::GetDocument(argv[1], Doc);
1170   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1171   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1172   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1173
1174   TDF_Label aLabel;
1175   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1176   if ( aLabel.IsNull() ) 
1177   {
1178     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1179     return 1;
1180   }
1181   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
1182   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
1183   {
1184     XCAFDimTolObjects_GeomToleranceModifiersSequence aS  = aGeomTolerance->GetObject()->GetModifiers();
1185     for(Standard_Integer i = 1; i <= aS.Length(); i++)
1186     {
1187       if (i > 1) di<<", ";
1188       switch(aS.Value(i)){
1189       case 0  : di<<"Any_Cross_Section"; break;
1190       case 1  : di<<"Common_Zone"; break;
1191       case 2  : di<<"Each_Radial_Element"; break;
1192       case 3  : di<<"Free_State"; break;
1193       case 4  : di<<"Least_Material_Requirement"; break;
1194       case 5  : di<<"Line_Element"; break;
1195       case 6  : di<<"Major_Diameter"; break;
1196       case 7  : di<<"Maximum_Material_Requirement"; break;
1197       case 8  : di<<"Minor_Diameter"; break;
1198       case 9  : di<<"Not_Convex"; break;
1199       case 10 : di<<"Pitch_Diameter"; break;
1200       case 11 : di<<"Reciprocity_Requirement"; break;
1201       case 12 : di<<"Separate_Requirement"; break;
1202       case 13 : di<<"Statistical_Tolerance"; break;
1203       case 14 : di<<"Tangent_Plane"; break;
1204       default : break;
1205       }
1206     }
1207   }
1208   return 0;
1209 }
1210
1211 static Standard_Integer setTolMaxVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1212 {
1213   if (argc < 4) {
1214     di<<"Use: XSetTolMaxValue Doc Dim_Label val\n";
1215     return 1;
1216   }
1217   Handle(TDocStd_Document) Doc;
1218   DDocStd::GetDocument(argv[1], Doc);
1219   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1220   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1221   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1222
1223   TDF_Label aLabel;
1224   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1225   if ( aLabel.IsNull() ) 
1226   {
1227     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1228     return 1;
1229   }
1230   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
1231   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
1232   {
1233     Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
1234     anObj->SetMaxValueModifier(Draw::Atof(argv[3]));
1235     aGeomTolerance->SetObject(anObj);
1236   }
1237   return 0;
1238 }
1239
1240 static Standard_Integer getTolMaxVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1241 {
1242   if (argc < 3) {
1243     di<<"Use: XGetTolMaxValue Doc Dim_Label\n";
1244     return 1;
1245   }
1246   Handle(TDocStd_Document) Doc;
1247   DDocStd::GetDocument(argv[1], Doc);
1248   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1249   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1250   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1251
1252   TDF_Label aLabel;
1253   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1254   if ( aLabel.IsNull() ) 
1255   {
1256     di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1257     return 1;
1258   }
1259   Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
1260   if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
1261   {
1262     di << aGeomTolerance->GetObject()->GetMaxValueModifier();
1263   }
1264   return 0;
1265 }
1266
1267 static Standard_Integer setDimType (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1268 {
1269   if (argc < 4) {
1270     di<<"Use: XSetDimensionType Doc Dim_Label type\n";
1271     return 1;
1272   }
1273   Handle(TDocStd_Document) Doc;
1274   DDocStd::GetDocument(argv[1], Doc);
1275   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1276   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1277   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1278
1279   TDF_Label aLabel;
1280   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1281   if ( aLabel.IsNull() ) 
1282   {
1283     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1284     return 1;
1285   }
1286   Handle(XCAFDoc_Dimension) aDimension;
1287   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1288   {
1289     if(Draw::Atoi(argv[3]) > -1 && Draw::Atoi(argv[3]) < 30)
1290     {
1291       Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
1292       anObj->SetType((XCAFDimTolObjects_DimensionType)Draw::Atoi(argv[3]));
1293       aDimension->SetObject(anObj);
1294     }
1295   }
1296   return 0;
1297 }
1298
1299 static Standard_Integer getDimType (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1300 {
1301   if (argc < 3) {
1302     di<<"Use: XGetDimensionType Doc Dim_Label\n";
1303     return 1;
1304   }
1305   Handle(TDocStd_Document) Doc;
1306   DDocStd::GetDocument(argv[1], Doc);
1307   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1308   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1309   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1310
1311   TDF_Label aLabel;
1312   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1313   if ( aLabel.IsNull() ) 
1314   {
1315     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1316     return 1;
1317   }
1318   Handle(XCAFDoc_Dimension) aDimension;
1319   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1320   {
1321       switch(aDimension->GetObject()->GetType()){
1322       case 0  : di<<"type is absent"; break;
1323       case 1  : di<<"Location_CurvedDistance"; break;
1324       case 2  : di<<"Location_LinearDistance"; break;
1325       case 3  : di<<"Location_LinearDistance_FromCenterToOuter"; break;
1326       case 4  : di<<"Location_LinearDistance_FromCenterToInner"; break;
1327       case 5  : di<<"Location_LinearDistance_FromOuterToCenter"; break;
1328       case 6  : di<<"Location_LinearDistance_FromOuterToOuter"; break;
1329       case 7  : di<<"Location_LinearDistance_FromOuterToInner"; break;
1330       case 8  : di<<"Location_LinearDistance_FromInnerToCenter"; break;
1331       case 9  : di<<"Location_LinearDistance_FromInnerToOuter"; break;
1332       case 10 : di<<"Location_LinearDistance_FromInnerToInner"; break;
1333       case 11 : di<<"Location_Angular"; break;
1334       case 12 : di<<"Location_Oriented"; break;
1335       case 13 : di<<"Location_WithPath"; break;
1336       case 14 : di<<"Size_CurveLength"; break;
1337       case 15 : di<<"Size_Diameter"; break;
1338       case 16 : di<<"Size_SphericalDiameter"; break;
1339       case 17 : di<<"Size_Radius"; break;
1340       case 18 : di<<"Size_SphericalRadius"; break;
1341       case 19 : di<<"Size_ToroidalMinorDiameter"; break;
1342       case 20 : di<<"Size_ToroidalMajorDiameter"; break;
1343       case 21 : di<<"Size_ToroidalMinorRadius"; break;
1344       case 22 : di<<"Size_ToroidalMajorRadius"; break;
1345       case 23 : di<<"Size_ToroidalHighMajorDiameter"; break;
1346       case 24 : di<<"Size_ToroidalLowMajorDiameter"; break;
1347       case 25 : di<<"Size_ToroidalHighMajorRadius"; break;
1348       case 26 : di<<"Size_ToroidalLowMajorRadius"; break;
1349       case 27 : di<<"Size_Thickness"; break;
1350       case 28 : di<<"Size_Angular"; break;
1351       case 29 : di<<"Size_WithPath"; break;
1352       default : break;
1353       }
1354   }
1355   return 0;
1356 }
1357
1358 static Standard_Integer setDimVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1359 {
1360   if (argc < 4) {
1361     di<<"Use: XSetDimensionValue Doc Dim_Label val\n";
1362     return 1;
1363   }
1364   Handle(TDocStd_Document) Doc;
1365   DDocStd::GetDocument(argv[1], Doc);
1366   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1367   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1368   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1369
1370   TDF_Label aLabel;
1371   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1372   if ( aLabel.IsNull() ) 
1373   {
1374     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1375     return 1;
1376   }
1377   Handle(XCAFDoc_Dimension) aDimension;
1378   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1379   {
1380     Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
1381     anObj->SetValue(Draw::Atof(argv[3]));
1382     aDimension->SetObject(anObj);
1383   }
1384   return 0;
1385 }
1386
1387 static Standard_Integer getDimVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1388 {
1389   if (argc < 3) {
1390     di<<"Use: XGetDimensionValue Doc Dim_Label\n";
1391     return 1;
1392   }
1393   Handle(TDocStd_Document) Doc;
1394   DDocStd::GetDocument(argv[1], Doc);
1395   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1396   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1397   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1398
1399   TDF_Label aLabel;
1400   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1401   if ( aLabel.IsNull() ) 
1402   {
1403     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1404     return 1;
1405   }
1406   Handle(XCAFDoc_Dimension) aDimension;
1407   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1408   {
1409     di << aDimension->GetObject()->GetValue();
1410   }
1411   return 0;
1412 }
1413
1414 static Standard_Integer setDimQalif (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1415 {
1416   if (argc < 4) {
1417     di<<"Use: XSetDimensionQualifier Doc Dim_Label val\n";
1418     return 1;
1419   }
1420   Handle(TDocStd_Document) Doc;
1421   DDocStd::GetDocument(argv[1], Doc);
1422   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1423   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1424   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1425
1426   TDF_Label aLabel;
1427   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1428   if ( aLabel.IsNull() ) 
1429   {
1430     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1431     return 1;
1432   }
1433   Handle(XCAFDoc_Dimension) aDimension;
1434   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1435   {
1436     if(Draw::Atoi(argv[3]) > -1 && Draw::Atoi(argv[3]) < 4)
1437     {
1438       Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
1439       anObj->SetQualifier((XCAFDimTolObjects_DimensionQualifier)Draw::Atoi(argv[3]));
1440       aDimension->SetObject(anObj);
1441     }
1442   }
1443   return 0;
1444 }
1445
1446 static Standard_Integer getDimQalif (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1447 {
1448   if (argc < 3) {
1449     di<<"Use: XGetDimensionQualifier Doc Dim_Label\n";
1450     return 1;
1451   }
1452   Handle(TDocStd_Document) Doc;
1453   DDocStd::GetDocument(argv[1], Doc);
1454   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1455   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1456   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1457
1458   TDF_Label aLabel;
1459   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1460   if ( aLabel.IsNull() ) 
1461   {
1462     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1463     return 1;
1464   }
1465   Handle(XCAFDoc_Dimension) aDimension;
1466   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1467   {
1468     
1469     switch(aDimension->GetObject()->GetQualifier()){
1470       case 0  : di<<"type is absent"; break;
1471       case 1  : di<<"Min"; break;
1472       case 2  : di<<"Max"; break;
1473       case 3  : di<<"Avg"; break;
1474       default : break;
1475       }
1476   }
1477   return 0;
1478 }
1479
1480 static Standard_Integer setDimRange (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1481 {
1482   if (argc < 5) {
1483     di<<"Use: XSetDimensionRange Doc Dim_Label low_val up_val\n";
1484     return 1;
1485   }
1486   Handle(TDocStd_Document) Doc;
1487   DDocStd::GetDocument(argv[1], Doc);
1488   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1489   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1490   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1491
1492   TDF_Label aLabel;
1493   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1494   if ( aLabel.IsNull() ) 
1495   {
1496     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1497     return 1;
1498   }
1499   Handle(XCAFDoc_Dimension) aDimension;
1500   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1501   {
1502     if(Draw::Atof(argv[3]) < Draw::Atof(argv[4]))
1503     {
1504       Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
1505       anObj->SetLowerBound(Draw::Atof(argv[3]));
1506       anObj->SetUpperBound(Draw::Atof(argv[4]));
1507       aDimension->SetObject(anObj);
1508     }
1509   }
1510   return 0;
1511 }
1512
1513 static Standard_Integer getDimRange (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1514 {
1515   if (argc < 3) {
1516     di<<"Use: XGetDimensionRange Doc Dim_Label\n";
1517     return 1;
1518   }
1519   Handle(TDocStd_Document) Doc;
1520   DDocStd::GetDocument(argv[1], Doc);
1521   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1522   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1523   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1524
1525   TDF_Label aLabel;
1526   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1527   if ( aLabel.IsNull() ) 
1528   {
1529     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1530     return 1;
1531   }
1532   Handle(XCAFDoc_Dimension) aDimension;
1533   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1534   {
1535     di << "lower " << aDimension->GetObject()->GetLowerBound();
1536     di << " upper " << aDimension->GetObject()->GetUpperBound();
1537   }
1538   return 0;
1539 }
1540
1541 static Standard_Integer setDimPlusMinusTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1542 {
1543   if (argc < 5) {
1544     di<<"Use: XSetDimensionPlusMinusTol Doc Dim_Label low_val up_val\n";
1545     return 1;
1546   }
1547   Handle(TDocStd_Document) Doc;
1548   DDocStd::GetDocument(argv[1], Doc);
1549   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1550   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1551   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1552
1553   TDF_Label aLabel;
1554   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1555   if ( aLabel.IsNull() ) 
1556   {
1557     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1558     return 1;
1559   }
1560   Handle(XCAFDoc_Dimension) aDimension;
1561   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1562   {
1563     if(Draw::Atof(argv[3]) < Draw::Atof(argv[4]))
1564     {
1565       Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
1566       anObj->SetLowerTolValue(Draw::Atof(argv[3]));
1567       anObj->SetUpperTolValue(Draw::Atof(argv[4]));
1568       aDimension->SetObject(anObj);
1569     }
1570   }
1571   return 0;
1572 }
1573
1574 static Standard_Integer getDimPlusMinusTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1575 {
1576   if (argc < 3) {
1577     di<<"Use: XGetDimensionPlusMinusTol Doc Dim_Label\n";
1578     return 1;
1579   }
1580   Handle(TDocStd_Document) Doc;
1581   DDocStd::GetDocument(argv[1], Doc);
1582   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1583   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1584   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1585
1586   TDF_Label aLabel;
1587   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1588   if ( aLabel.IsNull() ) 
1589   {
1590     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1591     return 1;
1592   }
1593   Handle(XCAFDoc_Dimension) aDimension;
1594   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1595   {
1596     di << "lower " << aDimension->GetObject()->GetLowerTolValue();
1597     di << " upper " << aDimension->GetObject()->GetUpperTolValue();
1598   }
1599   return 0;
1600 }
1601
1602 static Standard_Integer setDimClassTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1603 {
1604   if (argc < 6) {
1605     di<<"Use: XSetDimensionClassOfTol Doc Dim_Label ishole[1/0] formVar grade\n";
1606     return 1;
1607   }
1608   Handle(TDocStd_Document) Doc;
1609   DDocStd::GetDocument(argv[1], Doc);
1610   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1611   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1612   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1613
1614   TDF_Label aLabel;
1615   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1616   if ( aLabel.IsNull() ) 
1617   {
1618     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1619     return 1;
1620   }
1621   Handle(XCAFDoc_Dimension) aDimension;
1622   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1623   {
1624     if(Draw::Atoi(argv[4]) > 0 && Draw::Atoi(argv[4]) < 29 && Draw::Atoi(argv[5]) > -1 && Draw::Atoi(argv[5]) < 20)
1625     {
1626       Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
1627       anObj->SetClassOfTolerance((Draw::Atoi(argv[3]) != 0), (XCAFDimTolObjects_DimensionFormVariance)Draw::Atoi(argv[4]), (XCAFDimTolObjects_DimensionGrade)Draw::Atoi(argv[5]));
1628       aDimension->SetObject(anObj);
1629     }
1630   }
1631   return 0;
1632 }
1633
1634 static Standard_Integer getDimClassTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1635 {
1636   if (argc < 3) {
1637     di<<"Use: XGetDimensionClassOfTol Doc Dim_Label\n";
1638     return 1;
1639   }
1640   Handle(TDocStd_Document) Doc;
1641   DDocStd::GetDocument(argv[1], Doc);
1642   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1643   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1644   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1645
1646   TDF_Label aLabel;
1647   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1648   if ( aLabel.IsNull() ) 
1649   {
1650     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1651     return 1;
1652   }
1653   Handle(XCAFDoc_Dimension) aDimension;
1654   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1655   {
1656     Standard_Boolean h;
1657     XCAFDimTolObjects_DimensionFormVariance f;
1658     XCAFDimTolObjects_DimensionGrade g;
1659     if(aDimension->GetObject()->GetClassOfTolerance(h ,f, g))
1660     {
1661       if(h)
1662       {
1663         switch(f){
1664         case 1  : di<<"a";break;
1665         case 2  : di<<"b";break;
1666         case 3  : di<<"c";break;
1667         case 4  : di<<"cd";break;
1668         case 5  : di<<"d";break;
1669         case 6  : di<<"e";break;
1670         case 7  : di<<"ef";break;
1671         case 8  : di<<"f";break;
1672         case 9  : di<<"fg";break;
1673         case 10 : di<<"g";break;
1674         case 11 : di<<"h";break;
1675         case 12 : di<<"js";break;
1676         case 13 : di<<"j";break;
1677         case 14 : di<<"k";break;
1678         case 15 : di<<"m";break;
1679         case 16 : di<<"n";break;
1680         case 17 : di<<"p";break;
1681         case 18 : di<<"r";break;
1682         case 19 : di<<"s";break;
1683         case 20 : di<<"t";break;
1684         case 21 : di<<"u";break;
1685         case 22 : di<<"v";break;
1686         case 23 : di<<"x";break;
1687         case 24 : di<<"y";break;
1688         case 25 : di<<"z";break;
1689         case 26 : di<<"a";break;
1690         case 27 : di<<"zb";break;
1691         case 28 : di<<"zc";break;
1692         default : break;
1693         }
1694       }
1695       else
1696       {
1697         switch(f){
1698         case 1  : di<<"A";break;
1699         case 2  : di<<"B";break;
1700         case 3  : di<<"C";break;
1701         case 4  : di<<"CD";break;
1702         case 5  : di<<"D";break;
1703         case 6  : di<<"E";break;
1704         case 7  : di<<"EF";break;
1705         case 8  : di<<"F";break;
1706         case 9  : di<<"FG";break;
1707         case 10 : di<<"G";break;
1708         case 11 : di<<"H";break;
1709         case 12 : di<<"JS";break;
1710         case 13 : di<<"J";break;
1711         case 14 : di<<"K";break;
1712         case 15 : di<<"M";break;
1713         case 16 : di<<"N";break;
1714         case 17 : di<<"P";break;
1715         case 18 : di<<"R";break;
1716         case 19 : di<<"S";break;
1717         case 20 : di<<"T";break;
1718         case 21 : di<<"U";break;
1719         case 22 : di<<"V";break;
1720         case 23 : di<<"X";break;
1721         case 24 : di<<"Y";break;
1722         case 25 : di<<"Z";break;
1723         case 26 : di<<"ZA";break;
1724         case 27 : di<<"ZB";break;
1725         case 28 : di<<"ZC";break;
1726         default : break;
1727         }
1728       }
1729       switch(g){
1730       case 0  : di<<"01"; break;
1731       case 1  : di<<"0"; break;
1732       case 2  : di<<"1"; break;
1733       case 3  : di<<"2"; break;
1734       case 4  : di<<"3"; break;
1735       case 5  : di<<"4"; break;
1736       case 6  : di<<"5"; break;
1737       case 7  : di<<"6"; break;
1738       case 8  : di<<"7"; break;
1739       case 9  : di<<"8"; break;
1740       case 10 : di<<"9"; break;
1741       case 11 : di<<"10"; break;
1742       case 12 : di<<"11"; break;
1743       case 13 : di<<"12"; break;
1744       case 14 : di<<"13"; break;
1745       case 15 : di<<"14"; break;
1746       case 16 : di<<"15"; break;
1747       case 17 : di<<"16"; break;
1748       case 18 : di<<"17"; break;
1749       case 19 : di<<"18"; break;
1750       default : break;
1751       }
1752     }
1753   }
1754   return 0;
1755 }
1756
1757 static Standard_Integer setDimNbOfDecimalPlaces (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1758 {
1759   if (argc < 5) {
1760     di<<"Use: XSetDimensionNbOfDecimalPlaces Doc Dim_Label l_val r_val\n";
1761     return 1;
1762   }
1763   Handle(TDocStd_Document) Doc;
1764   DDocStd::GetDocument(argv[1], Doc);
1765   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1766   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1767   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1768
1769   TDF_Label aLabel;
1770   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1771   if ( aLabel.IsNull() ) 
1772   {
1773     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1774     return 1;
1775   }
1776   Handle(XCAFDoc_Dimension) aDimension;
1777   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1778   {
1779     Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
1780     anObj->SetNbOfDecimalPlaces(Draw::Atoi(argv[3]), Draw::Atoi(argv[4]));
1781     aDimension->SetObject(anObj);
1782   }
1783   return 0;
1784 }
1785
1786 static Standard_Integer getDimNbOfDecimalPlaces (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1787 {
1788   if (argc < 3) {
1789     di<<"Use: XGetDimensionNbOfDecimalPlaces Doc Dim_Label\n";
1790     return 1;
1791   }
1792   Handle(TDocStd_Document) Doc;
1793   DDocStd::GetDocument(argv[1], Doc);
1794   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1795   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1796   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1797
1798   TDF_Label aLabel;
1799   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1800   if ( aLabel.IsNull() ) 
1801   {
1802     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1803     return 1;
1804   }
1805   Handle(XCAFDoc_Dimension) aDimension;
1806   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1807   {
1808     Standard_Integer l, r;
1809     aDimension->GetObject()->GetNbOfDecimalPlaces(l,r);
1810     di << l << "." << r;
1811   }
1812   return 0;
1813 }
1814
1815 static Standard_Integer addDimModifier (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1816 {
1817   if (argc < 4) {
1818     di<<"Use: XAddDimensionModifiers Doc Dim_Label mod1 mod2 ...\n";
1819     return 1;
1820   }
1821   Handle(TDocStd_Document) Doc;
1822   DDocStd::GetDocument(argv[1], Doc);
1823   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1824   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1825   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1826
1827   TDF_Label aLabel;
1828   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1829   if ( aLabel.IsNull() ) 
1830   {
1831     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1832     return 1;
1833   }
1834   Handle(XCAFDoc_Dimension) aDimension;
1835   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1836   {
1837     for(Standard_Integer i = 3; i < argc; i++)
1838     {
1839       if(Draw::Atoi(argv[i]) > -1 && Draw::Atoi(argv[i]) < 24)
1840       {
1841         Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
1842         anObj->AddModifier((XCAFDimTolObjects_DimensionModif)Draw::Atoi(argv[i]));
1843         aDimension->SetObject(anObj);
1844       }
1845     }
1846   }
1847   return 0;
1848 }
1849
1850 static Standard_Integer getDimModifier (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1851 {
1852   if (argc < 3) {
1853     di<<"Use: XGetDimensionModifiers Doc Dim_Label\n";
1854     return 1;
1855   }
1856   Handle(TDocStd_Document) Doc;
1857   DDocStd::GetDocument(argv[1], Doc);
1858   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1859   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1860   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1861
1862   TDF_Label aLabel;
1863   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1864   if ( aLabel.IsNull() ) 
1865   {
1866     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1867     return 1;
1868   }
1869   Handle(XCAFDoc_Dimension) aDimension;
1870   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1871   {
1872     XCAFDimTolObjects_DimensionModifiersSequence aS = aDimension->GetObject()->GetModifiers();
1873     for(Standard_Integer i = 1; i <= aS.Length(); i++)
1874     {
1875       if (i > 1) di<<", ";
1876       switch(aS.Value(i)){
1877       case 0  : di<<"ControlledRadius"; break;
1878       case 1  : di<<"Square"; break;
1879       case 2  : di<<"StatisticalTolerance"; break;
1880       case 3  : di<<"ContinuousFeature"; break;
1881       case 4  : di<<"TwoPointSize"; break;
1882       case 5  : di<<"LocalSizeDefinedBySphere"; break;
1883       case 6  : di<<"LeastSquaresAssociationCriterion"; break;
1884       case 7  : di<<"MaximumInscribedAssociation"; break;
1885       case 8  : di<<"MinimumCircumscribedAssociation"; break;
1886       case 9  : di<<"CircumferenceDiameter"; break;
1887       case 10 : di<<"AreaDiameter"; break;
1888       case 11 : di<<"VolumeDiameter"; break;
1889       case 12 : di<<"MaximumSize"; break;
1890       case 13 : di<<"MinimumSize"; break;
1891       case 14 : di<<"AverageSize"; break;
1892       case 15 : di<<"MedianSize"; break;
1893       case 16 : di<<"MidRangeSize"; break;
1894       case 17 : di<<"RangeOfSizes"; break;
1895       case 18 : di<<"AnyRestrictedPortionOfFeature"; break;
1896       case 19 : di<<"AnyCrossSection"; break;
1897       case 20 : di<<"SpecificFixedCrossSection"; break;
1898       case 21 : di<<"CommonTolerance"; break;
1899       case 22 : di<<"FreeStateCondition"; break;
1900       case 23 : di<<"Between"; break;
1901       default : break;
1902       }
1903     }
1904   }
1905   return 0;
1906 }
1907
1908 static Standard_Integer addDimPath (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1909 {
1910   if (argc < 4) {
1911     di<<"Use: XSetDimensionPath Doc Dim_Label path(edge)\n";
1912     return 1;
1913   }
1914   Handle(TDocStd_Document) Doc;
1915   DDocStd::GetDocument(argv[1], Doc);
1916   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1917   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1918   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1919
1920   TDF_Label aLabel;
1921   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1922   if ( aLabel.IsNull() ) 
1923   {
1924     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1925     return 1;
1926   }
1927   Handle(XCAFDoc_Dimension) aDimension;
1928   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1929   {
1930     TopoDS_Edge aE = TopoDS::Edge(DBRep::Get(argv[3],TopAbs_EDGE));
1931     if(!aE.IsNull())
1932     {
1933       Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
1934       anObj->SetPath(aE);
1935       aDimension->SetObject(anObj);
1936     }
1937   }
1938   return 0;
1939 }
1940
1941 static Standard_Integer addDimPoints (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1942 {
1943   if (argc < 5) {
1944     di<<"Use: XSetDimensionPoints Doc Dim_Label v1 v2\n";
1945     return 1;
1946   }
1947   Handle(TDocStd_Document) Doc;
1948   DDocStd::GetDocument(argv[1], Doc);
1949   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1950   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1951   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1952
1953   TDF_Label aLabel;
1954   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1955   if ( aLabel.IsNull() ) 
1956   {
1957     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1958     return 1;
1959   }
1960   Handle(XCAFDoc_Dimension) aDimension;
1961   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1962   {
1963     TopoDS_Vertex aV1 = TopoDS::Vertex(DBRep::Get(argv[3],TopAbs_VERTEX));
1964     TopoDS_Vertex aV2 = TopoDS::Vertex(DBRep::Get(argv[4],TopAbs_VERTEX));
1965     if(!aV1.IsNull() && !aV1.IsNull())
1966     {
1967       Handle(TColgp_HArray1OfPnt) arr = new TColgp_HArray1OfPnt(1,2);
1968       arr->SetValue(1, BRep_Tool::Pnt(aV1));
1969       arr->SetValue(2, BRep_Tool::Pnt(aV2));
1970       Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
1971       anObj->SetPoints(arr);
1972       aDimension->SetObject(anObj);
1973     }
1974   }
1975   return 0;
1976 }
1977
1978 static Standard_Integer getDimPoints (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1979 {
1980   if (argc < 3) {
1981     di<<"Use: XGetDimensionPoints Doc Dim_Label\n";
1982     return 1;
1983   }
1984   Handle(TDocStd_Document) Doc;
1985   DDocStd::GetDocument(argv[1], Doc);
1986   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
1987   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
1988   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
1989
1990   TDF_Label aLabel;
1991   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
1992   if ( aLabel.IsNull() ) 
1993   {
1994     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
1995     return 1;
1996   }
1997   Handle(XCAFDoc_Dimension) aDimension;
1998   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
1999   {
2000     Handle(TColgp_HArray1OfPnt) pnts = aDimension->GetObject()->GetPoints();
2001     if(!pnts.IsNull() && pnts->Length() == 2)
2002     {
2003       di << pnts->Value(1).X() << ";" << pnts->Value(1).Y() << ";" << pnts->Value(1).Z() << " ";
2004       di << pnts->Value(2).X() << ";" << pnts->Value(2).Y() << ";" << pnts->Value(2).Z();
2005     }
2006  }
2007   return 0;
2008 }
2009
2010 static Standard_Integer addDimDir (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
2011 {
2012   if (argc < 6) {
2013     di<<"Use: XSetDimensionDir Doc Dim_Label x y z\n";
2014     return 1;
2015   }
2016   Handle(TDocStd_Document) Doc;
2017   DDocStd::GetDocument(argv[1], Doc);
2018   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
2019   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
2020   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
2021
2022   TDF_Label aLabel;
2023   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
2024   if ( aLabel.IsNull() ) 
2025   {
2026     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
2027     return 1;
2028   }
2029   Handle(XCAFDoc_Dimension) aDimension;
2030   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
2031   {
2032     Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
2033     anObj->SetDirection(gp_Dir(Draw::Atof(argv[3]),Draw::Atof(argv[4]),Draw::Atof(argv[5])));
2034     aDimension->SetObject(anObj);
2035   }
2036   return 0;
2037 }
2038
2039 static Standard_Integer getDimDir (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
2040 {
2041   if (argc < 3) {
2042     di<<"Use: XSetDimensionDir Doc Dim_Label\n";
2043     return 1;
2044   }
2045   Handle(TDocStd_Document) Doc;
2046   DDocStd::GetDocument(argv[1], Doc);
2047   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
2048   Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
2049   Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
2050
2051   TDF_Label aLabel;
2052   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
2053   if ( aLabel.IsNull() ) 
2054   {
2055     di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
2056     return 1;
2057   }
2058   Handle(XCAFDoc_Dimension) aDimension;
2059   if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
2060   {
2061     gp_Dir dir;
2062     if(aDimension->GetObject()->GetDirection(dir))
2063     {
2064       di << dir.X()<< ";"<< dir.Y()<< ";"<<dir.Z(); 
2065     }
2066   }
2067   return 0;
2068 }
2069
2070 //=======================================================================
2071 //function : InitCommands
2072 //purpose  : 
2073 //=======================================================================
2074
2075 void XDEDRAW_GDTs::InitCommands(Draw_Interpretor& di) 
2076 {
2077
2078   static Standard_Boolean initactor = Standard_False;
2079   if (initactor) return;  initactor = Standard_True;
2080
2081   
2082   Standard_CString g = "XDE G&DTs commands";
2083
2084   di.Add ("XDumpDGTs","XDumpDGTs Doc shape/label/all ",
2085     __FILE__, DumpDGTs, g);
2086
2087   di.Add ("XDumpNbDGTs","XDumpDGTs Doc",
2088     __FILE__, DumpNbDGTs, g);
2089
2090   di.Add ("XAddDimension","XAddDimension Doc shape/label [shape/label]",
2091     __FILE__, addDim, g);
2092
2093   di.Add ("XAddGeomTolerance","XAddGeomTolerance Doc shape/label",
2094     __FILE__, addGTol, g);
2095
2096   di.Add ("XAddDatum","XAddDatum Doc shape/label",
2097     __FILE__, addDatum, g);
2098
2099   di.Add ("XSetDatum","XSetDatum Doc Datum_Label GeomTol_Label",
2100     __FILE__, setDatum, g);
2101
2102   di.Add ("XGetDatum","XGetDatum Doc GeomTol_Label/Shape_Label",
2103     __FILE__, getDatum, g);
2104
2105   di.Add ("XAddDatumModifier","XAddDatumModifier Doc Datum_Label mod1 mod2 ...\n"
2106     "Values:"
2107     "\n  0 AnyCrossSection"
2108     "\n  1 Any_LongitudinalSection"
2109     "\n  2 Basic"
2110     "\n  3 ContactingFeature"
2111     "\n  4 DegreeOfFreedomConstraintU"
2112     "\n  5 DegreeOfFreedomConstraintV"
2113     "\n  6 DegreeOfFreedomConstraintW"
2114     "\n  7 DegreeOfFreedomConstraintX"
2115     "\n  8 DegreeOfFreedomConstraintY"
2116     "\n  9 DegreeOfFreedomConstraintZ"
2117     "\n 10 DistanceVariable"
2118     "\n 11 FreeState"
2119     "\n 12 LeastMaterialRequirement"
2120     "\n 13 Line"
2121     "\n 14 MajorDiameter"
2122     "\n 15 MaximumMaterialRequirement"
2123     "\n 16 MinorDiameter"
2124     "\n 17 Orientation"
2125     "\n 18 PitchDiameter"
2126     "\n 19 Plane"
2127     "\n 20 Point"
2128     "\n 21 Translation",
2129     __FILE__, addDatumModif, g);
2130
2131   di.Add ("XGetDatumModifiers","XGetDatumModifiers Doc Datum_Label",
2132     __FILE__, getDatumModif, g);
2133
2134   di.Add ("XSetDatumName","XSetDatumName Doc Datum_Label name",
2135     __FILE__, setDatumName, g);
2136
2137   di.Add ("XGetDatumName","XGetDatumName Doc Datum_Label",
2138     __FILE__, getDatumName, g);
2139
2140   di.Add ("XSetTypeOfTolerance","XSetTypeOfTolerance Doc GTol_Label type"
2141         "Values:\n"
2142       "\t  0 type is absent\n"
2143       "\t  1 Angularity\n"
2144       "\t  2 CircularRunout\n"
2145       "\t  3 CircularityOrRoundness\n"
2146       "\t  4 Coaxiality\n"
2147       "\t  5 Concentricity\n"
2148       "\t  6 Cylindricity\n"
2149       "\t  7 Flatness\n"
2150       "\t  8 Parallelism\n"
2151       "\t  9 Perpendicularity\n"
2152       "\t 10 Position\n"
2153       "\t 11 ProfileOfLine\n"
2154       "\t 12 ProfileOfSurface\n"
2155       "\t 13 Straightness\n"
2156       "\t 14 Symmetry\n"
2157       "\t 15 TotalRunout\n",
2158     __FILE__, setTypeOfTol, g);
2159
2160   di.Add ("XGetTypeOfTolerance","XGetTypeOfTolerance Doc GTol_Label",
2161     __FILE__, getTypeOfTol, g);
2162
2163   di.Add ("XSetTypeOfToleranceValue","XSetTypeOfToleranceValue Doc GTol_Label type"
2164         "Values:"
2165     "\n  0 none"
2166     "\n  1 Diameter"
2167     "\n  2 SphericalDiameter",
2168     __FILE__, setTypeOfTolVal, g);
2169
2170   di.Add ("XGetTypeOfToleranceValue","XGetTypeOfToleranceValue Doc GTol_Label",
2171     __FILE__, getTypeOfTolVal, g);
2172
2173   di.Add ("XSetToleranceValue","XSetToleranceValue Doc GTol_Label value",
2174     __FILE__, setTolVal, g);
2175
2176   di.Add ("XGetToleranceValue","XGetToleranceValue Doc GTol_Label",
2177     __FILE__, getTolVal, g);
2178
2179   di.Add ("XSetTolMaterialReq","XSetTolMaterialReq Doc GTol_Label mod"
2180         "Values:"
2181     "\n  0 none"
2182     "\n  1 M"
2183     "\n  2 L",
2184     __FILE__, setMatReq, g);
2185
2186   di.Add ("XGetTolMaterialReq","XGetTolMaterialReq Doc GTol_Label",
2187     __FILE__, getMatReq, g);
2188
2189   di.Add ("XSetTolZoneMod","XSetTolZoneMod Doc GTol_Label mod"
2190         "Values:"
2191     "\n  0 none"
2192     "\n  1 P"
2193     "\n  2 NonUniform",
2194     __FILE__, setZoneMod, g);
2195
2196   di.Add ("XGetTolZoneMod","XGetTolZoneMod Doc GTol_Label",
2197     __FILE__, getZoneMod, g);
2198
2199   di.Add ("XSetTolZoneModValue","XSetTolZoneModValue Doc GTol_Label val",
2200     __FILE__, setZoneModVal, g);
2201
2202   di.Add ("XGetTolZoneModValue","XGetTolZoneModValue Doc GTol_Label",
2203     __FILE__, getZoneModVal, g);
2204   
2205   di.Add ("XAddTolModifier","XAddTolModifier Doc Tol_Label mod1 mod2 ..."
2206         "Values:\n"
2207       "\t  0 Any_Cross_Section\n"
2208       "\t  1 Common_Zone\n"
2209       "\t  2 Each_Radial_Element\n"
2210       "\t  3 Free_State\n"
2211       "\t  4 Least_Material_Requirement\n"
2212       "\t  5 Line_Element\n"
2213       "\t  6 Major_Diameter\n"
2214       "\t  7 Maximum_Material_Requirement\n"
2215       "\t  8 Minor_Diameter\n"
2216       "\t  9 Not_Convex\n"
2217       "\t 10 Pitch_Diameter\n"
2218       "\t 11 Reciprocity_Requirement\n"
2219       "\t 12 Separate_Requirement\n"
2220       "\t 13 Statistical_Tolerance\n"
2221       "\t 14 Tangent_Plane\n",
2222     __FILE__, addTolModif, g);
2223
2224   di.Add ("XGetTolModifier","XGetTolModifier Doc Tol_Label",
2225     __FILE__, getTolModif, g);
2226
2227   di.Add ("XSetTolMaxValue","XSetTolMaxValue Doc Dim_Label val",
2228     __FILE__, setTolMaxVal, g);
2229
2230   di.Add ("XGetTolMaxValue","XGetTolMaxValue Doc Dim_Label val",
2231     __FILE__, getTolMaxVal, g);
2232
2233   di.Add ("XSetDimensionType","XSetDimensionType Doc Dim_Label type"
2234         "Values:"
2235       "\t  0 type is absent\n"
2236       "\t  1 Location_CurvedDistance\n"
2237       "\t  2 Location_LinearDistance\n"
2238       "\t  3 Location_LinearDistance_FromCenterToOuter\n"
2239       "\t  4 Location_LinearDistance_FromCenterToInner\n"
2240       "\t  5 Location_LinearDistance_FromOuterToCenter\n"
2241       "\t  6 Location_LinearDistance_FromOuterToOuter\n"
2242       "\t  7 Location_LinearDistance_FromOuterToInner\n"
2243       "\t  8 Location_LinearDistance_FromInnerToCenter\n"
2244       "\t  9 Location_LinearDistance_FromInnerToOuter\n"
2245       "\t 10 Location_LinearDistance_FromInnerToInner\n"
2246       "\t 11 Location_Angular\n"
2247       "\t 12 Location_Oriented\n"
2248       "\t 13 Location_WithPath\n"
2249       "\t 14 Size_CurveLength\n"
2250       "\t 15 Size_Diameter\n"
2251       "\t 16 Size_SphericalDiameter\n"
2252       "\t 17 Size_Radius\n"
2253       "\t 18 Size_SphericalRadius\n"
2254       "\t 19 Size_ToroidalMinorDiameter\n"
2255       "\t 20 Size_ToroidalMajorDiameter\n"
2256       "\t 21 Size_ToroidalMinorRadius\n"
2257       "\t 22 Size_ToroidalMajorRadius\n"
2258       "\t 23 Size_ToroidalHighMajorDiameter\n"
2259       "\t 24 Size_ToroidalLowMajorDiameter\n"
2260       "\t 25 Size_ToroidalHighMajorRadius\n"
2261       "\t 26 Size_ToroidalLowMajorRadius\n"
2262       "\t 27 Size_Thickness\n"
2263       "\t 28 Size_Angular\n"
2264       "\t 29 Size_WithPath\n",
2265     __FILE__, setDimType, g);
2266
2267   di.Add ("XGetDimensionType","XGetDimensionType Doc Dim_Label",
2268     __FILE__, getDimType, g);
2269
2270   di.Add ("XSetDimensionValue","XSetDimensionValue Doc Dim_Label val",
2271     __FILE__, setDimVal, g);
2272
2273   di.Add ("XGetDimensionValue","XGetDimensionValue Doc Dim_Label",
2274     __FILE__, getDimVal, g);
2275
2276   di.Add ("XSetDimensionQualifier","XSetDimensionQualifier Doc Dim_Label val"
2277         "Values:"
2278     "\n  0 none"
2279     "\n  1 Min"
2280     "\n  2 Max"
2281     "\n  3 Avg",
2282     __FILE__, setDimQalif, g);
2283   
2284   di.Add ("XGetDimensionQualifier","XGetDimensionQualifier Doc Dim_Label",
2285     __FILE__, getDimQalif, g);
2286
2287   di.Add ("XSetDimensionRange","XSetDimensionRange Doc Dim_Label low_val up_val",
2288     __FILE__, setDimRange, g);
2289
2290   di.Add ("XGetDimensionRange","XGetDimensionRange Doc Dim_Label",
2291     __FILE__, getDimRange, g);
2292
2293   di.Add ("XSetDimensionPlusMinusTol","XSetDimensionPlusMinusTol Doc Dim_Label low_val up_val",
2294     __FILE__, setDimPlusMinusTol, g);
2295
2296   di.Add ("XGetDimensionPlusMinusTol","XGetDimensionPlusMinusTol Doc Dim_Label",
2297     __FILE__, getDimPlusMinusTol, g);
2298
2299   di.Add ("XSetDimensionClassOfTol","XSetDimensionClassOfTol Doc Dim_Label ishole[1/0] formVar grade"
2300         "Values of formVar:"
2301         "\t 1 a\n"
2302         "\t 2 b\n"
2303         "\t 3 c\n"
2304         "\t 4 cd\n"
2305         "\t 5 d\n"
2306         "\t 6 e\n"
2307         "\t 7 ef\n"
2308         "\t 8 f\n"
2309         "\t 9 fg\n"
2310         "\t10 g\n"
2311         "\t11 h\n"
2312         "\t12 js\n"
2313         "\t13 j\n"
2314         "\t14 k\n"
2315         "\t15 m\n"
2316         "\t16 n\n"
2317         "\t17 p\n"
2318         "\t18 r\n"
2319         "\t19 s\n"
2320         "\t20 t\n"
2321         "\t21 u\n"
2322         "\t22 v\n"
2323         "\t23 x\n"
2324         "\t24 y\n"
2325         "\t25 z\n"
2326         "\t26 za\n"
2327         "\t27 zb\n"
2328         "\t28 zc\n\n"
2329         "Values of grade:"
2330         "\t 0 01\n"
2331         "\t 1 0\n"
2332         "\t 2 1\n"
2333         "\t 3 2d\n"
2334         "\t 4 3\n"
2335         "\t 5 4\n"
2336         "\t 6 5f\n"
2337         "\t 7 76\n"
2338         "\t 8 7g\n"
2339         "\t 9 8\n"
2340         "\t10 9\n"
2341         "\t11 10js\n"
2342         "\t12 11j\n"
2343         "\t13 12k\n"
2344         "\t14 13m\n"
2345         "\t15 14n\n"
2346         "\t16 15p\n"
2347         "\t17 16r\n"
2348         "\t18 17s\n"
2349         "\t19 18t\n",
2350     __FILE__, setDimClassTol, g);
2351
2352   di.Add ("XGetDimensionClassOfTol","XGetDimensionClassOfTol Doc Dim_Label",
2353     __FILE__, getDimClassTol, g);
2354
2355   di.Add ("XSetDimensionNbOfDecimalPlaces","XSetDimensionNbOfDecimalPlaces Doc Dim_Label l_val r_val",
2356     __FILE__, setDimNbOfDecimalPlaces, g);
2357
2358   di.Add ("XGetDimensionNbOfDecimalPlaces","XGetDimensionNbOfDecimalPlaces Doc Dim_Label",
2359     __FILE__, getDimNbOfDecimalPlaces, g);
2360
2361   di.Add ("XAddDimensionModifiers","XAddDimensionModifiers Doc Dim_Label mod1 mod2 ..."
2362         "Values:"
2363       "\t 0 ControlledRadius\n"
2364       "\t 1 Square\n"
2365       "\t 2 StatisticalTolerance\n"
2366       "\t 3 ContinuousFeature\n"
2367       "\t 4 TwoPointSize\n"
2368       "\t 5 LocalSizeDefinedBySphere\n"
2369       "\t 6 LeastSquaresAssociationCriterion\n"
2370       "\t 7 MaximumInscribedAssociation\n"
2371       "\t 8 MinimumCircumscribedAssociation\n"
2372       "\t 9 CircumferenceDiameter\n"
2373       "\t10 AreaDiameter\n"
2374       "\t11 VolumeDiameter\n"
2375       "\t12 MaximumSize\n"
2376       "\t13 MinimumSize\n"
2377       "\t14 AverageSize\n"
2378       "\t15 MedianSize\n"
2379       "\t16 MidRangeSize\n"
2380       "\t17 RangeOfSizes\n"
2381       "\t18 AnyRestrictedPortionOfFeature\n"
2382       "\t19 AnyCrossSection\n"
2383       "\t20 SpecificFixedCrossSection\n"
2384       "\t21 CommonTolerance\n"
2385       "\t22 FreeStateCondition\n"
2386       "\t23 Between\n",
2387     __FILE__, addDimModifier, g);
2388
2389   di.Add ("XGetDimensionModifiers","XGetDimensionModifiers Doc Dim_Label",
2390     __FILE__, getDimModifier, g);
2391   
2392   di.Add ("XSetDimensionPath","XSetDimensionPath Doc Dim_Label path(edge)",
2393     __FILE__, addDimPath, g);
2394
2395   di.Add ("XSetDimensionPoints","XSetDimensionPoints Doc Dim_Label v1 v2",
2396     __FILE__, addDimPoints, g);
2397
2398   di.Add ("XGetDimensionPoints","XGetDimensionPoints Doc Dim_Label",
2399     __FILE__, getDimPoints, g);
2400
2401   di.Add ("XSetDimensionDir","XSetDimensionDir Doc Dim_Label x y z",
2402     __FILE__, addDimDir, g);
2403
2404   di.Add ("XGetDimensionDir","XGetDimensionDir Doc Dim_Label",
2405     __FILE__, getDimDir, g);
2406 }