0026689: Necessary to improve STEPCAFControl_Reader to read GD&T data from STEP model...
[occt.git] / src / STEPConstruct / STEPConstruct_GDTProperty.cxx
1 // Created on: 1999-09-09
2 // Created by: Andrey BETENEV
3 // Copyright (c) 1999-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <STEPConstruct_GDTProperty.hxx>
18 #include <StepRepr_DescriptiveRepresentationItem.hxx>
19    
20 //=======================================================================
21 //function : STEPConstruct_GDTProperty
22 //purpose  : 
23 //=======================================================================
24
25 STEPConstruct_GDTProperty::STEPConstruct_GDTProperty ()
26 {
27 }
28
29 //=======================================================================
30 //function : getDimModifiers
31 //purpose  : 
32 //=======================================================================
33 void STEPConstruct_GDTProperty::GetDimModifiers(const Handle(StepRepr_CompoundRepresentationItem)& theCRI,
34                             XCAFDimTolObjects_DimensionModifiersSequence& theModifiers)
35 {
36   for (Standard_Integer l = 1; l <= theCRI->ItemElement()->Length(); l++)
37   {
38     Handle(StepRepr_DescriptiveRepresentationItem) aDRI =
39       Handle(StepRepr_DescriptiveRepresentationItem)::DownCast(theCRI->ItemElement()->Value(l));
40     if(aDRI.IsNull()) continue;
41     XCAFDimTolObjects_DimensionModif aModifier = XCAFDimTolObjects_DimensionModif_ControlledRadius;
42     const TCollection_AsciiString aModifStr = aDRI->Description()->String();
43     Standard_Boolean aFound = Standard_False;
44     if(aModifStr.IsEqual("controlled radius"))
45     {
46       aFound = Standard_True;
47       aModifier = XCAFDimTolObjects_DimensionModif_ControlledRadius;
48     }
49     else if(aModifStr.IsEqual("square"))
50     {
51       aFound = Standard_True;
52       aModifier = XCAFDimTolObjects_DimensionModif_Square;
53     }
54     else if(aModifStr.IsEqual("statistical"))
55     {
56       aFound = Standard_True;
57       aModifier = XCAFDimTolObjects_DimensionModif_StatisticalTolerance;
58     }
59     else if(aModifStr.IsEqual("continuous feature"))
60     {
61       aFound = Standard_True;
62       aModifier = XCAFDimTolObjects_DimensionModif_ContinuousFeature;
63     }
64     else if(aModifStr.IsEqual("two point size"))
65     {
66       aFound = Standard_True;
67       aModifier = XCAFDimTolObjects_DimensionModif_TwoPointSize;
68     }
69     else if(aModifStr.IsEqual("local size defined by a sphere"))
70     {
71       aFound = Standard_True;
72       aModifier = XCAFDimTolObjects_DimensionModif_LocalSizeDefinedBySphere;
73     }
74     else if(aModifStr.IsEqual("least squares association criteria"))
75     {
76       aFound = Standard_True;
77       aModifier = XCAFDimTolObjects_DimensionModif_LeastSquaresAssociationCriterion;
78     }
79     else if(aModifStr.IsEqual("maximum inscribed association criteria"))
80     {
81       aFound = Standard_True;
82       aModifier = XCAFDimTolObjects_DimensionModif_MaximumInscribedAssociation;
83     }
84     else if(aModifStr.IsEqual("minimum circumscribed association criteria"))
85     {
86       aFound = Standard_True;
87       aModifier = XCAFDimTolObjects_DimensionModif_MinimumCircumscribedAssociation;
88     }
89     else if(aModifStr.IsEqual("circumference diameter calculated size"))
90     {
91       aFound = Standard_True;
92       aModifier = XCAFDimTolObjects_DimensionModif_CircumferenceDiameter;
93     }
94     else if(aModifStr.IsEqual("area diameter calculated size"))
95     {
96       aFound = Standard_True;
97       aModifier = XCAFDimTolObjects_DimensionModif_AreaDiameter;
98     }
99     else if(aModifStr.IsEqual("volume diameter calculated size"))
100     {
101       aFound = Standard_True;
102       aModifier = XCAFDimTolObjects_DimensionModif_VolumeDiameter;
103     }
104     else if(aModifStr.IsEqual("maximum rank order size"))
105     {
106       aFound = Standard_True;
107       aModifier = XCAFDimTolObjects_DimensionModif_MaximumSize;
108     }
109     else if(aModifStr.IsEqual("minimum rank order size"))
110     {
111       aFound = Standard_True;
112       aModifier = XCAFDimTolObjects_DimensionModif_MinimumSize;
113     }
114     else if(aModifStr.IsEqual("average rank order size"))
115     {
116       aFound = Standard_True;
117       aModifier = XCAFDimTolObjects_DimensionModif_AverageSize;
118     }
119     else if(aModifStr.IsEqual("median rank order size"))
120     {
121       aFound = Standard_True;
122       aModifier = XCAFDimTolObjects_DimensionModif_MedianSize;
123     }
124     else if(aModifStr.IsEqual("mid range rank order size"))
125     {
126       aFound = Standard_True;
127       aModifier = XCAFDimTolObjects_DimensionModif_MidRangeSize;
128     }
129     else if(aModifStr.IsEqual("range rank order size"))
130     {
131       aFound = Standard_True;
132       aModifier = XCAFDimTolObjects_DimensionModif_RangeOfSizes;
133     }
134     else if(aModifStr.IsEqual("any part of the feature"))
135     {
136       aFound = Standard_True;
137       aModifier = XCAFDimTolObjects_DimensionModif_AnyRestrictedPortionOfFeature;
138     }
139     else if(aModifStr.IsEqual("any cross section"))
140     {
141       aFound = Standard_True;
142       aModifier = XCAFDimTolObjects_DimensionModif_AnyCrossSection;
143     }
144     else if(aModifStr.IsEqual("specific fixed cross section"))
145     {
146       aFound = Standard_True;
147       aModifier = XCAFDimTolObjects_DimensionModif_SpecificFixedCrossSection;
148     }           
149     else if(aModifStr.IsEqual("common tolerance"))
150     {
151       aFound = Standard_True;
152       aModifier = XCAFDimTolObjects_DimensionModif_CommonTolerance;
153     }             
154     else if(aModifStr.IsEqual("free state condition"))
155     {
156       aFound = Standard_True;
157       aModifier = XCAFDimTolObjects_DimensionModif_FreeStateCondition;
158     }
159     if (aFound)
160       theModifiers.Append(aModifier);
161   }
162 }
163
164 //=======================================================================
165 //function : getClassOfTolerance
166 //purpose  : 
167 //=======================================================================
168 void STEPConstruct_GDTProperty::GetDimClassOfTolerance(const Handle(StepShape_LimitsAndFits)& theLAF,
169                                    Standard_Boolean theHolle,
170                                    XCAFDimTolObjects_DimensionFormVariance theFV,
171                                    XCAFDimTolObjects_DimensionGrade theG)
172 {
173   Handle(TCollection_HAsciiString) aFormV = theLAF->FormVariance();
174   Handle(TCollection_HAsciiString) aGrade = theLAF->Grade();
175   theFV = XCAFDimTolObjects_DimensionFormVariance_None;
176   Standard_Boolean aFound;
177   theHolle = Standard_False;
178   //it is not verified information
179   for(Standard_Integer c = 0; c <= 1; c++)
180   {
181     aFound = Standard_False;
182     Standard_Boolean aCaseSens = Standard_False;
183     if (c == 1)
184       aCaseSens = Standard_True;
185     Handle(TCollection_HAsciiString) aStr = new TCollection_HAsciiString("a");
186     if(aFormV->IsSameString(aStr, aCaseSens))
187     {
188       aFound = Standard_True;
189       theFV = XCAFDimTolObjects_DimensionFormVariance_A;
190       continue;
191     }
192     aStr = new TCollection_HAsciiString("b");
193     if(aFormV->IsSameString(aStr, aCaseSens))
194     {
195       aFound = Standard_True;
196       theFV = XCAFDimTolObjects_DimensionFormVariance_B;
197       continue;
198     }
199     aStr = new TCollection_HAsciiString("c");
200     if(aFormV->IsSameString(aStr, aCaseSens))
201     {
202       aFound = Standard_True;
203       theFV = XCAFDimTolObjects_DimensionFormVariance_C;
204       continue;
205     }
206     aStr = new TCollection_HAsciiString("cd");
207     if(aFormV->IsSameString(aStr, aCaseSens))
208     {
209       aFound = Standard_True;
210       theFV = XCAFDimTolObjects_DimensionFormVariance_CD;
211       continue;
212     }
213     aStr = new TCollection_HAsciiString("d");
214     if(aFormV->IsSameString(aStr, aCaseSens))
215     {
216       aFound = Standard_True;
217       theFV = XCAFDimTolObjects_DimensionFormVariance_D;
218       continue;
219     }
220     aStr = new TCollection_HAsciiString("e");
221     if(aFormV->IsSameString(aStr, aCaseSens))
222     {
223       aFound = Standard_True;
224       theFV = XCAFDimTolObjects_DimensionFormVariance_E;
225       continue;
226     }
227     aStr = new TCollection_HAsciiString("ef");
228     if(aFormV->IsSameString(aStr, aCaseSens))
229     {
230       aFound = Standard_True;
231       theFV = XCAFDimTolObjects_DimensionFormVariance_EF;
232       continue;
233     }
234     aStr = new TCollection_HAsciiString("f");
235     if(aFormV->IsSameString(aStr, aCaseSens))
236     {
237       aFound = Standard_True;
238       theFV = XCAFDimTolObjects_DimensionFormVariance_F;
239       continue;
240     }
241     aStr = new TCollection_HAsciiString("fg");
242     if(aFormV->IsSameString(aStr, aCaseSens))
243     {
244       aFound = Standard_True;
245       theFV = XCAFDimTolObjects_DimensionFormVariance_FG;
246       continue;
247     }
248     aStr = new TCollection_HAsciiString("g");
249     if(aFormV->IsSameString(aStr, aCaseSens))
250     {
251       aFound = Standard_True;
252       theFV = XCAFDimTolObjects_DimensionFormVariance_G;
253       continue;
254     }
255     aStr = new TCollection_HAsciiString("h");
256     if(aFormV->IsSameString(aStr, aCaseSens))
257     {
258       aFound = Standard_True;
259       theFV = XCAFDimTolObjects_DimensionFormVariance_H;
260       continue;
261     }
262     aStr = new TCollection_HAsciiString("js");
263     if(aFormV->IsSameString(aStr, aCaseSens))
264     {
265       aFound = Standard_True;
266       theFV = XCAFDimTolObjects_DimensionFormVariance_JS;
267       continue;
268     }
269     aStr = new TCollection_HAsciiString("k");
270     if(aFormV->IsSameString(aStr, aCaseSens))
271     {
272       aFound = Standard_True;
273       theFV = XCAFDimTolObjects_DimensionFormVariance_K;
274       continue;
275     }
276     aStr = new TCollection_HAsciiString("m");
277     if(aFormV->IsSameString(aStr, aCaseSens))
278     {
279       aFound = Standard_True;
280       theFV = XCAFDimTolObjects_DimensionFormVariance_M;
281       continue;
282     }
283     aStr = new TCollection_HAsciiString("n");
284     if(aFormV->IsSameString(aStr, aCaseSens))
285     {
286       aFound = Standard_True;
287       theFV = XCAFDimTolObjects_DimensionFormVariance_N;
288       continue;
289     }
290     aStr = new TCollection_HAsciiString("p");
291     if(aFormV->IsSameString(aStr, aCaseSens))
292     {
293       aFound = Standard_True;
294       theFV = XCAFDimTolObjects_DimensionFormVariance_P;
295       continue;
296     }
297     aStr = new TCollection_HAsciiString("r");
298     if(aFormV->IsSameString(aStr, aCaseSens))
299     {
300       aFound = Standard_True;
301       theFV = XCAFDimTolObjects_DimensionFormVariance_R;
302       continue;
303     }
304     aStr = new TCollection_HAsciiString("s");
305     if(aFormV->IsSameString(aStr, aCaseSens))
306     {
307       aFound = Standard_True;
308       theFV = XCAFDimTolObjects_DimensionFormVariance_S;
309       continue;
310     }
311     aStr = new TCollection_HAsciiString("t");
312     if(aFormV->IsSameString(aStr, aCaseSens))
313     {
314       aFound = Standard_True;
315       theFV = XCAFDimTolObjects_DimensionFormVariance_T;
316       continue;
317     }
318     aStr = new TCollection_HAsciiString("u");
319     if(aFormV->IsSameString(aStr, aCaseSens))
320     {
321       aFound = Standard_True;
322       theFV = XCAFDimTolObjects_DimensionFormVariance_U;
323       continue;
324     }
325     aStr = new TCollection_HAsciiString("v");
326     if(aFormV->IsSameString(aStr, aCaseSens))
327     {
328       aFound = Standard_True;
329       theFV = XCAFDimTolObjects_DimensionFormVariance_V;
330       continue;
331     }
332     aStr = new TCollection_HAsciiString("x");
333     if(aFormV->IsSameString(aStr, aCaseSens))
334     {
335       aFound = Standard_True;
336       theFV = XCAFDimTolObjects_DimensionFormVariance_X;
337       continue;
338     }
339     aStr = new TCollection_HAsciiString("y");
340     if(aFormV->IsSameString(aStr, aCaseSens))
341     {
342       aFound = Standard_True;
343       theFV = XCAFDimTolObjects_DimensionFormVariance_Y;
344       continue;
345     }
346     aStr = new TCollection_HAsciiString("b");
347     if(aFormV->IsSameString(aStr, aCaseSens))
348     {
349       aFound = Standard_True;
350       theFV = XCAFDimTolObjects_DimensionFormVariance_B;
351       continue;
352     }
353     aStr = new TCollection_HAsciiString("z");
354     if(aFormV->IsSameString(aStr, aCaseSens))
355     {
356       aFound = Standard_True;
357       theFV = XCAFDimTolObjects_DimensionFormVariance_Z;
358       continue;
359     }
360     aStr = new TCollection_HAsciiString("za");
361     if(aFormV->IsSameString(aStr, aCaseSens))
362     {
363       aFound = Standard_True;
364       theFV = XCAFDimTolObjects_DimensionFormVariance_ZA;
365       continue;
366     }
367     aStr = new TCollection_HAsciiString("zb");
368     if(aFormV->IsSameString(aStr, aCaseSens))
369     {
370       aFound = Standard_True;
371       theFV = XCAFDimTolObjects_DimensionFormVariance_ZB;
372       continue;
373     }
374     aStr = new TCollection_HAsciiString("zc");
375     if(aFormV->IsSameString(aStr, aCaseSens))
376     {
377       aFound = Standard_True;
378       theFV = XCAFDimTolObjects_DimensionFormVariance_ZC;
379       continue;
380     }
381
382     if (c == 1 && !aFound)
383       theHolle = Standard_True;
384   }
385   Handle(TCollection_HAsciiString) aStr = new TCollection_HAsciiString("01");
386   if(aGrade->IsSameString(aStr))
387   {
388     theG = XCAFDimTolObjects_DimensionGrade_IT01;
389   }
390   else
391   {
392     theG = (XCAFDimTolObjects_DimensionGrade)(aGrade->IntegerValue()+1);
393   }
394 }
395
396 //=======================================================================
397 //function : getDimType
398 //purpose  : 
399 //=======================================================================
400 Standard_Boolean STEPConstruct_GDTProperty::GetDimType(const Handle(TCollection_HAsciiString)& theName,
401                        XCAFDimTolObjects_DimensionType& theType)
402 {
403     TCollection_AsciiString aName = theName->String();
404     aName.LowerCase();
405     theType = XCAFDimTolObjects_DimensionType_Location_None;
406     if(aName.IsEqual("curve length"))
407     {
408       theType = XCAFDimTolObjects_DimensionType_Size_CurveLength;
409     }
410     else if(aName.IsEqual("diameter"))
411     {
412       theType = XCAFDimTolObjects_DimensionType_Size_Diameter;
413     }
414     else if(aName.IsEqual("spherical diameter"))
415     {
416       theType = XCAFDimTolObjects_DimensionType_Size_SphericalDiameter;
417     }
418     else if(aName.IsEqual("radius"))
419     {
420       theType = XCAFDimTolObjects_DimensionType_Size_Radius;
421     }
422     else if(aName.IsEqual("spherical radius"))
423     {
424       theType = XCAFDimTolObjects_DimensionType_Size_SphericalRadius;
425     }
426     else if(aName.IsEqual("toroidal minor diameter"))
427     {
428       theType = XCAFDimTolObjects_DimensionType_Size_ToroidalMinorDiameter;
429     }
430     else if(aName.IsEqual("toroidal major diameter"))
431     {
432       theType = XCAFDimTolObjects_DimensionType_Size_ToroidalMajorDiameter;
433     }
434     else if(aName.IsEqual("toroidal minor radius"))
435     {
436       theType = XCAFDimTolObjects_DimensionType_Size_ToroidalMinorRadius;
437     }
438     else if(aName.IsEqual("toroidal major radius"))
439     {
440       theType = XCAFDimTolObjects_DimensionType_Size_ToroidalMajorRadius;
441     }
442     else if(aName.IsEqual("toroidal high major diameter"))
443     {
444       theType = XCAFDimTolObjects_DimensionType_Size_ToroidalHighMajorDiameter;
445     }
446     else if(aName.IsEqual("toroidal low major diameter"))
447     {
448       theType = XCAFDimTolObjects_DimensionType_Size_ToroidalLowMajorDiameter;
449     }
450     else if(aName.IsEqual("toroidal high major radius"))
451     {
452       theType = XCAFDimTolObjects_DimensionType_Size_ToroidalHighMajorRadius;
453     }
454     else if(aName.IsEqual("toroidal low major radius"))
455     {
456       theType = XCAFDimTolObjects_DimensionType_Size_ToroidalLowMajorRadius;
457     }
458     else if(aName.IsEqual("thickness"))
459     {
460       theType = XCAFDimTolObjects_DimensionType_Size_Thickness;
461     }
462     else if(aName.IsEqual("curved distance"))
463     {
464       theType = XCAFDimTolObjects_DimensionType_Location_CurvedDistance;
465     }
466     else if(aName.IsEqual("linear distance"))
467     {
468       theType = XCAFDimTolObjects_DimensionType_Location_LinearDistance;
469     }
470     else if(aName.IsEqual("linear distance centre outer"))
471     {
472       theType = XCAFDimTolObjects_DimensionType_Location_LinearDistance_FromCenterToOuter;
473     }
474     else if(aName.IsEqual("linear distance centre inner"))
475     {
476       theType = XCAFDimTolObjects_DimensionType_Location_LinearDistance_FromCenterToInner;
477     }
478     else if(aName.IsEqual("linear distance outer centre"))
479     {
480       theType = XCAFDimTolObjects_DimensionType_Location_LinearDistance_FromOuterToCenter;
481     }
482     else if(aName.IsEqual("linear distance outer outer"))
483     {
484       theType = XCAFDimTolObjects_DimensionType_Location_LinearDistance_FromOuterToOuter;
485     }
486     else if(aName.IsEqual("linear distance outer inner"))
487     {
488       theType = XCAFDimTolObjects_DimensionType_Location_LinearDistance_FromOuterToInner;
489     }
490     else if(aName.IsEqual("linear distance inner centre"))
491     {
492       theType = XCAFDimTolObjects_DimensionType_Location_LinearDistance_FromInnerToCenter;
493     }
494     else if(aName.IsEqual("linear distance inner outer"))
495     {
496       theType = XCAFDimTolObjects_DimensionType_Location_LinearDistance_FromInnerToOuter;
497     }
498     else if(aName.IsEqual("linear distance inner inner"))
499     {
500       theType = XCAFDimTolObjects_DimensionType_Location_LinearDistance_FromInnerToInner;
501     }
502
503     if(theType != XCAFDimTolObjects_DimensionType_Location_None)
504     {
505       return Standard_True;
506     }
507     return Standard_False;
508 }
509
510
511 //=======================================================================
512 //function : DatumTargetType
513 //purpose  : 
514 //=======================================================================
515 Standard_Boolean STEPConstruct_GDTProperty::GetDatumTargetType(const Handle(TCollection_HAsciiString)& theDescription,
516                        XCAFDimTolObjects_DatumTargetType& theType)
517 {
518     TCollection_AsciiString aName = theDescription->String();
519     aName.LowerCase();
520     if(aName.IsEqual("area"))
521     {
522       theType = XCAFDimTolObjects_DatumTargetType_Area;
523       return Standard_True;
524     }
525     else if(aName.IsEqual("line"))
526     {
527       theType = XCAFDimTolObjects_DatumTargetType_Line;
528       return Standard_True;
529     }
530     else if(aName.IsEqual("circle"))
531     {
532       theType = XCAFDimTolObjects_DatumTargetType_Circle;
533       return Standard_True;
534     }
535     else if(aName.IsEqual("rectangle"))
536     {
537       theType = XCAFDimTolObjects_DatumTargetType_Rectangle;
538       return Standard_True;
539     }
540     else if(aName.IsEqual("point"))
541     {
542       theType = XCAFDimTolObjects_DatumTargetType_Point;
543       return Standard_True;
544     }
545     return Standard_False;
546 }
547
548 //=======================================================================
549 //function : GetDimQualifierType
550 //purpose  : 
551 //=======================================================================
552 Standard_Boolean STEPConstruct_GDTProperty::GetDimQualifierType(const Handle(TCollection_HAsciiString)& theDescription,
553                        XCAFDimTolObjects_DimensionQualifier& theType)
554 {
555     TCollection_AsciiString aName = theDescription->String();
556     aName.LowerCase();
557     theType = XCAFDimTolObjects_DimensionQualifier_None;
558     if(aName.IsEqual("maximum"))
559     {
560       theType = XCAFDimTolObjects_DimensionQualifier_Max;
561     }
562     else if(aName.IsEqual("minimum"))
563     {
564       theType = XCAFDimTolObjects_DimensionQualifier_Min;
565     }
566     else if(aName.IsEqual("average"))
567     {
568       theType = XCAFDimTolObjects_DimensionQualifier_Avg;
569     }
570     if(theType != XCAFDimTolObjects_DimensionQualifier_None)
571     {
572       return Standard_True;
573     }
574     return Standard_False;
575 }
576
577 //=======================================================================
578 //function : GetTolValueType
579 //purpose  : 
580 //=======================================================================
581 Standard_Boolean STEPConstruct_GDTProperty::GetTolValueType(const Handle(TCollection_HAsciiString)& theDescription,
582                        XCAFDimTolObjects_GeomToleranceTypeValue& theType)
583 {
584     TCollection_AsciiString aName = theDescription->String();
585     aName.LowerCase();
586     theType = XCAFDimTolObjects_GeomToleranceTypeValue_None;
587     if(aName.IsEqual("cylindrical or circular"))
588     {
589       theType = XCAFDimTolObjects_GeomToleranceTypeValue_Diameter;
590     }
591     else if(aName.IsEqual("spherical"))
592     {
593       theType = XCAFDimTolObjects_GeomToleranceTypeValue_SphericalDiameter;
594     }
595     if(theType != XCAFDimTolObjects_GeomToleranceTypeValue_None)
596     {
597       return Standard_True;
598     }
599     return Standard_False;
600 }