]> OCCT Git - occt-copy.git/commitdiff
0026411: Necessary to improve XCAF to store and querying GD&T data.
authorink <ink@opencascade.com>
Thu, 9 Jul 2015 09:01:55 +0000 (12:01 +0300)
committerink <ink@opencascade.com>
Wed, 19 Aug 2015 07:36:15 +0000 (10:36 +0300)
42 files changed:
adm/UDLIST
src/STEPCAFControl/STEPCAFControl_Writer.cxx
src/TKXCAF/PACKAGES
src/XCAFDimTolObjects/XCAFDimTolObjects.cdl [new file with mode: 0644]
src/XCAFDimTolObjects/XCAFDimTolObjects_DatumObject.cdl [new file with mode: 0644]
src/XCAFDimTolObjects/XCAFDimTolObjects_DatumObject.cxx [new file with mode: 0644]
src/XCAFDimTolObjects/XCAFDimTolObjects_DimensionObject.cdl [new file with mode: 0644]
src/XCAFDimTolObjects/XCAFDimTolObjects_DimensionObject.cxx [new file with mode: 0644]
src/XCAFDimTolObjects/XCAFDimTolObjects_GeomToleranceObject.cdl [new file with mode: 0644]
src/XCAFDimTolObjects/XCAFDimTolObjects_GeomToleranceObject.cxx [new file with mode: 0644]
src/XCAFDimTolObjects/XCAFDimTolObjects_Tool.cdl [new file with mode: 0644]
src/XCAFDimTolObjects/XCAFDimTolObjects_Tool.cxx [new file with mode: 0644]
src/XCAFDoc/XCAFDoc.cdl
src/XCAFDoc/XCAFDoc.cxx
src/XCAFDoc/XCAFDoc_Datum.cdl
src/XCAFDoc/XCAFDoc_Datum.cxx
src/XCAFDoc/XCAFDoc_DimTol.cxx
src/XCAFDoc/XCAFDoc_DimTolTool.cdl
src/XCAFDoc/XCAFDoc_DimTolTool.cxx
src/XCAFDoc/XCAFDoc_Dimension.cdl [new file with mode: 0644]
src/XCAFDoc/XCAFDoc_Dimension.cxx [new file with mode: 0644]
src/XCAFDoc/XCAFDoc_GeomTolerance.cdl [new file with mode: 0644]
src/XCAFDoc/XCAFDoc_GeomTolerance.cxx [new file with mode: 0644]
src/XDEDRAW/XDEDRAW.cdl
src/XDEDRAW/XDEDRAW.cxx
src/XDEDRAW/XDEDRAW_GDTs.cdl [new file with mode: 0644]
src/XDEDRAW/XDEDRAW_GDTs.cxx [new file with mode: 0644]
tests/gdt/begin [new file with mode: 0644]
tests/gdt/dimensions/A1 [new file with mode: 0644]
tests/gdt/dimensions/A2 [new file with mode: 0644]
tests/gdt/dimensions/A3 [new file with mode: 0644]
tests/gdt/dimensions/A4 [new file with mode: 0644]
tests/gdt/dimensions/A5 [new file with mode: 0644]
tests/gdt/dimensions/A6 [new file with mode: 0644]
tests/gdt/dimensions/begin [new file with mode: 0644]
tests/gdt/dimensions/end [new file with mode: 0644]
tests/gdt/end [new file with mode: 0644]
tests/gdt/grids.list [new file with mode: 0644]
tests/gdt/tolerances/A1 [new file with mode: 0644]
tests/gdt/tolerances/A2 [new file with mode: 0644]
tests/gdt/tolerances/begin [new file with mode: 0644]
tests/gdt/tolerances/end [new file with mode: 0644]

index be32f80619fdc94cc725faaefe0dda038dbefbd6..dc1157985586fe357e68d383918927cbce7de01f 100644 (file)
@@ -402,6 +402,7 @@ p VrmlAPI
 p VrmlConverter
 p VrmlData
 p XCAFApp
+p XCAFDimTolObjects
 p XCAFDoc
 p XCAFDrivers
 p XCAFPrs
@@ -481,4 +482,4 @@ p IVtkVTK
 p IVtkTools
 t TKIVtk
 p IVtkDraw
