1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
16 #include <OSD_Environment.hxx>
17 #include <Resource_Manager.hxx>
18 #include <Standard_NoSuchObject.hxx>
19 #include <TCollection_AsciiString.hxx>
21 #include <Units_Dimensions.hxx>
22 #include <Units_Quantity.hxx>
23 #include <Units_Unit.hxx>
24 #include <Units_UnitsSystem.hxx>
25 #include <UnitsAPI.hxx>
27 static Handle(Resource_Manager) CurrentUnits,SICurrentUnits,MDTVCurrentUnits;
28 static Units_UnitsSystem LocalSystemUnits,SILocalSystemUnits,MDTVLocalSystemUnits;
29 static TCollection_AsciiString rstring;
30 static UnitsAPI_SystemUnits localSystem = UnitsAPI_SI;
31 static UnitsAPI_SystemUnits currentSystem = UnitsAPI_DEFAULT;
32 static OSD_Environment env1("CSF_UnitsLexicon");
33 static OSD_Environment env2("CSF_UnitsDefinition");
35 static OSD_Environment env3("CSF_CurrentUnits");
36 static OSD_Environment env4("CSF_MDTVCurrentUnits");
40 //=======================================================================
41 //function : CheckLoading
43 //=======================================================================
45 void UnitsAPI::CheckLoading (const UnitsAPI_SystemUnits aSystemUnits)
47 if( currentSystem != aSystemUnits || CurrentUnits.IsNull()) {
48 TCollection_AsciiString slexiconfile(env1.Value());
49 if( slexiconfile.Length() > 0 )
50 Units::LexiconFile(slexiconfile.ToCString());
52 OSD_Environment CasRootEnv("CASROOT");
53 TCollection_AsciiString CasRootString(CasRootEnv.Value());
54 if (CasRootString.Length() > 0 ) {
55 CasRootString += "/src/UnitsAPI/Lexi_Expr.dat" ;
56 Units::LexiconFile(CasRootString.ToCString());
59 Standard_NoSuchObject::Raise("environment variable CSF_UnitsLexicon undefined");
62 TCollection_AsciiString sunitsfile(env2.Value());
63 if( sunitsfile.Length() > 0 )
64 Units::UnitsFile(sunitsfile.ToCString());
66 OSD_Environment CasRootEnv("CASROOT");
67 TCollection_AsciiString CasRootString(CasRootEnv.Value());
68 if (CasRootString.Length() > 0 ) {
69 CasRootString += "/src/UnitsAPI/Units.dat";
70 Units::UnitsFile(CasRootString.ToCString());
73 Standard_NoSuchObject::Raise("environment variable CSF_UnitsDefinition undefined");
76 switch (aSystemUnits) {
77 case UnitsAPI_DEFAULT :
78 if( !CurrentUnits.IsNull() ) break;
80 currentSystem = UnitsAPI_SI;
81 if( SICurrentUnits.IsNull() ) {
83 TCollection_AsciiString csfcurrent (env3.Value());
84 if( csfcurrent.Length() > 0 )
85 SICurrentUnits = new Resource_Manager(csfcurrent.ToCString());
87 SICurrentUnits = new Resource_Manager("CurrentUnits");
89 SICurrentUnits = new Resource_Manager("CurrentUnits");
92 CurrentUnits = SICurrentUnits;
93 LocalSystemUnits = SILocalSystemUnits;
96 currentSystem = UnitsAPI_MDTV;
97 if( MDTVCurrentUnits.IsNull() ) {
99 TCollection_AsciiString csfmdtvcurrent (env4.Value());
100 if( csfmdtvcurrent.Length() > 0 )
101 MDTVCurrentUnits = new Resource_Manager(csfmdtvcurrent.ToCString());
103 MDTVCurrentUnits = new Resource_Manager("MDTVCurrentUnits");
105 MDTVCurrentUnits = new Resource_Manager("MDTVCurrentUnits");
108 CurrentUnits = MDTVCurrentUnits;
109 if( MDTVLocalSystemUnits.IsEmpty() ) {
110 MDTVLocalSystemUnits.Specify("LENGTH","mm");
111 MDTVLocalSystemUnits.Specify("AREA","mm\xB2");
112 MDTVLocalSystemUnits.Specify("VOLUME","mm\xB3");
113 MDTVLocalSystemUnits.Specify("INERTIA","mm**4");
114 MDTVLocalSystemUnits.Specify("SPEED","mm/s");
115 MDTVLocalSystemUnits.Specify("ACCELERATION","mm/s\xB2");
116 MDTVLocalSystemUnits.Specify("VOLUMIC MASS","kg/mm\xB3");
117 MDTVLocalSystemUnits.Specify("VOLUME FLOW","mm\xB3/s");
118 MDTVLocalSystemUnits.Specify("CONSUMPTION","mm\xB2");
119 MDTVLocalSystemUnits.Specify("QUANTITY OF MOVEMENT","kg*mm/s");
120 MDTVLocalSystemUnits.Specify("KINETIC MOMENT","kg*mm\xB2/s");
121 MDTVLocalSystemUnits.Specify("MOMENT OF INERTIA","kg*mm\xB2");
122 MDTVLocalSystemUnits.Specify("FORCE","kg*mm/s\xB2");
123 MDTVLocalSystemUnits.Specify("LINEIC FORCE","kg/s\xB2");
124 MDTVLocalSystemUnits.Specify("MOMENT OF A FORCE","kg*mm\xB2/s\xB2");
125 MDTVLocalSystemUnits.Specify("PRESSURE","kg/(mm*s\xB2)");
126 MDTVLocalSystemUnits.Specify("DYNAMIC VISCOSITY","kg/(mm*s)");
127 MDTVLocalSystemUnits.Specify("KINETIC VISCOSITY","mm\xB2/s");
128 MDTVLocalSystemUnits.Specify("TENSION SUPERFICIELLE","mm/s\xB2");
129 MDTVLocalSystemUnits.Specify("ENERGY","kg*mm\xB2/s\xB2");
130 MDTVLocalSystemUnits.Specify("POWER","kg*mm\xB2/s\xB3");
131 MDTVLocalSystemUnits.Specify("LINEIC POWER","kg*mm/s\xB3");
132 MDTVLocalSystemUnits.Specify("SURFACIC POWER","kg/s\xB3");
133 MDTVLocalSystemUnits.Specify("VOLUMIC POWER","kg/(mm*s\xB3)");
134 MDTVLocalSystemUnits.Specify("THERMICAL CONDUCTIVITY","kg*mm/(s\xB3*\xB0K)");
135 MDTVLocalSystemUnits.Specify("THERMICAL CONVECTIVITY","kg/(s\xB3*\xB0K)");
136 MDTVLocalSystemUnits.Specify("THERMICAL MASSIC CAPACITY","mm\xB2/(s\xB2*\xB0K)");
137 MDTVLocalSystemUnits.Specify("ENTROPY","kg*mm\xB2/(s\xB2*\xB0K)");
138 MDTVLocalSystemUnits.Specify("ENTHALPY","kg*mm\xB2/s\xB2");
139 MDTVLocalSystemUnits.Specify("LUMINANCE","cd/mm\xB2");
140 MDTVLocalSystemUnits.Specify("LUMINOUS EFFICACITY","s\xB3*Lu/(kg*mm\xB2)");
141 MDTVLocalSystemUnits.Specify("ELECTRIC FIELD","V/mm");
142 MDTVLocalSystemUnits.Specify("ELECTRIC CAPACITANCE","s**4*A\xB2/(kg*mm\xB2)");
143 MDTVLocalSystemUnits.Specify("MAGNETIC FIELD","A/mm");
144 MDTVLocalSystemUnits.Specify("MAGNETIC FLUX","kg*mm\xB2/(s\xB2*A)");
145 MDTVLocalSystemUnits.Specify("INDUCTANCE","kg*mm\xB2/(s\xB2*A\xB2)");
146 MDTVLocalSystemUnits.Specify("RELUCTANCE","s\xB2*A\xB2/(kg*mm\xB2)");
147 MDTVLocalSystemUnits.Specify("RESISTIVITY","O*mm");
148 MDTVLocalSystemUnits.Specify("CONDUCTIVITY","S/mm");
149 MDTVLocalSystemUnits.Specify("MOLAR MASS","kg/mol");
150 MDTVLocalSystemUnits.Specify("MOLAR VOLUME","mm\xB3/mol");
151 MDTVLocalSystemUnits.Specify("CONCENTRATION","kg/mm\xB3");
152 MDTVLocalSystemUnits.Specify("MOLAR CONCENTRATION","mol/mm\xB3");
153 MDTVLocalSystemUnits.Specify("ACCOUSTIC INTENSITY","mm/A\xB2");
154 MDTVLocalSystemUnits.Specify("DOSE EQUIVALENT","mm\xB2/s\xB2");
155 MDTVLocalSystemUnits.Specify("ABSORBED DOSE","mm\xB2/s\xB2");
156 MDTVLocalSystemUnits.Specify("FLUX OF MAGNETIC INDUCTION","kg*mm\xB2/(s\xB2*A)");
157 MDTVLocalSystemUnits.Specify("ROTATION ACCELERATION","rad/s\xB2");
158 MDTVLocalSystemUnits.Specify("TRANSLATION STIFFNESS","kg/s\xB2");
159 MDTVLocalSystemUnits.Specify("ROTATION STIFFNESS","kg*mm\xB2/(s\xB2*rad)");
160 MDTVLocalSystemUnits.Activates();
162 LocalSystemUnits = MDTVLocalSystemUnits;
169 //=======================================================================
170 //function : CurrentToLS
172 //=======================================================================
174 Standard_Real UnitsAPI::CurrentToLS(const Standard_Real aData,
175 const Standard_CString aQuantity)
177 Standard_Real aValue = aData;
178 CheckLoading (localSystem);
179 if( CurrentUnits->Find(aQuantity) ) {
180 TCollection_AsciiString current(CurrentUnits->Value(aQuantity));
181 aValue = Units::ToSI(aData,current.ToCString());
182 aValue = LocalSystemUnits.ConvertSIValueToUserSystem(aQuantity,aValue);
186 cout <<"Warning: UnitsAPI,the quantity '" << aQuantity << "' does not exist in the current units system" << endl;
194 //=======================================================================
195 //function : CurrentToSI
197 //=======================================================================
199 Standard_Real UnitsAPI::CurrentToSI(const Standard_Real aData,
200 const Standard_CString aQuantity)
202 Standard_Real aValue = aData;
203 CheckLoading (UnitsAPI_DEFAULT);
204 if( CurrentUnits->Find(aQuantity) ) {
205 TCollection_AsciiString current(CurrentUnits->Value(aQuantity));
206 aValue = Units::ToSI(aData,current.ToCString());
210 cout<<"Warning: UnitsAPI,the quantity '" << aQuantity << "' does not exist in the current units system" << endl;
218 //=======================================================================
219 //function : CurrentFromLS
221 //=======================================================================
223 Standard_Real UnitsAPI::CurrentFromLS(const Standard_Real aData,
224 const Standard_CString aQuantity)
226 Standard_Real aValue = aData;
227 CheckLoading (localSystem);
228 if( CurrentUnits->Find(aQuantity) ) {
229 TCollection_AsciiString current(CurrentUnits->Value(aQuantity));
230 aValue = LocalSystemUnits.ConvertUserSystemValueToSI(aQuantity,aData);
231 aValue = Units::FromSI(aValue,current.ToCString());
235 cout<<"Warning: UnitsAPI,the quantity '" << aQuantity << "' does not exist in the current units system" << endl;
243 //=======================================================================
244 //function : CurrentFromSI
246 //=======================================================================
248 Standard_Real UnitsAPI::CurrentFromSI(const Standard_Real aData,
249 const Standard_CString aQuantity)
251 Standard_Real aValue = aData;
252 CheckLoading (UnitsAPI_DEFAULT);
253 if( CurrentUnits->Find(aQuantity) ) {
254 TCollection_AsciiString current(CurrentUnits->Value(aQuantity));
255 aValue = Units::FromSI(aData,current.ToCString());
259 cout<<"Warning: UnitsAPI,the quantity '" << aQuantity << "' does not exist in the current units system" << endl;
267 //=======================================================================
268 //function : CurrentToAny
270 //=======================================================================
272 Standard_Real UnitsAPI::CurrentToAny(const Standard_Real aData,
273 const Standard_CString aQuantity,
274 const Standard_CString aUnit) {
275 Standard_Real aValue = aData;
276 CheckLoading (UnitsAPI_DEFAULT);
277 if( CurrentUnits->Find(aQuantity) ) {
278 TCollection_AsciiString current(CurrentUnits->Value(aQuantity));
279 aValue = AnyToAny(aData,current.ToCString(),aUnit);
283 cout<<"Warning: UnitsAPI,the quantity '" << aQuantity << "' does not exist in the current units system" << endl;
291 //=======================================================================
292 //function : CurrentFromAny
294 //=======================================================================
296 Standard_Real UnitsAPI::CurrentFromAny(const Standard_Real aData,
297 const Standard_CString aQuantity,
298 const Standard_CString aUnit)
300 Standard_Real aValue = aData;
301 CheckLoading (UnitsAPI_DEFAULT);
302 if( CurrentUnits->Find(aQuantity) ) {
303 TCollection_AsciiString current(CurrentUnits->Value(aQuantity));
304 aValue = AnyToAny(aData,aUnit,current.ToCString());
308 cout<<"Warning: UnitsAPI,the quantity '" << aQuantity << "' does not exist in the current units system" << endl;
316 //=======================================================================
319 //=======================================================================
321 Standard_Real UnitsAPI::AnyToLS(const Standard_Real aData,
322 const Standard_CString aUnit)
324 Standard_Real aValue = aData;
325 CheckLoading (localSystem);
326 Handle(Units_Dimensions) aDim;
327 aValue = Units::ToSI(aValue,aUnit,aDim);
330 Standard_CString quantity = aDim->Quantity();
332 aValue = LocalSystemUnits.ConvertSIValueToUserSystem(quantity,aValue);
336 cout<<"Warning: BAD Quantity returns in UnitsAPI::AnyToLS(" << aData << "," << aUnit << ")" << endl;
342 //=======================================================================
345 //=======================================================================
347 Standard_Real UnitsAPI::AnyToLS(const Standard_Real aData,
348 const Standard_CString aUnit,
349 Handle(Units_Dimensions) &aDim)
351 Standard_Real aValue = aData;
352 CheckLoading (localSystem);
353 aValue = Units::ToSI(aValue,aUnit,aDim);
354 Standard_CString quantity = aDim->Quantity();
358 aValue = LocalSystemUnits.ConvertSIValueToUserSystem(quantity,aValue);
362 cout<<"Warning: BAD Quantity returns in UnitsAPI::AnyToLS(" << aData << "," << aUnit << "," << aDim.get() << ")" << endl;
368 //=======================================================================
371 //=======================================================================
373 Standard_Real UnitsAPI::AnyToSI(const Standard_Real aData,
374 const Standard_CString aUnit)
376 Standard_Real aValue;
377 CheckLoading (UnitsAPI_DEFAULT);
378 aValue = Units::ToSI(aData,aUnit);
383 //=======================================================================
386 //=======================================================================
388 Standard_Real UnitsAPI::AnyToSI(const Standard_Real aData,
389 const Standard_CString aUnit,
390 Handle(Units_Dimensions) &aDim)
392 Standard_Real aValue;
393 CheckLoading (UnitsAPI_DEFAULT);
394 aValue = Units::ToSI(aData,aUnit,aDim);
399 //=======================================================================
400 //function : AnyFromLS
402 //=======================================================================
404 Standard_Real UnitsAPI::AnyFromLS(const Standard_Real aData,
405 const Standard_CString aUnit)
407 Standard_Real aValue = aData;
408 CheckLoading (localSystem);
409 Handle(Units_Dimensions) aDim;
410 aValue = Units::FromSI(aValue,aUnit,aDim);
411 Standard_CString quantity = aDim->Quantity();
413 aValue = LocalSystemUnits.ConvertUserSystemValueToSI(quantity,aValue);
417 cout<<"Warning: BAD Quantity returns in UnitsAPI::AnyToLS(" << aData << "," << aUnit << ")" << endl;
424 //=======================================================================
425 //function : AnyFromSI
427 //=======================================================================
429 Standard_Real UnitsAPI::AnyFromSI(const Standard_Real aData,
430 const Standard_CString aUnit)
432 Standard_Real aValue;
433 CheckLoading (UnitsAPI_DEFAULT);
434 aValue = Units::FromSI(aData,aUnit);
439 //=======================================================================
440 //function : AnyToAny
442 //=======================================================================
444 Standard_Real UnitsAPI::AnyToAny(const Standard_Real aData,
445 const Standard_CString aUnit1,
446 const Standard_CString aUnit2)
448 Standard_Real aValue = aData;
449 CheckLoading (UnitsAPI_DEFAULT);
450 aValue = Units::Convert(aValue,aUnit1,aUnit2);
455 //=======================================================================
458 //=======================================================================
460 Standard_Real UnitsAPI::LSToSI(const Standard_Real aData,
461 const Standard_CString aQuantity)
463 Standard_Real aValue = aData;
464 CheckLoading (localSystem);
465 if( CurrentUnits->Find(aQuantity) ) {
466 aValue = LocalSystemUnits.ConvertUserSystemValueToSI(aQuantity,aData);
470 cout<<"Warning: UnitsAPI,the quantity '" << aQuantity << "' does not exist in the current units system" << endl;
478 //=======================================================================
481 //=======================================================================
483 Standard_Real UnitsAPI::SIToLS(const Standard_Real aData,
484 const Standard_CString aQuantity)
486 Standard_Real aValue = aData;
487 CheckLoading (localSystem);
488 if( CurrentUnits->Find(aQuantity) ) {
489 aValue = LocalSystemUnits.ConvertSIValueToUserSystem(aQuantity,aValue);
493 cout<<"Warning: UnitsAPI,the quantity '" << aQuantity << "' does not exist in the current units system" << endl;
501 //=======================================================================
502 //function : SetLocalSystem
504 //=======================================================================
506 void UnitsAPI::SetLocalSystem(const UnitsAPI_SystemUnits aSystemUnits)
508 CheckLoading (aSystemUnits);
509 localSystem = currentSystem;
513 //=======================================================================
514 //function : LocalSystem
516 //=======================================================================
518 UnitsAPI_SystemUnits UnitsAPI::LocalSystem()
524 //=======================================================================
525 //function : SetCurrentUnit
527 //=======================================================================
529 void UnitsAPI::SetCurrentUnit(const Standard_CString aQuantity,
530 const Standard_CString anUnit)
532 CheckLoading(localSystem);
533 CurrentUnits->SetResource(aQuantity,anUnit);
537 //=======================================================================
540 //=======================================================================
542 void UnitsAPI::Save()
544 CheckLoading(localSystem);
545 CurrentUnits->Save();
549 //=======================================================================
552 //=======================================================================
554 void UnitsAPI::Reload()
556 currentSystem = UnitsAPI_DEFAULT;
557 CheckLoading(localSystem);
561 //=======================================================================
562 //function : CurrentUnit
564 //=======================================================================
566 static TCollection_AsciiString astring;
567 Standard_CString UnitsAPI::CurrentUnit(const Standard_CString aQuantity)
569 CheckLoading(localSystem);
570 astring = CurrentUnits->Value(aQuantity);
571 return astring.ToCString();
575 //=======================================================================
576 //function : Dimensions
578 //=======================================================================
580 Handle(Units_Dimensions) UnitsAPI::Dimensions(const Standard_CString aType)
582 return Units::Dimensions(aType);
586 //=======================================================================
587 //function : DimensionLess
589 //=======================================================================
591 Handle(Units_Dimensions) UnitsAPI::DimensionLess()
593 return Units_Dimensions::ALess();
597 //=======================================================================
598 //function : DimensionMass
600 //=======================================================================
602 Handle(Units_Dimensions) UnitsAPI::DimensionMass()
604 return Units_Dimensions::AMass();
608 //=======================================================================
609 //function : DimensionLength
611 //=======================================================================
613 Handle(Units_Dimensions) UnitsAPI::DimensionLength()
615 return Units_Dimensions::ALength();
619 //=======================================================================
620 //function : DimensionTime
622 //=======================================================================
624 Handle(Units_Dimensions) UnitsAPI::DimensionTime()
626 return Units_Dimensions::ATime() ;
630 //=======================================================================
631 //function : DimensionElectricCurrent
633 //=======================================================================
635 Handle(Units_Dimensions) UnitsAPI::DimensionElectricCurrent()
637 return Units_Dimensions::AElectricCurrent() ;
641 //=======================================================================
642 //function : DimensionThermodynamicTemperature
644 //=======================================================================
646 Handle(Units_Dimensions) UnitsAPI::DimensionThermodynamicTemperature()
648 return Units_Dimensions::AThermodynamicTemperature();
652 //=======================================================================
653 //function : DimensionAmountOfSubstance
655 //=======================================================================
657 Handle(Units_Dimensions) UnitsAPI::DimensionAmountOfSubstance()
659 return Units_Dimensions::AAmountOfSubstance();
663 //=======================================================================
664 //function : DimensionLuminousIntensity
666 //=======================================================================
668 Handle(Units_Dimensions) UnitsAPI::DimensionLuminousIntensity()
670 return Units_Dimensions::ALuminousIntensity();
674 //=======================================================================
675 //function : DimensionPlaneAngle
677 //=======================================================================
679 Handle(Units_Dimensions) UnitsAPI::DimensionPlaneAngle()
681 return Units_Dimensions::APlaneAngle();
685 //=======================================================================
686 //function : DimensionSolidAngle
688 //=======================================================================
690 Handle(Units_Dimensions) UnitsAPI::DimensionSolidAngle()
692 return Units_Dimensions::ASolidAngle();
696 //=======================================================================
699 //=======================================================================
701 Standard_Boolean UnitsAPI::Check(const Standard_CString aQuantity,
702 const Standard_CString /*aUnit*/)
704 Standard_Boolean status = Standard_False;
705 CheckLoading (UnitsAPI_DEFAULT);
706 if( CurrentUnits->Find(aQuantity) ) {
707 TCollection_AsciiString current(CurrentUnits->Value(aQuantity));
708 // aValue = AnyToAny(aData,current.ToCString(),aUnit);
709 // aValue = Units::Convert(aValue,aUnit1,aUnit2);