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