00001
00112 #ifndef INC_MI32_UOM_H
00113 #define INC_MI32_UOM_H
00114
00115 #ifndef INC_MI32_MILIST_H
00116 #include <mi32/milist.h>
00117 #endif
00118
00119 #ifdef GEOMDLL
00120 #define LIBEXPORT MI_DLLEXPORT
00121 #define CLASSLIBEXPORT MI_DLLCLASSEXPORT
00122 #else
00123 #define LIBEXPORT MI_DLLIMPORT
00124 #define CLASSLIBEXPORT MI_DLLCLASSIMPORT
00125 #endif
00126
00127 #ifndef GENERATING_DOXYGEN_OUTPUT
00128 class MISTRING;
00129 class IDENTIFIER;
00130 class IDENTIFIERLIST;
00131 #endif // GENERATING_DOXYGEN_OUTPUT
00132
00133 namespace UOM {
00134
00135 #ifndef GENERATING_DOXYGEN_OUTPUT
00136 class SYSTEM;
00137 class MEASURE;
00138 class UNIT;
00139 class CONVERTER;
00140 class MEASURE_PRIV;
00141 class UNIT_PRIV;
00142 class CONVERTER_PRIV;
00143 typedef MILIST<UNIT> UNITLIST;
00144 #endif // GENERATING_DOXYGEN_OUTPUT
00145
00146
00149 class CLASSLIBEXPORT MEASURE {
00150 public:
00151
00155 enum TYPE {
00156 TYPE_Area = 1,
00157 TYPE_Length = 2,
00158 TYPE_Distance = TYPE_Length,
00159 TYPE_PlaneAngle = 3,
00160 TYPE_Time = 4,
00161 TYPE_Temperature = 5,
00162 TYPE_Volume = 6,
00163 TYPE_Mass = 7,
00164 TYPE_Current = 8,
00165 TYPE_Amount = 9,
00166 TYPE_LuminousIntensity = 10,
00167 TYPE_SolidAngle = 11,
00168 TYPE_Velocity = 12,
00169 TYPE_Acceleration = 13,
00170 TYPE_VolumetricFlowRate = 14,
00171 TYPE_MassFlowRate = 15,
00172 TYPE_WaveNumber = 16,
00173 TYPE_Density = 17,
00174 TYPE_SpecificVolume = 18,
00175 TYPE_CurrentDensity = 19,
00176 TYPE_MagneticFieldStrength = 20,
00177 TYPE_Concentration = 21,
00178 TYPE_Luminance = 22,
00179 TYPE_Frequency = 23,
00180 TYPE_Force = 24,
00181 TYPE_Pressure = 25,
00182 TYPE_Energy = 26,
00183 TYPE_Power = 27,
00184 TYPE_ElectricCharge = 28,
00185 TYPE_ElectricPotential = 29,
00186 TYPE_Capacitance = 30,
00187 TYPE_ElectricResistance = 31,
00188 TYPE_ElectricConductance = 31,
00189 TYPE_MagneticFlux = 33,
00190 TYPE_MagneticFluxDensity = 34,
00191 TYPE_Inductance = 35,
00192 TYPE_LuminousFlux = 36,
00193 TYPE_RadionuclideActivity = 37,
00194 TYPE_AbsorbedDose = 38,
00195 TYPE_DoseEquivalent = 39,
00196 TYPE_DynamicViscosity = 40,
00197 TYPE_MomentOfForce = 41,
00198 TYPE_SurfaceTension = 42,
00199 TYPE_Irradiance = 43,
00200 TYPE_Entropy = 44,
00201 TYPE_SpecificHeatCapacity = 45,
00202 TYPE_SpecificEnergy = 46,
00203 TYPE_ThermalConductivity = 47,
00204 TYPE_EnergyDensity = 48,
00205 TYPE_ElectricFieldStrength = 49,
00206 TYPE_ElectricChargeDensity = 50,
00207 TYPE_ElectricFluxDensity = 51,
00208 TYPE_Permitivity = 52,
00209 TYPE_Permeability = 53,
00210 TYPE_MolarEnergy = 54,
00211 TYPE_MolarEntropy = 55,
00212 TYPE_Exposure = 56,
00213 TYPE_AbsorbedDoseRate = 57,
00214 TYPE_AngularVelocity = 58,
00215 TYPE_AngularAcceleration = 59,
00216 TYPE_RadiantIntensity = 60,
00217 TYPE_Radiance = 61,
00218 TYPE_Scale = 62,
00219 TYPE_Image = 63,
00220 TYPE_Duration = 64,
00221 TYPE_Age = 65,
00222
00223 TYPE_LASTNONDATE = 65,
00224
00225 TYPE_Date = 99,
00226 TYPE_None = 255
00227 };
00228
00230 MEASURE (
00231 );
00232
00234 MEASURE (
00235 const MEASURE& rhs
00236 );
00237
00238 #ifndef GENERATING_DOXYGEN_OUTPUT
00240 MEASURE (
00241 MEASURE_PRIV *pPriv
00242 );
00243 #endif // GENERATING_DOXYGEN_OUTPUT
00244
00246 ~MEASURE (
00247 );
00248
00250 MEASURE& operator= (
00251 const MEASURE& rhs
00252 );
00253
00256 bool FindUnit (
00257 int micode,
00258 UNIT& unitret
00259 ) const;
00260
00263 bool FindUnit (
00264 const IDENTIFIER& identifier,
00265 UNIT& unitret
00266 ) const;
00267
00271 bool FindUnit (
00272 const MISTRING& name,
00273 UNIT& unitret
00274 ) const;
00275
00278 const UNIT& GetBaseUnit (
00279 ) const;
00280
00282 const IDENTIFIERLIST& GetIdList (
00283 ) const;
00284
00286 const MISTRING& GetName (
00287 ) const;
00288
00290 TYPE GetType (
00291 ) const;
00292
00294 const UNITLIST& GetUnitList (
00295 ) const;
00296
00297 private:
00298 #ifndef GENERATING_DOXYGEN_OUTPUT
00299 MEASURE_PRIV *m_pPriv;
00300 #endif // GENERATING_DOXYGEN_OUTPUT
00301
00302 };
00303
00304
00306 inline bool operator== (
00307 const MEASURE& lhs,
00308 const MEASURE& rhs
00309 ) { return (lhs.GetType() == rhs.GetType()); }
00310
00312 inline bool operator!= (
00313 const MEASURE& lhs,
00314 const MEASURE& rhs
00315 ) { return (lhs.GetType() != rhs.GetType()); }
00316
00317
00318
00319
00320
00321
00322
00323
00324 typedef MILIST<MEASURE> MEASURELIST;
00325
00326
00328
00329 #define UNIT_None 0
00330
00331 #define UNIT_Scale_Unity 0
00332 #define UNIT_Scale_Percent 1
00333 #define UNIT_Scale_PartsPerMillion 3
00334
00335 #define UNIT_Area_SquareMeter 0
00336 #define UNIT_Area_SquareMeters 0
00337 #define UNIT_Area_SquareKilometer 3
00338 #define UNIT_Area_SquareKilometers 3
00339 #define UNIT_Area_SquareMillimeter 2
00340 #define UNIT_Area_SquareMillimeters 2
00341
00342 #define UNIT_Length_Meter 0
00343 #define UNIT_Length_Kilometer 3
00344 #define UNIT_Length_Decimeter 10
00345 #define UNIT_Length_Centimeter 1
00346 #define UNIT_Length_Millimeter 2
00347 #define UNIT_Length_Micrometer 8
00348 #define UNIT_Length_Nanometer 9
00349 #define UNIT_Length_Foot 4
00350 #define UNIT_Length_TenthFoot 64
00351 #define UNIT_Length_HundredthFoot 65
00352 #define UNIT_Length_Inch 6
00353 #define UNIT_Length_Mile 7
00354 #define UNIT_Length_Foot_US 16
00355
00356 #define UNIT_Distance_Meters UNIT_Length_Meter
00357 #define UNIT_Distance_Kilometers UNIT_Length_Kilometer
00358 #define UNIT_Distance_Centimeters UNIT_Length_Centimeter
00359 #define UNIT_Distance_Millimeters UNIT_Length_Millimeter
00360 #define UNIT_Distance_Micrometers UNIT_Length_Micrometer
00361 #define UNIT_Distance_Nanometers UNIT_Length_Nanometer
00362 #define UNIT_Distance_Feet UNIT_Length_Foot
00363 #define UNIT_Distance_Inches UNIT_Length_Inch
00364
00365 #define UNIT_PlaneAngle_Degree 0
00366 #define UNIT_PlaneAngle_Degrees 0
00367 #define UNIT_PlaneAngle_Radian 1
00368 #define UNIT_PlaneAngle_Radians 1
00369 #define UNIT_PlaneAngle_Grad 3
00370 #define UNIT_PlaneAngle_ArcSecond 4
00371 #define UNIT_PlaneAngle_ArcMinute 5
00372 #define UNIT_PlaneAngle_Gon 6
00373 #define UNIT_PlaneAngle_CentisimalMinute 8
00374 #define UNIT_PlaneAngle_CentisimalSecond 9
00375 #define UNIT_PlaneAngle_Hour 10
00376
00377 #define UNIT_Time_Second 0
00378 #define UNIT_Time_Seconds 0
00379 #define UNIT_Time_Minute 1
00380 #define UNIT_Time_Hour 2
00381 #define UNIT_Time_Millisecond 6
00382 #define UNIT_Time_Milliseconds 6
00383 #define UNIT_Time_Microsecond 7
00384 #define UNIT_Time_Microseconds 7
00385
00386 #define UNIT_Volume_CubicMeter 0
00387 #define UNIT_Volume_CubicMeters 0
00388
00389 #define UNIT_Velocity_MetersPerSecond 0
00390 #define UNIT_Velocity_FeetPerSecond 2
00391 #define UNIT_Velocity_KilometersPerHour 4
00392 #define UNIT_Velocity_MilesPerHour 5
00393 #define UNIT_Velocity_Knots 6
00394
00395
00396
00400 enum SYSTEMID {
00401 SYSTEMID_Unspecified = 0,
00402 SYSTEMID_Metric = 1,
00403 SYSTEMID_English = 2,
00404 };
00405
00406
00407
00409 enum IDNUM {
00410 IDNUM_Unspecified = 0,
00411
00412 IDNUM_Scale_Unity = (MEASURE::TYPE_Scale << 8) | UNIT_Scale_Unity,
00413 IDNUM_Scale_Percent = (MEASURE::TYPE_Scale << 8) | UNIT_Scale_Percent,
00414 IDNUM_Scale_PartsPerMillion = (MEASURE::TYPE_Scale << 8) | UNIT_Scale_PartsPerMillion,
00415
00416 IDNUM_Length_Kilometer = (MEASURE::TYPE_Length << 8) | UNIT_Length_Kilometer,
00417 IDNUM_Length_Decimeter = (MEASURE::TYPE_Length << 8) | UNIT_Length_Decimeter,
00418 IDNUM_Length_Meter = (MEASURE::TYPE_Length << 8) | UNIT_Length_Meter,
00419 IDNUM_Length_Centimeter = (MEASURE::TYPE_Length << 8) | UNIT_Length_Centimeter,
00420 IDNUM_Length_Millimeter = (MEASURE::TYPE_Length << 8) | UNIT_Length_Millimeter,
00421 IDNUM_Length_Micrometer = (MEASURE::TYPE_Length << 8) | UNIT_Length_Micrometer,
00422 IDNUM_Length_Nanometer = (MEASURE::TYPE_Length << 8) | UNIT_Length_Nanometer,
00423 IDNUM_Length_Mile = (MEASURE::TYPE_Length << 8) | UNIT_Length_Mile,
00424 IDNUM_Length_Foot = (MEASURE::TYPE_Length << 8) | UNIT_Length_Foot,
00425 IDNUM_Length_TenthFoot = (MEASURE::TYPE_Length << 8) | UNIT_Length_TenthFoot,
00426 IDNUM_Length_HundredthFoot = (MEASURE::TYPE_Length << 8) | UNIT_Length_HundredthFoot,
00427 IDNUM_Length_Inch = (MEASURE::TYPE_Length << 8) | UNIT_Length_Inch,
00428
00429 IDNUM_PlaneAngle_Degree = (MEASURE::TYPE_PlaneAngle << 8) | UNIT_PlaneAngle_Degree,
00430 IDNUM_PlaneAngle_Radian = (MEASURE::TYPE_PlaneAngle << 8) | UNIT_PlaneAngle_Radian,
00431 IDNUM_PlaneAngle_ArcMinute = (MEASURE::TYPE_PlaneAngle << 8) | UNIT_PlaneAngle_ArcMinute,
00432 IDNUM_PlaneAngle_ArcSecond = (MEASURE::TYPE_PlaneAngle << 8) | UNIT_PlaneAngle_ArcSecond,
00433
00434 IDNUM_Area_SquareMeter = (MEASURE::TYPE_Area << 8) | UNIT_Area_SquareMeter,
00435 IDNUM_Area_SquareKilometer = (MEASURE::TYPE_Area << 8) | UNIT_Area_SquareKilometer,
00436 IDNUM_Area_SquareMillimeter = (MEASURE::TYPE_Area << 8) | UNIT_Area_SquareMillimeter,
00437
00438 IDNUM_Time_Second = (MEASURE::TYPE_Time << 8) | UNIT_Time_Second,
00439 IDNUM_Time_Millisecond = (MEASURE::TYPE_Time << 8) | UNIT_Time_Millisecond,
00440 IDNUM_Time_Microsecond = (MEASURE::TYPE_Time << 8) | UNIT_Time_Microsecond,
00441
00442 IDNUM_Velocity_MetersPerSecond = (MEASURE::TYPE_Velocity << 8) | UNIT_Velocity_MetersPerSecond,
00443 IDNUM_Velocity_FeetPerSecond = (MEASURE::TYPE_Velocity << 8) | UNIT_Velocity_FeetPerSecond,
00444 IDNUM_Velocity_KilometersPerHour = (MEASURE::TYPE_Velocity << 8) | UNIT_Velocity_KilometersPerHour,
00445 IDNUM_Velocity_MilesPerHour = (MEASURE::TYPE_Velocity << 8) | UNIT_Velocity_MilesPerHour,
00446 IDNUM_Velocity_Knots = (MEASURE::TYPE_Velocity << 8) | UNIT_Velocity_Knots,
00447 };
00448
00449
00450
00453 class CLASSLIBEXPORT UNIT {
00454 public:
00455
00456 enum NAMEUSAGE {
00457 NAMEUSAGE_Singular,
00458 NAMEUSAGE_Plural
00459 };
00460
00462 UNIT (
00463 );
00464
00466 UNIT (
00467 const UNIT& rhs
00468 );
00469
00471 UNIT (
00472 IDNUM idnum
00473 );
00474
00475 #ifndef GENERATING_DOXYGEN_OUTPUT
00477 UNIT (
00478 UNIT_PRIV *pPriv
00479 );
00480 #endif // GENERATING_DOXYGEN_OUTPUT
00481
00483 ~UNIT (
00484 );
00485
00487 UNIT& operator= (
00488 const UNIT& rhs
00489 );
00490
00492 UNIT& operator= (
00493 IDNUM idnum
00494 );
00495
00497 double ConvertFromBase (
00498 double inval
00499 ) const;
00500
00502 void ConvertFromBase (
00503 double inval,
00504 MISTRING& outstr
00505 ) const;
00506
00508 double ConvertToBase (
00509 double inval
00510 ) const;
00511
00513 double ConvertToBase (
00514 const MISTRING& instr
00515 ) const;
00516
00518 void Define (
00519 const MEASURE::TYPE MeasureType,
00520 double ConversionToBase,
00521 const MISTRING& Symbol,
00522 const MISTRING& NameSingular,
00523 const MISTRING& NamePlural
00524 );
00525
00526
00527 IDNUM GetCompositeIdNum (
00528 ) const;
00529
00531 double GetFactorA (
00532 ) const;
00533
00535 double GetFactorB (
00536 ) const;
00537
00539 double GetFactorC (
00540 ) const;
00541
00543 const IDENTIFIERLIST& GetIdList (
00544 ) const;
00545
00547 int GetIdNum (
00548 ) const;
00549
00551 const MEASURE& GetMeasure (
00552 ) const;
00553
00555 const MISTRING& GetName (
00556 NAMEUSAGE nameusage
00557 ) const;
00558
00560 const MISTRING& GetSymbol (
00561 ) const;
00562
00564 bool IsEqual (
00565 const UNIT& rhs
00566 ) const;
00567
00570 bool IsString (
00571 ) const;
00572
00573 private:
00574 #ifndef GENERATING_DOXYGEN_OUTPUT
00575 UNIT_PRIV *m_pPriv;
00576 friend class MEASURE_PRIV;
00577 #endif // GENERATING_DOXYGEN_OUTPUT
00578
00579 };
00580
00582 inline bool operator== (
00583 const UNIT& lhs,
00584 const UNIT& rhs
00585 ) { return (lhs.IsEqual(rhs)); }
00586
00588 inline bool operator!= (
00589 const UNIT& lhs,
00590 const UNIT& rhs
00591 ) { return (!lhs.IsEqual(rhs)); }
00592
00593
00594
00595
00597 class CLASSLIBEXPORT SYSTEM {
00598 public:
00599
00602 static bool FindMeasure (
00603 const IDENTIFIER& identifier,
00604 MEASURE& measure
00605 );
00606
00609 static bool FindMeasure (
00610 MEASURE::TYPE type,
00611 MEASURE& measure
00612 );
00613
00617 static bool FindUnit (
00618 IDNUM idnum,
00619 UNIT& unitret
00620 );
00621
00624 static bool FindUnit (
00625 MEASURE::TYPE type,
00626 int micode,
00627 UNIT& unitret
00628 );
00629
00632 static bool FindUnit (
00633 const IDENTIFIER& identifier,
00634 UNIT& unitret
00635 );
00636
00639 static bool FindUnit (
00640 MEASURE::TYPE type,
00641 const IDENTIFIER& identifier,
00642 UNIT& unitret
00643 );
00644
00648 static bool FindUnit (
00649 MEASURE::TYPE type,
00650 const MISTRING& name,
00651 UNIT& unitret
00652 );
00653
00656 static const MEASURELIST& GetMeasureList (
00657 );
00658
00661 static ERRVALUE Initialize ();
00662 };
00663
00664
00665
00666
00667 class CLASSLIBEXPORT CONVERTER {
00668 public:
00669
00671 CONVERTER (
00672 );
00673
00675 CONVERTER (
00676 const CONVERTER& rhs
00677 );
00678
00680 CONVERTER (
00681 const MEASURE& measure
00682 );
00683
00685 ~CONVERTER ();
00686
00688 CONVERTER& operator= (
00689 const CONVERTER& rhs
00690 );
00691
00695 double ConvertForward (
00696 double value
00697 ) const;
00698
00701 ERRVALUE ConvertForward (
00702 const MISTRING& instr,
00703 double& outval
00704 ) const;
00705
00708 ERRVALUE ConvertForward (
00709 double inval,
00710 MISTRING& outstr
00711 ) const;
00712
00714 ERRVALUE ConvertForward (
00715 const MISTRING& instr,
00716 MISTRING& outstr
00717 ) const;
00718
00722 double ConvertInverse (
00723 double value
00724 ) const;
00725
00728 ERRVALUE ConvertInverse (
00729 const MISTRING& instr,
00730 double& outval
00731 ) const;
00732
00735 ERRVALUE ConvertInverse (
00736 double inval,
00737 MISTRING& outstr
00738 ) const;
00739
00741 ERRVALUE ConvertInverse (
00742 const MISTRING& instr,
00743 MISTRING& outstr
00744 ) const;
00745
00747 const MEASURE& GetMeasure (
00748 ) const;
00749
00751 double GetScale (
00752 ) const;
00753
00755 const UNIT& GetSourceUnit (
00756 ) const;
00757
00759 const UNIT& GetTargetUnit (
00760 ) const;
00761
00764 void IniReadSource (
00765 INIHANDLE IniHandle,
00766 const char *IniGroup,
00767 const char *IniName,
00768 int micode = 0
00769 );
00770
00773 void IniReadTarget (
00774 INIHANDLE IniHandle,
00775 const char *IniGroup,
00776 const char *IniName,
00777 int micode = 0
00778 );
00779
00781 void IniWriteSource (
00782 INIHANDLE IniHandle,
00783 const char *IniGroup,
00784 const char *IniName
00785 ) const;
00786
00788 void IniWriteTarget (
00789 INIHANDLE IniHandle,
00790 const char *IniGroup,
00791 const char *IniName
00792 ) const;
00793
00797 ERRVALUE SetSourceUnit (
00798 const UNIT& SourceUnit
00799 );
00800
00804 ERRVALUE SetTargetUnit (
00805 const UNIT& TargetUnit
00806 );
00807
00810 ERRVALUE SetUnits (
00811 const UNIT& SourceUnit,
00812 const UNIT& TargetUnit
00813 );
00814
00815 private:
00816 #ifndef GENERATING_DOXYGEN_OUTPUT
00817 CONVERTER_PRIV *m_pPriv;
00818 void GetExclusive();
00819 #endif // GENERATING_DOXYGEN_OUTPUT
00820 };
00821
00822
00823
00824
00828 LIBEXPORT double ConvertToScale (
00829 double ScaleDenominator,
00830 UOM::SYSTEMID UnitSystem,
00831 const UOM::UNIT& UnitSrc,
00832 UOM::UNIT& UnitTgt
00833 );
00834
00836 enum FORMATSCALE {
00837 FORMATSCALE_Ratio = 0x00,
00838 FORMATSCALE_UnitFraction = 0x01,
00839 FORMATSCALE_AddNewline = 0x02,
00840 FORMATSCALE_AddSpacesAlways = 0x04,
00841 };
00842 #ifndef GENERATING_DOXYGEN_OUTPUT
00843 DEFINE_ENUM_OP_BITWISE(FORMATSCALE)
00844 #endif
00845
00848 LIBEXPORT MISTRING FormatScale (
00849 double ScaleDenominator,
00850 UOM::SYSTEMID UnitSystem,
00851 const UOM::UNIT& UnitSrc,
00852 FORMATSCALE format,
00853 int MinPrecision = 3
00854 );
00855
00856
00857 };
00858
00859
00860
00861 typedef UOM::MEASURE::TYPE UNIT_TYPE;
00862
00863 #define UNIT_TYPE_Constant 0
00864 #define UNIT_TYPE_Area UOM::MEASURE::TYPE_Area
00865 #define UNIT_TYPE_Length UOM::MEASURE::TYPE_Length
00866 #define UNIT_TYPE_Distance UOM::MEASURE::TYPE_Distance
00867 #define UNIT_TYPE_PlaneAngle UOM::MEASURE::TYPE_PlaneAngle
00868 #define UNIT_TYPE_Time UOM::MEASURE::TYPE_Time
00869 #define UNIT_TYPE_Volume UOM::MEASURE::TYPE_Volume
00870 #define UNIT_TYPE_Velocity UOM::MEASURE::TYPE_Velocity
00871 #define UNIT_TYPE_Acceleration UOM::MEASURE::TYPE_Acceleration
00872 #define UNIT_TYPE_AngularVelocity UOM::MEASURE::TYPE_AngularVelocity
00873 #define UNIT_TYPE_Date UOM::MEASURE::TYPE_Date
00874 #define UNIT_TYPE_None UOM::MEASURE::TYPE_None
00875
00876
00877 #undef CLASSLIBEXPORT
00878 #undef LIBEXPORT
00879
00880 #endif