-t TKIVtkDraw
\ No newline at end of file
+t TKIVtkDraw
index 6aac6d2da1fde56d6f93e24e1b6a11ce31831214..2832f86019a42f3bc228bbe28db45f071d6a8632 100644 (file)
@@ -2024,10 +2024,10 @@ Standard_Boolean STEPCAFControl_Writer::WriteDGTs (const Handle(XSControl_WorkSe
   Standard_Integer i;
   for(i=1; i<=DGTLabels.Length(); i++) {
     TDF_Label DatumL = DGTLabels.Value(i);
-    TDF_Label ShapeL;
+    TDF_LabelSequence ShapeL;
     if(!DGTTool->GetRefShapeLabel(DatumL,ShapeL)) continue;
     // find target shape
-    TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(ShapeL);
+    TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(ShapeL.Value(1));
     TopLoc_Location Loc;
     TColStd_SequenceOfTransient seqRI;
     FindEntities( FP, aShape, Loc, seqRI );
@@ -2105,10 +2105,10 @@ Standard_Boolean STEPCAFControl_Writer::WriteDGTs (const Handle(XSControl_WorkSe
   if(DGTLabels.Length()<=0) return Standard_False;
   for(i=1; i<=DGTLabels.Length(); i++) {
     TDF_Label DimTolL = DGTLabels.Value(i);
-    TDF_Label ShapeL;
+    TDF_LabelSequence ShapeL;
     if(!DGTTool->GetRefShapeLabel(DimTolL,ShapeL)) continue;
     // find target shape
-    TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(ShapeL);
+    TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(ShapeL.Value(1));
     TopLoc_Location Loc;
     TColStd_SequenceOfTransient seqRI;
     FindEntities( FP, aShape, Loc, seqRI );
@@ -2248,7 +2248,7 @@ Standard_Boolean STEPCAFControl_Writer::WriteDGTs (const Handle(XSControl_WorkSe
     else if(kind<50) { //tolerance
       if(kind<35) { // tolerance with datum system
         TDF_LabelSequence DatumLabels;
-        DGTTool->GetDatumTolerLabels(DimTolL,DatumLabels);
+        DGTTool->GetDatumOfTolerLabels(DimTolL,DatumLabels);
         Standard_Integer NbDR = DatumLabels.Length();
         Handle(StepDimTol_HArray1OfDatumReference) HADR = new StepDimTol_HArray1OfDatumReference(1,NbDR);
         for(Standard_Integer j=1; j<=NbDR; j++) {
index 9731d6722dffaf6e20e555a24bcca44f143f8c30..ad9e0b5c8239f74ac5ac6fa6edd61c32e397ad94 100755 (executable)
@@ -1,3 +1,4 @@
 XCAFApp
+XCAFDimTolObjects
 XCAFDoc
 XCAFPrs
diff --git a/src/XCAFDimTolObjects/XCAFDimTolObjects.cdl b/src/XCAFDimTolObjects/XCAFDimTolObjects.cdl
new file mode 100644 (file)
index 0000000..5a4ed0f
--- /dev/null
@@ -0,0 +1,291 @@
+-- Created on: 2015-07-31
+-- Created by: data exchange team
+-- Copyright (c) 2000-2015 OPEN CASCADE SAS
+--
+-- This file is part of Open CASCADE Technology software library.
+--
+-- This library is free software; you can redistribute it and/or modify it under
+-- the terms of the GNU Lesser General Public License version 2.1 as published
+-- by the Free Software Foundation, with special exception defined in the file
+-- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+-- distribution for complete text of the license and disclaimer of any warranty.
+--
+-- Alternatively, this file may be used under the terms of Open CASCADE
+-- commercial license or contractual agreement.
+
+package XCAFDimTolObjects
+
+    ---Purpose:
+        
+uses
+    TCollection,
+    TColStd,
+    TopoDS,
+    gp,
+    TColgp,
+    XCAFDoc,
+    TDocStd
+    
+is
+
+    enumeration DimensionType is
+       ---Purpose: Defines types of dimension
+        DimensionType_Location_None,
+        DimensionType_Location_CurvedDistance,        
+        DimensionType_Location_LinearDistance,        
+        DimensionType_Location_LinearDistance_FromCenterToOuter,        
+        DimensionType_Location_LinearDistance_FromCenterToInner,        
+        DimensionType_Location_LinearDistance_FromOuterToCenter,        
+        DimensionType_Location_LinearDistance_FromOuterToOuter,        
+        DimensionType_Location_LinearDistance_FromOuterToInner,        
+        DimensionType_Location_LinearDistance_FromInnerToCenter,        
+        DimensionType_Location_LinearDistance_FromInnerToOuter,
+        DimensionType_Location_LinearDistance_FromInnerToInner,        
+        DimensionType_Location_Angular,
+        DimensionType_Location_Oriented,
+        DimensionType_Location_WithPath,
+        DimensionType_Size_CurveLength,
+        DimensionType_Size_Diameter,
+        DimensionType_Size_SphericalDiameter,
+        DimensionType_Size_Radius,
+        DimensionType_Size_SphericalRadius,
+        DimensionType_Size_ToroidalMinorDiameter,
+        DimensionType_Size_ToroidalMajorDiameter,
+        DimensionType_Size_ToroidalMinorRadius,
+        DimensionType_Size_ToroidalMajorRadius,
+        DimensionType_Size_ToroidalHighMajorDiameter,
+        DimensionType_Size_ToroidalLowMajorDiameter,
+        DimensionType_Size_ToroidalHighMajorRadius,
+        DimensionType_Size_ToroidalLowMajorRadius,
+        DimensionType_Size_Thickness,
+        DimensionType_Size_Angular,
+        DimensionType_Size_WithPath
+    end DimensionType;
+
+    enumeration DimensionQualifier is
+       ---Purpose: Defines types of qualifier
+        DimensionQualifier_None,        
+        DimensionQualifier_Min,
+       DimensionQualifier_Max,
+       DimensionQualifier_Avg 
+    end DimensionQualifier;
+
+    enumeration DimensionFormVariance is
+       ---Purpose: Defines value of form variance
+        DimensionFormVariance_None,        
+        DimensionFormVariance_A,
+        DimensionFormVariance_B,
+        DimensionFormVariance_C,
+        DimensionFormVariance_CD,
+        DimensionFormVariance_D,
+        DimensionFormVariance_E,
+        DimensionFormVariance_EF,
+        DimensionFormVariance_F,
+        DimensionFormVariance_FG,
+        DimensionFormVariance_G,
+        DimensionFormVariance_H,
+        DimensionFormVariance_JS,
+        DimensionFormVariance_J,
+        DimensionFormVariance_K,
+        DimensionFormVariance_M,
+        DimensionFormVariance_N,
+        DimensionFormVariance_P,
+        DimensionFormVariance_R,
+        DimensionFormVariance_S,
+        DimensionFormVariance_T,
+        DimensionFormVariance_U,
+        DimensionFormVariance_V,
+        DimensionFormVariance_X,
+        DimensionFormVariance_Y,
+        DimensionFormVariance_Z,
+        DimensionFormVariance_ZA,
+        DimensionFormVariance_ZB,
+        DimensionFormVariance_ZC
+    end DimensionFormVariance;
+
+    enumeration DimensionGrade is
+       ---Purpose: Defines value of grade
+        DimensionGrade_IT01,        
+        DimensionGrade_IT0,
+        DimensionGrade_IT1,
+        DimensionGrade_IT2,
+        DimensionGrade_IT3,
+        DimensionGrade_IT4,
+        DimensionGrade_IT5,
+        DimensionGrade_IT6,
+        DimensionGrade_IT7,
+        DimensionGrade_IT8,
+        DimensionGrade_IT9,
+        DimensionGrade_IT10,
+        DimensionGrade_IT11,
+        DimensionGrade_IT12,
+        DimensionGrade_IT13,
+        DimensionGrade_IT14,
+        DimensionGrade_IT15,
+        DimensionGrade_IT16,
+        DimensionGrade_IT17,
+        DimensionGrade_IT18 
+    end DimensionGrade;
+
+    enumeration GeomToleranceType is
+       ---Purpose: Defines types of geom tolerance
+        GeomToleranceType_None,
+        GeomToleranceType_Angularity,        
+        GeomToleranceType_CircularRunout,        
+        GeomToleranceType_CircularityOrRoundness,        
+        GeomToleranceType_Coaxiality,        
+        GeomToleranceType_Concentricity,        
+        GeomToleranceType_Cylindricity,        
+        GeomToleranceType_Flatness,        
+        GeomToleranceType_Parallelism,        
+        GeomToleranceType_Perpendicularity,        
+        GeomToleranceType_Position,        
+        GeomToleranceType_ProfileOfLine,        
+        GeomToleranceType_ProfileOfSurface,        
+        GeomToleranceType_Straightness,        
+        GeomToleranceType_Symmetry,
+        GeomToleranceType_TotalRunout
+    end GeomToleranceType;
+
+    enumeration GeomToleranceTypeValue is
+       ---Purpose: Defines types of value of tolerane
+        GeomToleranceTypeValue_None,        
+        GeomToleranceTypeValue_Diameter,
+        GeomToleranceTypeValue_SphericalDiameter
+    end GeomToleranceTypeValue;
+
+    enumeration GeomToleranceMatReqModif is
+       ---Purpose: Defines types of material requirement
+        GeomToleranceMatReqModif_None,        
+        GeomToleranceMatReqModif_M,        
+        GeomToleranceMatReqModif_L
+    end GeomToleranceMatReqModif;
+
+    enumeration GeomToleranceZoneModif is
+       ---Purpose: Defines types of zone
+        GeomToleranceZoneModif_None,        
+        GeomToleranceZoneModif_P,
+        GeomToleranceZoneModif_NonUniform
+    end GeomToleranceZoneModif;
+
+
+    enumeration DatumSingleModif is
+       ---Purpose: Defines modifirs 
+        DatumSingleModif_AnyCrossSection,
+        DatumSingleModif_Any_LongitudinalSection,
+        DatumSingleModif_Basic,
+        DatumSingleModif_ContactingFeature,
+        DatumSingleModif_DegreeOfFreedomConstraintU,
+        DatumSingleModif_DegreeOfFreedomConstraintV,
+        DatumSingleModif_DegreeOfFreedomConstraintW,
+        DatumSingleModif_DegreeOfFreedomConstraintX,
+        DatumSingleModif_DegreeOfFreedomConstraintY,
+        DatumSingleModif_DegreeOfFreedomConstraintZ,
+        DatumSingleModif_DistanceVariable,
+        DatumSingleModif_FreeState,
+        DatumSingleModif_LeastMaterialRequirement,
+        DatumSingleModif_Line,
+        DatumSingleModif_MajorDiameter,
+        DatumSingleModif_MaximumMaterialRequirement,
+        DatumSingleModif_MinorDiameter,
+        DatumSingleModif_Orientation,
+        DatumSingleModif_PitchDiameter,
+        DatumSingleModif_Plane,
+        DatumSingleModif_Point,
+        DatumSingleModif_Translation 
+    end DatumSingleModif;
+
+    enumeration DatumModifWithValue is
+       ---Purpose: Defines modifirs 
+        DatumModifWithValue_None,
+        DatumModifWithValue_CircularOrCylindrical,
+        DatumModifWithValue_Distance,
+        DatumModifWithValue_Projected,
+        DatumModifWithValue_Spherical 
+    end DatumModifWithValue;
+
+    enumeration DimensionModif is
+       ---Purpose: Defines modifirs
+        DimensionModif_ControlledRadius,
+        DimensionModif_Square,
+        DimensionModif_StatisticalTolerance,
+        DimensionModif_ContinuousFeature,
+        DimensionModif_TwoPointSize,
+        DimensionModif_LocalSizeDefinedBySphere,
+        DimensionModif_LeastSquaresAssociationCriterion,
+        DimensionModif_MaximumInscribedAssociation,
+        DimensionModif_MinimumCircumscribedAssociation,
+        DimensionModif_CircumferenceDiameter,
+        DimensionModif_AreaDiameter,
+        DimensionModif_VolumeDiameter,
+        DimensionModif_MaximumSize,
+        DimensionModif_MinimumSize,
+        DimensionModif_AverageSize,
+        DimensionModif_MedianSize,
+        DimensionModif_MidRangeSize,
+        DimensionModif_RangeOfSizes,
+        DimensionModif_AnyRestrictedPortionOfFeature,
+        DimensionModif_AnyCrossSection,
+        DimensionModif_SpecificFixedCrossSection,
+        DimensionModif_CommonTolerance,
+        DimensionModif_FreeStateCondition,
+        DimensionModif_Between
+    end DimensionModif;
+
+    enumeration GeomToleranceModif is
+       ---Purpose: Defines modifirs 
+        GeomToleranceModif_Any_Cross_Section,
+        GeomToleranceModif_Common_Zone,
+        GeomToleranceModif_Each_Radial_Element,
+        GeomToleranceModif_Free_State,
+        GeomToleranceModif_Least_Material_Requirement,
+        GeomToleranceModif_Line_Element,
+        GeomToleranceModif_Major_Diameter,
+        GeomToleranceModif_Maximum_Material_Requirement,
+        GeomToleranceModif_Minor_Diameter,
+        GeomToleranceModif_Not_Convex,
+        GeomToleranceModif_Pitch_Diameter,
+        GeomToleranceModif_Reciprocity_Requirement,
+        GeomToleranceModif_Separate_Requirement,
+        GeomToleranceModif_Statistical_Tolerance,
+        GeomToleranceModif_Tangent_Plane
+    end GeomToleranceModif;
+
+        
+    class DimensionObject;
+
+    class GeomToleranceObject;
+
+    class DatumObject;
+
+    class Tool;
+    
+    class DimensionObjectSequence instantiates Sequence from TCollection
+       (DimensionObject from XCAFDimTolObjects);
+       ---Purpose: class for containing Dimension.
+
+    class GeomToleranceObjectSequence instantiates Sequence from TCollection
+       (GeomToleranceObject from XCAFDimTolObjects);
+       ---Purpose: class for containing GeomTolerances.
+
+    class DatumObjectSequence instantiates Sequence from TCollection
+       (DatumObject from XCAFDimTolObjects);
+       ---Purpose: class for containing Datums.
+
+    class DimensionModifiersSequence instantiates Sequence from TCollection
+       (DimensionModif from XCAFDimTolObjects);
+       ---Purpose: class for containing modifiers of Dimension.
+
+    class GeomToleranceModifiersSequence instantiates Sequence from TCollection
+       (GeomToleranceModif from XCAFDimTolObjects);
+       ---Purpose: class for containing modifiers of GeomTolerances.
+
+    class DatumModifiersSequence instantiates Sequence from TCollection
+       (DatumSingleModif from XCAFDimTolObjects);
+       ---Purpose: class for containing modifiers of Datums.
+
+    class DataMapOfToleranceDatum instantiates DataMap from TCollection 
+    (GeomToleranceObject from XCAFDimTolObjects,DatumObject from XCAFDimTolObjects,MapTransientHasher  from  TColStd); 
+       ---Purpose:
+                                                                                                               
+end XCAFDimTolObjects;                                                  
diff --git a/src/XCAFDimTolObjects/XCAFDimTolObjects_DatumObject.cdl b/src/XCAFDimTolObjects/XCAFDimTolObjects_DatumObject.cdl
new file mode 100644 (file)
index 0000000..f517f16
--- /dev/null
@@ -0,0 +1,63 @@
+-- Created on: 2015-07-31
+-- Created by: data exchange team
+-- Copyright (c) 2000-2015 OPEN CASCADE SAS
+--
+-- This file is part of Open CASCADE Technology software library.
+--
+-- This library is free software; you can redistribute it and/or modify it under
+-- the terms of the GNU Lesser General Public License version 2.1 as published
+-- by the Free Software Foundation, with special exception defined in the file
+-- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+-- distribution for complete text of the license and disclaimer of any warranty.
+--
+-- Alternatively, this file may be used under the terms of Open CASCADE
+-- commercial license or contractual agreement.
+
+class DatumObject from XCAFDimTolObjects inherits Transient from Standard
+
+       ---Purpose: object to store datum
+
+uses
+    HAsciiString from TCollection,
+    DatumModifWithValue from XCAFDimTolObjects,
+    DatumModifiersSequence from XCAFDimTolObjects,
+    DatumSingleModif from XCAFDimTolObjects,
+    Shape from TopoDS
+
+is
+    Create returns DatumObject from XCAFDimTolObjects;
+
+    Create(theObj : DatumObject from XCAFDimTolObjects) returns DatumObject from XCAFDimTolObjects;
+    
+    ---Category: class methods
+    --           =============
+
+            
+    GetName (me) returns HAsciiString from TCollection;
+
+    SetName (me : mutable; theTag : HAsciiString from TCollection);
+
+    GetModifiers (me) returns DatumModifiersSequence from XCAFDimTolObjects;
+
+    SetModifiers (me : mutable; theModifiers : DatumModifiersSequence from XCAFDimTolObjects);
+
+    GetModifierWithValue (me; theModifier : out DatumModifWithValue from XCAFDimTolObjects; theValue : out Real from Standard);
+
+    SetModifierWithValue (me : mutable; theModifier : DatumModifWithValue from XCAFDimTolObjects; theValue : Real from Standard);
+
+    AddModifier (me : mutable; theModifier : DatumSingleModif from XCAFDimTolObjects);
+
+    GetDatumTarget (me) returns Shape from TopoDS;
+
+    SetDatumTarget (me : mutable; theShape : Shape from TopoDS);
+
+    IsDatumTarget (me) returns Boolean from Standard;
+
+fields
+    myName : HAsciiString from TCollection;
+    myModifiers : DatumModifiersSequence from XCAFDimTolObjects;
+    myModifierWithValue : DatumModifWithValue from XCAFDimTolObjects;
+    myValueOfModifier : Real from Standard;
+    myDatumTarget : Shape from TopoDS;
+
+end DatumObject;
diff --git a/src/XCAFDimTolObjects/XCAFDimTolObjects_DatumObject.cxx b/src/XCAFDimTolObjects/XCAFDimTolObjects_DatumObject.cxx
new file mode 100644 (file)
index 0000000..96cc117
--- /dev/null
@@ -0,0 +1,142 @@
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <XCAFDimTolObjects_DatumObject.ixx>
+
+
+//=======================================================================
+//function : XCAFDimTolObjects_DatumObject
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_DatumObject::XCAFDimTolObjects_DatumObject()
+{
+}
+
+//=======================================================================
+//function : XCAFDimTolObjects_DatumObject
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_DatumObject::XCAFDimTolObjects_DatumObject(const Handle(XCAFDimTolObjects_DatumObject)& theObj)
+{
+  myName = theObj->myName;
+  myModifiers = theObj->myModifiers;
+  myModifierWithValue = theObj->myModifierWithValue;
+  myValueOfModifier = theObj->myValueOfModifier;
+  myDatumTarget = theObj->myDatumTarget;
+}
+
+//=======================================================================
+//function : GetName
+//purpose  : 
+//=======================================================================
+
+Handle(TCollection_HAsciiString) XCAFDimTolObjects_DatumObject::GetName() const
+{
+  if(myName.IsNull())
+    return new TCollection_HAsciiString();
+  return myName;
+}
+
+//=======================================================================
+//function : SetName
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_DatumObject::SetName(const Handle(TCollection_HAsciiString)& theName)
+{
+  myName = theName;
+}
+
+//=======================================================================
+//function : GetModifiers
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_DatumModifiersSequence XCAFDimTolObjects_DatumObject::GetModifiers() const
+{
+  return myModifiers;
+}
+
+//=======================================================================
+//function : SetModifiers
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_DatumObject::SetModifiers(const XCAFDimTolObjects_DatumModifiersSequence& theModifiers)
+{
+  myModifiers = theModifiers;
+}
+
+//=======================================================================
+//function : SetModifierWithValue
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_DatumObject::SetModifierWithValue(const XCAFDimTolObjects_DatumModifWithValue theModifier, const Standard_Real theValue)
+{
+  myModifierWithValue = theModifier;
+  myValueOfModifier = theValue;
+}
+
+//=======================================================================
+//function : GetModifierWithValue
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_DatumObject::GetModifierWithValue(XCAFDimTolObjects_DatumModifWithValue& theModifier, Standard_Real& theValue) const
+{
+  theModifier = myModifierWithValue;
+  theValue = myValueOfModifier;
+}
+  
+//=======================================================================
+//function : AddModifier
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_DatumObject::AddModifier(const XCAFDimTolObjects_DatumSingleModif theModifier)
+{
+  myModifiers.Append(theModifier);
+}
+
+//=======================================================================
+//function : GetDatumTarget
+//purpose  : 
+//=======================================================================
+
+TopoDS_Shape XCAFDimTolObjects_DatumObject::GetDatumTarget()  const
+{
+  return myDatumTarget;
+}
+
+//=======================================================================
+//function : SetDatumTarget
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_DatumObject::SetDatumTarget (const TopoDS_Shape& theShape) 
+{
+  myDatumTarget = theShape;
+}
+  
+//=======================================================================
+//function : IsDatumTarget
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDimTolObjects_DatumObject::IsDatumTarget()  const
+{
+  return !myDatumTarget.IsNull();
+}
diff --git a/src/XCAFDimTolObjects/XCAFDimTolObjects_DimensionObject.cdl b/src/XCAFDimTolObjects/XCAFDimTolObjects_DimensionObject.cdl
new file mode 100644 (file)
index 0000000..bf4ebdd
--- /dev/null
@@ -0,0 +1,128 @@
+-- Created on: 2015-07-31
+-- Created by: data exchange team
+-- Copyright (c) 2000-2015 OPEN CASCADE SAS
+--
+-- This file is part of Open CASCADE Technology software library.
+--
+-- This library is free software; you can redistribute it and/or modify it under
+-- the terms of the GNU Lesser General Public License version 2.1 as published
+-- by the Free Software Foundation, with special exception defined in the file
+-- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+-- distribution for complete text of the license and disclaimer of any warranty.
+--
+-- Alternatively, this file may be used under the terms of Open CASCADE
+-- commercial license or contractual agreement.
+
+class DimensionObject from XCAFDimTolObjects inherits Transient from Standard
+
+       ---Purpose: object to store dimension
+
+uses
+    HArray1OfReal from TColStd,
+    DimensionQualifier from XCAFDimTolObjects,
+    DimensionType from XCAFDimTolObjects,
+    DimensionFormVariance from XCAFDimTolObjects,
+    DimensionGrade from XCAFDimTolObjects,
+    Edge from TopoDS,
+    Dir from gp,
+    HArray1OfPnt from TColgp,
+    DimensionModifiersSequence from XCAFDimTolObjects,
+    DimensionModif from XCAFDimTolObjects
+
+is
+
+    Create returns DimensionObject from XCAFDimTolObjects;
+
+    Create(theObj : DimensionObject from XCAFDimTolObjects) returns DimensionObject from XCAFDimTolObjects;
+    
+    ---Category: class methods
+    --           =============
+
+    SetQualifier (me : mutable; theQualifier : DimensionQualifier from XCAFDimTolObjects);
+
+    GetQualifier (me) returns DimensionQualifier from XCAFDimTolObjects;
+
+    HasQualifier (me) returns Boolean;
+
+    SetType (me : mutable; theTyupe : DimensionType from XCAFDimTolObjects);
+
+    GetType (me) returns DimensionType from XCAFDimTolObjects;
+
+    GetValue (me) returns Real from Standard ;
+
+    GetValues (me) returns HArray1OfReal from TColStd ;
+
+    SetValue (me : mutable; theValue : Real from Standard );
+
+    SetValues (me : mutable; theValue : HArray1OfReal from TColStd );
+
+    IsDimWithRange (me) returns Boolean;
+
+    SetUpperBound(me : mutable; theUpperBound : Real from Standard);
+
+    SetLowerBound(me : mutable; theLowerBound : Real from Standard);
+
+    GetUpperBound(me) returns Real from Standard;
+
+    GetLowerBound(me) returns Real from Standard;
+
+    IsDimWithPlusMinusTolerance (me) returns Boolean;
+
+    SetUpperTolValue(me : mutable; theUperTolValue : Real from Standard) returns Boolean from Standard;
+
+    SetLowerTolValue(me : mutable; theLowerTolValue : Real from Standard) returns Boolean from Standard;
+
+    GetUpperTolValue(me) returns Real from Standard;
+
+    GetLowerTolValue(me) returns Real from Standard;
+
+    IsDimWithClassOfTolerance (me) returns Boolean;
+
+    SetClassOfTolerance(me : mutable; theHole : Boolean from Standard;
+                                      theFormVariance : DimensionFormVariance from XCAFDimTolObjects;
+                                      theGrade : DimensionGrade from XCAFDimTolObjects);
+
+    GetClassOfTolerance(me; theHole : out Boolean from Standard;
+                                      theFormVariance : out DimensionFormVariance from XCAFDimTolObjects;
+                                      theGrade : out DimensionGrade from XCAFDimTolObjects)
+    returns Boolean from Standard;
+
+    SetNbOfDecimalPlaces(me : mutable; theL : Integer from Standard;
+                                      theR : Integer from Standard);
+
+    GetNbOfDecimalPlaces(me; theL : out Integer from Standard;
+                             theR : out Integer from Standard);
+
+    GetModifiers(me) returns DimensionModifiersSequence from XCAFDimTolObjects;
+
+    SetModifiers(me : mutable; theModifiers : DimensionModifiersSequence from XCAFDimTolObjects );
+
+    AddModifier(me : mutable; theModifier : DimensionModif from XCAFDimTolObjects);
+
+    GetPath(me) returns Edge from TopoDS;
+
+    SetPath(me : mutable; thePath : Edge from TopoDS);
+
+    GetDirection(me; theDir : out Dir from gp) returns Boolean from Standard;
+
+    SetDirection(me : mutable; theDir : Dir from gp)returns Boolean from Standard;
+
+    GetPoints(me) returns HArray1OfPnt from TColgp;
+
+    SetPoints(me : mutable; thePnts : HArray1OfPnt from TColgp);
+
+fields
+    myType : DimensionType from XCAFDimTolObjects;
+    myVal : HArray1OfReal from TColStd;
+    myQualifier : DimensionQualifier from XCAFDimTolObjects; 
+    myIsHole : Boolean from Standard;
+    myFormVariance : DimensionFormVariance from XCAFDimTolObjects;
+    myGrade : DimensionGrade from XCAFDimTolObjects;
+    myL : Integer from Standard; 
+    myR : Integer from Standard;
+    myModifiers : DimensionModifiersSequence from XCAFDimTolObjects;
+    myPath : Edge from TopoDS;
+    myDir : Dir from gp;
+    myPnts : HArray1OfPnt from TColgp;
+
+end DimensionObject;
diff --git a/src/XCAFDimTolObjects/XCAFDimTolObjects_DimensionObject.cxx b/src/XCAFDimTolObjects/XCAFDimTolObjects_DimensionObject.cxx
new file mode 100644 (file)
index 0000000..d9c65b2
--- /dev/null
@@ -0,0 +1,430 @@
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <XCAFDimTolObjects_DimensionObject.ixx>
+
+#include <Precision.hxx>
+#include <TColgp_HArray1OfPnt.hxx>
+
+
+//=======================================================================
+//function : XCAFDimTolObjects_DimensionObject
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_DimensionObject::XCAFDimTolObjects_DimensionObject()
+{
+}
+
+//=======================================================================
+//function : 
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_DimensionObject::XCAFDimTolObjects_DimensionObject(const Handle(XCAFDimTolObjects_DimensionObject)& theObj)
+{
+  myType = theObj->myType;
+  myVal = theObj->myVal;
+  myQualifier = theObj->myQualifier;
+  myIsHole = theObj->myIsHole;
+  myFormVariance = theObj->myFormVariance;
+  myGrade = theObj->myGrade;
+  myL = theObj->myL;
+  myR = theObj->myR;
+  myModifiers = theObj->myModifiers;
+  myPath = theObj->myPath;
+  myDir = theObj->myDir;
+  myPnts = theObj->myPnts;
+}
+
+//=======================================================================
+//function : SetQualifier
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::SetQualifier (const XCAFDimTolObjects_DimensionQualifier theQualifier)
+{
+  myQualifier = theQualifier;
+}
+
+//=======================================================================
+//function : GetQualifier
+//purpose  : 
+//=======================================================================
+XCAFDimTolObjects_DimensionQualifier XCAFDimTolObjects_DimensionObject::GetQualifier()  const
+{
+  return myQualifier;
+}
+
+//=======================================================================
+//function : HasQualifier
+//purpose  : 
+//=======================================================================
+Standard_Boolean XCAFDimTolObjects_DimensionObject::HasQualifier()  const
+{
+  return (myQualifier != XCAFDimTolObjects_DimensionQualifier_None);
+}
+
+//=======================================================================
+//function : SetType
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::SetType (const XCAFDimTolObjects_DimensionType theType)
+{
+  myType = theType;
+}
+
+//=======================================================================
+//function : GetType
+//purpose  : 
+//=======================================================================
+XCAFDimTolObjects_DimensionType XCAFDimTolObjects_DimensionObject::GetType()  const
+{
+  return myType;
+}
+  
+//=======================================================================
+//function : GetValue
+//purpose  : 
+//=======================================================================
+Standard_Real XCAFDimTolObjects_DimensionObject::GetValue ()  const
+{
+  if(!myVal.IsNull() && (myVal->Length() == 1 || myVal->Length() == 3))
+  {
+    return myVal->Value(1);
+  }
+  return 0;
+}
+
+//=======================================================================
+//function : GetValues
+//purpose  : 
+//=======================================================================
+Handle(TColStd_HArray1OfReal) XCAFDimTolObjects_DimensionObject::GetValues ()  const
+{
+  return myVal;
+}
+
+//=======================================================================
+//function : SetValue
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::SetValue (const Standard_Real theValue)
+{
+  myVal = new TColStd_HArray1OfReal(1, 1);
+  myVal->SetValue(1,theValue);
+}
+
+//=======================================================================
+//function : SetValues
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::SetValues (const Handle(TColStd_HArray1OfReal)& theValue)
+{
+  myVal = theValue;
+}
+  
+//=======================================================================
+//function : IsDimWithRange
+//purpose  : 
+//=======================================================================
+Standard_Boolean XCAFDimTolObjects_DimensionObject::IsDimWithRange()  const
+{
+  if (!myVal.IsNull() && myVal->Length() == 2)
+    return Standard_True;
+  return Standard_False;
+}
+  
+//=======================================================================
+//function : SetUpperBound
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::SetUpperBound (const Standard_Real theUpperBound)
+{
+  if(!myVal.IsNull() && myVal->Length() > 1)
+    myVal->SetValue(2, theUpperBound);
+  else
+  {
+    myVal = new TColStd_HArray1OfReal(1, 2);
+    myVal->SetValue(1, theUpperBound);
+    myVal->SetValue(2, theUpperBound);
+  }
+}
+  
+//=======================================================================
+//function : SetLowerBound
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::SetLowerBound (const Standard_Real theLowerBound)
+{
+  if(!myVal.IsNull() && myVal->Length() > 1)
+    myVal->SetValue(1, theLowerBound);
+  else
+  {
+    myVal = new TColStd_HArray1OfReal(1, 2);
+    myVal->SetValue(2, theLowerBound);
+    myVal->SetValue(1, theLowerBound);
+  }
+}
+  
+//=======================================================================
+//function : GetUpperBound
+//purpose  : 
+//=======================================================================
+Standard_Real XCAFDimTolObjects_DimensionObject::GetUpperBound ()  const
+{
+  if(!myVal.IsNull() && myVal->Length() == 2)
+  {
+    return myVal->Value(2);
+  }
+  return 0;
+}
+  
+//=======================================================================
+//function : GetLowerBound
+//purpose  : 
+//=======================================================================
+Standard_Real XCAFDimTolObjects_DimensionObject::GetLowerBound ()  const
+{
+  if(!myVal.IsNull() && myVal->Length() == 2)
+  {
+    return myVal->Value(1);
+  }
+  return 0;
+}
+  
+//=======================================================================
+//function : IsDimWithPlusMinusTolerance
+//purpose  : 
+//=======================================================================
+Standard_Boolean XCAFDimTolObjects_DimensionObject::IsDimWithPlusMinusTolerance()  const
+{
+  return (!myVal.IsNull() && myVal->Length() == 3);
+}
+  
+//=======================================================================
+//function : SetUpperTolValue
+//purpose  : 
+//=======================================================================
+Standard_Boolean XCAFDimTolObjects_DimensionObject::SetUpperTolValue (const Standard_Real theUperTolValue)
+{
+  if(!myVal.IsNull() && myVal->Length() == 3)
+  {
+    myVal->SetValue(3, theUperTolValue);
+    return Standard_True;
+  }
+  else if(!myVal.IsNull() && myVal->Length() == 1)
+  {
+    Standard_Real v = myVal->Value(1);
+    myVal = new TColStd_HArray1OfReal(1, 3);
+    myVal->SetValue(1, v);
+    myVal->SetValue(2, theUperTolValue);
+    myVal->SetValue(3, theUperTolValue);
+    return Standard_True;
+  }
+  return Standard_False;
+}
+  
+//=======================================================================
+//function : SetLowerTolValue
+//purpose  : 
+//=======================================================================
+Standard_Boolean XCAFDimTolObjects_DimensionObject::SetLowerTolValue (const Standard_Real theLowerTolValue)
+{
+  if(!myVal.IsNull() && myVal->Length() == 3)
+  {
+    myVal->SetValue(2, theLowerTolValue);
+    return Standard_True;
+  }
+  else if(!myVal.IsNull() && myVal->Length() == 1)
+  {
+    Standard_Real v = myVal->Value(1);
+    myVal = new TColStd_HArray1OfReal(1, 3);
+    myVal->SetValue(1, v);
+    myVal->SetValue(2, theLowerTolValue);
+    myVal->SetValue(3, theLowerTolValue);
+    return Standard_True;
+  }
+  return Standard_False;
+}
+  
+//=======================================================================
+//function : GetUpperTolValue
+//purpose  : 
+//=======================================================================
+Standard_Real XCAFDimTolObjects_DimensionObject::GetUpperTolValue ()  const
+{
+  if(!myVal.IsNull() && myVal->Length() == 3)
+  {
+    return myVal->Value(3);
+  }
+  return 0;
+}
+  
+//=======================================================================
+//function : GetLowerTolValue
+//purpose  : 
+//=======================================================================
+Standard_Real XCAFDimTolObjects_DimensionObject::GetLowerTolValue ()  const
+{
+  if(!myVal.IsNull() && myVal->Length() == 3)
+  {
+    return myVal->Value(2);
+  }
+  return 0;
+}
+  
+//=======================================================================
+//function : IsDimWithClassOfTolerance
+//purpose  : 
+//=======================================================================
+Standard_Boolean XCAFDimTolObjects_DimensionObject::IsDimWithClassOfTolerance()  const
+{
+  return (myFormVariance != XCAFDimTolObjects_DimensionFormVariance_None);
+}
+  
+//=======================================================================
+//function : SetClassOfTolerance
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::SetClassOfTolerance (const Standard_Boolean theHole,
+  const XCAFDimTolObjects_DimensionFormVariance theFormVariance,
+  const XCAFDimTolObjects_DimensionGrade theGrade)
+{
+  myIsHole = theHole;
+  myFormVariance = theFormVariance;
+  myGrade = theGrade;
+}
+  
+//=======================================================================
+//function : GetClassOfTolerance
+//purpose  : 
+//=======================================================================
+Standard_Boolean XCAFDimTolObjects_DimensionObject::GetClassOfTolerance (Standard_Boolean& theHole,
+  XCAFDimTolObjects_DimensionFormVariance& theFormVariance,
+  XCAFDimTolObjects_DimensionGrade& theGrade)  const
+{
+  if(myFormVariance != XCAFDimTolObjects_DimensionFormVariance_None)
+  {
+    theHole = myIsHole;
+    theFormVariance = myFormVariance;
+    theGrade = myGrade;
+    return Standard_True;
+  }
+  return Standard_False;
+}
+  
+//=======================================================================
+//function : SetNbOfDecimalPlaces
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::SetNbOfDecimalPlaces (const Standard_Integer theL, const Standard_Integer theR)
+{
+  myL = theL;
+  myR = theR;
+}
+  
+//=======================================================================
+//function : GetNbOfDecimalPlaces
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::GetNbOfDecimalPlaces (Standard_Integer& theL, Standard_Integer& theR)  const
+{
+  theL = myL;
+  theR = myR;
+}
+  
+//=======================================================================
+//function : GetModifiers
+//purpose  : 
+//=======================================================================
+XCAFDimTolObjects_DimensionModifiersSequence XCAFDimTolObjects_DimensionObject::GetModifiers ()  const
+{
+  return myModifiers;
+}
+  
+//=======================================================================
+//function : SetModifiers
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::SetModifiers (const XCAFDimTolObjects_DimensionModifiersSequence& theModifiers)
+{
+  myModifiers = theModifiers;
+}
+  
+//=======================================================================
+//function : AddModifier
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::AddModifier (const XCAFDimTolObjects_DimensionModif theModifier)
+{
+  myModifiers.Append(theModifier);
+}
+  
+//=======================================================================
+//function : GetPath
+//purpose  : 
+//=======================================================================
+TopoDS_Edge XCAFDimTolObjects_DimensionObject::GetPath ()  const
+{
+    return myPath;
+}
+  
+//=======================================================================
+//function : SetPath
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::SetPath (const TopoDS_Edge& thePath)
+{
+  if(!thePath.IsNull())
+  {
+    myPath = thePath;
+  }
+}
+  
+//=======================================================================
+//function : GetDirection
+//purpose  : 
+//=======================================================================
+Standard_Boolean XCAFDimTolObjects_DimensionObject::GetDirection (gp_Dir& theDir)  const
+{
+  theDir = myDir;
+  return Standard_True;
+}
+  
+//=======================================================================
+//function : SetDirection
+//purpose  : 
+//=======================================================================
+Standard_Boolean XCAFDimTolObjects_DimensionObject::SetDirection (const gp_Dir& theDir)
+{
+  myDir = theDir;
+  return Standard_True;
+}
+
+//=======================================================================
+//function : GetPoints
+//purpose  : 
+//=======================================================================
+Handle(TColgp_HArray1OfPnt) XCAFDimTolObjects_DimensionObject::GetPoints ()  const
+{
+  return myPnts;
+}
+  
+//=======================================================================
+//function : SetPoints
+//purpose  : 
+//=======================================================================
+void XCAFDimTolObjects_DimensionObject::SetPoints (const Handle(TColgp_HArray1OfPnt)& thePnts)
+{
+  myPnts = thePnts;
+}
diff --git a/src/XCAFDimTolObjects/XCAFDimTolObjects_GeomToleranceObject.cdl b/src/XCAFDimTolObjects/XCAFDimTolObjects_GeomToleranceObject.cdl
new file mode 100644 (file)
index 0000000..a7a6596
--- /dev/null
@@ -0,0 +1,84 @@
+-- Created on: 2015-07-31
+-- Created by: data exchange team
+-- Copyright (c) 2000-2015 OPEN CASCADE SAS
+--
+-- This file is part of Open CASCADE Technology software library.
+--
+-- This library is free software; you can redistribute it and/or modify it under
+-- the terms of the GNU Lesser General Public License version 2.1 as published
+-- by the Free Software Foundation, with special exception defined in the file
+-- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+-- distribution for complete text of the license and disclaimer of any warranty.
+--
+-- Alternatively, this file may be used under the terms of Open CASCADE
+-- commercial license or contractual agreement.
+
+class GeomToleranceObject from XCAFDimTolObjects inherits Transient from Standard
+
+       ---Purpose: attribute to store dimension and tolerance
+
+uses
+    HArray1OfReal from TColStd,
+    HAsciiString from TCollection,
+    GeomToleranceType from XCAFDimTolObjects,
+    GeomToleranceTypeValue from XCAFDimTolObjects,
+    GeomToleranceMatReqModif from XCAFDimTolObjects,
+    GeomToleranceZoneModif from XCAFDimTolObjects,
+    GeomToleranceModifiersSequence from XCAFDimTolObjects,
+    GeomToleranceModif from XCAFDimTolObjects
+    
+is
+
+    Create returns GeomToleranceObject from XCAFDimTolObjects;
+    
+    Create(theObj : GeomToleranceObject from XCAFDimTolObjects) returns GeomToleranceObject from XCAFDimTolObjects;
+    
+    ---Category: class methods
+    --           =============
+
+    SetType (me : mutable; theType : GeomToleranceType from XCAFDimTolObjects);
+
+    GetType (me) returns GeomToleranceType from XCAFDimTolObjects;
+
+    SetTypeOfValue (me : mutable; theTypeOfValue : GeomToleranceTypeValue from XCAFDimTolObjects);
+
+    GetTypeOfValue (me) returns GeomToleranceTypeValue from XCAFDimTolObjects;
+
+    SetValue (me : mutable; theValue : Real from Standard);
+
+    GetValue (me) returns Real from Standard;
+
+    SetMaterialRequirementModifier (me : mutable; theGeomToleranceMatReqModif : GeomToleranceMatReqModif from XCAFDimTolObjects);
+
+    GetMaterialRequirementModifier (me) returns GeomToleranceMatReqModif from XCAFDimTolObjects;
+
+    SetZoneModifier (me : mutable; theGeomToleranceZoneModif : GeomToleranceZoneModif from XCAFDimTolObjects);
+
+    GetZoneModifier (me) returns GeomToleranceZoneModif from XCAFDimTolObjects;
+
+    SetValueOfZoneModifier (me : mutable; theValue : Real from Standard);
+
+    GetValueOfZoneModifier (me) returns Real from Standard;
+
+    SetModifiers (me : mutable; theModifiers : GeomToleranceModifiersSequence from XCAFDimTolObjects);
+
+    AddModifier (me : mutable; theModifier : GeomToleranceModif from XCAFDimTolObjects);
+
+    GetModifiers (me) returns GeomToleranceModifiersSequence from XCAFDimTolObjects;
+
+    SetMaxValueModifier (me : mutable; theModifier : Real from Standard);
+
+    GetMaxValueModifier (me) returns Real from Standard;
+
+fields
+    myType :  GeomToleranceType from XCAFDimTolObjects;
+    myTypeOfValue : GeomToleranceTypeValue from XCAFDimTolObjects ;
+    myValue : Real from Standard ;
+    myMatReqModif : GeomToleranceMatReqModif from XCAFDimTolObjects ;
+    myZoneModif : GeomToleranceZoneModif from XCAFDimTolObjects;
+    myValueOfZoneModif : Real from Standard;
+    myModifiers : GeomToleranceModifiersSequence from XCAFDimTolObjects;
+    myMaxValueModif : Real from Standard ;
+    
+end GeomToleranceObject;
diff --git a/src/XCAFDimTolObjects/XCAFDimTolObjects_GeomToleranceObject.cxx b/src/XCAFDimTolObjects/XCAFDimTolObjects_GeomToleranceObject.cxx
new file mode 100644 (file)
index 0000000..f4f96ad
--- /dev/null
@@ -0,0 +1,210 @@
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <XCAFDimTolObjects_GeomToleranceObject.ixx>
+
+//=======================================================================
+//function : XCAFDimTolObjects_GeomTolerance
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_GeomToleranceObject::XCAFDimTolObjects_GeomToleranceObject()
+{
+}
+
+//=======================================================================
+//function : XCAFDimTolObjects_GeomTolerance
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_GeomToleranceObject::XCAFDimTolObjects_GeomToleranceObject(const Handle(XCAFDimTolObjects_GeomToleranceObject)& theObj)
+{
+  myType = theObj->myType;
+  myTypeOfValue = theObj->myTypeOfValue;
+  myValue = theObj->myValue;
+  myMatReqModif = theObj->myMatReqModif;
+  myZoneModif = theObj->myZoneModif;
+  myValueOfZoneModif = theObj->myValueOfZoneModif;
+  myModifiers = theObj->myModifiers;
+  myMaxValueModif = theObj->myMaxValueModif;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_GeomToleranceObject::SetType (const XCAFDimTolObjects_GeomToleranceType theType) 
+{
+  myType = theType;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_GeomToleranceType XCAFDimTolObjects_GeomToleranceObject::GetType()  const
+{
+  return myType;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_GeomToleranceObject::SetTypeOfValue (const XCAFDimTolObjects_GeomToleranceTypeValue theTypeOfValue) 
+{
+  myTypeOfValue = theTypeOfValue;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_GeomToleranceTypeValue XCAFDimTolObjects_GeomToleranceObject::GetTypeOfValue()  const
+{
+  return myTypeOfValue;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_GeomToleranceObject::SetValue (const Standard_Real theValue) 
+{
+  myValue = theValue;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+Standard_Real XCAFDimTolObjects_GeomToleranceObject::GetValue()  const
+{
+  return myValue;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_GeomToleranceObject::SetMaterialRequirementModifier (const XCAFDimTolObjects_GeomToleranceMatReqModif theMatReqModif) 
+{
+  myMatReqModif = theMatReqModif;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_GeomToleranceMatReqModif XCAFDimTolObjects_GeomToleranceObject::GetMaterialRequirementModifier()  const
+{
+  return myMatReqModif;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_GeomToleranceObject::SetZoneModifier (const XCAFDimTolObjects_GeomToleranceZoneModif theZoneModif) 
+{
+  myZoneModif = theZoneModif;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_GeomToleranceZoneModif XCAFDimTolObjects_GeomToleranceObject::GetZoneModifier()  const
+{
+  return myZoneModif;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_GeomToleranceObject::SetValueOfZoneModifier (const Standard_Real theValue) 
+{
+  myValueOfZoneModif = theValue;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+Standard_Real XCAFDimTolObjects_GeomToleranceObject::GetValueOfZoneModifier()  const
+{
+  return myValueOfZoneModif;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_GeomToleranceObject::SetModifiers (const XCAFDimTolObjects_GeomToleranceModifiersSequence& theModifiers) 
+{
+  myModifiers = theModifiers;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_GeomToleranceObject::AddModifier (const XCAFDimTolObjects_GeomToleranceModif theModifier) 
+{
+  myModifiers.Append(theModifier);
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_GeomToleranceModifiersSequence XCAFDimTolObjects_GeomToleranceObject::GetModifiers()  const
+{
+  return myModifiers;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_GeomToleranceObject::SetMaxValueModifier (const Standard_Real theModifier) 
+{
+  myMaxValueModif = theModifier;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+Standard_Real XCAFDimTolObjects_GeomToleranceObject::GetMaxValueModifier()  const
+{
+  return myMaxValueModif;
+}
diff --git a/src/XCAFDimTolObjects/XCAFDimTolObjects_Tool.cdl b/src/XCAFDimTolObjects/XCAFDimTolObjects_Tool.cdl
new file mode 100644 (file)
index 0000000..7a93d93
--- /dev/null
@@ -0,0 +1,62 @@
+-- Created on: 2004-01-09
+-- Created by: Sergey KUUL
+-- Copyright (c) 2004-2014 OPEN CASCADE SAS
+--
+-- This file is part of Open CASCADE Technology software library.
+--
+-- This library is free software; you can redistribute it and/or modify it under
+-- the terms of the GNU Lesser General Public License version 2.1 as published
+-- by the Free Software Foundation, with special exception defined in the file
+-- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+-- distribution for complete text of the license and disclaimer of any warranty.
+--
+-- Alternatively, this file may be used under the terms of Open CASCADE
+-- commercial license or contractual agreement.
+
+class Tool from XCAFDimTolObjects
+
+       ---Purpose:
+uses
+    Shape from TopoDS,
+    Document from TDocStd,
+    DimTolTool from XCAFDoc,
+    GeomToleranceObject from XCAFDimTolObjects,
+    DatumObject from XCAFDimTolObjects,
+    DimensionObject from XCAFDimTolObjects,
+    DimensionObjectSequence from XCAFDimTolObjects,
+    DatumObjectSequence from XCAFDimTolObjects,
+    GeomToleranceObjectSequence from XCAFDimTolObjects,
+    DataMapOfToleranceDatum from XCAFDimTolObjects
+
+is
+    Create (theDoc : Document from TDocStd) returns Tool from XCAFDimTolObjects;
+
+
+    GetDimensions (me; theDimensionObjectSequence: out DimensionObjectSequence from XCAFDimTolObjects);
+       ---Purpose: Returns a sequence of Dimensions currently stored 
+        --          in the DGTtable
+
+    GetRefDimensions (me; theShape: Shape from TopoDS; theDimensions: out DimensionObjectSequence from XCAFDimTolObjects) 
+    returns Boolean;
+       ---Purpose: Returns all Dimensions defined for Shape
+
+    GetGeomTolerances (me; theGeomToleranceObjectSequence : out GeomToleranceObjectSequence from XCAFDimTolObjects;
+                           theDatumObjectSequence : out DatumObjectSequence from XCAFDimTolObjects;
+                           theMap : out DataMapOfToleranceDatum from XCAFDimTolObjects);
+       ---Purpose: Returns a sequence of Tolerancess currently stored 
+        --          in the DGTtable
+    GetRefGeomTolerances (me; theShape: Shape from TopoDS;
+                              theGeomToleranceObjectSequence: out GeomToleranceObjectSequence from XCAFDimTolObjects;
+                              theDatumObjectSequence : out DatumObjectSequence from XCAFDimTolObjects;
+                              theMap : out DataMapOfToleranceDatum from XCAFDimTolObjects) 
+    returns Boolean;
+       ---Purpose: Returns all GeomTolerances defined for Shape
+
+    GetRefDatum (me; theShape: Shape from TopoDS; theDatum: out DatumObject from XCAFDimTolObjects) 
+    returns Boolean;
+       ---Purpose: Returns DatumObject defined for Shape
+fields
+    myDimTolTool : DimTolTool from XCAFDoc;
+
+                                                                                                               
+end Tool;
diff --git a/src/XCAFDimTolObjects/XCAFDimTolObjects_Tool.cxx b/src/XCAFDimTolObjects/XCAFDimTolObjects_Tool.cxx
new file mode 100644 (file)
index 0000000..418b469
--- /dev/null
@@ -0,0 +1,187 @@
+// Copyright (c) 1999-2015 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <XCAFDimTolObjects_Tool.hxx>
+#include <XCAFDimTolObjects_DimensionObjectSequence.hxx>
+#include <TDF_ChildIterator.hxx>
+#include <XCAFDoc_DimTolTool.hxx>
+#include <XCAFDoc_Dimension.hxx>
+#include <XCAFDimTolObjects_GeomToleranceObjectSequence.hxx>
+#include <XCAFDoc_GeomTolerance.hxx>
+#include <XCAFDimTolObjects_DatumObjectSequence.hxx>
+#include <XCAFDoc_Datum.hxx>
+#include <XCAFDoc_ShapeTool.hxx>
+#include <XCAFDoc_Datum.hxx>
+#include <TDF_Label.hxx>
+#include <TDF_LabelSequence.hxx>
+#include <XCAFDoc_DocumentTool.hxx>
+#include <TDocStd_Document.hxx>
+#include <NCollection_DataMap.hxx>
+#include <XCAFDimTolObjects_DataMapOfToleranceDatum.hxx>
+
+//=======================================================================
+//function : XCAFDimTolObjects_Tool
+//purpose  : 
+//=======================================================================
+
+XCAFDimTolObjects_Tool::XCAFDimTolObjects_Tool(const Handle(TDocStd_Document)& theDoc)
+{
+  myDimTolTool = XCAFDoc_DocumentTool::DimTolTool(theDoc->Main());
+}
+
+//=======================================================================
+//function : GetDimensions
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_Tool::GetDimensions(XCAFDimTolObjects_DimensionObjectSequence& theDimensionObjectSequence) const
+{
+  theDimensionObjectSequence.Clear();
+  TDF_ChildIterator aChildIterator( myDimTolTool->Label() ); 
+  for (; aChildIterator.More(); aChildIterator.Next()) {
+    TDF_Label aL = aChildIterator.Value();
+    Handle(XCAFDoc_Dimension) aDimension;
+    if(aL.FindAttribute(XCAFDoc_Dimension::GetID(),aDimension)) {
+      theDimensionObjectSequence.Append(aDimension->GetObject());
+    }
+  }
+}
+
+//=======================================================================
+//function : GetGeomTolerances
+//purpose  : 
+//=======================================================================
+
+void XCAFDimTolObjects_Tool::GetGeomTolerances(XCAFDimTolObjects_GeomToleranceObjectSequence& theGeomToleranceObjectSequence,
+                                               XCAFDimTolObjects_DatumObjectSequence& theDatumSequence,
+                                               XCAFDimTolObjects_DataMapOfToleranceDatum& theMap) const
+{
+  theGeomToleranceObjectSequence.Clear();
+  TDF_ChildIterator aChildIterator( myDimTolTool->Label() ); 
+  for (; aChildIterator.More(); aChildIterator.Next()) {
+    TDF_Label aL = aChildIterator.Value();
+    Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+    if(aL.FindAttribute(XCAFDoc_GeomTolerance::GetID(),aGeomTolerance)) {
+      theGeomToleranceObjectSequence.Append(aGeomTolerance->GetObject());
+      TDF_LabelSequence aSeq;
+      if(myDimTolTool->GetDatumOfTolerLabels(aGeomTolerance->Label(), aSeq))
+      {
+        for(Standard_Integer i = 1; i <= aSeq.Length(); i++)
+        {
+          Handle(XCAFDoc_Datum) aDatum;
+          if(aSeq.Value(i).FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
+          {
+            theDatumSequence.Append(aDatum->GetObject());
+            theMap.Bind(theGeomToleranceObjectSequence.Last(), theDatumSequence.Last());
+          }
+        }
+      }
+    }
+  }
+}
+
+//=======================================================================
+//function : GetRefDimensions
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDimTolObjects_Tool::GetRefDimensions(const TopoDS_Shape& theShape,
+                                                      XCAFDimTolObjects_DimensionObjectSequence& theDimensionObjectSequence) const
+{
+  theDimensionObjectSequence.Clear();
+  TDF_Label aShapeL;
+  myDimTolTool->ShapeTool()->Search(theShape, aShapeL);
+  if(!aShapeL.IsNull())
+  {
+    TDF_LabelSequence aSeq;
+    if( myDimTolTool->GetRefDimensionLabels(aShapeL, aSeq) ) {
+      for(Standard_Integer i = 1; i <= aSeq.Length(); i++)
+      {
+        Handle(XCAFDoc_Dimension) aDimension;
+        if( aSeq.Value(i).FindAttribute(XCAFDoc_Dimension::GetID(),aDimension))
+          theDimensionObjectSequence.Append(aDimension->GetObject());
+      }
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : GetRefGeomTolerances
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDimTolObjects_Tool::GetRefGeomTolerances(const TopoDS_Shape& theShape,
+                                                     XCAFDimTolObjects_GeomToleranceObjectSequence& theGeomToleranceObjectSequence,
+                                                     XCAFDimTolObjects_DatumObjectSequence& theDatumSequence,
+                                                     XCAFDimTolObjects_DataMapOfToleranceDatum& theMap) const
+{
+  theGeomToleranceObjectSequence.Clear();
+  TDF_Label aShapeL;
+  myDimTolTool->ShapeTool()->Search(theShape, aShapeL);
+  if(!aShapeL.IsNull())
+  {
+    TDF_LabelSequence aSeq;
+    if( myDimTolTool->GetRefGeomToleranceLabels(aShapeL, aSeq) ) {
+      for(Standard_Integer i = 1; i <= aSeq.Length(); i++)
+      {
+        Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+        if( aSeq.Value(i).FindAttribute(XCAFDoc_GeomTolerance::GetID(),aGeomTolerance))
+        {
+          theGeomToleranceObjectSequence.Append(aGeomTolerance->GetObject());
+          TDF_LabelSequence aSeq;
+          if(myDimTolTool->GetDatumOfTolerLabels(aGeomTolerance->Label(), aSeq))
+          {
+            for(Standard_Integer i = 1; i <= aSeq.Length(); i++)
+            {
+              Handle(XCAFDoc_Datum) aDatum;
+              if(aSeq.Value(i).FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
+              {
+                theDatumSequence.Append(aDatum->GetObject());
+                theMap.Bind(theGeomToleranceObjectSequence.Last(), theDatumSequence.Last());
+              }
+            }
+          }
+        }
+      }
+      return Standard_True;
+    }
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : GetRefDatum
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDimTolObjects_Tool::GetRefDatum(const TopoDS_Shape& theShape,
+                                                     Handle(XCAFDimTolObjects_DatumObject)& theDatumObject) const
+{
+  TDF_Label aShapeL;
+  myDimTolTool->ShapeTool()->Search(theShape, aShapeL);
+  if(!aShapeL.IsNull())
+  {
+    TDF_Label aDatumL;
+    if(myDimTolTool->GetRefDatumLabel(aShapeL, aDatumL))
+    {
+      Handle(XCAFDoc_Datum) aDatum;
+      if( aDatumL.FindAttribute(XCAFDoc_Datum::GetID(),aDatum)){
+        theDatumObject = aDatum->GetObject();
+        return Standard_True;
+      }
+    }
+  }
+  return Standard_False;
+}
index b28e8690c8e624d387296147de5929c9641e773e..9ed62bcae01d1cb59ca623b4f41a31423d326233 100644 (file)
@@ -34,12 +34,14 @@ uses
     Quantity,
     TCollection,
     TColStd,
+    TColgp,
     TopLoc,
     TopoDS,
     TopTools,
     TDF,
     TDocStd,
     TDataStd,
+    XCAFDimTolObjects,
     gp
     
 is
@@ -56,7 +58,6 @@ is
        ColorSurf,  -- color of surfaces
        ColorCurv   -- color of curves
     end ColorType;
-
         
     class DocumentTool;
     
@@ -65,9 +66,13 @@ is
     class Color;
     
     class DimTol;
-    
+
+    class Dimension;
+
+    class GeomTolerance;
+
     class Datum;
-    
+
     class Material;
     
     class Volume;
@@ -93,6 +98,7 @@ is
     class GraphNodeSequence instantiates Sequence from TCollection
        (GraphNode from XCAFDoc);
        ---Purpose: class for containing GraphNodes.
+
                
     class DataMapOfShapeLabel instantiates
          DataMap from TCollection (Shape from TopoDS,
@@ -113,9 +119,15 @@ is
        
     DimTolRefGUID returns GUID from Standard;
        ---Purpose: Return GUIDs for TreeNode representing specified types of DGT
+
+    DimensionRefGUID returns GUID from Standard;
+       ---Purpose: Return GUIDs for TreeNode representing specified types of Dimension
        
     DatumRefGUID returns GUID from Standard;
        ---Purpose: Return GUIDs for TreeNode representing specified types of datum
+
+    GeomToleranceRefGUID returns GUID from Standard;
+       ---Purpose: Return GUIDs for TreeNode representing specified types of GeomTolerance
        
     DatumTolRefGUID returns GUID from Standard;
        ---Purpose: Return GUIDs for TreeNode representing connections Datum-Toler
index dc22c014a103cca88daa91a4ca819c45ff904d8c..ab339a5941a60f23dad39bdb4b2c4fcc99efc754 100644 (file)
@@ -89,6 +89,27 @@ Standard_GUID XCAFDoc::DimTolRefGUID()
   return ID;
 }
 
+//=======================================================================
+//function : DimensionRefGUID
+//purpose  : 
+//=======================================================================
+
+Standard_GUID XCAFDoc::DimensionRefGUID()
+{
+  static Standard_GUID ID("efd212e3-6dfd-11d4-b9c8-0060b0ee281b");
+  return ID;
+}
+
+//=======================================================================
+//function : GeomToleranceRefGUID
+//purpose  : 
+//=======================================================================
+
+Standard_GUID XCAFDoc::GeomToleranceRefGUID()
+{
+  static Standard_GUID ID("efd213e3-6dfd-11d4-b9c8-0060b0ee281b");
+  return ID;
+}
 
 //=======================================================================
 //function : DatumRefGUID
index 17dad19fbb6b8cd96955f997874b6e0037e52a00..26c35279366ee34ac6c5fc6e08261e39f8aa4144 100644 (file)
@@ -20,9 +20,11 @@ class Datum from XCAFDoc inherits Attribute from TDF
 uses
     Label from TDF,
     RelocationTable from TDF,
-    HAsciiString from TCollection
+    HAsciiString from TCollection,
+    DatumObject from XCAFDimTolObjects
 
 is
     Create returns Datum from XCAFDoc;
     
     ---Category: class methods
@@ -38,16 +40,24 @@ is
                  anIdentification : HAsciiString from TCollection)
     returns Datum from XCAFDoc;
 
+    Set (myclass; label : Label from TDF)
+    returns Datum from XCAFDoc;
+
+
     Set (me : mutable; aName : HAsciiString from TCollection;
                       aDescription : HAsciiString from TCollection;
                       anIdentification : HAsciiString from TCollection);
             
     GetName (me) returns HAsciiString from TCollection;
-
+                                                                   
     GetDescription (me) returns HAsciiString from TCollection;
 
     GetIdentification (me) returns HAsciiString from TCollection;
 
+    GetObject (me) returns DatumObject from XCAFDimTolObjects;
+
+    SetObject (me : mutable; theObject : DatumObject from XCAFDimTolObjects);
+
     ID (me)
        ---C++: return const & 
     returns GUID from Standard;
index 1dbe0977c915384188d30177369e4f82c088f764..b08c83445f408620f17fd03ce21bacd09b2d6baa 100644 (file)
 #include <XCAFDoc_Datum.ixx>
 
 #include <TDF_RelocationTable.hxx>
-
+#include <TDataStd_AsciiString.hxx>
+#include <TDataStd_IntegerArray.hxx>
+#include <TDataStd_Integer.hxx>
+#include <TDataStd_Real.hxx>
+#include <TNaming_NamedShape.hxx>
+#include <TNaming_Builder.hxx>
+
+enum ChildLab
+{
+  ChildLab_Name = 1,
+  ChildLab_Modifiers,
+  ChildLab_ModifierWithValue,
+  ChildLab_DatumTarget
+};
 
 //=======================================================================
 //function : XCAFDoc_Datum
@@ -25,7 +38,6 @@ XCAFDoc_Datum::XCAFDoc_Datum()
 {
 }
 
-
 //=======================================================================
 //function : GetID
 //purpose  : 
@@ -45,18 +57,33 @@ const Standard_GUID& XCAFDoc_Datum::GetID()
 //purpose  : 
 //=======================================================================
 
-Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& label,
-                                         const Handle(TCollection_HAsciiString)& aName,
-                                         const Handle(TCollection_HAsciiString)& aDescription,
-                                         const Handle(TCollection_HAsciiString)& anIdentification) 
+Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel,
+                                         const Handle(TCollection_HAsciiString)& theName,
+                                         const Handle(TCollection_HAsciiString)& theDescription,
+                                         const Handle(TCollection_HAsciiString)& theIdentification) 
+{
+  Handle(XCAFDoc_Datum) aDatum;
+  if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
+    aDatum = new XCAFDoc_Datum();
+    theLabel.AddAttribute(aDatum);
+  }
+  aDatum->Set(theName,theDescription,theIdentification); 
+  return aDatum;
+}
+
+//=======================================================================
+//function : Set
+//purpose  : 
+//=======================================================================
+
+Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& theLabel) 
 {
-  Handle(XCAFDoc_Datum) A;
-  if (!label.FindAttribute(XCAFDoc_Datum::GetID(), A)) {
-    A = new XCAFDoc_Datum();
-    label.AddAttribute(A);
+  Handle(XCAFDoc_Datum) aDatum;
+  if (!theLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum)) {
+    aDatum = new XCAFDoc_Datum();
+    theLabel.AddAttribute(aDatum);
   }
-  A->Set(aName,aDescription,anIdentification); 
-  return A;
+  return aDatum;
 }
 
 
@@ -65,13 +92,14 @@ Handle(XCAFDoc_Datum) XCAFDoc_Datum::Set(const TDF_Label& label,
 //purpose  : 
 //=======================================================================
 
-void XCAFDoc_Datum::Set(const Handle(TCollection_HAsciiString)& aName,
-                        const Handle(TCollection_HAsciiString)& aDescription,
-                        const Handle(TCollection_HAsciiString)& anIdentification) 
+void XCAFDoc_Datum::Set(const Handle(TCollection_HAsciiString)& theName,
+                        const Handle(TCollection_HAsciiString)& theDescription,
+                        const Handle(TCollection_HAsciiString)& theIdentification) 
 {
-  myName = aName;
-  myDescription = aDescription;
-  myIdentification = anIdentification;
+  Backup();
+  myName = theName;
+  myDescription = theDescription;
+  myIdentification = theIdentification;
 }
 
 
@@ -82,12 +110,13 @@ void XCAFDoc_Datum::Set(const Handle(TCollection_HAsciiString)& aName,
 
 Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetName() const
 {
+  if(myName.IsNull())
+    return new TCollection_HAsciiString();
   return myName;
 }
 
-
 //=======================================================================
-//function : GetDescription
+//function : GetDescriptio7n
 //purpose  : 
 //=======================================================================
 
@@ -107,6 +136,127 @@ Handle(TCollection_HAsciiString) XCAFDoc_Datum::GetIdentification() const
   return myIdentification;
 }
 
+//=======================================================================
+//function : SetObject
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_Datum::SetObject(const Handle(XCAFDimTolObjects_DatumObject)& theObject)
+{
+  Backup();
+  if (!theObject->GetName().IsNull())
+  {
+    Handle(TDataStd_AsciiString) anAttName;
+    if(!Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
+    {
+      anAttName = new TDataStd_AsciiString();
+      Label().FindChild(ChildLab_Name).AddAttribute(anAttName);
+    }
+    anAttName->Set(theObject->GetName()->String());
+  }
+  else
+  {
+    Label().FindChild(ChildLab_Name).ForgetAllAttributes();
+  }
+
+  if(theObject->GetModifiers().Length() == 0)
+  {
+    Label().FindChild(ChildLab_Modifiers).ForgetAllAttributes();
+  }
+  else
+  {
+    Handle(TDataStd_IntegerArray) aModifiers;
+    if(!Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), aModifiers))
+    {
+      aModifiers = new TDataStd_IntegerArray();
+      Label().FindChild(ChildLab_Modifiers).AddAttribute(aModifiers);
+    }
+    Handle(TColStd_HArray1OfInteger) anArr = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
+    for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
+      anArr->SetValue(i,theObject->GetModifiers().Value(i));
+    aModifiers->ChangeArray(anArr);
+  }
+
+  XCAFDimTolObjects_DatumModifWithValue aM;
+  Standard_Real aV;
+  theObject->GetModifierWithValue(aM, aV);
+  if(aM != XCAFDimTolObjects_DatumModifWithValue_None)
+  {
+    Handle(TDataStd_Integer) aModifierWithValueM;
+    if(!Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
+    {
+      aModifierWithValueM = new TDataStd_Integer();
+      Label().FindChild(ChildLab_ModifierWithValue).AddAttribute(aModifierWithValueM);
+    }
+    Handle(TDataStd_Real) aModifierWithValueV;
+    if(!Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
+    {
+      aModifierWithValueV = new TDataStd_Real();
+      Label().FindChild(ChildLab_ModifierWithValue).AddAttribute(aModifierWithValueV);
+    }
+    aModifierWithValueM->Set(aM);
+    aModifierWithValueV->Set(aV);
+  }
+  else
+  {
+    Label().FindChild(ChildLab_ModifierWithValue).ForgetAllAttributes();
+  }
+
+  if(!theObject->GetDatumTarget().IsNull())
+  {
+    TNaming_Builder tnBuild(Label().FindChild(ChildLab_DatumTarget));
+    tnBuild.Generated(theObject->GetDatumTarget());
+  }
+  else
+  {
+    Label().FindChild(ChildLab_DatumTarget).ForgetAllAttributes();
+  }
+}
+
+//=======================================================================
+//function : GetObject
+//purpose  : 
+//=======================================================================
+
+Handle(XCAFDimTolObjects_DatumObject) XCAFDoc_Datum::GetObject() const
+{
+  Handle(XCAFDimTolObjects_DatumObject) anObj = new XCAFDimTolObjects_DatumObject();
+
+  Handle(TDataStd_AsciiString) anAttName;
+  if(Label().FindChild(ChildLab_Name).FindAttribute(TDataStd_AsciiString::GetID(), anAttName))
+  {
+    Handle(TCollection_HAsciiString) aStr = new TCollection_HAsciiString(anAttName->Get());
+    anObj->SetName(aStr);
+  }
+
+  Handle(TDataStd_IntegerArray) anArr;
+  if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
+     && !anArr->Array().IsNull())
+  {
+    XCAFDimTolObjects_DatumModifiersSequence aModifiers;
+    for(Standard_Integer i = 1; i <= anArr->Length(); i++)
+      aModifiers.Append((XCAFDimTolObjects_DatumSingleModif)anArr->Value(i));
+    anObj->SetModifiers(aModifiers);
+  }
+
+  Handle(TDataStd_Integer) aModifierWithValueM;
+  if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Integer::GetID(), aModifierWithValueM))
+  {
+    Handle(TDataStd_Real) aModifierWithValueV;
+    if(Label().FindChild(ChildLab_ModifierWithValue).FindAttribute(TDataStd_Real::GetID(), aModifierWithValueV))
+    {
+      anObj->SetModifierWithValue((XCAFDimTolObjects_DatumModifWithValue)aModifierWithValueM->Get(),aModifierWithValueV->Get());
+    }
+  }
+
+  Handle(TNaming_NamedShape) aDatumTarget;
+  if(Label().FindChild(ChildLab_DatumTarget).FindAttribute(TNaming_NamedShape::GetID(), aDatumTarget))
+  {
+    anObj->SetDatumTarget(aDatumTarget->Get());
+  }
+
+  return anObj;
+}
 
 //=======================================================================
 //function : ID
@@ -124,11 +274,11 @@ const Standard_GUID& XCAFDoc_Datum::ID() const
 //purpose  : 
 //=======================================================================
 
-void XCAFDoc_Datum::Restore(const Handle(TDF_Attribute)& With) 
+void XCAFDoc_Datum::Restore(const Handle(TDF_Attribute)& theWith) 
 {
-  myName = Handle(XCAFDoc_Datum)::DownCast(With)->GetName();
-  myDescription = Handle(XCAFDoc_Datum)::DownCast(With)->GetDescription();
-  myIdentification = Handle(XCAFDoc_Datum)::DownCast(With)->GetIdentification();
+  myName = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetName();
+  myDescription = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetDescription();
+  myIdentification = Handle(XCAFDoc_Datum)::DownCast(theWith)->GetIdentification();
 }
 
 
@@ -148,9 +298,9 @@ Handle(TDF_Attribute) XCAFDoc_Datum::NewEmpty() const
 //purpose  : 
 //=======================================================================
 
-void XCAFDoc_Datum::Paste(const Handle(TDF_Attribute)& Into,
+void XCAFDoc_Datum::Paste(const Handle(TDF_Attribute)& theInto,
                           const Handle(TDF_RelocationTable)& /*RT*/) const
 {
-  Handle(XCAFDoc_Datum)::DownCast(Into)->Set(myName,myDescription,myIdentification);
+  Handle(XCAFDoc_Datum)::DownCast(theInto)->Set(myName,myDescription,myIdentification);
 }
 
index d658c7943e367a8dbf16cdeb7d04a444fb958edb..2726975662326778df201ccec264a62d347f6eeb 100644 (file)
@@ -71,6 +71,7 @@ void XCAFDoc_DimTol::Set(const Standard_Integer kind,
                          const Handle(TCollection_HAsciiString)& aName,
                          const Handle(TCollection_HAsciiString)& aDescription) 
 {
+  Backup();
   myKind = kind;
   myVal = aVal;
   myName = aName;
index 9564ff2557aa6e852b977ba6d95337e0830c4e31..17594735fb8ee57e2546b17b944e22e4b4353a9f 100644 (file)
@@ -27,6 +27,9 @@ uses
     LabelSequence from TDF,
     Document from TDocStd,
     ShapeTool from XCAFDoc,
+    GeomTolerance from XCAFDoc,
+    Datum from XCAFDoc,
+    Dimension from XCAFDoc,
     RelocationTable from TDF,
     HArray1OfReal from TColStd,
     HAsciiString from TCollection
@@ -53,6 +56,61 @@ is
        ---C++: return const &
 
 
+
+    -- Methods for Dimension:
+
+    IsDimension (me; theLab: Label from TDF) returns Boolean;
+       ---Purpose: Returns True if label belongs to a dimtoltable and
+        --          is a Dimension definition 
+
+    GetDimensionLabels (me; theLabels: out LabelSequence from TDF);
+       ---Purpose: Returns a sequence of Dimensions labels currently stored 
+        --          in the DGTtable
+
+
+    SetDimension (me; theFirstL: Label from TDF;
+                   theSecondL: Label from TDF;
+                  theDimTolL: Label from TDF);
+       ---Purpose: Sets a link with GUID
+
+    SetDimension (me; theL: Label from TDF;
+                  theDimTolL: Label from TDF);
+       ---Purpose: Sets a link with GUID
+
+    GetRefDimensionLabels (me; theShapeL: Label from TDF; theDimensions: out LabelSequence from TDF) 
+    returns Boolean;
+       ---Purpose: Returns all Dimension labels defined for label ShapeL
+
+    AddDimension (me : mutable)
+    returns Label from TDF;
+       ---Purpose: Adds a dimension definition to a DGTtable and returns its label
+
+
+
+    -- Methods for GeomTolerance:
+
+    IsGeomTolerance (me; theLab: Label from TDF) returns Boolean;
+       ---Purpose: Returns True if label belongs to a dimtoltable and
+        --          is a DimTol definition 
+
+    GetGeomToleranceLabels (me; theLabels: out LabelSequence from TDF);
+       ---Purpose: Returns a sequence of Tolerance labels currently stored 
+        --          in the DGTtable
+
+    SetGeomTolerance (me; theL: Label from TDF;
+                  theDimTolL: Label from TDF);
+       ---Purpose: Sets a link with GUID
+
+    GetRefGeomToleranceLabels (me; theShapeL: Label from TDF; theDimTols: out LabelSequence from TDF) 
+    returns Boolean;
+       ---Purpose: Returns all GeomTolerance labels defined for label ShapeL
+
+    AddGeomTolerance (me : mutable)
+    returns Label from TDF;
+       ---Purpose: Adds a GeomTolerance definition to a DGTtable and returns its label
+
+
+
     -- Methods for DimTol:
 
     IsDimTol (me; lab: Label from TDF) returns Boolean;
@@ -98,12 +156,12 @@ is
        ---Purpose: Sets a link with GUID
        --          Adds a DimTol as necessary
     
-    GetRefShapeLabel (me; DimTolL: Label from TDF; ShapeL: out Label from TDF) 
+    GetRefShapeLabel (me; theDimTolL: Label from TDF; theShapeL: out LabelSequence from TDF) 
     returns Boolean;
        ---Purpose: Returns ShapeL defined for label DimTolL
        --          Returns False if the DimTolL is not in DGTtable
 
-    GetRefDGTLabels (me; ShapeL: Label from TDF; DimTols: out LabelSequence from TDF) 
+    GetRefDGTLabels (me; theShapeL: Label from TDF; theDimTols: out LabelSequence from TDF) 
     returns Boolean;
        ---Purpose: Returns all DimTol labels defined for label ShapeL
 
@@ -117,14 +175,14 @@ is
 
     -- Methods for Datum:
 
-    IsDatum (me; lab: Label from TDF) returns Boolean;
+    IsDatum (me; theLab: Label from TDF) returns Boolean;
        ---Purpose: Returns True if label belongs to a dimtoltable and
         --          is a Datum definition 
     
-    GetDatumLabels (me; Labels: out LabelSequence from TDF);
-       ---Purpose: Returns a sequence of Datumss currently stored 
+    GetDatumLabels (me; theLabels: out LabelSequence from TDF);
+       ---Purpose: Returns a sequence of Datum labels currently stored 
         --          in the DGTtable
-    
+   
     FindDatum (me; aName : HAsciiString from TCollection;
                   aDescription : HAsciiString from TCollection;
                   anIdentification : HAsciiString from TCollection;
@@ -138,8 +196,12 @@ is
     returns Label from TDF;
        ---Purpose: Adds a datum definition to a DGTtable and returns its label
 
-    SetDatum (me; L: Label from TDF;
-                 DatumL: Label from TDF);
+    AddDatum (me : mutable)
+    returns Label from TDF;
+       ---Purpose: Adds a datum definition to a DGTtable and returns its label
+
+    SetDatum (me; theL: Label from TDF;
+                 theDatumL: Label from TDF);
        ---Purpose: Sets a link with GUID
     
     SetDatum (me; L: Label from TDF; TolerL: Label from TDF;
@@ -149,6 +211,11 @@ is
        ---Purpose: Sets a link with GUID for Datum
        --          Adds a Datum as necessary
        --          Sets connection between Datum and Tolerance
+
+    SetDatumToGeomTol (me; theL: Label from TDF; theTolerL: Label from TDF);
+       ---Purpose: Sets a link with GUID for Datum
+       --          Sets connection between Datum and Tolerance
+
     
     GetDatum (me; DatumL: Label from TDF;
                  aName : out HAsciiString from TCollection;
@@ -157,10 +224,21 @@ is
         ---Purpose: Returns datum assigned to <DatumL>
        --          Returns False if no such datum is assigned
     
-    GetDatumTolerLabels (me; DimTolL: Label from TDF; Datums: out LabelSequence from TDF) 
+    GetDatumOfTolerLabels (me; theDimTolL: Label from TDF; theDatums: out LabelSequence from TDF) 
     returns Boolean;
        ---Purpose: Returns all Datum labels defined for label DimTolL
 
+    GetTolerOfDatumLabels (me; theDatumL: Label from TDF; theTols: out LabelSequence from TDF) 
+    returns Boolean;
+       ---Purpose: Returns all GeomToleranses labels defined for label DatumL
+
+    GetRefDatumLabel (me; theShapeL: Label from TDF; theDatum: out Label from TDF) 
+    returns Boolean;
+       ---Purpose: Returns Datum label defined for label ShapeL
+
+    GetRefDatum (me; theShape: Shape from TopoDS; theDatum: out Datum from XCAFDoc) 
+    returns Boolean;
+       ---Purpose: Returns Datum label defined for label Shape
 
     ID (me)
        ---C++: return const & 
index b3e597b9968fdff164567154a979594220c69d34..e28629f17b31ac13ad8de0de0913039f675513b9 100644 (file)
@@ -15,6 +15,8 @@
 
 #include <XCAFDoc.hxx>
 #include <XCAFDoc_DimTol.hxx>
+#include <XCAFDoc_Dimension.hxx>
+#include <XCAFDoc_GeomTolerance.hxx>
 #include <XCAFDoc_Datum.hxx>
 #include <XCAFDoc_DocumentTool.hxx>
 #include <XCAFDoc_GraphNode.hxx>
@@ -92,31 +94,87 @@ const Handle(XCAFDoc_ShapeTool)& XCAFDoc_DimTolTool::ShapeTool()
 //purpose  : 
 //=======================================================================
 
-Standard_Boolean XCAFDoc_DimTolTool::IsDimTol(const TDF_Label& DimTolL) const
+Standard_Boolean XCAFDoc_DimTolTool::IsDimTol(const TDF_Label& theDimTolL) const
 {
-  Handle(XCAFDoc_DimTol) DimTolAttr;
-  if(DimTolL.FindAttribute(XCAFDoc_DimTol::GetID(),DimTolAttr)) {
+  Handle(XCAFDoc_DimTol) aDimTolAttr;
+  if(theDimTolL.FindAttribute(XCAFDoc_DimTol::GetID(),aDimTolAttr)) {
     return Standard_True;
   }
   return Standard_False;
 }
 
+//=======================================================================
+//function : IsDimension
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDoc_DimTolTool::IsDimension(const TDF_Label& theDimTolL) const
+{
+  Handle(XCAFDoc_Dimension) aDimTolAttr;
+  if(theDimTolL.FindAttribute(XCAFDoc_Dimension::GetID(),aDimTolAttr)) {
+    return Standard_True;
+  }
+  return Standard_False;
+}
+
+//=======================================================================
+//function : IsGeomTolerance
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDoc_DimTolTool::IsGeomTolerance(const TDF_Label& theDimTolL) const
+{
+  Handle(XCAFDoc_GeomTolerance) aDimTolAttr;
+  if(theDimTolL.FindAttribute(XCAFDoc_GeomTolerance::GetID(),aDimTolAttr)) {
+    return Standard_True;
+  }
+  return Standard_False;
+}
 
 //=======================================================================
 //function : GetDimTolLabels
 //purpose  : 
 //=======================================================================
 
-void XCAFDoc_DimTolTool::GetDimTolLabels(TDF_LabelSequence& Labels) const
+void XCAFDoc_DimTolTool::GetDimTolLabels(TDF_LabelSequence& theLabels) const
 {
-  Labels.Clear();
-  TDF_ChildIterator ChildIterator( Label() ); 
-  for (; ChildIterator.More(); ChildIterator.Next()) {
-    TDF_Label L = ChildIterator.Value();
-    if ( IsDimTol(L)) Labels.Append(L);
+  theLabels.Clear();
+  TDF_ChildIterator aChildIterator( Label() ); 
+  for (; aChildIterator.More(); aChildIterator.Next()) {
+    TDF_Label aL = aChildIterator.Value();
+    if ( IsDimTol(aL)) theLabels.Append(aL);
   }
 }
 
+//=======================================================================
+//function : GetDimensionLabels
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_DimTolTool::GetDimensionLabels(TDF_LabelSequence& theLabels) const
+{
+  theLabels.Clear();
+  TDF_ChildIterator aChildIterator( Label() ); 
+  for (; aChildIterator.More(); aChildIterator.Next()) {
+    TDF_Label aL = aChildIterator.Value();
+    if ( IsDimension(aL)) theLabels.Append(aL);
+  }
+}
+
+//=======================================================================
+//function : GetGeomToleranceLabels
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_DimTolTool::GetGeomToleranceLabels(TDF_LabelSequence& theLabels) const
+{
+  theLabels.Clear();
+  TDF_ChildIterator aChildIterator( Label() ); 
+  for (; aChildIterator.More(); aChildIterator.Next()) {
+    TDF_Label aL = aChildIterator.Value();
+    if ( IsGeomTolerance(aL)) theLabels.Append(aL);
+  }
+}
 
 //=======================================================================
 //function : FindDimTol
@@ -198,21 +256,129 @@ TDF_Label XCAFDoc_DimTolTool::AddDimTol(const Standard_Integer kind,
   return DimTolL;
 }
 
+//=======================================================================
+//function : AddDimension
+//purpose  : 
+//=======================================================================
+
+TDF_Label XCAFDoc_DimTolTool::AddDimension()
+{
+  TDF_Label aDimTolL;
+  TDF_TagSource aTag;
+  aDimTolL = aTag.NewChild ( Label() );
+  Handle(XCAFDoc_Dimension) aDim = XCAFDoc_Dimension::Set(aDimTolL);
+  TCollection_AsciiString aStr = "DGT:Dimension";
+  TDataStd_Name::Set(aDimTolL,aStr);
+  return aDimTolL;
+}
+
+//=======================================================================
+//function : AddGeomTolerance
+//purpose  : 
+//=======================================================================
+
+TDF_Label XCAFDoc_DimTolTool::AddGeomTolerance()
+{
+  TDF_Label aDimTolL;
+  TDF_TagSource aTag;
+  aDimTolL = aTag.NewChild ( Label() );
+  Handle(XCAFDoc_GeomTolerance) aTol = XCAFDoc_GeomTolerance::Set(aDimTolL);
+  TCollection_AsciiString aStr = "DGT:Tolerance";
+  TDataStd_Name::Set(aDimTolL,aStr);
+  return aDimTolL;
+}
+
+//=======================================================================
+//function : SetDimension
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_DimTolTool::SetDimension(const TDF_Label& theL,
+                                   const TDF_Label& theDimTolL) const
+{
+  TDF_Label nullLab;
+  SetDimension(theL, nullLab, theDimTolL);
+}
+
+//=======================================================================
+//function : SetDimension
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_DimTolTool::SetDimension(const TDF_Label& theFirstL,
+                                   const TDF_Label& theSecondL,
+                                   const TDF_Label& theDimTolL) const
+{
+  Handle(XCAFDoc_GraphNode) aChGNode;
+  Handle(XCAFDoc_GraphNode) aFGNode;
+  Handle(XCAFDoc_GraphNode) aSecondFGNode;
+
+  //Handle(XCAFDoc_GraphNode) ChGNode, FGNode;
+  if ( theDimTolL.FindAttribute (XCAFDoc::DimensionRefGUID(), aChGNode) ) {
+    while (aChGNode->NbFathers() > 0) {
+      aFGNode = aChGNode->GetFather(1);
+      aFGNode->UnSetChild(aChGNode);
+    }
+    theDimTolL.ForgetAttribute ( XCAFDoc::DimTolRefGUID() );
+  }
+
+  if(!IsDimension(theDimTolL))
+  {
+    return;
+  }
+
+  if (!theDimTolL.FindAttribute(XCAFDoc::DimensionRefGUID(), aChGNode) ) {
+    aChGNode = new XCAFDoc_GraphNode;
+    aChGNode = XCAFDoc_GraphNode::Set(theDimTolL);
+  }
+  if (!theFirstL.FindAttribute(XCAFDoc::DimensionRefGUID(), aFGNode) ) {
+    aFGNode = new XCAFDoc_GraphNode;
+    aFGNode = XCAFDoc_GraphNode::Set(theFirstL);
+  }
+  aFGNode->SetGraphID(XCAFDoc::DimensionRefGUID());
+  aChGNode->SetGraphID(XCAFDoc::DimensionRefGUID());
+  aFGNode->SetChild(aChGNode);
+  aChGNode->SetFather(aFGNode);
+
+  if (!theSecondL.IsNull()){
+    if(!theSecondL.FindAttribute(XCAFDoc::DimensionRefGUID(), aSecondFGNode) ) {
+      aSecondFGNode = new XCAFDoc_GraphNode;
+      aSecondFGNode = XCAFDoc_GraphNode::Set(theSecondL);
+    }
+    aSecondFGNode->SetGraphID(XCAFDoc::DimensionRefGUID());
+    aSecondFGNode->SetChild(aChGNode);
+    aChGNode->SetFather(aSecondFGNode);
+  }
+}
+
+//=======================================================================
+//function : SetGeomTolerance
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_DimTolTool::SetGeomTolerance(const TDF_Label& theL,
+                                   const TDF_Label& theDimTolL) const
+{
+  // set reference
+  Handle(TDataStd_TreeNode) refNode, mainNode;
+  refNode = TDataStd_TreeNode::Set ( theDimTolL, XCAFDoc::GeomToleranceRefGUID() );
+  mainNode  = TDataStd_TreeNode::Set ( theL,       XCAFDoc::GeomToleranceRefGUID() );
+  refNode->Remove(); // abv: fix against bug in TreeNode::Append()
+  mainNode->Append(refNode);
+}
 
 //=======================================================================
 //function : SetDimTol
 //purpose  : 
 //=======================================================================
 
-void XCAFDoc_DimTolTool::SetDimTol(const TDF_Label& L,
-                                   const TDF_Label& DimTolL) const
+void XCAFDoc_DimTolTool::SetDimTol(const TDF_Label& theL,
+                                   const TDF_Label& theDimTolL) const
 {
   // set reference
   Handle(TDataStd_TreeNode) refNode, mainNode;
-//  mainNode = TDataStd_TreeNode::Set ( DimTolL, XCAFDoc::DimTolRefGUID() );
-//  refNode  = TDataStd_TreeNode::Set ( L,       XCAFDoc::DimTolRefGUID() );
-  refNode = TDataStd_TreeNode::Set ( DimTolL, XCAFDoc::DimTolRefGUID() );
-  mainNode  = TDataStd_TreeNode::Set ( L,       XCAFDoc::DimTolRefGUID() );
+  refNode = TDataStd_TreeNode::Set ( theDimTolL, XCAFDoc::DimTolRefGUID() );
+  mainNode  = TDataStd_TreeNode::Set (theL,       XCAFDoc::DimTolRefGUID() );
   refNode->Remove(); // abv: fix against bug in TreeNode::Append()
   mainNode->Append(refNode);
 }
@@ -240,42 +406,88 @@ TDF_Label XCAFDoc_DimTolTool::SetDimTol(const TDF_Label& L,
 //purpose  : 
 //=======================================================================
 
-Standard_Boolean XCAFDoc_DimTolTool::GetRefShapeLabel(const TDF_Label& L,
-                                                      TDF_LabelShapeL) const
+Standard_Boolean XCAFDoc_DimTolTool::GetRefShapeLabel(const TDF_Label& theL,
+                                                      TDF_LabelSequence& theShapeL) const
 {
-  Handle(TDataStd_TreeNode) Node;
-  if( !L.FindAttribute(XCAFDoc::DimTolRefGUID(),Node) || !Node->HasFather() ) {
-    if( !L.FindAttribute(XCAFDoc::DatumRefGUID(),Node) || !Node->HasFather() ) {
-      return Standard_False;
+  theShapeL.Clear();
+  Handle(TDataStd_TreeNode) aNode;
+  if( !theL.FindAttribute(XCAFDoc::DimTolRefGUID(),aNode) || !aNode->HasFather() ) {
+    if( !theL.FindAttribute(XCAFDoc::DatumRefGUID(),aNode) || !aNode->HasFather() ) {
+      if( !theL.FindAttribute(XCAFDoc::GeomToleranceRefGUID(),aNode) || !aNode->HasFather() ) {
+        Handle(XCAFDoc_GraphNode) aGNode;
+        if( theL.FindAttribute(XCAFDoc::DimensionRefGUID(),aGNode) && aGNode->NbFathers() > 0 ) {
+          for(Standard_Integer i = 1; i <= aGNode->NbFathers(); i++)
+          {
+            theShapeL.Append(aGNode->GetFather(i)->Label());
+          }
+          return Standard_True;
+        }
+        return Standard_False;
+      }
     }
   }
-  ShapeL = Node->Father()->Label();
+  theShapeL.Append(aNode->Father()->Label());
   return Standard_True;
 }
 
+//=======================================================================
+//function : GetRefDimensionLabels
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDoc_DimTolTool::GetRefDimensionLabels(const TDF_Label& theShapeL,
+                                                     TDF_LabelSequence& theDimTols) const
+{
+  Handle(XCAFDoc_GraphNode) aGNode;
+  if( theShapeL.FindAttribute(XCAFDoc::DimensionRefGUID(),aGNode) && aGNode->NbChildren() > 0 ) {
+    for(Standard_Integer i = 1; i <= aGNode->NbChildren(); i++)
+    {
+      theDimTols.Append(aGNode->GetChild(i)->Label());
+    }
+    return Standard_True;
+  }
+  return Standard_False;
+}
 
 //=======================================================================
-//function : GetRefDGTLabels
+//function : GetRefGeomToleranceLabels
 //purpose  : 
 //=======================================================================
 
-Standard_Boolean XCAFDoc_DimTolTool::GetRefDGTLabels(const TDF_Label& ShapeL,
-                                                     TDF_LabelSequence &DimTols) const
+Standard_Boolean XCAFDoc_DimTolTool::GetRefGeomToleranceLabels(const TDF_Label& theShapeL,
+                                                     TDF_LabelSequence& theDimTols) const
 {
-  Handle(TDataStd_TreeNode) Node;
-  if( !ShapeL.FindAttribute(XCAFDoc::DimTolRefGUID(),Node) ||
-       !Node->HasFirst() ) {
+  Handle(TDataStd_TreeNode) aNode;
+  if( !theShapeL.FindAttribute(XCAFDoc::GeomToleranceRefGUID(),aNode) ||
+       !aNode->HasFirst() ) {
     return Standard_False;
   }
-  Handle(TDataStd_TreeNode) Last = Node->First();
-  DimTols.Append(Last->Label());
-  while(Last->HasNext()) {
-    Last = Last->Next();
-    DimTols.Append(Last->Label());
+  Handle(TDataStd_TreeNode) aLast = aNode->First();
+  theDimTols.Append(aLast->Label());
+  while(aLast->HasNext()) {
+    aLast = aLast->Next();
+    theDimTols.Append(aLast->Label());
   }
   return Standard_True;
 }
 
+//=======================================================================
+//function : GetRefDatumLabel
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDoc_DimTolTool::GetRefDatumLabel(const TDF_Label& theShapeL,
+                                                     TDF_Label& theDatum) const
+{
+  Handle(TDataStd_TreeNode) aNode;
+  if( !theShapeL.FindAttribute(XCAFDoc::DatumRefGUID(),aNode) ||
+       !aNode->HasFirst() ) {
+    return Standard_False;
+  }
+  Handle(TDataStd_TreeNode) aLast = aNode->First();
+  theDatum = aLast->Label();
+  return Standard_True;
+}
 
 //=======================================================================
 //function : GetDimTol
@@ -306,10 +518,10 @@ Standard_Boolean XCAFDoc_DimTolTool::GetDimTol(const TDF_Label& DimTolL,
 //purpose  : 
 //=======================================================================
 
-Standard_Boolean XCAFDoc_DimTolTool::IsDatum(const TDF_Label& DimTolL) const
+Standard_Boolean XCAFDoc_DimTolTool::IsDatum(const TDF_Label& theDimTolL) const
 {
-  Handle(XCAFDoc_Datum) DatumAttr;
-  if(DimTolL.FindAttribute(XCAFDoc_Datum::GetID(),DatumAttr)) {
+  Handle(XCAFDoc_Datum) aDatumAttr;
+  if(theDimTolL.FindAttribute(XCAFDoc_Datum::GetID(),aDatumAttr)) {
     return Standard_True;
   }
   return Standard_False;
@@ -321,17 +533,16 @@ Standard_Boolean XCAFDoc_DimTolTool::IsDatum(const TDF_Label& DimTolL) const
 //purpose  : 
 //=======================================================================
 
-void XCAFDoc_DimTolTool::GetDatumLabels(TDF_LabelSequence& Labels) const
+void XCAFDoc_DimTolTool::GetDatumLabels(TDF_LabelSequence& theLabels) const
 {
-  Labels.Clear();
-  TDF_ChildIterator ChildIterator( Label() ); 
-  for (; ChildIterator.More(); ChildIterator.Next()) {
-    TDF_Label L = ChildIterator.Value();
-    if ( IsDatum(L)) Labels.Append(L);
+  theLabels.Clear();
+  TDF_ChildIterator aChildIterator( Label() ); 
+  for (; aChildIterator.More(); aChildIterator.Next()) {
+    TDF_Label L = aChildIterator.Value();
+    if ( IsDatum(L)) theLabels.Append(L);
   }
 }
 
-
 //=======================================================================
 //function : FindDatum
 //purpose  : 
@@ -375,24 +586,37 @@ TDF_Label XCAFDoc_DimTolTool::AddDatum(const Handle(TCollection_HAsciiString)& a
   return DatumL;
 }
 
+//=======================================================================
+//function : AddDatum
+//purpose  : 
+//=======================================================================
+
+TDF_Label XCAFDoc_DimTolTool::AddDatum()
+{
+  TDF_Label aDatumL;
+  TDF_TagSource aTag;
+  aDatumL = aTag.NewChild ( Label() );
+  Handle(XCAFDoc_Datum) aDat = XCAFDoc_Datum::Set(aDatumL);
+  TDataStd_Name::Set(aDatumL,"DGT:Datum");
+  return aDatumL;
+}
 
 //=======================================================================
 //function : SetDatum
 //purpose  : 
 //=======================================================================
 
-void XCAFDoc_DimTolTool::SetDatum(const TDF_Label& L,
-                                  const TDF_Label& DatumL) const
+void XCAFDoc_DimTolTool::SetDatum(const TDF_Label& theL,
+                                  const TDF_Label& theDatumL) const
 {
   // set reference
   Handle(TDataStd_TreeNode) refNode, mainNode;
-  refNode = TDataStd_TreeNode::Set ( DatumL, XCAFDoc::DatumRefGUID() );
-  mainNode  = TDataStd_TreeNode::Set ( L, XCAFDoc::DatumRefGUID() );
+  refNode = TDataStd_TreeNode::Set ( theDatumL, XCAFDoc::DatumRefGUID() );
+  mainNode  = TDataStd_TreeNode::Set ( theL, XCAFDoc::DatumRefGUID() );
   refNode->Remove();
   mainNode->Append(refNode);
 }
 
-
 //=======================================================================
 //function : SetDatum
 //purpose  : 
@@ -425,6 +649,31 @@ void XCAFDoc_DimTolTool::SetDatum(const TDF_Label& L,
   ChGNode->SetFather(FGNode);
 }
 
+//=======================================================================
+//function : SetDatumToGeomTol
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_DimTolTool::SetDatumToGeomTol(const TDF_Label& theDatumL,
+                                           const TDF_Label& theTolerL) const
+{
+  // set reference
+  Handle(XCAFDoc_GraphNode) aFGNode;
+  Handle(XCAFDoc_GraphNode) aChGNode;
+  if (! theTolerL.FindAttribute( XCAFDoc::DatumTolRefGUID(), aFGNode) ) {
+    aFGNode = new XCAFDoc_GraphNode;
+    aFGNode = XCAFDoc_GraphNode::Set(theTolerL);
+  }
+  if (! theDatumL.FindAttribute( XCAFDoc::DatumTolRefGUID(), aChGNode) ) {
+    aChGNode = new XCAFDoc_GraphNode;
+    aChGNode = XCAFDoc_GraphNode::Set(theDatumL);
+  }
+  aFGNode->SetGraphID( XCAFDoc::DatumTolRefGUID() );
+  aChGNode->SetGraphID( XCAFDoc::DatumTolRefGUID() );
+  aFGNode->SetChild(aChGNode);
+  aChGNode->SetFather(aFGNode);
+}
+
 //=======================================================================
 //function : GetDatum
 //purpose  : 
@@ -451,15 +700,33 @@ Standard_Boolean XCAFDoc_DimTolTool::GetDatum(const TDF_Label& theDatumL,
 //purpose  : 
 //=======================================================================
 
-Standard_Boolean XCAFDoc_DimTolTool::GetDatumTolerLabels(const TDF_Label& DimTolL,
-                                                         TDF_LabelSequence &Datums) const
+Standard_Boolean XCAFDoc_DimTolTool::GetDatumOfTolerLabels(const TDF_Label& theDimTolL,
+                                                         TDF_LabelSequence& theDatums) const
 {
-  Handle(XCAFDoc_GraphNode) Node;
-  if( !DimTolL.FindAttribute(XCAFDoc::DatumTolRefGUID(),Node) )
+  Handle(XCAFDoc_GraphNode) aNode;
+  if( !theDimTolL.FindAttribute(XCAFDoc::DatumTolRefGUID(),aNode) )
     return Standard_False;
-  for(Standard_Integer i=1; i<=Node->NbChildren(); i++) {
-    Handle(XCAFDoc_GraphNode) DatumNode = Node->GetChild(i);
-    Datums.Append(DatumNode->Label());
+  for(Standard_Integer i=1; i<=aNode->NbChildren(); i++) {
+    Handle(XCAFDoc_GraphNode) aDatumNode = aNode->GetChild(i);
+    theDatums.Append(aDatumNode->Label());
+  }
+  return Standard_True;
+}
+
+//=======================================================================
+//function : GetTolerDatumLabels
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDoc_DimTolTool::GetTolerOfDatumLabels(const TDF_Label& theDatumL,
+                                                         TDF_LabelSequence& theTols) const
+{
+  Handle(XCAFDoc_GraphNode) aNode;
+  if( !theDatumL.FindAttribute(XCAFDoc::DatumTolRefGUID(),aNode) )
+    return Standard_False;
+  for(Standard_Integer i=1; i<=aNode->NbFathers(); i++) {
+    Handle(XCAFDoc_GraphNode) aDatumNode = aNode->GetFather(i);
+    theTols.Append(aDatumNode->Label());
   }
   return Standard_True;
 }
@@ -505,5 +772,4 @@ Handle(TDF_Attribute) XCAFDoc_DimTolTool::NewEmpty() const
 void XCAFDoc_DimTolTool::Paste(const Handle(TDF_Attribute)& /*into*/,
                                const Handle(TDF_RelocationTable)& /*RT*/) const
 {
-}
-
+}
\ No newline at end of file
diff --git a/src/XCAFDoc/XCAFDoc_Dimension.cdl b/src/XCAFDoc/XCAFDoc_Dimension.cdl
new file mode 100644 (file)
index 0000000..3dcee0d
--- /dev/null
@@ -0,0 +1,55 @@
+-- Created on: 2004-01-09
+-- Created by: Sergey KUUL
+-- Copyright (c) 2004-2014 OPEN CASCADE SAS
+--
+-- This file is part of Open CASCADE Technology software library.
+--
+-- This library is free software; you can redistribute it and/or modify it under
+-- the terms of the GNU Lesser General Public License version 2.1 as published
+-- by the Free Software Foundation, with special exception defined in the file
+-- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+-- distribution for complete text of the license and disclaimer of any warranty.
+--
+-- Alternatively, this file may be used under the terms of Open CASCADE
+-- commercial license or contractual agreement.
+
+class Dimension from XCAFDoc inherits Attribute from TDF
+
+       ---Purpose: attribute to store dimension
+
+uses
+    Label from TDF,
+    RelocationTable from TDF,
+    DimensionObject from XCAFDimTolObjects
+
+is
+
+    Create returns Dimension from XCAFDoc;
+    
+    ---Category: class methods
+    --           =============
+
+    GetID (myclass)   
+       ---C++: return const &  
+    returns GUID from Standard;
+    
+    Set (myclass; theLabel : Label from TDF)
+    returns Dimension from XCAFDoc;
+                                                                          
+    ID (me)
+       ---C++: return const & 
+    returns GUID from Standard;
+
+    Restore (me: mutable; With : Attribute from TDF);
+
+    NewEmpty (me)
+    returns Attribute from TDF;
+
+    Paste (me; Into : Attribute from TDF;
+              RT   : RelocationTable from TDF);    
+
+    SetObject (me : mutable; theDimensionObject : DimensionObject from XCAFDimTolObjects);
+
+    GetObject (me) returns DimensionObject from XCAFDimTolObjects;
+
+end Dimension;
diff --git a/src/XCAFDoc/XCAFDoc_Dimension.cxx b/src/XCAFDoc/XCAFDoc_Dimension.cxx
new file mode 100644 (file)
index 0000000..297a7c9
--- /dev/null
@@ -0,0 +1,329 @@
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <XCAFDoc_Dimension.ixx>
+
+#include <TDF_RelocationTable.hxx>
+#include <XCAFDoc.hxx>
+#include <TDataStd_TreeNode.hxx>
+#include <Precision.hxx>
+#include <TColgp_HArray1OfPnt.hxx>
+#include <TDataStd_Integer.hxx>
+#include <TDataStd_IntegerArray.hxx>
+#include <TDataStd_Real.hxx>
+#include <TDataStd_RealArray.hxx>
+#include <TNaming_Builder.hxx>
+#include <TNaming_NamedShape.hxx>
+#include <TColStd_HArray1OfReal.hxx>
+#include <TopoDS.hxx>
+
+enum ChildLab
+{
+  ChildLab_Type = 1,
+  ChildLab_Value,
+  ChildLab_Qualifier,
+  ChildLab_Class,
+  ChildLab_Dec,
+  ChildLab_Modifiers,
+  ChildLab_Path,
+  ChildLab_Dir,
+  ChildLab_Pnts
+};
+
+//=======================================================================
+//function : XCAFDoc_Dimension
+//purpose  : 
+//=======================================================================
+
+XCAFDoc_Dimension::XCAFDoc_Dimension()
+{
+}
+
+
+//=======================================================================
+//function : GetID
+//purpose  : 
+//=======================================================================
+
+const Standard_GUID& XCAFDoc_Dimension::GetID() 
+{
+  static Standard_GUID DGTID ("58ed092c-44de-11d8-8776-001083004c77");
+  //static Standard_GUID ID("efd212e9-6dfd-11d4-b9c8-0060b0ee281b");
+  return DGTID; 
+  //return ID;
+}
+
+//=======================================================================
+//function : Set
+//purpose  : 
+//=======================================================================
+Handle(XCAFDoc_Dimension) XCAFDoc_Dimension::Set(const TDF_Label& theLabel) 
+{
+  Handle(XCAFDoc_Dimension) A;
+  if (!theLabel.FindAttribute(XCAFDoc_Dimension::GetID(), A)) {
+    A = new XCAFDoc_Dimension();
+    theLabel.AddAttribute(A);
+  }
+  return A;
+}
+
+//=======================================================================
+//function : SetObject
+//purpose  : 
+//=======================================================================
+void XCAFDoc_Dimension::SetObject (const Handle(XCAFDimTolObjects_DimensionObject)& theObject)
+{
+  Backup();
+
+  Handle(TDataStd_Integer) aType;
+  if(!Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
+  {
+    aType = new TDataStd_Integer();
+    Label().FindChild(ChildLab_Type).AddAttribute(aType);
+  }
+  aType->Set(theObject->GetType());
+
+  if(theObject->GetValues().IsNull())
+  {
+    Label().FindChild(ChildLab_Value).ForgetAllAttributes();
+  }
+  else
+  {
+    Handle(TDataStd_RealArray) aVal;
+    if(!Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_RealArray::GetID(), aVal))
+    {
+      aVal = new TDataStd_RealArray();
+      Label().FindChild(ChildLab_Value).AddAttribute(aVal);
+    }
+    aVal->ChangeArray(theObject->GetValues());
+  }
+
+  Handle(TDataStd_Integer) aQualifier;
+  if(!Label().FindChild(ChildLab_Qualifier).FindAttribute(TDataStd_Integer::GetID(), aQualifier))
+  {
+    aQualifier = new TDataStd_Integer();
+    Label().FindChild(ChildLab_Qualifier).AddAttribute(aQualifier);
+  }
+  aQualifier->Set(theObject->GetQualifier());
+  Standard_Boolean aH;
+  XCAFDimTolObjects_DimensionFormVariance aF;
+  XCAFDimTolObjects_DimensionGrade aG;
+  theObject->GetClassOfTolerance(aH,aF,aG);
+  Handle(TDataStd_IntegerArray) aClass;
+  if(!Label().FindChild(ChildLab_Class).FindAttribute(TDataStd_IntegerArray::GetID(), aClass))
+  {
+    aClass = new TDataStd_IntegerArray();
+    Label().FindChild(ChildLab_Class).AddAttribute(aClass);
+  }
+  Handle(TColStd_HArray1OfInteger) anArrI = new TColStd_HArray1OfInteger(1,3);
+  anArrI->SetValue(1,aH);
+  anArrI->SetValue(2,aF);
+  anArrI->SetValue(3,aG);
+  aClass->ChangeArray(anArrI);
+
+  Standard_Integer aL, aR;
+  theObject->GetNbOfDecimalPlaces(aL, aR);
+  Handle(TDataStd_IntegerArray) aDec;
+  if(!Label().FindChild(ChildLab_Dec).FindAttribute(TDataStd_IntegerArray::GetID(), aDec))
+  {
+    aDec = new TDataStd_IntegerArray();
+    Label().FindChild(ChildLab_Dec).AddAttribute(aDec);
+  }
+  anArrI = new TColStd_HArray1OfInteger(1,2);
+  anArrI->SetValue(1,aL);
+  anArrI->SetValue(2,aR);
+  aDec->ChangeArray(anArrI);
+  if(theObject->GetModifiers().Length() == 0)
+  {
+    Label().FindChild(ChildLab_Modifiers).ForgetAllAttributes();
+  }
+  else
+  {
+    Handle(TDataStd_IntegerArray) aModifiers;
+    if(!Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), aModifiers))
+    {
+      aModifiers = new TDataStd_IntegerArray();
+      Label().FindChild(ChildLab_Modifiers).AddAttribute(aModifiers);
+    }
+    anArrI = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
+    for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
+      anArrI->SetValue(i,theObject->GetModifiers().Value(i));
+    aModifiers->ChangeArray(anArrI);
+  }
+
+  if(!theObject->GetPath().IsNull())
+  {
+  TNaming_Builder tnBuild(Label().FindChild(ChildLab_Path));
+  tnBuild.Generated(theObject->GetPath());
+  }
+  else
+  {
+    Label().FindChild(ChildLab_Path).ForgetAllAttributes();
+  }
+
+  Handle(TDataStd_RealArray) aDir;
+  if(!Label().FindChild(ChildLab_Dir).FindAttribute(TDataStd_RealArray::GetID(), aDir))
+  {
+    aDir = new TDataStd_RealArray();
+    Label().FindChild(ChildLab_Dir).AddAttribute(aDir);
+  }
+  gp_Dir aD;
+  theObject->GetDirection(aD);
+  Handle(TColStd_HArray1OfReal) anArrR = new TColStd_HArray1OfReal(1,3);
+  anArrR->SetValue(1,aD.X());
+  anArrR->SetValue(2,aD.Y());
+  anArrR->SetValue(3,aD.Z());
+  aDir->ChangeArray(anArrR);
+
+  Handle(TDataStd_RealArray) aPnts;
+  if(!Label().FindChild(ChildLab_Pnts).FindAttribute(TDataStd_RealArray::GetID(), aPnts))
+  {
+    aPnts = new TDataStd_RealArray();
+    Label().FindChild(ChildLab_Pnts).AddAttribute(aPnts);
+  }
+  Handle(TColgp_HArray1OfPnt) aP = theObject->GetPoints();
+  if(!aP.IsNull() && aP->Length() > 0)
+  {
+    anArrR = new TColStd_HArray1OfReal(1,6);
+    anArrR->SetValue(1,aP->Value(1).X());
+    anArrR->SetValue(2,aP->Value(1).Y());
+    anArrR->SetValue(3,aP->Value(1).Z());
+    anArrR->SetValue(4,aP->Value(2).X());
+    anArrR->SetValue(5,aP->Value(2).Y());
+    anArrR->SetValue(6,aP->Value(2).Z());
+    aPnts->ChangeArray(anArrR);
+  }
+}
+
+//=======================================================================
+//function : GetObject
+//purpose  : 
+//=======================================================================
+Handle(XCAFDimTolObjects_DimensionObject) XCAFDoc_Dimension::GetObject()  const
+{
+  Handle(XCAFDimTolObjects_DimensionObject) anObj = new XCAFDimTolObjects_DimensionObject();
+
+  Handle(TDataStd_Integer) aType;
+  if(Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
+  {
+    anObj->SetType((XCAFDimTolObjects_DimensionType)aType->Get());
+  }
+
+  Handle(TDataStd_RealArray) aVal;
+  if(Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_RealArray::GetID(), aVal) 
+     && !aVal->Array().IsNull())
+  {
+    anObj->SetValues(aVal->Array());
+  }
+
+  Handle(TDataStd_Integer) aQualifier;
+  if(Label().FindChild(ChildLab_Qualifier).FindAttribute(TDataStd_Integer::GetID(), aQualifier))
+  {
+    anObj->SetQualifier((XCAFDimTolObjects_DimensionQualifier)aQualifier->Get());
+  }
+  Handle(TDataStd_IntegerArray) aClass;
+  if(Label().FindChild(ChildLab_Class).FindAttribute(TDataStd_IntegerArray::GetID(), aClass) 
+     && !aClass->Array().IsNull() && aClass->Array()->Length() > 0)
+  {
+    anObj->SetClassOfTolerance(aClass->Array()->Value(1), (XCAFDimTolObjects_DimensionFormVariance)aClass->Array()->Value(2), (XCAFDimTolObjects_DimensionGrade)aClass->Array()->Value(3));
+  }
+
+  Handle(TDataStd_IntegerArray) aDec;
+  if(Label().FindChild(ChildLab_Dec).FindAttribute(TDataStd_IntegerArray::GetID(), aDec)
+     && !aDec->Array().IsNull() && aDec->Array()->Length() > 0)
+  {
+      anObj->SetNbOfDecimalPlaces(aDec->Array()->Value(1), aDec->Array()->Value(2));
+  }
+  Handle(TDataStd_IntegerArray) aModifiers;
+  if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), aModifiers) 
+     && !aModifiers->Array().IsNull())
+  {
+    XCAFDimTolObjects_DimensionModifiersSequence aM;
+    for(Standard_Integer i = 1; i <= aModifiers->Array()->Length(); i++)
+      aM.Append((XCAFDimTolObjects_DimensionModif)aModifiers->Array()->Value(i));
+    anObj->SetModifiers(aM);
+  }
+
+  Handle(TNaming_NamedShape) aShape;
+  if(Label().FindChild(ChildLab_Path).FindAttribute(TNaming_NamedShape::GetID(), aShape)
+    && !aShape.IsNull())
+  {
+    anObj->SetPath(TopoDS::Edge(aShape->Get()));
+  }
+
+
+  Handle(TDataStd_RealArray) aDir;
+  if(Label().FindChild(ChildLab_Dir).FindAttribute(TDataStd_RealArray::GetID(), aDir)
+     && !aDir->Array().IsNull() && aDir->Array()->Length() > 0)
+  {
+    gp_Dir aD(aDir->Array()->Value(1), aDir->Array()->Value(2), aDir->Array()->Value(3));
+    anObj->SetDirection(aD);
+  }
+
+  Handle(TDataStd_RealArray) aPnts;
+  if(Label().FindChild(ChildLab_Pnts).FindAttribute(TDataStd_RealArray::GetID(), aPnts) 
+     && !aPnts->Array().IsNull() && aPnts->Array()->Length() > 0)
+  {
+    Handle(TColgp_HArray1OfPnt) aP = new TColgp_HArray1OfPnt(1,2);
+    aP->SetValue(1, gp_Pnt(aPnts->Array()->Value(1), aPnts->Array()->Value(2), aPnts->Array()->Value(3)));
+    aP->SetValue(2, gp_Pnt(aPnts->Array()->Value(4), aPnts->Array()->Value(5), aPnts->Array()->Value(6)));
+    anObj->SetPoints(aP);
+  }
+
+  return anObj;
+}
+
+//=======================================================================
+//function : ID
+//purpose  : 
+//=======================================================================
+
+const Standard_GUID& XCAFDoc_Dimension::ID() const
+{
+  return GetID();
+}
+
+//=======================================================================
+//function : Restore
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_Dimension::Restore(const Handle(TDF_Attribute)& /*With*/) 
+{
+}
+
+
+//=======================================================================
+//function : NewEmpty
+//purpose  : 
+//=======================================================================
+
+Handle(TDF_Attribute) XCAFDoc_Dimension::NewEmpty() const
+{
+  return new XCAFDoc_Dimension();
+}
+
+
+//=======================================================================
+//function : Paste
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_Dimension::Paste(const Handle(TDF_Attribute)& /*Into*/,
+                           const Handle(TDF_RelocationTable)& /*RT*/) const
+{
+}
diff --git a/src/XCAFDoc/XCAFDoc_GeomTolerance.cdl b/src/XCAFDoc/XCAFDoc_GeomTolerance.cdl
new file mode 100644 (file)
index 0000000..68bc386
--- /dev/null
@@ -0,0 +1,58 @@
+-- Created on: 2004-01-09
+-- Created by: Sergey KUUL
+-- Copyright (c) 2004-2014 OPEN CASCADE SAS
+--
+-- This file is part of Open CASCADE Technology software library.
+--
+-- This library is free software; you can redistribute it and/or modify it under
+-- the terms of the GNU Lesser General Public License version 2.1 as published
+-- by the Free Software Foundation, with special exception defined in the file
+-- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+-- distribution for complete text of the license and disclaimer of any warranty.
+--
+-- Alternatively, this file may be used under the terms of Open CASCADE
+-- commercial license or contractual agreement.
+
+class GeomTolerance from XCAFDoc inherits Attribute from TDF
+
+       ---Purpose: attribute to store dimension and tolerance
+
+uses
+    Label from TDF,
+    RelocationTable from TDF,
+    GeomToleranceObject from XCAFDimTolObjects
+
+is
+
+    Create returns GeomTolerance from XCAFDoc;
+
+    Create(theObj : GeomTolerance from XCAFDoc) returns GeomTolerance from XCAFDoc;
+    
+    ---Category: class methods
+    --           =============
+
+    GetID (myclass)   
+       ---C++: return const &  
+    returns GUID from Standard;
+
+    Set (myclass; theLabel : Label from TDF)
+    returns GeomTolerance from XCAFDoc;
+
+    SetObject (me : mutable; theObject : GeomToleranceObject from XCAFDimTolObjects);
+
+    GetObject (me) returns GeomToleranceObject from XCAFDimTolObjects;
+                                                                                
+    ID (me)
+       ---C++: return const & 
+    returns GUID from Standard;
+
+    Restore (me: mutable; With : Attribute from TDF);
+
+    NewEmpty (me)
+    returns Attribute from TDF;
+
+    Paste (me; Into : Attribute from TDF;
+              RT   : RelocationTable from TDF);    
+
+
+end GeomTolerance;
diff --git a/src/XCAFDoc/XCAFDoc_GeomTolerance.cxx b/src/XCAFDoc/XCAFDoc_GeomTolerance.cxx
new file mode 100644 (file)
index 0000000..e784520
--- /dev/null
@@ -0,0 +1,261 @@
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <XCAFDoc_GeomTolerance.ixx>
+
+#include <TDF_RelocationTable.hxx>
+#include <XCAFDoc.hxx>
+#include <TDataStd_TreeNode.hxx>
+#include <TDataStd_Integer.hxx>
+#include <TDataStd_IntegerArray.hxx>
+#include <TDataStd_Real.hxx>
+
+enum ChildLab
+{
+  ChildLab_Type = 1,
+  ChildLab_TypeOfValue,
+  ChildLab_Value,
+  ChildLab_MatReqModif,
+  ChildLab_ZoneModif,
+  ChildLab_ValueOfZoneModif,
+  ChildLab_Modifiers,
+  ChildLab_aMaxValueModif
+};
+
+//=======================================================================
+//function : XCAFDoc_GeomTolerance
+//purpose  : 
+//=======================================================================
+
+XCAFDoc_GeomTolerance::XCAFDoc_GeomTolerance()
+{
+}
+
+
+//=======================================================================
+//function : GetID
+//purpose  : 
+//=======================================================================
+
+const Standard_GUID& XCAFDoc_GeomTolerance::GetID() 
+{
+  static Standard_GUID DGTID ("58ed092f-44de-11d8-8776-001083004c77");
+  //static Standard_GUID ID("efd212e9-6dfd-11d4-b9c8-0060b0ee281b");
+  return DGTID; 
+  //return ID;
+}
+
+//=======================================================================
+//function :
+//purpose  : 
+//=======================================================================
+
+Handle(XCAFDoc_GeomTolerance) XCAFDoc_GeomTolerance::Set (const TDF_Label& theLabel)
+{
+  Handle(XCAFDoc_GeomTolerance) A;
+  if (!theLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), A)) {
+    A = new XCAFDoc_GeomTolerance();
+    theLabel.AddAttribute(A);
+  }
+  return A;
+}
+
+//=======================================================================
+//function : SetObject
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_GeomTolerance::SetObject (const Handle(XCAFDimTolObjects_GeomToleranceObject)& theObject) 
+{
+  Backup();
+
+  Handle(TDataStd_Integer) aType;
+  if(!Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
+  {
+    aType = new TDataStd_Integer();
+    Label().FindChild(ChildLab_Type).AddAttribute(aType);
+  }
+  aType->Set(theObject->GetType());
+
+  Handle(TDataStd_Integer) aTypeOfValue;
+  if(!Label().FindChild(ChildLab_TypeOfValue).FindAttribute(TDataStd_Integer::GetID(), aTypeOfValue))
+  {
+    aTypeOfValue = new TDataStd_Integer();
+    Label().FindChild(ChildLab_TypeOfValue).AddAttribute(aTypeOfValue);
+  }
+  aTypeOfValue->Set(theObject->GetTypeOfValue());
+
+  Handle(TDataStd_Real) aValue;
+  if(!Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_Real::GetID(), aValue))
+  {
+    aValue = new TDataStd_Real();
+    Label().FindChild(ChildLab_Value).AddAttribute(aValue);
+  }
+  aValue->Set(theObject->GetValue());
+
+  Handle(TDataStd_Integer) aMatReqModif;
+  if(!Label().FindChild(ChildLab_MatReqModif).FindAttribute(TDataStd_Integer::GetID(), aMatReqModif))
+  {
+    aMatReqModif = new TDataStd_Integer();
+    Label().FindChild(ChildLab_MatReqModif).AddAttribute(aMatReqModif);
+  }
+  aMatReqModif->Set(theObject->GetMaterialRequirementModifier());
+
+  Handle(TDataStd_Integer) aZoneModif;
+  if(!Label().FindChild(ChildLab_ZoneModif).FindAttribute(TDataStd_Integer::GetID(), aZoneModif))
+  {
+    aZoneModif = new TDataStd_Integer();
+    Label().FindChild(ChildLab_ZoneModif).AddAttribute(aZoneModif);
+  }
+  aZoneModif->Set(theObject->GetZoneModifier());
+
+  Handle(TDataStd_Real) aValueOfZoneModif;
+  if(!Label().FindChild(ChildLab_ValueOfZoneModif).FindAttribute(TDataStd_Real::GetID(), aValueOfZoneModif))
+  {
+    aValueOfZoneModif = new TDataStd_Real();
+    Label().FindChild(ChildLab_ValueOfZoneModif).AddAttribute(aValueOfZoneModif);
+  }
+  aValueOfZoneModif->Set(theObject->GetValueOfZoneModifier());
+
+  if(theObject->GetModifiers().Length() == 0)
+  {
+    Label().FindChild(ChildLab_Modifiers).ForgetAllAttributes();
+  }
+  else
+  {
+    Handle(TDataStd_IntegerArray) aModifiers;
+    if(!Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), aModifiers)
+      || theObject->GetModifiers().Length() == 0)
+    {
+      aModifiers = new TDataStd_IntegerArray();
+      Label().FindChild(ChildLab_Modifiers).AddAttribute(aModifiers);
+    }
+    Handle(TColStd_HArray1OfInteger) anArr = new TColStd_HArray1OfInteger(1,theObject->GetModifiers().Length());
+    for(Standard_Integer i = 1; i <= theObject->GetModifiers().Length(); i++)
+      anArr->SetValue(i,theObject->GetModifiers().Value(i));
+    aModifiers->ChangeArray(anArr);
+  }
+
+  Handle(TDataStd_Real) aMaxValueModif;
+  if(!Label().FindChild(ChildLab_aMaxValueModif).FindAttribute(TDataStd_Real::GetID(), aMaxValueModif))
+  {
+    aMaxValueModif = new TDataStd_Real();
+    Label().FindChild(ChildLab_aMaxValueModif).AddAttribute(aMaxValueModif);
+  }
+  aMaxValueModif->Set(theObject->GetMaxValueModifier());
+}
+
+//=======================================================================
+//function :GetObject
+//purpose  : 
+//=======================================================================
+
+Handle(XCAFDimTolObjects_GeomToleranceObject) XCAFDoc_GeomTolerance::GetObject()  const
+{
+  Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = new XCAFDimTolObjects_GeomToleranceObject();
+
+  Handle(TDataStd_Integer) aType;
+  if(Label().FindChild(ChildLab_Type).FindAttribute(TDataStd_Integer::GetID(), aType))
+  {
+    anObj->SetType((XCAFDimTolObjects_GeomToleranceType)aType->Get());
+  }
+
+  Handle(TDataStd_Integer) aTypeOfValue;
+  if(Label().FindChild(ChildLab_TypeOfValue).FindAttribute(TDataStd_Integer::GetID(), aTypeOfValue))
+  {
+    anObj->SetTypeOfValue((XCAFDimTolObjects_GeomToleranceTypeValue)aTypeOfValue->Get());
+  }
+
+  Handle(TDataStd_Real) aValue;
+  if(Label().FindChild(ChildLab_Value).FindAttribute(TDataStd_Real::GetID(), aValue))
+  {
+    anObj->SetValue(aValue->Get());
+  }
+
+  Handle(TDataStd_Integer) aMatReqModif;
+  if(Label().FindChild(ChildLab_MatReqModif).FindAttribute(TDataStd_Integer::GetID(), aMatReqModif))
+  {
+    anObj->SetMaterialRequirementModifier((XCAFDimTolObjects_GeomToleranceMatReqModif)aMatReqModif->Get());
+  }
+
+  Handle(TDataStd_Integer) aZoneModif;
+  if(Label().FindChild(ChildLab_ZoneModif).FindAttribute(TDataStd_Integer::GetID(), aZoneModif))
+  {
+    anObj->SetZoneModifier((XCAFDimTolObjects_GeomToleranceZoneModif)aZoneModif->Get());
+  }
+
+  Handle(TDataStd_Real) aValueOfZoneModif;
+  if(Label().FindChild(ChildLab_ValueOfZoneModif).FindAttribute(TDataStd_Real::GetID(), aValueOfZoneModif))
+  {
+    anObj->SetValueOfZoneModifier(aValueOfZoneModif->Get());
+  }
+
+  Handle(TDataStd_IntegerArray) anArr;
+  if(Label().FindChild(ChildLab_Modifiers).FindAttribute(TDataStd_IntegerArray::GetID(), anArr)
+     && !anArr->Array().IsNull())
+  {
+    XCAFDimTolObjects_GeomToleranceModifiersSequence aModifiers;
+    for(Standard_Integer i = 1; i <= anArr->Length(); i++)
+      aModifiers.Append((XCAFDimTolObjects_GeomToleranceModif)anArr->Value(i));
+    anObj->SetModifiers(aModifiers);
+  }
+
+  Handle(TDataStd_Real) aMaxValueModif;
+  if(Label().FindChild(ChildLab_aMaxValueModif).FindAttribute(TDataStd_Real::GetID(), aMaxValueModif))
+  {
+    anObj->SetMaxValueModifier(aMaxValueModif->Get());
+  }
+
+  return anObj;
+}
+
+//=======================================================================
+//function : ID
+//purpose  : 
+//=======================================================================
+
+const Standard_GUID& XCAFDoc_GeomTolerance::ID() const
+{
+  return GetID();
+}
+
+//=======================================================================
+//function : Restore
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_GeomTolerance::Restore(const Handle(TDF_Attribute)& /*With*/) 
+{
+}
+
+
+//=======================================================================
+//function : NewEmpty
+//purpose  : 
+//=======================================================================
+
+Handle(TDF_Attribute) XCAFDoc_GeomTolerance::NewEmpty() const
+{
+  return new XCAFDoc_GeomTolerance();
+}
+
+
+//=======================================================================
+//function : Paste
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_GeomTolerance::Paste(const Handle(TDF_Attribute)& /*Into*/,
+                           const Handle(TDF_RelocationTable)& /*RT*/) const
+{
+}
index 066ec710ac4eaaa8da274de21abfb140fcd1b818..735b1b226b1b6e5d447678a4cca7e842640ed7df 100644 (file)
@@ -28,6 +28,8 @@ is
 
     class Layers;
 
+    class GDTs;
+
     class Props;
 
     class Common; 
index eef41eee5de9c5d6430c865bfdd1466d9992a59c..b5f696ae40561190faed3b1bee359d8e65f840ad 100644 (file)
@@ -75,6 +75,7 @@
 
 #include <XDEDRAW_Shapes.hxx>
 #include <XDEDRAW_Colors.hxx>
+#include <XDEDRAW_GDTs.hxx>
 #include <XDEDRAW_Layers.hxx>
 #include <XDEDRAW_Props.hxx>
 #include <XDEDRAW_Common.hxx>
@@ -600,8 +601,6 @@ static Standard_Integer XAttributeValue (Draw_Interpretor& di, Standard_Integer
     else if ( att->ID() == XCAFDoc::ColorRefGUID(XCAFDoc_ColorGen) ) type = "Generic Color Link";
     else if ( att->ID() == XCAFDoc::ColorRefGUID(XCAFDoc_ColorSurf) ) type = "Surface Color Link";
     else if ( att->ID() == XCAFDoc::ColorRefGUID(XCAFDoc_ColorCurv) ) type = "Curve Color Link";
-    else if ( att->ID() == XCAFDoc::DimTolRefGUID() ) type = "DGT Link";
-    else if ( att->ID() == XCAFDoc::DatumRefGUID() ) type = "Datum Link";
     else if ( att->ID() == XCAFDoc::MaterialRefGUID() ) type = "Material Link";
     Handle(TDataStd_TreeNode) TN = Handle(TDataStd_TreeNode)::DownCast(att);
     TCollection_AsciiString ref;
@@ -768,6 +767,12 @@ static Standard_Integer XAttributeValue (Draw_Interpretor& di, Standard_Integer
     else if ( att->ID() == XCAFDoc::DatumTolRefGUID() ) {
       type = "DatumToler Link";
     }
+    else if ( att->ID() == XCAFDoc::DimTolRefGUID() ){
+      type = "DGT Link";
+    }
+    else if ( att->ID() == XCAFDoc::DatumRefGUID() ){
+      type = "Datum Link";
+    }
     else return 0;
 
     Handle(XCAFDoc_GraphNode) DETGN = Handle(XCAFDoc_GraphNode)::DownCast(att);
@@ -1140,6 +1145,7 @@ void XDEDRAW::Init(Draw_Interpretor& di)
   XDEDRAW_Colors::InitCommands ( di );
   XDEDRAW_Layers::InitCommands ( di );
   XDEDRAW_Props::InitCommands ( di );
+  XDEDRAW_GDTs::InitCommands ( di );
   XDEDRAW_Common::InitCommands ( di );//moved from EXE
 
 }
diff --git a/src/XDEDRAW/XDEDRAW_GDTs.cdl b/src/XDEDRAW/XDEDRAW_GDTs.cdl
new file mode 100644 (file)
index 0000000..737bfae
--- /dev/null
@@ -0,0 +1,27 @@
+-- Created on: 2015-06-18
+-- Created by: Ilya Novikov
+-- Copyright (c) 2000-2015 OPEN CASCADE SAS
+--
+-- This file is part of Open CASCADE Technology software library.
+--
+-- This library is free software; you can redistribute it and/or modify it under
+-- the terms of the GNU Lesser General Public License version 2.1 as published
+-- by the Free Software Foundation, with special exception defined in the file
+-- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+-- distribution for complete text of the license and disclaimer of any warranty.
+--
+-- Alternatively, this file may be used under the terms of Open CASCADE
+-- commercial license or contractual agreement.
+
+class GDTs from XDEDRAW 
+
+    ---Purpose: Contains commands to work with G&DTs
+
+uses
+    Interpretor from Draw
+    
+is
+
+    InitCommands (myclass; theCommands: in out Interpretor from Draw);
+       
+end GDTs;
diff --git a/src/XDEDRAW/XDEDRAW_GDTs.cxx b/src/XDEDRAW/XDEDRAW_GDTs.cxx
new file mode 100644 (file)
index 0000000..696fa19
--- /dev/null
@@ -0,0 +1,2209 @@
+// Created on: 2015-06-18
+// Created by: Ilya Novikov
+// Copyright (c) 2000-2015 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <XDEDRAW_GDTs.ixx>
+
+#include <Draw.hxx>
+#include <DBRep.hxx>
+#include <DDocStd.hxx>
+
+#include <TDF_Tool.hxx>
+#include <TDF_Label.hxx>
+#include <TDF_LabelSequence.hxx>
+#include <TDocStd_Document.hxx>
+#include <XCAFDoc_GraphNode.hxx>
+
+#include <XCAFDoc.hxx>
+#include <XCAFDoc_DocumentTool.hxx>
+#include <XCAFDoc_ShapeTool.hxx>
+#include <XCAFDoc_DimTol.hxx>
+#include <XCAFDoc_Dimension.hxx>
+#include <XCAFDimTolObjects_DimensionObject.hxx>
+#include <XCAFDoc_Datum.hxx>
+#include <XCAFDimTolObjects_DatumObject.hxx>
+#include <XCAFDoc_GeomTolerance.hxx>
+#include <XCAFDimTolObjects_GeomToleranceObject.hxx>
+#include <XCAFDoc_DimTolTool.hxx>
+#include <XCAFDimTolObjects_DimensionObjectSequence.hxx>
+#include <XCAFDimTolObjects_DatumObjectSequence.hxx>
+#include <XCAFDimTolObjects_GeomToleranceObjectSequence.hxx>
+#include <XCAFDimTolObjects_DatumSingleModif.hxx>
+#include <XCAFDimTolObjects_DimensionModif.hxx>
+#include <XCAFDimTolObjects_GeomToleranceModif.hxx>
+#include <XCAFDimTolObjects_DatumModifiersSequence.hxx>
+#include <XCAFDimTolObjects_DatumObject.hxx>
+#include <XCAFDimTolObjects_Tool.hxx>
+
+#include <TCollection_AsciiString.hxx>
+#include <TCollection_HAsciiString.hxx>
+#include <TColStd_HArray1OfReal.hxx>
+#include <TColgp_HArray1OfPnt.hxx>
+
+#include <TopoDS.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <BRep_Tool.hxx>
+
+
+
+static Standard_Integer DumpDGTs (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XDumpDGTs Doc shape/label/all\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool= XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TCollection_AsciiString name = argv[2];
+  TDF_LabelSequence aLabels;
+  if(name.IsEqual("all"))
+  {
+    aShapeTool->GetShapes(aLabels);
+    for ( Standard_Integer i=1; i <= aLabels.Length(); i++ )
+    {
+      aShapeTool->GetSubShapes(aLabels.Value(i), aLabels);
+    }
+  }
+  else
+  {
+    TDF_Label aLabel;
+    TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+    if ( !aLabel.IsNull() ) {
+      aLabels.Append(aLabel);
+      aShapeTool->GetSubShapes(aLabel, aLabels);
+    }
+    else
+    {
+      TopoDS_Shape aShape= DBRep::Get(argv[2]);
+      if ( !aShape.IsNull() )
+      {
+        aShapeTool->Search(aShape, aLabel);
+        if ( !aLabel.IsNull() ) {
+          aLabels.Append(aLabel);
+          aShapeTool->GetSubShapes(aLabel, aLabels);
+        }
+        else
+        {
+          di<<"Shape "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+          return 1;
+        }
+      }
+    }
+  }
+
+  for ( Standard_Integer i=1; i <= aLabels.Length(); i++ )
+  {
+    Standard_Boolean flag = Standard_True;
+    TDF_LabelSequence aGDTs;
+    aDimTolTool->GetRefDimensionLabels(aLabels.Value(i), aGDTs);
+    for ( Standard_Integer j=1; j <= aGDTs.Length(); j++ )
+    {
+      Handle(XCAFDoc_Dimension) aDimTol;
+      if(aGDTs.Value(j).FindAttribute(XCAFDoc_Dimension::GetID(), aDimTol))
+      {
+        Handle(XCAFDimTolObjects_DimensionObject) aDimTolObj = aDimTol->GetObject();
+        if(flag)
+        {
+          TCollection_AsciiString Entry;
+          TDF_Tool::Entry(aLabels.Value(i), Entry);
+          di << "\n " << Entry;
+          flag = Standard_False;
+        }
+        TCollection_AsciiString Entry;
+        TDF_Tool::Entry(aGDTs.Value(j), Entry);
+        di << "\n \t " << Entry;
+        flag = Standard_False;
+
+        di << " Dimension";
+      }
+    }
+    aGDTs.Clear();
+    aDimTolTool->GetRefGeomToleranceLabels(aLabels.Value(i), aGDTs);
+    for ( Standard_Integer j=1; j <= aGDTs.Length(); j++ )
+    {
+      Handle(XCAFDoc_GeomTolerance) aDimTol;
+      if(aGDTs.Value(j).FindAttribute(XCAFDoc_GeomTolerance::GetID(), aDimTol))
+      {
+        Handle(XCAFDimTolObjects_GeomToleranceObject) aDimTolObj = aDimTol->GetObject();
+        if(flag)
+        {
+          TCollection_AsciiString Entry;
+          TDF_Tool::Entry(aLabels.Value(i), Entry);
+          di << "\n " << Entry;
+          flag = Standard_False;
+        }
+        TCollection_AsciiString Entry;
+        TDF_Tool::Entry(aGDTs.Value(j), Entry);
+        di << "\n \t " << Entry;
+        flag = Standard_False;
+
+        di << " GeomTolerance";
+        Handle(XCAFDoc_GraphNode) aNode;
+        if(aGDTs.Value(j).FindAttribute(XCAFDoc::DatumTolRefGUID(), aNode) && aNode->NbChildren() > 0)
+        {
+          for(Standard_Integer i = 1; i<=aNode->NbChildren(); i++)
+          {
+            Handle(XCAFDoc_Datum) aDatum;
+            if(aNode->GetChild(i)->Label().FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
+            {
+              TCollection_AsciiString Entry;
+              TDF_Tool::Entry(aNode->GetChild(i)->Label(), Entry);
+              di << "\n \t \t " << Entry;
+              di << " Datum";
+            }
+          }
+        }
+      }
+    }
+    TDF_Label aDatumL;
+    if (aDimTolTool->GetRefDatumLabel(aLabels.Value(i), aDatumL))
+    {
+      Handle(XCAFDoc_Datum) aDatum;
+      if(aDatumL.FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
+      {
+        if(flag)
+        {
+          TCollection_AsciiString Entry;
+          TDF_Tool::Entry(aLabels.Value(i), Entry);
+          di << "\n " << Entry;
+          flag = Standard_False;
+        }
+        TCollection_AsciiString Entry;
+        TDF_Tool::Entry(aDatumL, Entry);
+        di << "\n \t " << Entry;
+        flag = Standard_False;
+
+        di << " Datum";
+      }
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer addDim (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XAddDimension Doc shape/label [shape/label]\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    TopoDS_Shape aShape= DBRep::Get(argv[2]);
+    if ( !aShape.IsNull() )
+    {
+      aShapeTool->Search(aShape, aLabel);
+      if ( aLabel.IsNull() )
+      {
+        di<<"Shape "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+        return 1;
+      }
+    }
+  }
+  TDF_Label aLabel1;
+  if(argc == 4)
+  {
+    TDF_Tool::Label(Doc->GetData(), argv[3], aLabel1);
+    if ( aLabel1.IsNull() ) 
+    {
+      TopoDS_Shape aShape= DBRep::Get(argv[3]);
+      if ( !aShape.IsNull() )
+      {
+        aShapeTool->Search(aShape, aLabel1);
+        if ( aLabel1.IsNull() )
+        {
+          di<<"Shape "<<argv[3]<<" is absent in "<<argv[1]<<"\n";
+          return 1;
+        }
+      }
+    }
+  }
+
+  TDF_Label aDimL = aDimTolTool->AddDimension();
+  if(aLabel1.IsNull())
+    aDimTolTool->SetDimension(aLabel, aDimL);
+  else
+    aDimTolTool->SetDimension(aLabel, aLabel1, aDimL);
+  TCollection_AsciiString Entry;
+  TDF_Tool::Entry(aDimL, Entry);
+  di << Entry;
+  return 0;
+}
+
+static Standard_Integer addGTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XAddGeomTolerance Doc shape/label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    TopoDS_Shape aShape= DBRep::Get(argv[2]);
+    if ( !aShape.IsNull() )
+    {
+      aShapeTool->Search(aShape, aLabel);
+      if ( aLabel.IsNull() )
+      {
+        di<<"Shape "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+        return 1;
+      }
+    }
+  }
+
+  TDF_Label aTolL = aDimTolTool->AddGeomTolerance();
+  aDimTolTool->SetGeomTolerance(aLabel, aTolL);
+  TCollection_AsciiString Entry;
+  TDF_Tool::Entry(aTolL, Entry);
+  di << Entry;
+  return 0;
+}
+
+static Standard_Integer addDatum (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XAddDatum Doc shape/label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    TopoDS_Shape aShape= DBRep::Get(argv[2]);
+    if ( !aShape.IsNull() )
+    {
+      aShapeTool->Search(aShape, aLabel);
+      if ( aLabel.IsNull() )
+      {
+        di<<"Shape "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+        return 1;
+      }
+    }
+  }
+
+  TDF_Label aDatumL = aDimTolTool->AddDatum();
+  aDimTolTool->SetDatum(aLabel, aDatumL);
+  TCollection_AsciiString Entry;
+  TDF_Tool::Entry(aDatumL, Entry);
+  di << Entry;
+  return 0;
+}
+
+static Standard_Integer setDatum (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetDatum Doc Datum_Label GeomTol_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Datum "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+
+  TDF_Label aTol;
+  TDF_Tool::Label(Doc->GetData(), argv[3], aTol);
+  if ( aTol.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[3]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+
+  aDimTolTool->SetDatumToGeomTol(aLabel, aTol);
+  return 0;
+}
+
+static Standard_Integer getDatum (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetDatum Doc GeomTol_Label/Shape_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Label "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+
+  TDF_Label aD;
+  if(!aDimTolTool->GetRefDatumLabel(aLabel, aD))
+  {
+    TDF_LabelSequence aDS;
+    if(aDimTolTool->GetDatumOfTolerLabels(aLabel, aDS))
+    {
+      for(Standard_Integer i = 1; i<=aDS.Length();i++)
+      {
+        if(i>1) di<<", ";
+        TCollection_AsciiString Entry;
+        TDF_Tool::Entry(aDS.Value(i), Entry);
+        di<<Entry;
+      }
+    }
+  }
+  else
+  {
+    TCollection_AsciiString Entry;
+    TDF_Tool::Entry(aD, Entry);
+    di<<Entry;
+  }
+  return 0;
+}
+
+static Standard_Integer addDatumModif (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XAddDatumModifier Doc Datum_Label mod1 mod2 ...\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Datum "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Datum) aDatum;
+  if(aLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
+  {
+    for(Standard_Integer i = 3; i < argc; i++)
+    {
+      if(Draw::Atoi(argv[i]) < 22 && Draw::Atoi(argv[i]) > -1)
+      {
+        Handle(XCAFDimTolObjects_DatumObject) anObj = aDatum->GetObject();
+        anObj->AddModifier((XCAFDimTolObjects_DatumSingleModif)Draw::Atoi(argv[i]));
+        aDatum->SetObject(anObj);
+      }
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getDatumModif (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetDatumModifiers Doc Datum_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Datum "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Datum) aDatum;
+  if(aLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
+  {
+    XCAFDimTolObjects_DatumModifiersSequence aS = aDatum->GetObject()->GetModifiers();
+    for(Standard_Integer i = 1; i<=aS.Length();i++)
+    {
+      if (i > 1) di<<", ";
+      switch(aS.Value(i)){
+      case 0  : di<<"AnyCrossSection"; break;
+      case 1  : di<<"AnyLongitudinalSection"; break;
+      case 2  : di<<"Basic"; break;
+      case 3  : di<<"ContactingFeature\n"; break;
+      case 4  : di<<"DegreeOfFreedomConstraintU"; break;
+      case 5  : di<<"DegreeOfFreedomConstraintV"; break;
+      case 6  : di<<"DegreeOfFreedomConstraintW"; break;
+      case 7  : di<<"DegreeOfFreedomConstraintX"; break;
+      case 8  : di<<"DegreeOfFreedomConstraintY"; break;
+      case 9  : di<<"DegreeOfFreedomConstraintZ"; break;
+      case 10 : di<<"DistanceVariable"; break;
+      case 11 : di<<"FreeState"; break;
+      case 12 : di<<"LeastMaterialRequirement"; break;
+      case 13 : di<<"Line"; break;
+      case 14 : di<<"MajorDiameter"; break;
+      case 15 : di<<"MaximumMaterialRequirement"; break;
+      case 16 : di<<"MinorDiameter"; break;
+      case 17 : di<<"Orientation"; break;
+      case 18 : di<<"PitchDiameter"; break;
+      case 19 : di<<"Plane"; break;
+      case 20 : di<<"Point"; break;
+      case 21 : di<<"Translation"; break;
+      default : break;
+      }
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer setDatumName (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetDatumName Doc Datum_Label name\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Datum "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Datum) aDatum;
+  if(aLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
+  {
+    Handle(XCAFDimTolObjects_DatumObject) anObj = aDatum->GetObject();
+    anObj->SetName(new TCollection_HAsciiString(argv[3]));
+    aDatum->SetObject(anObj);
+  }
+  return 0;
+}
+
+static Standard_Integer getDatumName (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetDatumName Doc Datum_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Datum "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Datum) aDatum;
+  if(aLabel.FindAttribute(XCAFDoc_Datum::GetID(), aDatum))
+  {
+    di<<aDatum->GetObject()->GetName()->ToCString();
+  }
+  return 0;
+}
+
+static Standard_Integer setTypeOfTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetTypeOfTolerance Doc GTol_Label type\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    if(Draw::Atoi(argv[3]) > -1 && Draw::Atoi(argv[3]) < 16)
+    {
+      Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
+      anObj->SetType((XCAFDimTolObjects_GeomToleranceType)Draw::Atoi(argv[3]));
+      aGeomTolerance->SetObject(anObj);
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getTypeOfTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetTypeOfTolerance Doc GTol_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+      switch(aGeomTolerance->GetObject()->GetType()){
+      case 0  : di<<"type is absent"; break;
+      case 1  : di<<"Angularity"; break;
+      case 2  : di<<"CircularRunout"; break;
+      case 3  : di<<"CircularityOrRoundness"; break;
+      case 4  : di<<"Coaxiality"; break;
+      case 5  : di<<"Concentricity"; break;
+      case 6  : di<<"Cylindricity"; break;
+      case 7  : di<<"Flatness"; break;
+      case 8  : di<<"Parallelism"; break;
+      case 9  : di<<"Perpendicularity"; break;
+      case 10 : di<<"Position"; break;
+      case 11 : di<<"ProfileOfLine"; break;
+      case 12 : di<<"ProfileOfSurface"; break;
+      case 13 : di<<"Straightness"; break;
+      case 14 : di<<"Symmetry"; break;
+      case 15 : di<<"TotalRunout"; break;
+      default : break;
+      }
+  }
+  return 0;
+}
+
+static Standard_Integer setTypeOfTolVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetTypeOfToleranceValue Doc GTol_Label type\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    if(Draw::Atoi(argv[3]) > -1 && Draw::Atoi(argv[3]) < 3)
+    {
+      Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
+      anObj->SetTypeOfValue((XCAFDimTolObjects_GeomToleranceTypeValue)Draw::Atoi(argv[3]));
+      aGeomTolerance->SetObject(anObj);
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getTypeOfTolVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetTypeOfToleranceValue Doc GTol_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    switch(aGeomTolerance->GetObject()->GetTypeOfValue()){
+      case 0  : di<<"type is absent"; break;
+      case 1  : di<<"Diameter"; break;
+      case 2  : di<<"SphericalDiameter"; break;
+      default : break;
+      }
+  }
+  return 0;
+}
+
+static Standard_Integer setTolVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetToleranceValue Doc GTol_Label value\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
+    anObj->SetValue(Draw::Atof(argv[3]));
+    aGeomTolerance->SetObject(anObj);
+  }
+  return 0;
+}
+
+static Standard_Integer getTolVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetToleranceValue Doc GTol_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    di << aGeomTolerance->GetObject()->GetValue();
+  }
+  return 0;
+}
+
+static Standard_Integer setMatReq (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetTolMaterialReq Doc GTol_Label mod\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    if(Draw::Atoi(argv[3]) > -1 && Draw::Atoi(argv[3]) < 3)
+    {
+      Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
+      anObj->SetMaterialRequirementModifier((XCAFDimTolObjects_GeomToleranceMatReqModif)Draw::Atoi(argv[3]));
+      aGeomTolerance->SetObject(anObj);
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getMatReq (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetTolMaterialReq Doc GTol_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+      switch(aGeomTolerance->GetObject()->GetMaterialRequirementModifier()){
+      case 0  : di<<"modifier is absent"; break;
+      case 1  : di<<"M"; break;
+      case 2  : di<<"L"; break;
+      default : break;
+      }
+  }
+  return 0;
+}
+
+static Standard_Integer setZoneMod (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetTolZoneMod Doc GTol_Label mod\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    if(Draw::Atoi(argv[3]) > -1 && Draw::Atoi(argv[3]) < 3)
+    {
+      Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
+      anObj->SetZoneModifier((XCAFDimTolObjects_GeomToleranceZoneModif)Draw::Atoi(argv[3]));
+      aGeomTolerance->SetObject(anObj);
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getZoneMod (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetTolZoneMod Doc GTol_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+      switch(aGeomTolerance->GetObject()->GetZoneModifier()){
+      case 0  : di<<"modifier is absent"; break;
+      case 1  : di<<"P"; break;
+      case 2  : di<<"NonUniform"; break;
+      default : break;
+      }
+  }
+  return 0;
+}
+
+static Standard_Integer setZoneModVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetTolZoneModValue Doc GTol_Label val\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
+    anObj->SetValueOfZoneModifier(Draw::Atof(argv[3]));
+    aGeomTolerance->SetObject(anObj);
+  }
+  return 0;
+}
+
+static Standard_Integer getZoneModVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetTolZoneModValue Doc GTol_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    di << aGeomTolerance->GetObject()->GetValueOfZoneModifier();
+  }
+  return 0;
+}
+
+static Standard_Integer addTolModif (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XAddTolModifier Doc Tol_Label mod1 mod2 ...\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    for(Standard_Integer i = 3; i < argc; i++)
+    {
+      if(Draw::Atoi(argv[i]) > -1 && Draw::Atoi(argv[i]) < 15)
+      {
+        Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
+        anObj->AddModifier((XCAFDimTolObjects_GeomToleranceModif)Draw::Atoi(argv[i]));
+        aGeomTolerance->SetObject(anObj);
+      }
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getTolModif (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetTolModifiers Doc Tol_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    XCAFDimTolObjects_GeomToleranceModifiersSequence aS  = aGeomTolerance->GetObject()->GetModifiers();
+    for(Standard_Integer i = 1; i <= aS.Length(); i++)
+    {
+      if (i > 1) di<<", ";
+      switch(aS.Value(i)){
+      case 0  : di<<"Any_Cross_Section"; break;
+      case 1  : di<<"Common_Zone"; break;
+      case 2  : di<<"Each_Radial_Element"; break;
+      case 3  : di<<"Free_State"; break;
+      case 4  : di<<"Least_Material_Requirement"; break;
+      case 5  : di<<"Line_Element"; break;
+      case 6  : di<<"Major_Diameter"; break;
+      case 7  : di<<"Maximum_Material_Requirement"; break;
+      case 8  : di<<"Minor_Diameter"; break;
+      case 9  : di<<"Not_Convex"; break;
+      case 10 : di<<"Pitch_Diameter"; break;
+      case 11 : di<<"Reciprocity_Requirement"; break;
+      case 12 : di<<"Separate_Requirement"; break;
+      case 13 : di<<"Statistical_Tolerance"; break;
+      case 14 : di<<"Tangent_Plane"; break;
+      default : break;
+      }
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer setTolMaxVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetTolMaxValue Doc Dim_Label val\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    Handle(XCAFDimTolObjects_GeomToleranceObject) anObj = aGeomTolerance->GetObject();
+    anObj->SetMaxValueModifier(Draw::Atof(argv[3]));
+    aGeomTolerance->SetObject(anObj);
+  }
+  return 0;
+}
+
+static Standard_Integer getTolMaxVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetTolMaxValue Doc Dim_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"GeomTolerance "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_GeomTolerance) aGeomTolerance;
+  if(aLabel.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGeomTolerance))
+  {
+    di << aGeomTolerance->GetObject()->GetMaxValueModifier();
+  }
+  return 0;
+}
+
+static Standard_Integer setDimType (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetDimensionType Doc Dim_Label type\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    if(Draw::Atoi(argv[3]) > -1 && Draw::Atoi(argv[3]) < 30)
+    {
+      Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
+      anObj->SetType((XCAFDimTolObjects_DimensionType)Draw::Atoi(argv[3]));
+      aDimension->SetObject(anObj);
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getDimType (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetDimensionType Doc Dim_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+      switch(aDimension->GetObject()->GetType()){
+      case 0  : di<<"type is absent"; break;
+      case 1  : di<<"Location_CurvedDistance"; break;
+      case 2  : di<<"Location_LinearDistance"; break;
+      case 3  : di<<"Location_LinearDistance_FromCenterToOuter"; break;
+      case 4  : di<<"Location_LinearDistance_FromCenterToInner"; break;
+      case 5  : di<<"Location_LinearDistance_FromOuterToCenter"; break;
+      case 6  : di<<"Location_LinearDistance_FromOuterToOuter"; break;
+      case 7  : di<<"Location_LinearDistance_FromOuterToInner"; break;
+      case 8  : di<<"Location_LinearDistance_FromInnerToCenter"; break;
+      case 9  : di<<"Location_LinearDistance_FromInnerToOuter"; break;
+      case 10 : di<<"Location_LinearDistance_FromInnerToInner"; break;
+      case 11 : di<<"Location_Angular"; break;
+      case 12 : di<<"Location_Oriented"; break;
+      case 13 : di<<"Location_WithPath"; break;
+      case 14 : di<<"Size_CurveLength"; break;
+      case 15 : di<<"Size_Diameter"; break;
+      case 16 : di<<"Size_SphericalDiameter"; break;
+      case 17 : di<<"Size_Radius"; break;
+      case 18 : di<<"Size_SphericalRadius"; break;
+      case 19 : di<<"Size_ToroidalMinorDiameter"; break;
+      case 20 : di<<"Size_ToroidalMajorDiameter"; break;
+      case 21 : di<<"Size_ToroidalMinorRadius"; break;
+      case 22 : di<<"Size_ToroidalMajorRadius"; break;
+      case 23 : di<<"Size_ToroidalHighMajorDiameter"; break;
+      case 24 : di<<"Size_ToroidalLowMajorDiameter"; break;
+      case 25 : di<<"Size_ToroidalHighMajorRadius"; break;
+      case 26 : di<<"Size_ToroidalLowMajorRadius"; break;
+      case 27 : di<<"Size_Thickness"; break;
+      case 28 : di<<"Size_Angular"; break;
+      case 29 : di<<"Size_WithPath"; break;
+      default : break;
+      }
+  }
+  return 0;
+}
+
+static Standard_Integer setDimVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetDimensionValue Doc Dim_Label val\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
+    anObj->SetValue(Draw::Atof(argv[3]));
+    aDimension->SetObject(anObj);
+  }
+  return 0;
+}
+
+static Standard_Integer getDimVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetDimensionValue Doc Dim_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    di << aDimension->GetObject()->GetValue();
+  }
+  return 0;
+}
+
+static Standard_Integer setDimQalif (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetDimensionQualifier Doc Dim_Label val\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    if(Draw::Atoi(argv[3]) > -1 && Draw::Atoi(argv[3]) < 4)
+    {
+      Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
+      anObj->SetQualifier((XCAFDimTolObjects_DimensionQualifier)Draw::Atoi(argv[3]));
+      aDimension->SetObject(anObj);
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getDimQalif (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetDimensionQualifier Doc Dim_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    
+    switch(aDimension->GetObject()->GetQualifier()){
+      case 0  : di<<"type is absent"; break;
+      case 1  : di<<"Min"; break;
+      case 2  : di<<"Max"; break;
+      case 3  : di<<"Avg"; break;
+      default : break;
+      }
+  }
+  return 0;
+}
+
+static Standard_Integer setDimRange (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 5) {
+    di<<"Use: "<<"XSetDimensionRange Doc Dim_Label low_val up_val\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    if(Draw::Atof(argv[3]) < Draw::Atof(argv[4]))
+    {
+      Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
+      anObj->SetLowerBound(Draw::Atof(argv[3]));
+      anObj->SetUpperBound(Draw::Atof(argv[4]));
+      aDimension->SetObject(anObj);
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getDimRange (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetDimensionRange Doc Dim_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    di << "lower " << aDimension->GetObject()->GetLowerBound();
+    di << " upper " << aDimension->GetObject()->GetUpperBound();
+  }
+  return 0;
+}
+
+static Standard_Integer setDimPlusMinusTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 5) {
+    di<<"Use: "<<"XSetDimensionPlusMinusTol Doc Dim_Label low_val up_val\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    if(Draw::Atof(argv[3]) < Draw::Atof(argv[4]))
+    {
+      Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
+      anObj->SetLowerTolValue(Draw::Atof(argv[3]));
+      anObj->SetUpperTolValue(Draw::Atof(argv[4]));
+      aDimension->SetObject(anObj);
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getDimPlusMinusTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetDimensionPlusMinusTol Doc Dim_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    di << "lower " << aDimension->GetObject()->GetLowerTolValue();
+    di << " upper " << aDimension->GetObject()->GetUpperTolValue();
+  }
+  return 0;
+}
+
+static Standard_Integer setDimClassTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 6) {
+    di<<"Use: "<<"XSetDimensionClassOfTol Doc Dim_Label ishole[1/0] formVar grade\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    if(Draw::Atoi(argv[4]) > 0 && Draw::Atoi(argv[4]) < 29 && Draw::Atoi(argv[5]) > -1 && Draw::Atoi(argv[5]) < 20)
+    {
+      Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
+      anObj->SetClassOfTolerance((Draw::Atoi(argv[3]) != 0), (XCAFDimTolObjects_DimensionFormVariance)Draw::Atoi(argv[4]), (XCAFDimTolObjects_DimensionGrade)Draw::Atoi(argv[5]));
+      aDimension->SetObject(anObj);
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getDimClassTol (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetDimensionClassOfTol Doc Dim_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    Standard_Boolean h;
+    XCAFDimTolObjects_DimensionFormVariance f;
+    XCAFDimTolObjects_DimensionGrade g;
+    if(aDimension->GetObject()->GetClassOfTolerance(h ,f, g))
+    {
+      if(h)
+      {
+        switch(f){
+        case 1  : di<<"a";break;
+        case 2  : di<<"b";break;
+        case 3  : di<<"c";break;
+        case 4  : di<<"cd";break;
+        case 5  : di<<"d";break;
+        case 6  : di<<"e";break;
+        case 7  : di<<"ef";break;
+        case 8  : di<<"f";break;
+        case 9  : di<<"fg";break;
+        case 10 : di<<"g";break;
+        case 11 : di<<"h";break;
+        case 12 : di<<"js";break;
+        case 13 : di<<"j";break;
+        case 14 : di<<"k";break;
+        case 15 : di<<"m";break;
+        case 16 : di<<"n";break;
+        case 17 : di<<"p";break;
+        case 18 : di<<"r";break;
+        case 19 : di<<"s";break;
+        case 20 : di<<"t";break;
+        case 21 : di<<"u";break;
+        case 22 : di<<"v";break;
+        case 23 : di<<"x";break;
+        case 24 : di<<"y";break;
+        case 25 : di<<"z";break;
+        case 26 : di<<"a";break;
+        case 27 : di<<"zb";break;
+        case 28 : di<<"zc";break;
+        default : break;
+        }
+      }
+      else
+      {
+        switch(f){
+        case 1  : di<<"A";break;
+        case 2  : di<<"B";break;
+        case 3  : di<<"C";break;
+        case 4  : di<<"CD";break;
+        case 5  : di<<"D";break;
+        case 6  : di<<"E";break;
+        case 7  : di<<"EF";break;
+        case 8  : di<<"F";break;
+        case 9  : di<<"FG";break;
+        case 10 : di<<"G";break;
+        case 11 : di<<"H";break;
+        case 12 : di<<"JS";break;
+        case 13 : di<<"J";break;
+        case 14 : di<<"K";break;
+        case 15 : di<<"M";break;
+        case 16 : di<<"N";break;
+        case 17 : di<<"P";break;
+        case 18 : di<<"R";break;
+        case 19 : di<<"S";break;
+        case 20 : di<<"T";break;
+        case 21 : di<<"U";break;
+        case 22 : di<<"V";break;
+        case 23 : di<<"X";break;
+        case 24 : di<<"Y";break;
+        case 25 : di<<"Z";break;
+        case 26 : di<<"ZA";break;
+        case 27 : di<<"ZB";break;
+        case 28 : di<<"ZC";break;
+        default : break;
+        }
+      }
+      switch(g){
+      case 0  : di<<"01"; break;
+      case 1  : di<<"0"; break;
+      case 2  : di<<"1"; break;
+      case 3  : di<<"2"; break;
+      case 4  : di<<"3"; break;
+      case 5  : di<<"4"; break;
+      case 6  : di<<"5"; break;
+      case 7  : di<<"6"; break;
+      case 8  : di<<"7"; break;
+      case 9  : di<<"8"; break;
+      case 10 : di<<"9"; break;
+      case 11 : di<<"10"; break;
+      case 12 : di<<"11"; break;
+      case 13 : di<<"12"; break;
+      case 14 : di<<"13"; break;
+      case 15 : di<<"14"; break;
+      case 16 : di<<"15"; break;
+      case 17 : di<<"16"; break;
+      case 18 : di<<"17"; break;
+      case 19 : di<<"18"; break;
+      default : break;
+      }
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer setDimNbOfDecimalPlaces (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 5) {
+    di<<"Use: "<<"XSetDimensionNbOfDecimalPlaces Doc Dim_Label l_val r_val\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
+    anObj->SetNbOfDecimalPlaces(Draw::Atoi(argv[3]), Draw::Atoi(argv[4]));
+    aDimension->SetObject(anObj);
+  }
+  return 0;
+}
+
+static Standard_Integer getDimNbOfDecimalPlaces (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetDimensionNbOfDecimalPlaces Doc Dim_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    Standard_Integer l, r;
+    aDimension->GetObject()->GetNbOfDecimalPlaces(l,r);
+    di << l << "." << r;
+  }
+  return 0;
+}
+
+static Standard_Integer addDimModifier (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XAddDimensionModifiers Doc Dim_Label mod1 mod2 ...\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    for(Standard_Integer i = 3; i < argc; i++)
+    {
+      if(Draw::Atoi(argv[i]) > -1 && Draw::Atoi(argv[i]) < 24)
+      {
+        Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
+        anObj->AddModifier((XCAFDimTolObjects_DimensionModif)Draw::Atoi(argv[i]));
+        aDimension->SetObject(anObj);
+      }
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getDimModifier (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetDimensionModifiers Doc Dim_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    XCAFDimTolObjects_DimensionModifiersSequence aS = aDimension->GetObject()->GetModifiers();
+    for(Standard_Integer i = 1; i <= aS.Length(); i++)
+    {
+      if (i > 1) di<<", ";
+      switch(aS.Value(i)){
+      case 0  : di<<"ControlledRadius"; break;
+      case 1  : di<<"Square"; break;
+      case 2  : di<<"StatisticalTolerance"; break;
+      case 3  : di<<"ContinuousFeature"; break;
+      case 4  : di<<"TwoPointSize"; break;
+      case 5  : di<<"LocalSizeDefinedBySphere"; break;
+      case 6  : di<<"LeastSquaresAssociationCriterion"; break;
+      case 7  : di<<"MaximumInscribedAssociation"; break;
+      case 8  : di<<"MinimumCircumscribedAssociation"; break;
+      case 9  : di<<"CircumferenceDiameter"; break;
+      case 10 : di<<"AreaDiameter"; break;
+      case 11 : di<<"VolumeDiameter"; break;
+      case 12 : di<<"MaximumSize"; break;
+      case 13 : di<<"MinimumSize"; break;
+      case 14 : di<<"AverageSize"; break;
+      case 15 : di<<"MedianSize"; break;
+      case 16 : di<<"MidRangeSize"; break;
+      case 17 : di<<"RangeOfSizes"; break;
+      case 18 : di<<"AnyRestrictedPortionOfFeature"; break;
+      case 19 : di<<"AnyCrossSection"; break;
+      case 20 : di<<"SpecificFixedCrossSection"; break;
+      case 21 : di<<"CommonTolerance"; break;
+      case 22 : di<<"FreeStateCondition"; break;
+      case 23 : di<<"Between"; break;
+      default : break;
+      }
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer addDimPath (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 4) {
+    di<<"Use: "<<"XSetDimensionPath Doc Dim_Label path(edge)\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    TopoDS_Edge aE = TopoDS::Edge(DBRep::Get(argv[3],TopAbs_EDGE));
+    if(!aE.IsNull())
+    {
+      Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
+      anObj->SetPath(aE);
+      aDimension->SetObject(anObj);
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer addDimPoints (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 5) {
+    di<<"Use: "<<"XSetDimensionPoints Doc Dim_Label v1 v2\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    TopoDS_Vertex aV1 = TopoDS::Vertex(DBRep::Get(argv[3],TopAbs_VERTEX));
+    TopoDS_Vertex aV2 = TopoDS::Vertex(DBRep::Get(argv[4],TopAbs_VERTEX));
+    if(!aV1.IsNull() && !aV1.IsNull())
+    {
+      Handle(TColgp_HArray1OfPnt) arr = new TColgp_HArray1OfPnt(1,2);
+      arr->SetValue(1, BRep_Tool::Pnt(aV1));
+      arr->SetValue(2, BRep_Tool::Pnt(aV2));
+      Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
+      anObj->SetPoints(arr);
+      aDimension->SetObject(anObj);
+    }
+  }
+  return 0;
+}
+
+static Standard_Integer getDimPoints (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XGetDimensionPoints Doc Dim_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    Handle(TColgp_HArray1OfPnt) pnts = aDimension->GetObject()->GetPoints();
+    if(!pnts.IsNull() && pnts->Length() == 2)
+    {
+      di << pnts->Value(1).X() << ";" << pnts->Value(1).Y() << ";" << pnts->Value(1).Z() << " ";
+      di << pnts->Value(2).X() << ";" << pnts->Value(2).Y() << ";" << pnts->Value(2).Z();
+    }
+ }
+  return 0;
+}
+
+static Standard_Integer addDimDir (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 6) {
+    di<<"Use: "<<"XSetDimensionDir Doc Dim_Label x y z\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    Handle(XCAFDimTolObjects_DimensionObject) anObj = aDimension->GetObject();
+    anObj->SetDirection(gp_Dir(Draw::Atof(argv[3]),Draw::Atof(argv[4]),Draw::Atof(argv[5])));
+    aDimension->SetObject(anObj);
+  }
+  return 0;
+}
+
+static Standard_Integer getDimDir (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc < 3) {
+    di<<"Use: "<<"XSetDimensionDir Doc Dim_Label\n";
+    return 1;
+  }
+  Handle(TDocStd_Document) Doc;
+  DDocStd::GetDocument(argv[1], Doc);
+  if ( Doc.IsNull() ) { di << argv[1] << " is not a document" << "\n"; return 1; }
+  Handle(XCAFDoc_DimTolTool) aDimTolTool = XCAFDoc_DocumentTool::DimTolTool(Doc->Main());
+  Handle(XCAFDoc_ShapeTool) aShapeTool= XCAFDoc_DocumentTool::ShapeTool(Doc->Main());
+
+  TDF_Label aLabel;
+  TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
+  if ( aLabel.IsNull() ) 
+  {
+    di<<"Dimension "<<argv[2]<<" is absent in "<<argv[1]<<"\n";
+    return 1;
+  }
+  Handle(XCAFDoc_Dimension) aDimension;
+  if(aLabel.FindAttribute(XCAFDoc_Dimension::GetID(), aDimension))
+  {
+    gp_Dir dir;
+    if(aDimension->GetObject()->GetDirection(dir))
+    {
+      di << dir.X()<< ";"<< dir.Y()<< ";"<<dir.Z(); 
+    }
+  }
+  return 0;
+}
+
+//=======================================================================
+//function : InitCommands
+//purpose  : 
+//=======================================================================
+
+void XDEDRAW_GDTs::InitCommands(Draw_Interpretor& di) 
+{
+
+  static Standard_Boolean initactor = Standard_False;
+  if (initactor) return;  initactor = Standard_True;
+
+  
+  Standard_CString g = "XDE G&DTs commands";
+
+  di.Add ("XDumpDGTs","XDumpDGTs Doc shape/label/all ",
+    __FILE__, DumpDGTs, g);
+
+  di.Add ("XAddDimension","XAddDimension Doc shape/label [shape/label]",
+    __FILE__, addDim, g);
+
+  di.Add ("XAddGeomTolerance","XAddGeomTolerance Doc shape/label",
+    __FILE__, addGTol, g);
+
+  di.Add ("XAddDatum","XAddDatum Doc shape/label",
+    __FILE__, addDatum, g);
+
+  di.Add ("XSetDatum","XSetDatum Doc Datum_Label GeomTol_Label",
+    __FILE__, setDatum, g);
+
+  di.Add ("XGetDatum","XGetDatum Doc GeomTol_Label/Shape_Label",
+    __FILE__, getDatum, g);
+
+  di.Add ("XAddDatumModifier","XAddDatumModifier Doc Datum_Label mod1 mod2 ...\n"
+    "Values:"
+    "\n  0 AnyCrossSection"
+    "\n  1 Any_LongitudinalSection"
+    "\n  2 Basic"
+    "\n  3 ContactingFeature"
+    "\n  4 DegreeOfFreedomConstraintU"
+    "\n  5 DegreeOfFreedomConstraintV"
+    "\n  6 DegreeOfFreedomConstraintW"
+    "\n  7 DegreeOfFreedomConstraintX"
+    "\n  8 DegreeOfFreedomConstraintY"
+    "\n  9 DegreeOfFreedomConstraintZ"
+    "\n 10 DistanceVariable"
+    "\n 11 FreeState"
+    "\n 12 LeastMaterialRequirement"
+    "\n 13 Line"
+    "\n 14 MajorDiameter"
+    "\n 15 MaximumMaterialRequirement"
+    "\n 16 MinorDiameter"
+    "\n 17 Orientation"
+    "\n 18 PitchDiameter"
+    "\n 19 Plane"
+    "\n 20 Point"
+    "\n 21 Translation",
+    __FILE__, addDatumModif, g);
+
+  di.Add ("XGetDatumModifiers","XGetDatumModifiers Doc Datum_Label",
+    __FILE__, getDatumModif, g);
+
+  di.Add ("XSetDatumName","XSetDatumName Doc Datum_Label name",
+    __FILE__, setDatumName, g);
+
+  di.Add ("XGetDatumName","XGetDatumName Doc Datum_Label",
+    __FILE__, getDatumName, g);
+
+  di.Add ("XSetTypeOfTolerance","XSetTypeOfTolerance Doc GTol_Label type"
+        "Values:\n"
+      "\t  0 type is absent\n"
+      "\t  1 Angularity\n"
+      "\t  2 CircularRunout\n"
+      "\t  3 CircularityOrRoundness\n"
+      "\t  4 Coaxiality\n"
+      "\t  5 Concentricity\n"
+      "\t  6 Cylindricity\n"
+      "\t  7 Flatness\n"
+      "\t  8 Parallelism\n"
+      "\t  9 Perpendicularity\n"
+      "\t 10 Position\n"
+      "\t 11 ProfileOfLine\n"
+      "\t 12 ProfileOfSurface\n"
+      "\t 13 Straightness\n"
+      "\t 14 Symmetry\n"
+      "\t 15 TotalRunout\n",
+    __FILE__, setTypeOfTol, g);
+
+  di.Add ("XGetTypeOfTolerance","XGetTypeOfTolerance Doc GTol_Label",
+    __FILE__, getTypeOfTol, g);
+
+  di.Add ("XSetTypeOfToleranceValue","XSetTypeOfToleranceValue Doc GTol_Label type"
+        "Values:"
+    "\n  0 none"
+    "\n  1 Diameter"
+    "\n  2 SphericalDiameter",
+    __FILE__, setTypeOfTolVal, g);
+
+  di.Add ("XGetTypeOfToleranceValue","XGetTypeOfToleranceValue Doc GTol_Label",
+    __FILE__, getTypeOfTolVal, g);
+
+  di.Add ("XSetToleranceValue","XSetToleranceValue Doc GTol_Label value",
+    __FILE__, setTolVal, g);
+
+  di.Add ("XGetToleranceValue","XGetToleranceValue Doc GTol_Label",
+    __FILE__, getTolVal, g);
+
+  di.Add ("XSetTolMaterialReq","XSetTolMaterialReq Doc GTol_Label mod"
+        "Values:"
+    "\n  0 none"
+    "\n  1 M"
+    "\n  2 L",
+    __FILE__, setMatReq, g);
+
+  di.Add ("XGetTolMaterialReq","XGetTolMaterialReq Doc GTol_Label",
+    __FILE__, getMatReq, g);
+
+  di.Add ("XSetTolZoneMod","XSetTolZoneMod Doc GTol_Label mod"
+        "Values:"
+    "\n  0 none"
+    "\n  1 P"
+    "\n  2 NonUniform",
+    __FILE__, setZoneMod, g);
+
+  di.Add ("XGetTolZoneMod","XGetTolZoneMod Doc GTol_Label",
+    __FILE__, getZoneMod, g);
+
+  di.Add ("XSetTolZoneModValue","XSetTolZoneModValue Doc GTol_Label val",
+    __FILE__, setZoneModVal, g);
+
+  di.Add ("XGetTolZoneModValue","XGetTolZoneModValue Doc GTol_Label",
+    __FILE__, getZoneModVal, g);
+  
+  di.Add ("XAddTolModifier","XAddTolModifier Doc Tol_Label mod1 mod2 ..."
+        "Values:\n"
+      "\t  0 Any_Cross_Section\n"
+      "\t  1 Common_Zone\n"
+      "\t  2 Each_Radial_Element\n"
+      "\t  3 Free_State\n"
+      "\t  4 Least_Material_Requirement\n"
+      "\t  5 Line_Element\n"
+      "\t  6 Major_Diameter\n"
+      "\t  7 Maximum_Material_Requirement\n"
+      "\t  8 Minor_Diameter\n"
+      "\t  9 Not_Convex\n"
+      "\t 10 Pitch_Diameter\n"
+      "\t 11 Reciprocity_Requirement\n"
+      "\t 12 Separate_Requirement\n"
+      "\t 13 Statistical_Tolerance\n"
+      "\t 14 Tangent_Plane\n",
+    __FILE__, addTolModif, g);
+
+  di.Add ("XGetTolModifier","XGetTolModifier Doc Tol_Label",
+    __FILE__, getTolModif, g);
+
+  di.Add ("XSetTolMaxValue","XSetTolMaxValue Doc Dim_Label val",
+    __FILE__, setTolMaxVal, g);
+
+  di.Add ("XGetTolMaxValue","XGetTolMaxValue Doc Dim_Label val",
+    __FILE__, getTolMaxVal, g);
+
+  di.Add ("XSetDimensionType","XSetDimensionType Doc Dim_Label type"
+        "Values:"
+      "\t  0 type is absent\n"
+      "\t  1 Location_CurvedDistance\n"
+      "\t  2 Location_LinearDistance\n"
+      "\t  3 Location_LinearDistance_FromCenterToOuter\n"
+      "\t  4 Location_LinearDistance_FromCenterToInner\n"
+      "\t  5 Location_LinearDistance_FromOuterToCenter\n"
+      "\t  6 Location_LinearDistance_FromOuterToOuter\n"
+      "\t  7 Location_LinearDistance_FromOuterToInner\n"
+      "\t  8 Location_LinearDistance_FromInnerToCenter\n"
+      "\t  9 Location_LinearDistance_FromInnerToOuter\n"
+      "\t 10 Location_LinearDistance_FromInnerToInner\n"
+      "\t 11 Location_Angular\n"
+      "\t 12 Location_Oriented\n"
+      "\t 13 Location_WithPath\n"
+      "\t 14 Size_CurveLength\n"
+      "\t 15 Size_Diameter\n"
+      "\t 16 Size_SphericalDiameter\n"
+      "\t 17 Size_Radius\n"
+      "\t 18 Size_SphericalRadius\n"
+      "\t 19 Size_ToroidalMinorDiameter\n"
+      "\t 20 Size_ToroidalMajorDiameter\n"
+      "\t 21 Size_ToroidalMinorRadius\n"
+      "\t 22 Size_ToroidalMajorRadius\n"
+      "\t 23 Size_ToroidalHighMajorDiameter\n"
+      "\t 24 Size_ToroidalLowMajorDiameter\n"
+      "\t 25 Size_ToroidalHighMajorRadius\n"
+      "\t 26 Size_ToroidalLowMajorRadius\n"
+      "\t 27 Size_Thickness\n"
+      "\t 28 Size_Angular\n"
+      "\t 29 Size_WithPath\n",
+    __FILE__, setDimType, g);
+
+  di.Add ("XGetDimensionType","XGetDimensionType Doc Dim_Label",
+    __FILE__, getDimType, g);
+
+  di.Add ("XSetDimensionValue","XSetDimensionValue Doc Dim_Label val",
+    __FILE__, setDimVal, g);
+
+  di.Add ("XGetDimensionValue","XGetDimensionValue Doc Dim_Label",
+    __FILE__, getDimVal, g);
+
+  di.Add ("XSetDimensionQualifier","XSetDimensionQualifier Doc Dim_Label val"
+        "Values:"
+    "\n  0 none"
+    "\n  1 Min"
+    "\n  2 Max"
+    "\n  3 Avg",
+    __FILE__, setDimQalif, g);
+  
+  di.Add ("XGetDimensionQualifier","XGetDimensionQualifier Doc Dim_Label",
+    __FILE__, getDimQalif, g);
+
+  di.Add ("XSetDimensionRange","XSetDimensionRange Doc Dim_Label low_val up_val",
+    __FILE__, setDimRange, g);
+
+  di.Add ("XGetDimensionRange","XGetDimensionRange Doc Dim_Label",
+    __FILE__, getDimRange, g);
+
+  di.Add ("XSetDimensionPlusMinusTol","XSetDimensionPlusMinusTol Doc Dim_Label low_val up_val",
+    __FILE__, setDimPlusMinusTol, g);
+
+  di.Add ("XGetDimensionPlusMinusTol","XGetDimensionPlusMinusTol Doc Dim_Label",
+    __FILE__, getDimPlusMinusTol, g);
+
+  di.Add ("XSetDimensionClassOfTol","XSetDimensionClassOfTol Doc Dim_Label ishole[1/0] formVar grade"
+        "Values of formVar:"
+        "\t 1 a\n"
+        "\t 2 b\n"
+        "\t 3 c\n"
+        "\t 4 cd\n"
+        "\t 5 d\n"
+        "\t 6 e\n"
+        "\t 7 ef\n"
+        "\t 8 f\n"
+        "\t 9 fg\n"
+        "\t10 g\n"
+        "\t11 h\n"
+        "\t12 js\n"
+        "\t13 j\n"
+        "\t14 k\n"
+        "\t15 m\n"
+        "\t16 n\n"
+        "\t17 p\n"
+        "\t18 r\n"
+        "\t19 s\n"
+        "\t20 t\n"
+        "\t21 u\n"
+        "\t22 v\n"
+        "\t23 x\n"
+        "\t24 y\n"
+        "\t25 z\n"
+        "\t26 za\n"
+        "\t27 zb\n"
+        "\t28 zc\n\n"
+        "Values of grade:"
+        "\t 0 01\n"
+        "\t 1 0\n"
+        "\t 2 1\n"
+        "\t 3 2d\n"
+        "\t 4 3\n"
+        "\t 5 4\n"
+        "\t 6 5f\n"
+        "\t 7 76\n"
+        "\t 8 7g\n"
+        "\t 9 8\n"
+        "\t10 9\n"
+        "\t11 10js\n"
+        "\t12 11j\n"
+        "\t13 12k\n"
+        "\t14 13m\n"
+        "\t15 14n\n"
+        "\t16 15p\n"
+        "\t17 16r\n"
+        "\t18 17s\n"
+        "\t19 18t\n",
+    __FILE__, setDimClassTol, g);
+
+  di.Add ("XGetDimensionClassOfTol","XGetDimensionClassOfTol Doc Dim_Label",
+    __FILE__, getDimClassTol, g);
+
+  di.Add ("XSetDimensionNbOfDecimalPlaces","XSetDimensionNbOfDecimalPlaces Doc Dim_Label l_val r_val",
+    __FILE__, setDimNbOfDecimalPlaces, g);
+
+  di.Add ("XGetDimensionNbOfDecimalPlaces","XGetDimensionNbOfDecimalPlaces Doc Dim_Label",
+    __FILE__, getDimNbOfDecimalPlaces, g);
+
+  di.Add ("XAddDimensionModifiers","XAddDimensionModifiers Doc Dim_Label mod1 mod2 ..."
+        "Values:"
+      "\t 0 ControlledRadius\n"
+      "\t 1 Square\n"
+      "\t 2 StatisticalTolerance\n"
+      "\t 3 ContinuousFeature\n"
+      "\t 4 TwoPointSize\n"
+      "\t 5 LocalSizeDefinedBySphere\n"
+      "\t 6 LeastSquaresAssociationCriterion\n"
+      "\t 7 MaximumInscribedAssociation\n"
+      "\t 8 MinimumCircumscribedAssociation\n"
+      "\t 9 CircumferenceDiameter\n"
+      "\t10 AreaDiameter\n"
+      "\t11 VolumeDiameter\n"
+      "\t12 MaximumSize\n"
+      "\t13 MinimumSize\n"
+      "\t14 AverageSize\n"
+      "\t15 MedianSize\n"
+      "\t16 MidRangeSize\n"
+      "\t17 RangeOfSizes\n"
+      "\t18 AnyRestrictedPortionOfFeature\n"
+      "\t19 AnyCrossSection\n"
+      "\t20 SpecificFixedCrossSection\n"
+      "\t21 CommonTolerance\n"
+      "\t22 FreeStateCondition\n"
+      "\t23 Between\n",
+    __FILE__, addDimModifier, g);
+
+  di.Add ("XGetDimensionModifiers","XGetDimensionModifiers Doc Dim_Label",
+    __FILE__, getDimModifier, g);
+  
+  di.Add ("XSetDimensionPath","XSetDimensionPath Doc Dim_Label path(edge)",
+    __FILE__, addDimPath, g);
+
+  di.Add ("XSetDimensionPoints","XSetDimensionPoints Doc Dim_Label v1 v2",
+    __FILE__, addDimPoints, g);
+
+  di.Add ("XGetDimensionPoints","XGetDimensionPoints Doc Dim_Label",
+    __FILE__, getDimPoints, g);
+
+  di.Add ("XSetDimensionDir","XSetDimensionDir Doc Dim_Label x y z",
+    __FILE__, addDimDir, g);
+
+  di.Add ("XGetDimensionDir","XGetDimensionDir Doc Dim_Label",
+    __FILE__, getDimDir, g);
+}
diff --git a/tests/gdt/begin b/tests/gdt/begin
new file mode 100644 (file)
index 0000000..9ecb225
--- /dev/null
@@ -0,0 +1,2 @@
+cpulimit 1000
+pload ALL
\ No newline at end of file
diff --git a/tests/gdt/dimensions/A1 b/tests/gdt/dimensions/A1
new file mode 100644 (file)
index 0000000..7113e61
--- /dev/null
@@ -0,0 +1,14 @@
+
+box b 10 10 10
+explode b
+explode b_1
+
+NewDocument D
+XAddShape D b
+XAddDimension D b_1_1
+#0:1:4:1
+XSetDimensionType D 0:1:4:1 14
+XSetDimensionValue D 0:1:4:1 1.5
+
+set c_value "1.5"
+set c_type "Size_CurveLength"
\ No newline at end of file
diff --git a/tests/gdt/dimensions/A2 b/tests/gdt/dimensions/A2
new file mode 100644 (file)
index 0000000..9094c6e
--- /dev/null
@@ -0,0 +1,16 @@
+
+box b 10 10 10
+explode b
+explode b_1
+
+NewDocument D
+XAddShape D b
+XAddDimension D b_1_1
+#0:1:4:1
+XSetDimensionType D  0:1:4:1 15
+XSetDimensionValue D  0:1:4:1 2.5
+XSetDimensionQualifier D  0:1:4:1 2
+
+set c_value "2.5"
+set c_type "Size_Diameter"
+set c_qalif "Max"
\ No newline at end of file
diff --git a/tests/gdt/dimensions/A3 b/tests/gdt/dimensions/A3
new file mode 100644 (file)
index 0000000..f005a9a
--- /dev/null
@@ -0,0 +1,15 @@
+
+box b 10 10 10
+explode b
+explode b_1
+
+NewDocument D
+XAddShape D b
+XAddDimension D b_1_1
+
+#0:1:4:1
+XSetDimensionType D  0:1:4:1 14
+XSetDimensionRange D  0:1:4:1 1.5 2.5
+
+set c_range "lower 1.5 upper 2.5"
+set c_type "Size_CurveLength"
\ No newline at end of file
diff --git a/tests/gdt/dimensions/A4 b/tests/gdt/dimensions/A4
new file mode 100644 (file)
index 0000000..ad0cc80
--- /dev/null
@@ -0,0 +1,20 @@
+
+box b 10 10 10
+explode b
+explode b_1
+
+NewDocument D
+XAddShape D b
+XAddDimension D b_1_1
+#0:1:4:1
+XSetDimensionType D  0:1:4:1 15
+XSetDimensionValue D  0:1:4:1 2.5
+XSetDimensionClassOfTol D  0:1:4:1 1 8 7
+XSetDimensionNbOfDecimalPlaces D  0:1:4:1 3 3 
+XAddDimensionModifiers D  0:1:4:1 14 0
+
+set c_value "2.5"
+set c_type "Size_Diameter"
+set c_class "f6"
+set c_d "3.3"
+set c_mod  "AverageSize, ControlledRadius"
\ No newline at end of file
diff --git a/tests/gdt/dimensions/A5 b/tests/gdt/dimensions/A5
new file mode 100644 (file)
index 0000000..edd83c2
--- /dev/null
@@ -0,0 +1,24 @@
+
+box b 10 10 10
+box b1 20 20 20 30 30 30
+explode b
+explode b_1
+explode b1
+explode b1_1
+
+NewDocument D
+XAddShape D b
+XAddShape D b1
+XAddDimension D b_1_1 b1_1_1
+#0:1:4:1
+XSetDimensionType D  0:1:4:1 2
+XSetDimensionValue D  0:1:4:1 6
+XSetDimensionPlusMinusTol D  0:1:4:1 -0.001 0.002
+vertex v1 10 10 10
+vertex v2 20 20 20 
+XSetDimensionPoints D  0:1:4:1 v1 v2
+
+set c_value "6"
+set c_type "Location_LinearDistance"
+set c_pnts "10;10;10 20;20;20"
+set c_plusminus "lower -0.001 upper 0.002"
\ No newline at end of file
diff --git a/tests/gdt/dimensions/A6 b/tests/gdt/dimensions/A6
new file mode 100644 (file)
index 0000000..2c8bb11
--- /dev/null
@@ -0,0 +1,22 @@
+
+box b 10 10 10
+box b1 20 20 20 30 30 30
+explode b
+explode b_1
+explode b1
+explode b1_1
+
+NewDocument D
+XAddShape D b
+XAddShape D b1
+XAddDimension D b_1_1  b1_1_1
+#0:1:4:1
+XSetDimensionType D  0:1:4:1 2
+XSetDimensionValue D  0:1:4:1 6
+XSetDimensionPlusMinusTol D  0:1:4:1 -0.001 0.002
+XSetDimensionDir D  0:1:4:1 1 1 0
+
+set c_value "6"
+set c_type "Location_LinearDistance"
+set c_plusminus "lower -0.001 upper 0.002"
+set c_dir "0.70710678118654757;0.70710678118654757;0"
diff --git a/tests/gdt/dimensions/begin b/tests/gdt/dimensions/begin
new file mode 100644 (file)
index 0000000..4f31a33
--- /dev/null
@@ -0,0 +1,12 @@
+set c_type 0
+set c_value 0
+set c_qalif 0
+set c_classtol 0
+set c_d 0
+set c_modif 0
+set c_dir 0
+set c_pnts 0
+set c_range 0
+set c_mod 0
+set c_plusminus 0
+set c_dump 0
\ No newline at end of file
diff --git a/tests/gdt/dimensions/end b/tests/gdt/dimensions/end
new file mode 100644 (file)
index 0000000..cf61d0d
--- /dev/null
@@ -0,0 +1,57 @@
+set value [XGetDimensionValue D 0:1:4:1]
+set type [XGetDimensionType D 0:1:4:1]
+set qualif [XGetDimensionQualifier D 0:1:4:1]
+set range [XGetDimensionRange D 0:1:4:1]
+set classtol [XGetDimensionClassOfTol D 0:1:4:1]
+set d [XGetDimensionNbOfDecimalPlaces D 0:1:4:1]
+set dir [XGetDimensionDir D 0:1:4:1]
+set pnts [XGetDimensionPoints D 0:1:4:1]
+set mod [XGetDimensionModifiers  D 0:1:4:1]
+set plusminus [XGetDimensionPlusMinusTol D  0:1:4:1]
+set dump [XDumpDGTs D all]
+
+if { $c_value != 0 && $value != $c_value} {
+ puts "Error wrong value"
+} else {
+  if { $c_type != 0 && [string compare $type $c_type] != 0} {
+   puts "Error wrong type"
+  } else {
+    if { $c_qalif !=  0 && [string compare $qualif $c_qalif] != 0} {
+     puts "Error wrong qualifier"
+    } else {
+      if { $c_classtol !=  0 && $classtol != $c_classtol} {
+       puts "Error wrong class of tolerance"
+      } else {
+        if { $c_d !=  0 && $d != $c_d} {
+         puts "Error wrong nbdigit"
+        } else {
+          if { $c_modif !=  0 && [string compare $modif $c_modif] != 0} {
+           puts "Error wrong modifiers"
+          } else {
+            if { $c_dir !=  0 && [string compare $dir $c_dir] != 0} {
+             puts "Error wrong direction"
+            } else {
+              if { $c_pnts !=  0 && [string compare $pnts $c_pnts] != 0} {
+               puts "Error wrong points"
+              } else {
+                if { $c_range !=  0 && [string compare $range $c_range] != 0} {
+                 puts "Error wrong range"
+                } else {
+                  if { $c_mod !=  0 && [string compare $mod $c_mod] != 0} {
+                   puts "Error wrong modifiers"
+                  } else {
+                    if { $c_plusminus !=  0 && [string compare $plusminus $c_plusminus] != 0} {
+                     puts "Error wrong modifiers"
+                    } else {
+                      puts "TEST COMPLETED"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/tests/gdt/end b/tests/gdt/end
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/gdt/grids.list b/tests/gdt/grids.list
new file mode 100644 (file)
index 0000000..9f8a778
--- /dev/null
@@ -0,0 +1,2 @@
+001 dimensions
+002 tolerances
\ No newline at end of file
diff --git a/tests/gdt/tolerances/A1 b/tests/gdt/tolerances/A1
new file mode 100644 (file)
index 0000000..5c55789
--- /dev/null
@@ -0,0 +1,34 @@
+
+box b 10 10 10
+explode b
+explode b_1
+
+NewDocument D
+XAddShape D b
+XAddGeomTolerance D b_1_1
+XAddDatum D b_1_2
+#0:1:4:1
+#0:1:4:2
+XSetDatumName D 0:1:4:2 A
+XAddDatumModifier D 0:1:4:2 10
+XSetDatum D 0:1:4:2 0:1:4:1
+XSetToleranceValue D 0:1:4:1 0.5
+XSetTypeOfTolerance D 0:1:4:1 1
+XSetTypeOfToleranceValue D 0:1:4:1 1
+XSetTolMaterialReq D 0:1:4:1 1
+XSetTolZoneMod D 0:1:4:1 1
+XSetTolZoneModValue D 0:1:4:1 1
+XAddTolModifier D 0:1:4:1 6 1
+XSetTolMaxValue D 0:1:4:1 1.5
+
+set c_dname "A"
+set c_dmod "DistanceVariable"
+set c_val "0.5"
+set c_type "Angularity"
+set c_typev "Diameter"
+set c_mat "M"
+set c_zone "P"
+set c_zonev "1"
+set c_mod "Major_Diameter, Common_Zone"
+set c_max "1.5"
+
diff --git a/tests/gdt/tolerances/A2 b/tests/gdt/tolerances/A2
new file mode 100644 (file)
index 0000000..d687bd5
--- /dev/null
@@ -0,0 +1,26 @@
+
+box b 10 10 10
+explode b
+explode b_1
+
+NewDocument D
+XAddShape D b
+XAddGeomTolerance D b_1_1
+XAddDatum D b_1_2
+XAddDatum D b_1_3
+#0:1:4:1
+#0:1:4:2
+#0:1:4:3
+XSetDatumName D 0:1:4:2 A
+XSetDatumName D 0:1:4:3 B
+XAddDatumModifier D 0:1:4:2 10
+XSetDatum D 0:1:4:2 0:1:4:1
+XSetDatum D 0:1:4:3 0:1:4:1
+XSetToleranceValue D 0:1:4:1 0.5
+
+
+set c_dname "A"
+set c_dmod "DistanceVariable"
+set c_val "0.5"
+
+
diff --git a/tests/gdt/tolerances/begin b/tests/gdt/tolerances/begin
new file mode 100644 (file)
index 0000000..d7f0fcd
--- /dev/null
@@ -0,0 +1,11 @@
+set c_dmod 0
+set c_dname 0
+set c_val 0
+set c_type 0
+set c_typev 0
+set c_mat 0
+set c_zone 0
+set c_zonev 0
+set c_mod 0
+set c_max 0
+set c_dump 0
\ No newline at end of file
diff --git a/tests/gdt/tolerances/end b/tests/gdt/tolerances/end
new file mode 100644 (file)
index 0000000..f0f980f
--- /dev/null
@@ -0,0 +1,54 @@
+set dmod [XGetDatumModifiers D 0:1:4:2]
+set dname [XGetDatumName D 0:1:4:2]
+set type [XGetTypeOfTolerance D 0:1:4:1]
+set typev [XGetTypeOfToleranceValue D 0:1:4:1]
+set val [XGetToleranceValue D 0:1:4:1]
+set mat [XGetTolMaterialReq D 0:1:4:1]
+set zone [XGetTolZoneMod D 0:1:4:1]
+set zonev [XGetTolZoneModValue D 0:1:4:1]
+set mod [XGetTolModifier  D 0:1:4:1]
+set max [XGetTolMaxValue D  0:1:4:1]
+set dump [XDumpDGTs D all]
+
+  if { $c_dmod != 0 && [string compare $dmod $c_dmod] != 0} {
+   puts "Error wrong datum modif"
+  } else {
+    if { $c_dname !=  0 && [string compare $dname $c_dname] != 0} {
+     puts "Error wrong datum name"
+    } else {
+      if { $c_type !=  0 && [string compare $type $c_type] != 0} {
+       puts "Error wrong type"
+      } else {
+        if { $c_typev !=  0 && [string compare $typev $c_typev] != 0} {
+         puts "Error wrong type of value"
+        } else {
+          if { $c_mat !=  0 && [string compare $mat $c_mat] != 0} {
+           puts "Error wrong mat"
+          } else {
+            if { $c_zone !=  0 && [string compare $zone $c_zone] != 0} {
+             puts "Error wrong zone"
+            } else {
+              if { $c_zonev !=  0 && $zonev != $c_zonev } {
+               puts "Error wrong zome value"
+              } else {
+                if { $c_mod !=  0 && [string compare $mod $c_mod] != 0} {
+                 puts "Error wrong modifiers"
+                } else {
+                  if { $c_max !=  0 && $max != $c_max } {
+                   puts "Error wrong maxvalue"
+                  } else {
+                    if { $c_val !=  0 && $val != $c_val } {
+                     puts "Error wrong value"
+                    } else {
+                      puts "TEST COMPLETED"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+