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