0022885: Bugfix: else clause applies to the wrong if statement because of missing...
[occt.git] / src / IGESData / IGESData_GlobalSection.cxx
1 //#52 rln 06.01.99 writing value 1.e-07
2 //gka 19.01.99 changing size of ParamSet
3 //#65 rln 12.02.99 S4151 (explicitly force YYMMDD.HHMMSS before Y2000 and YYYYMMDD.HHMMSS after Y2000)
4 //#66 rln Setting IGES 5.3 by default
5 //#73 rln 10.03.99 S4135: "read.scale.unit" is applied after translation
6 #include <IGESData_GlobalSection.ixx>
7 #include <Interface_ParamType.hxx>
8 #include <Interface_FloatWriter.hxx>
9 #include <Interface_FileReaderData.hxx>
10 #include <Interface_FileParameter.hxx>
11 #include <OSD_Process.hxx>
12 #include <Quantity_Date.hxx>
13 #include <Interface_Static.hxx>
14 #include <IGESData_BasicEditor.hxx>
15 #include <stdio.h>
16
17 // MGE 21/07/98
18 #include <Message_Msg.hxx>
19
20 #include <UnitsMethods.hxx>
21
22 //  valeurs en MILLIMETRE pardefaut, reajustable
23 //static Standard_Real convunit = 1000.;
24
25
26 //  Routines locales copiant une string [l`ideal serait : astr = astr->Copy()]
27 //    et transformant un CString (Hollerith ou non) en HAsciiString non Holl.
28 //    et l inverse
29
30
31 static void CopyString (Handle(TCollection_HAsciiString)& astr);
32
33 static void MakeHollerith(const Handle(TCollection_HAsciiString)& astr,
34                           char* text, Standard_Integer& lt);
35
36 void CopyString (Handle(TCollection_HAsciiString)& astr)
37 {
38   if (astr.IsNull()) return;   // ne rien faire si String pas definie !
39   Handle(TCollection_HAsciiString) S = new TCollection_HAsciiString("");
40   S->AssignCat(astr);  astr = S;
41 }
42
43 void MakeHollerith(const Handle(TCollection_HAsciiString)& astr,
44    char* text, Standard_Integer& lt)
45 {
46   lt = 0;  text[0] = '\0';
47   if (astr.IsNull()) return;
48   Standard_Integer ln = astr->Length();
49   if (ln == 0) return;
50   sprintf (text,"%dH%s",ln,astr->ToCString());
51   lt = ln+2;  if (ln >= 10) lt ++;  if (ln >= 100) lt ++;    // strlen text
52 }
53
54
55 //=======================================================================
56 //function : IGESData_GlobalSection
57 //purpose  : 
58 //=======================================================================
59
60 IGESData_GlobalSection::IGESData_GlobalSection ()
61 {
62 //  convunit = 1000.;
63   //#73 rln 10.03.99 S4135: "read.scale.unit" is applied after translation
64   //if (Interface_Static::IVal("read.scale.unit") == 1) convunit = 1;
65 }
66
67
68 // pourrait etre une methode generale au package en fait
69 //=======================================================================
70 //function : TranslatedFromHollerith
71 //purpose  : 
72 //=======================================================================
73
74 Handle(TCollection_HAsciiString) IGESData_GlobalSection::TranslatedFromHollerith
75        (const Handle(TCollection_HAsciiString)& astr) const
76 {
77   Handle(TCollection_HAsciiString) res;
78   if (astr.IsNull()) return res;
79   Standard_Integer n = astr->Search("H");
80   if (n > 1) {
81     if (!astr->Token("H")->IsIntegerValue()) n = 0;
82   }
83   if (n > 1 && n < astr->Length()) res = astr->SubString(n+1,astr->Length());
84   else if(astr->ToCString()== NULL)
85     res = new TCollection_HAsciiString;
86   else res = new TCollection_HAsciiString(astr->ToCString());
87   return res;
88 }
89
90
91 //=======================================================================
92 //function : Init
93 //purpose  : 
94 //=======================================================================
95
96 void IGESData_GlobalSection::Init(const Handle(Interface_ParamSet)& params,
97                                   Handle(Interface_Check)& ach)
98 {
99   // MGE 21/07/98
100   // Building of messages
101   //======================================
102   //Message_Msg Msg39 ("XSTEP_39");
103   //Message_Msg Msg48 ("XSTEP_48");
104   //Message_Msg Msg49 ("XSTEP_49");
105   //======================================
106
107   theSeparator = ',';       theEndMark = ';';
108   theSendName.Nullify();    theFileName.Nullify();  theSystemId.Nullify();
109   theInterfaceVersion.Nullify();
110   theIntegerBits       = 32;  // par defaut, simple = entier = 32b, double = 64
111   theMaxPower10Single  =  38;  theMaxDigitsSingle   =  6;
112   theMaxPower10Double  = 308;  theMaxDigitsDouble   = 15;
113   theReceiveName.Nullify();
114   theScale             = 1.0;
115   theUnitFlag          = 0;  theUnitName.Nullify();
116   theLineWeightGrad    = 1;  theMaxLineWeight     = 0.;
117   theDate.Nullify();
118   theResolution        = 0.; theMaxCoord          = 0.; hasMaxCoord = Standard_False;
119   theAuthorName.Nullify();  theCompanyName.Nullify();
120   theIGESVersion       = 11;//3 //#66 rln Setting IGES 5.3 by default(To avoid misleading fails below)
121   theDraftingStandard  = 0;
122   theLastChangeDate.Nullify();  // nouveaute 5.1 (peut etre absente)
123   theAppliProtocol.Nullify();   // nouveaute 5.3 (peut etre absente)
124
125   Standard_Integer nbp = params->NbParams();
126
127   for (Standard_Integer i = 1; i <= nbp; i ++) {
128     Standard_Integer intval = 0;  Standard_Real realval = 0.0;
129     Handle(TCollection_HAsciiString) strval;  // doit repartir a null
130     //char message[80]; //szv#4:S4163:12Mar99 unused
131     Standard_CString    val = params->Param(i).CValue();
132     Interface_ParamType fpt = params->Param(i).ParamType();
133     if (fpt == Interface_ParamVoid) continue;
134     
135     // if the param is an Integer
136     if (fpt == Interface_ParamInteger) {
137        // but a real is expected 
138       if ( i == 13 || i == 17 || i == 19 || i == 20)
139         realval = atof(val);
140       intval  = atoi(val);
141     }
142
143     // if the param is a Real
144     else if (fpt == Interface_ParamReal || fpt == Interface_ParamEnum) {
145       char text[50];
146       Standard_Integer k , j = 0;
147       for (k = 0; k < 50; k ++) {
148         if (val[k] ==  'D' || val[k] == 'd')
149           text[j++] = 'e';
150         else
151           text[j++] = val[k];  
152         if (val[k] == '\0') break;
153       }
154       realval = atof(text);//Interface_FileReaderData::Fastof(val);
155     }
156
157     // if the param is a text
158     else if (fpt == Interface_ParamText) {
159       strval = new TCollection_HAsciiString (val);
160       if (val[0] != '\0') {
161         Standard_Integer nhol = strval->Search("H");
162         Standard_Integer lhol = strval->Length();
163         if (nhol > 1) 
164           if (!strval->Token("H")->IsIntegerValue()) nhol = 0;
165         if (nhol > 1 && nhol < lhol) 
166           strval = strval->SubString(nhol+1,lhol);
167       }
168     }
169
170     char sepend = '\0';
171     if (i < 3) {
172       if (val[0] != '\0') sepend = val[0];
173       if (val[1] == 'H')  sepend = val[2];  // prioritaire
174     }
175
176     switch (i) 
177      {
178       case  1 : if (sepend != '\0') theSeparator = sepend;    break;
179       case  2 : if (sepend != '\0') theEndMark   = sepend;    break;
180       case  3 : theSendName                      = strval;    break;
181       case  4 : theFileName                      = strval;    break;
182       case  5 : theSystemId                      = strval;    break;
183       case  6 : theInterfaceVersion              = strval;    break;
184       case  7 : theIntegerBits                   = intval;    break;
185       case  8 : theMaxPower10Single              = intval;    break;
186       case  9 : theMaxDigitsSingle               = intval;    break;
187       case 10 : theMaxPower10Double              = intval;    break;
188       case 11 : theMaxDigitsDouble               = intval;    break;
189       case 12 : theReceiveName                   = strval;    break;
190       case 13 : theScale                         = realval;   break;
191       case 14 : theUnitFlag                      = intval;    break;
192       case 15 : theUnitName                      = strval;    break;
193       case 16 : theLineWeightGrad                = intval;    break;
194       case 17 : theMaxLineWeight                 = realval;   break;
195       case 18 : theDate                          = strval;    break;
196       case 19 : theResolution                    = realval;   break;
197       case 20 : theMaxCoord                      = realval;
198                 hasMaxCoord                      = Standard_True;  break;
199       case 21 : theAuthorName                    = strval;    break;
200       case 22 : theCompanyName                   = strval;    break;
201       case 23 : theIGESVersion                   = intval;    break;
202       case 24 : theDraftingStandard              = intval;    break;
203       case 25 : theLastChangeDate                = strval;    break;
204       case 26 : theAppliProtocol                 = strval;    break;
205       default : break;
206     }
207   }
208
209   // Sending of message : Incorrect number of parameters (following the IGES version)
210   // Version less than 5.3 
211   if  (theIGESVersion < 11)
212   {
213     if ((nbp < 24) || (nbp > 25)) {
214        // 24 or 25 parameters are expected (parameter 25 is not required)
215       Message_Msg Msg39 ("XSTEP_39");
216       Msg39.Arg(24);
217       Msg39.Arg(25);
218       if (nbp < 24) ach->SendFail(Msg39);
219       else          ach->SendWarning(Msg39);
220     }
221   }
222   // Version 5.3 
223   else if ((nbp < 25) || (nbp > 26)) {
224     // 25 or 26 parameters are expected (parameter 25 is not required)
225     Message_Msg Msg39 ("XSTEP_39");
226     Msg39.Arg(25);
227     Msg39.Arg(26);
228     if (nbp < 25) ach->SendFail(Msg39);
229     else          ach->SendWarning(Msg39);
230   }
231   
232   //:45 by abv 11.12.97: if UnitFlag is not defined in the file, 
233   // restore it from UnitName. Repris par CKY 13-FEV-1998
234   if ( theUnitFlag == 0 || theUnitFlag == 3 ) {
235     Standard_Integer corrected = 0 ;
236     if(theUnitName.IsNull())
237       //default (inches) value taken
238       corrected = 1;
239     else
240       corrected = IGESData_BasicEditor::UnitNameFlag (theUnitName->ToCString());
241     if (corrected > 0) theUnitFlag = corrected;
242     else if (theUnitFlag == 3) {
243       Message_Msg Msg49 ("XSTEP_49");
244       ach->SendWarning (Msg49);
245     }
246     else {
247       Message_Msg Msg48 ("XSTEP_48");
248       ach->SendFail (Msg48);
249     }
250   }
251 }
252
253
254 //=======================================================================
255 //function : CopyRefs
256 //purpose  : 
257 //=======================================================================
258
259 void IGESData_GlobalSection::CopyRefs ()
260 {
261   CopyString(theSendName);   CopyString(theFileName);  CopyString(theSystemId);
262   CopyString(theInterfaceVersion);  CopyString(theReceiveName);
263   CopyString(theUnitName);          CopyString(theDate);
264   CopyString(theAuthorName);        CopyString(theCompanyName);
265   CopyString(theLastChangeDate);    CopyString(theAppliProtocol);
266 }
267
268
269 //=======================================================================
270 //function : Params
271 //purpose  : 
272 //=======================================================================
273
274 Handle(Interface_ParamSet) IGESData_GlobalSection::Params () const
275 {
276   char vide[1];  char uncar[2];  char nombre[20];  char text[200];
277   Standard_Integer lt;
278   vide[0] = uncar[1] = '\0';  uncar[0] = ',';
279   Handle(Interface_ParamSet) res  = new Interface_ParamSet(26);  //gka 19.01.99
280   if (theSeparator == ',') res->Append (vide,0,Interface_ParamVoid,0);
281   else { uncar[0] = theSeparator; res->Append (uncar,1,Interface_ParamMisc,0); }
282
283   if (theEndMark == ';') res->Append (vide,0,Interface_ParamVoid,0);
284   else { uncar[0] = theEndMark; res->Append (uncar,1,Interface_ParamMisc,0); }
285
286   MakeHollerith (theSendName,text,lt);
287   res->Append (text,lt, Interface_ParamText,0);
288
289   MakeHollerith (theFileName,text,lt);
290   res->Append (text,lt, Interface_ParamText,0);
291
292   MakeHollerith (theSystemId,text,lt);
293   res->Append (text,lt, Interface_ParamText,0);
294
295   MakeHollerith (theInterfaceVersion,text,lt);
296   res->Append (text,lt, Interface_ParamText,0);
297
298   sprintf(nombre,"%d",theIntegerBits);
299   res->Append (nombre,strlen(nombre),Interface_ParamInteger,0);
300
301   sprintf(nombre,"%d",theMaxPower10Single);
302   res->Append (nombre,strlen(nombre),Interface_ParamInteger,0);
303
304   sprintf(nombre,"%d",theMaxDigitsSingle);
305   res->Append (nombre,strlen(nombre),Interface_ParamInteger,0);
306
307   sprintf(nombre,"%d",theMaxPower10Double);
308   res->Append (nombre,strlen(nombre),Interface_ParamInteger,0);
309
310   sprintf(nombre,"%d",theMaxDigitsDouble);
311   res->Append (nombre,strlen(nombre),Interface_ParamInteger,0);
312
313   MakeHollerith (theReceiveName,text,lt);
314   res->Append (text,lt, Interface_ParamText,0);
315
316   Interface_FloatWriter::Convert (theScale,nombre,Standard_True,0.,0.,"%f","%f");
317 //  sprintf(nombre,"%f",theScale);
318   res->Append (nombre,strlen(nombre),Interface_ParamReal,0);
319
320   sprintf(nombre,"%d",theUnitFlag);
321   res->Append (nombre,strlen(nombre),Interface_ParamInteger,0);
322
323   MakeHollerith (theUnitName,text,lt);
324   res->Append (text,lt, Interface_ParamText,0);
325
326   sprintf(nombre,"%d",theLineWeightGrad);
327   res->Append (nombre,strlen(nombre),Interface_ParamInteger,0);
328
329   Interface_FloatWriter::Convert (theMaxLineWeight,nombre,Standard_True,0.,0.,"%f","%f");
330 //  sprintf(nombre,"%f",theMaxLineWeight);
331   res->Append (nombre,strlen(nombre),Interface_ParamReal,0);
332
333   MakeHollerith (theDate,text,lt);
334   res->Append (text,lt, Interface_ParamText,0);
335
336   Interface_FloatWriter::Convert (theResolution,nombre,Standard_True,0.,0.,"%g","%g");
337 //  sprintf(nombre,"%f",theResolution);
338   res->Append (nombre,strlen(nombre),Interface_ParamReal,0);
339
340   if (hasMaxCoord)
341     Interface_FloatWriter::Convert (theMaxCoord,nombre,Standard_True,0.,0.,"%f","%f");
342   //  sprintf(nombre,"%f",theMaxCoord);
343   else nombre[0] = '\0';
344   res->Append (nombre,strlen(nombre),Interface_ParamReal,0);
345
346   MakeHollerith (theAuthorName,text,lt);
347   res->Append (text,lt, Interface_ParamText,0);
348
349   MakeHollerith (theCompanyName,text,lt);
350   res->Append (text,lt, Interface_ParamText,0);
351
352   sprintf(nombre,"%d",theIGESVersion);
353   res->Append (nombre,strlen(nombre),Interface_ParamInteger,0);
354
355   sprintf(nombre,"%d",theDraftingStandard);
356   res->Append (nombre,strlen(nombre),Interface_ParamInteger,0);
357
358   if (!theLastChangeDate.IsNull()) {
359     MakeHollerith (theLastChangeDate,text,lt);
360     res->Append (text,lt, Interface_ParamText,0);
361   }
362
363   if (!theAppliProtocol.IsNull()) {
364     MakeHollerith (theAppliProtocol,text,lt);
365     res->Append (text,lt, Interface_ParamText,0);
366   }
367 // Ici : parametre absent ignore
368
369   return res;
370 }
371
372
373 // ###############           QUERIES           ###############
374
375
376 //=======================================================================
377 //function : Separator
378 //purpose  : 
379 //=======================================================================
380
381 Standard_Character IGESData_GlobalSection::Separator () const
382 {
383   return theSeparator;
384 }
385
386
387 //=======================================================================
388 //function : EndMark
389 //purpose  : 
390 //=======================================================================
391
392 Standard_Character IGESData_GlobalSection::EndMark () const
393 {
394   return theEndMark;
395 }
396
397
398 //=======================================================================
399 //function : SendName
400 //purpose  : 
401 //=======================================================================
402
403 Handle(TCollection_HAsciiString) IGESData_GlobalSection::SendName () const
404 {
405   return theSendName;
406 }
407
408
409 //=======================================================================
410 //function : FileName
411 //purpose  : 
412 //=======================================================================
413
414 Handle(TCollection_HAsciiString) IGESData_GlobalSection::FileName () const
415 {
416   return theFileName;
417 }
418
419
420 //=======================================================================
421 //function : SystemId
422 //purpose  : 
423 //=======================================================================
424
425 Handle(TCollection_HAsciiString) IGESData_GlobalSection::SystemId () const
426 {
427   return theSystemId;
428 }
429
430
431 //=======================================================================
432 //function : InterfaceVersion
433 //purpose  : 
434 //=======================================================================
435
436 Handle(TCollection_HAsciiString) IGESData_GlobalSection::InterfaceVersion () const
437 {
438   return theInterfaceVersion;
439 }
440
441
442 //=======================================================================
443 //function : IntegerBits
444 //purpose  : 
445 //=======================================================================
446
447 Standard_Integer IGESData_GlobalSection::IntegerBits () const
448 {
449   return theIntegerBits;
450 }
451
452
453 //=======================================================================
454 //function : MaxPower10Single
455 //purpose  : 
456 //=======================================================================
457
458 Standard_Integer IGESData_GlobalSection::MaxPower10Single () const
459 {
460   return theMaxPower10Single;
461 }
462
463
464 //=======================================================================
465 //function : MaxDigitsSingle
466 //purpose  : 
467 //=======================================================================
468
469 Standard_Integer IGESData_GlobalSection::MaxDigitsSingle () const
470 {
471   return theMaxDigitsSingle;
472 }
473
474
475 //=======================================================================
476 //function : MaxPower10Double
477 //purpose  : 
478 //=======================================================================
479
480 Standard_Integer IGESData_GlobalSection::MaxPower10Double () const
481 {
482   return theMaxPower10Double;
483 }
484
485
486 //=======================================================================
487 //function : MaxDigitsDouble
488 //purpose  : 
489 //=======================================================================
490
491 Standard_Integer IGESData_GlobalSection::MaxDigitsDouble () const
492 {
493   return theMaxDigitsDouble;
494 }
495
496
497 //=======================================================================
498 //function : ReceiveName
499 //purpose  : 
500 //=======================================================================
501
502 Handle(TCollection_HAsciiString) IGESData_GlobalSection::ReceiveName () const
503 {
504   return theReceiveName;
505 }
506
507
508 //=======================================================================
509 //function : Scale
510 //purpose  : 
511 //=======================================================================
512
513 Standard_Real IGESData_GlobalSection::Scale () const
514 {
515   return theScale;
516 }
517
518
519 //=======================================================================
520 //function : UnitFlag
521 //purpose  : 
522 //=======================================================================
523
524 Standard_Integer IGESData_GlobalSection::UnitFlag () const
525 {
526   return theUnitFlag;
527 }
528
529
530 //=======================================================================
531 //function : UnitName
532 //purpose  : 
533 //=======================================================================
534
535 Handle(TCollection_HAsciiString) IGESData_GlobalSection::UnitName () const
536 {
537   return theUnitName;
538 }
539
540
541 //=======================================================================
542 //function : LineWeightGrad
543 //purpose  : 
544 //=======================================================================
545
546 Standard_Integer IGESData_GlobalSection::LineWeightGrad () const
547 {
548   return theLineWeightGrad;
549 }
550
551
552 //=======================================================================
553 //function : MaxLineWeight
554 //purpose  : 
555 //=======================================================================
556
557 Standard_Real IGESData_GlobalSection::MaxLineWeight () const
558 {
559   return theMaxLineWeight;
560 }
561
562
563 //=======================================================================
564 //function : Date
565 //purpose  : 
566 //=======================================================================
567
568 Handle(TCollection_HAsciiString) IGESData_GlobalSection::Date () const
569 {
570   return theDate;
571 }
572
573
574 //=======================================================================
575 //function : Resolution
576 //purpose  : 
577 //=======================================================================
578
579 Standard_Real IGESData_GlobalSection::Resolution () const
580 {
581   return theResolution;
582 }
583
584
585 //=======================================================================
586 //function : MaxCoord
587 //purpose  : 
588 //=======================================================================
589
590 Standard_Real IGESData_GlobalSection::MaxCoord () const
591 {
592   return theMaxCoord;
593 }
594
595
596 //=======================================================================
597 //function : HasMaxCoord
598 //purpose  : 
599 //=======================================================================
600
601 Standard_Boolean IGESData_GlobalSection::HasMaxCoord () const
602 {
603   return hasMaxCoord;
604 }
605
606
607 //=======================================================================
608 //function : AuthorName
609 //purpose  : 
610 //=======================================================================
611
612 Handle(TCollection_HAsciiString) IGESData_GlobalSection::AuthorName () const
613 {
614   return theAuthorName;
615 }
616
617
618 //=======================================================================
619 //function : CompanyName
620 //purpose  : 
621 //=======================================================================
622
623 Handle(TCollection_HAsciiString) IGESData_GlobalSection::CompanyName () const
624 {
625   return theCompanyName;
626 }
627
628
629 //=======================================================================
630 //function : IGESVersion
631 //purpose  : 
632 //=======================================================================
633
634 Standard_Integer IGESData_GlobalSection::IGESVersion () const
635 {
636   return theIGESVersion;
637 }
638
639
640 //=======================================================================
641 //function : DraftingStandard
642 //purpose  : 
643 //=======================================================================
644
645 Standard_Integer IGESData_GlobalSection::DraftingStandard () const
646 {
647   return theDraftingStandard;
648 }
649
650
651 //=======================================================================
652 //function : LastChangeDate
653 //purpose  : 
654 //=======================================================================
655
656 Handle(TCollection_HAsciiString) IGESData_GlobalSection::LastChangeDate () const
657 {
658   return theLastChangeDate;
659 }
660
661
662 //=======================================================================
663 //function : HasLastChangeDate
664 //purpose  : 
665 //=======================================================================
666
667 Standard_Boolean IGESData_GlobalSection::HasLastChangeDate () const
668 {
669   return (!theLastChangeDate.IsNull());
670 }
671
672
673 //=======================================================================
674 //function : SetLastChangeDate
675 //purpose  : 
676 //=======================================================================
677
678 void IGESData_GlobalSection::SetLastChangeDate ()
679 {
680   if (HasLastChangeDate()) return;
681   Standard_Integer mois,jour,annee,heure,minute,seconde,millisec,microsec;
682   OSD_Process system;
683   Quantity_Date ladate = system.SystemDate();
684   ladate.Values (mois,jour,annee,heure,minute,seconde,millisec,microsec);
685   if (annee < 2000)
686     //#65 rln 12.02.99 S4151 (explicitly force YYMMDD.HHMMSS before Y2000)
687     theLastChangeDate = NewDateString (annee,mois,jour,heure,minute,seconde,0);
688   else 
689     //#65 rln 12.02.99 S4151 (explicitly force YYYYMMDD.HHMMSS after Y2000)
690     theLastChangeDate = NewDateString (annee,mois,jour,heure,minute,seconde, -1);
691 }
692
693
694 //=======================================================================
695 //function : HasApplicationProtocol
696 //purpose  : 
697 //=======================================================================
698
699 Standard_Boolean IGESData_GlobalSection::HasApplicationProtocol () const
700 {
701   return !theAppliProtocol.IsNull();
702 }
703
704
705 //=======================================================================
706 //function : ApplicationProtocol
707 //purpose  : 
708 //=======================================================================
709
710 Handle(TCollection_HAsciiString) IGESData_GlobalSection::ApplicationProtocol () const
711 {
712   return theAppliProtocol;
713 }
714
715
716 //=======================================================================
717 //function : NewDateString
718 //purpose  : 
719 //=======================================================================
720
721 Handle(TCollection_HAsciiString) IGESData_GlobalSection::NewDateString
722        (const Standard_Integer annee, const Standard_Integer mois,
723         const Standard_Integer jour, const Standard_Integer heure,
724         const Standard_Integer minute, const Standard_Integer seconde,
725         const Standard_Integer mode)
726 {
727 //  0 : IGES annee a l ancienne 00-99    -1 IGES annee complete    1 lisible
728   char madate[60];
729   Standard_Integer moi  = mois  , jou   = jour   , anne   = annee;
730   Standard_Integer heur = heure , minut = minute , second = seconde;
731   if (annee == 0) {
732     Standard_Integer millisec,microsec;
733     OSD_Process system;
734     Quantity_Date ladate = system.SystemDate();
735     ladate.Values (moi,jou,anne,heur,minut,second,millisec,microsec);
736   }
737   if (mode == 0 || mode == -1) {
738     Standard_Integer an = anne % 100;
739     Standard_Boolean dizaine = (an >= 10);
740     if (!dizaine) an += 10;
741     if (mode < 0) { an = anne; dizaine = Standard_True; }
742     Standard_Integer date1 = (an)         * 10000 + moi   * 100 + jou;
743     Standard_Integer date2 = (heur + 100) * 10000 + minut * 100 + second;
744     sprintf (madate,"%d%d",date1,date2);
745     madate[(mode == 0 ? 6: 8)] = '.';
746     if (!dizaine) madate[0] = '0';
747   } else if (mode == 1) {
748     sprintf (madate,"%4.4d-%2.2d-%2.2d:%2.2d-%2.2d-%2.2d",
749              anne,moi,jou,heur,minut,second);
750   }
751   return new TCollection_HAsciiString(madate);
752 }
753
754
755 //=======================================================================
756 //function : NewDateString
757 //purpose  : 
758 //=======================================================================
759
760 Handle(TCollection_HAsciiString) IGESData_GlobalSection::NewDateString
761        (const Handle(TCollection_HAsciiString)& date, const Standard_Integer mode)
762 {
763   Standard_Integer anne,moi,jou,heur,minut,second;
764   if (date.IsNull()) return date;
765   Standard_Integer i0 = 0;
766   if (date->Length() == 15) i0 = 2;
767   else if (date->Length() != 13) return date;
768   if (date->Value(i0+7) != '.') return date;
769   anne   = (date->Value(i0+ 1) - 48) * 10 + (date->Value(i0+ 2) - 48);
770   if (i0 == 0) {
771     anne = anne + 1900;
772     if (anne < 1980) anne += 100;
773   } else {
774     anne = anne + (date->Value(1) - 48) *1000 + (date->Value(2) - 48) * 100;
775   }
776   moi    = (date->Value(i0+ 3) - 48) * 10 + (date->Value(i0+ 4) - 48);
777   jou    = (date->Value(i0+ 5) - 48) * 10 + (date->Value(i0+ 6) - 48);
778   heur   = (date->Value(i0+ 8) - 48) * 10 + (date->Value(i0+ 9) - 48);
779   minut  = (date->Value(i0+10) - 48) * 10 + (date->Value(i0+11) - 48);
780   second = (date->Value(i0+12) - 48) * 10 + (date->Value(i0+13) - 48);
781
782   return IGESData_GlobalSection::NewDateString (anne,moi,jou,heur,minut,second,mode);
783 }
784
785
786 //=======================================================================
787 //function : UnitValue
788 //purpose  : 
789 //=======================================================================
790
791 Standard_Real IGESData_GlobalSection::UnitValue () const
792 {
793   return UnitsMethods::GetLengthFactorValue ( theUnitFlag ) /
794          UnitsMethods::GetCasCadeLengthUnit(); //abv 22 Feb 00: adding cascade unit factor
795 }
796
797
798 // ###############           UPDATES           ###############
799
800     void  IGESData_GlobalSection::SetSeparator   (const Standard_Character val)
801       {  theSeparator = val;  }
802
803     void  IGESData_GlobalSection::SetEndMark     (const Standard_Character val)
804       {  theEndMark = val;  }
805
806     void  IGESData_GlobalSection::SetSendName (const Handle(TCollection_HAsciiString)& val)
807       {  theSendName = TranslatedFromHollerith(val);  }
808
809     void  IGESData_GlobalSection::SetFileName (const Handle(TCollection_HAsciiString)& val)
810       {  theFileName = TranslatedFromHollerith(val);  }
811
812     void  IGESData_GlobalSection::SetSystemId    (const Handle(TCollection_HAsciiString)& val)
813       {  theSystemId = TranslatedFromHollerith(val);  }
814
815     void  IGESData_GlobalSection::SetInterfaceVersion (const Handle(TCollection_HAsciiString)& val)
816       {  theInterfaceVersion = TranslatedFromHollerith(val);  }
817
818     void  IGESData_GlobalSection::SetIntegerBits (const Standard_Integer val)
819       {  theIntegerBits = val;  }
820
821     void  IGESData_GlobalSection::SetMaxPower10Single (const Standard_Integer val)
822       {  theMaxPower10Single = val;  }
823
824     void  IGESData_GlobalSection::SetMaxDigitsSingle (const Standard_Integer val)
825       {  theMaxDigitsSingle = val;  }
826
827     void  IGESData_GlobalSection::SetMaxPower10Double (const Standard_Integer val)
828       {  theMaxPower10Double = val;  }
829
830     void  IGESData_GlobalSection::SetMaxDigitsDouble (const Standard_Integer val)
831       {  theMaxDigitsDouble = val;  }
832
833     void  IGESData_GlobalSection::SetReceiveName (const Handle(TCollection_HAsciiString)& val)
834       {  theReceiveName = TranslatedFromHollerith(val);  }
835
836     void  IGESData_GlobalSection::SetScale       (const Standard_Real val)
837       {  theScale = val;  }
838
839     void  IGESData_GlobalSection::SetUnitFlag    (const Standard_Integer val)
840       {  theUnitFlag = val;  }
841
842     void  IGESData_GlobalSection::SetUnitName (const Handle(TCollection_HAsciiString)& val)
843       {  theUnitName = TranslatedFromHollerith(val);  }
844
845     void  IGESData_GlobalSection::SetLineWeightGrad (const Standard_Integer val)
846       {  theLineWeightGrad = val;  }
847
848     void  IGESData_GlobalSection::SetMaxLineWeight (const Standard_Real val)
849       {  theMaxLineWeight = val;  }
850
851     void  IGESData_GlobalSection::SetDate (const Handle(TCollection_HAsciiString)& val)
852       {  theDate = TranslatedFromHollerith(val);  }
853
854     void  IGESData_GlobalSection::SetResolution  (const Standard_Real val)
855       {  theResolution = val;  }
856
857     void  IGESData_GlobalSection::SetMaxCoord    (const Standard_Real val)
858 {
859   hasMaxCoord = (val > 0.);
860   theMaxCoord = (hasMaxCoord ? val : 0.);
861 }
862
863     void  IGESData_GlobalSection::MaxMaxCoord    (const Standard_Real val)
864 {
865   Standard_Real aval = Abs(val);
866   if (hasMaxCoord)  {  if (aval > theMaxCoord) theMaxCoord = aval;  }
867   else SetMaxCoord (aval);
868 }
869
870     void  IGESData_GlobalSection::MaxMaxCoords   (const gp_XYZ& xyz)
871 {  MaxMaxCoord (xyz.X());  MaxMaxCoord (xyz.Y());  MaxMaxCoord (xyz.Z());  }
872
873
874     void  IGESData_GlobalSection::SetAuthorName (const Handle(TCollection_HAsciiString)& val)
875       {  theAuthorName = TranslatedFromHollerith(val);  }
876
877     void  IGESData_GlobalSection::SetCompanyName (const Handle(TCollection_HAsciiString)& val)
878       {  theCompanyName = TranslatedFromHollerith(val);  }
879
880     void  IGESData_GlobalSection::SetIGESVersion (const Standard_Integer val)
881       {  theIGESVersion = val;  }
882
883     void  IGESData_GlobalSection::SetDraftingStandard (const Standard_Integer val)
884       {  theDraftingStandard = val;  }
885
886     void  IGESData_GlobalSection::SetLastChangeDate (const Handle(TCollection_HAsciiString)& val)
887       {  theLastChangeDate = TranslatedFromHollerith(val);  }
888
889     void  IGESData_GlobalSection::SetApplicationProtocol (const Handle(TCollection_HAsciiString)& val)
890       {  theAppliProtocol = TranslatedFromHollerith(val);  }