VR-Forces 5.0.3 Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DtDisplayUnitsSettingsManager.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * Copyright (c) 2022 MAK Technologies, Inc.
3  * All rights reserved.
4  *****************************************************************************/
5 
9 
10 #pragma once
11 
12 #include <vrvCore/vrvCore.h>
13 
15 #include <vrvUtil/DtUnicode.h>
16 
19 
20 namespace makVrv
21 {
22 
23  class DtDe;
24  class DtCoordinateDisplay;
25  class DtDisplayUnitsSettingsSynchronizerAgent;
26  class DtWorldMagneticModel;
27 
62  {
63  public:
64 
74 
77 
79  DtCoordinateDisplay* currentCoordinateDisplay();
80 
82  const DtCoordinateDisplay* currentCoordinateDisplay() const;
83 
86 
87  CoordSys currentCoordinateDisplaySystem() const;
88 
94  DistanceUnits currentDistanceUnit(
95  const DtUnicode& displayUnitCollectionName,
96  const DtUnicode& displayUnitName) const;
97 
103  VelocityUnits currentVelocityUnit(
104  const DtUnicode& displayUnitCollectionName,
105  const DtUnicode& displayUnitName) const;
106 
112  OrientationUnits currentOrientationUnit(
113  const DtUnicode& displayUnitCollectionName,
114  const DtUnicode& displayUnitName) const;
115 
121  NorthUnits currentNorthUnit(
122  const DtUnicode& displayUnitCollectionName,
123  const DtUnicode& displayUnitName) const;
124 
130  AccelerationUnits currentAccelerationUnit(
131  const DtUnicode& displayUnitCollectionName,
132  const DtUnicode& displayUnitName) const;
133 
139  RotVelocityUnits currentRotationalVelocityUnit(
140  const DtUnicode& displayUnitCollectionName,
141  const DtUnicode& displayUnitName) const;
142 
148  TemperatureUnits currentTemperatureUnit(
149  const DtUnicode& displayUnitCollectionName,
150  const DtUnicode& displayUnitName) const;
151 
157  PressureUnits currentPressureUnit(
158  const DtUnicode& displayUnitCollectionName,
159  const DtUnicode& displayUnitName) const;
160 
166  unsigned int displayUnitUnit(
167  const DtUnicode& displayUnitCollectionName,
168  const DtUnicode& displayUnitName) const;
169 
175  unsigned int displayUnitDecimals(
176  const DtUnicode& displayUnitCollectionName,
177  const DtUnicode& displayUnitName) const;
178 
184  DtUnicode displayUnitNotation(
185  const DtUnicode& displayUnitCollectionName,
186  const DtUnicode& displayUnitName) const;
187 
189 
192 
193  DtUnicode coordinateSystemNotation( CoordSys cs ) const;
194  DtUnicode distanceUnitNotation( DistanceUnits distUnit ) const;
195  DtUnicode velocityUnitNotation( VelocityUnits velocityUnit ) const;
196  DtUnicode orientationUnitNotation( OrientationUnits oriUnit ) const;
197  DtUnicode accelerationUnitNotation( AccelerationUnits accelUnit ) const;
198  DtUnicode rotationalVelocityUnitNotation( RotVelocityUnits wUnit ) const;
199  DtUnicode temperatureUnitNotation( TemperatureUnits tempUnit ) const;
200  DtUnicode pressureUnitNotation( PressureUnits pressureUnit ) const;
201  DtUnicode northUnitNotation( NorthUnits wUnit ) const;
202 
204 
207 
209  void coordinateSystemLabels(DtUnicode& x, DtUnicode& y, DtUnicode& z ) const;
210 
212  void coordinateSystemLabels(
213  CoordSys coordSystem,
214  DtUnicode& x, DtUnicode& y, DtUnicode& z ) const;
215 
217  void regularExpressionValidators( std::string& x,
218  std::string& y, std::string& z ) const;
219 
221  void regularExpressionValidators(
222  CoordSys cs,
223  std::string& x, std::string& y, std::string& z ) const;
224 
230  std::vector<DtUnicode> convertPositionToNotatedStringList(
231  CoordSys coordSys,
232  const DtVector& pos,
233  DistanceUnits coordinateSystemUnit,
234  unsigned int coordinateSystemDecimals,
235  DistanceUnits altitudeUnit,
236  unsigned int altitudeDecimals,
237  bool minimal = false) const;
238 
243  std::vector<DtUnicode> convertPositionToNotatedStringList(
244  const DtVector& pos,
245  DistanceUnits coordinateSystemUnit,
246  unsigned int coordinateSystemDecimals,
247  DistanceUnits altitudeUnit,
248  unsigned int altitudeDecimals,
249  bool minimal = false ) const;
250 
254  std::vector<std::string> convertPositionToStringList( CoordSys coordSys,
255  const DtVector& pos,
256  DistanceUnits coordinateSystemUnit,
257  unsigned int coordinateSystemDecimals,
258  DistanceUnits altitudeUnit,
259  unsigned int altitudeDecimals ) const;
260 
264  std::vector<std::string> convertPositionToStringList(
265  const DtVector& pos,
266  DistanceUnits coordinateSystemUnit,
267  unsigned int coordinateSystemDecimals,
268  DistanceUnits altitudeUnit,
269  unsigned int altitudeDecimals ) const;
270 
272 
275 
277  double convertAngleUnitNativeToDisplay(
278  double angle,
279  OrientationUnits unit ) const;
280 
282  double convertAngleUnitDisplayToNative(
283  double angle,
284  OrientationUnits unit ) const;
285 
293  std::string convertAngleUnitNativeToDisplayString(
294  double angle,
295  OrientationUnits unit,
296  unsigned int decimals,
297  bool additionalFormatting = false ) const;
298 
306  DtUnicode convertAngleUnitNativeToNotatedDisplayString(
307  double angle,
308  OrientationUnits unit,
309  unsigned int decimals,
310  bool additionalFormatting = false) const;
311 
313 
316 
325  double convertHeadingUnitNativeToDisplay(
326  const DtVector& geocLoc,
327  double heading,
328  NorthUnits unit,
329  bool convertDisplayToDegrees=true) const;
330 
339  double convertHeadingUnitDisplayToNative(
340  const DtVector& geocLoc,
341  double heading,
342  NorthUnits unit,
343  bool convertNativeToRadians=true) const;
344 
347  double convertLocationToMagneticDeclination(const DtVector& geocLoc) const;
348 
353  double convertLocationToGridDeclination(const DtVector& geocLoc) const;
354 
364  DtUnicode convertHeadingUnitNativeToNotatedDisplayString(const DtVector& geocLoc,
365  double heading, NorthUnits unit, DtUnicode unitNotation, bool suppressMagneticNorthNotation) const;
366 
374  DtUnicode convertHeadingUnitNativeToNotatedDisplayString(
375  const DtVector& geocLoc,
376  double heading,
377  NorthUnits unit ) const;
378 
380 
383 
385  double convertDistanceUnitNativeToDisplay(
386  double distance,
387  DistanceUnits unit ) const;
388 
390  double convertDistanceUnitDisplayToNative(
391  double distance,
392  DistanceUnits unit ) const;
393 
396  std::string convertDistanceUnitNativeToDisplayString(
397  double dist,
398  DistanceUnits unit,
399  unsigned int decimals ) const;
400 
403  DtUnicode convertDistanceUnitNativeToNotatedDisplayString(
404  double dist,
405  DistanceUnits unit,
406  unsigned int decimals) const;
407 
409 
412 
414  DtVector convertVelocityUnitNativeToDisplay(
415  const DtVector& vel,
416  VelocityUnits unit ) const;
417 
420  DtVector convertVelocityUnitDisplayToNative(
421  const DtVector& vel,
422  VelocityUnits unit) const;
423 
426  DtVector convertVelocitySystemAndUnitGeocentricToDisplay(
427  const DtVector& geocLoc,
428  const DtVector& geocVel,
429  VelocityUnits unit ) const;
430 
433  std::string convertVelocityUnitNativeToDisplayString(
434  const DtVector& vel,
435  VelocityUnits unit,
436  unsigned int decimals ) const;
437 
441  std::string convertVelocitySystemAndUnitGeocentricToDisplayString(
442  const DtVector& geocLoc,
443  const DtVector& geocVel,
444  VelocityUnits unit,
445  unsigned int decimals) const;
446 
448 
451 
453  DtVector convertAccelerationUnitNativeToDisplay(
454  const DtVector& accel,
455  AccelerationUnits unit ) const;
456 
459  DtVector convertAccelerationUnitDisplayToNative(
460  const DtVector& accel,
461  AccelerationUnits unit) const;
462 
465  std::string convertAccelerationUnitNativeToDisplayString(
466  const DtVector& accel,
467  AccelerationUnits unit,
468  unsigned int decimals ) const;
469 
471  DtVector convertAccelerationSystemAndUnitGeocentricToDisplay(
472  const DtVector& geocLoc,
473  const DtVector& accel,
474  AccelerationUnits unit ) const;
475 
478  std::string convertAccelerationSystemAndUnitGeocentricToDisplayString(
479  const DtVector& geocLoc, const DtVector& accel,
480  AccelerationUnits unit,
481  unsigned int decimals ) const;
482 
484 
487 
489  DtTaitBryan convertOrientationUnitNativeToDisplay(
490  const DtTaitBryan& ori,
491  OrientationUnits unit ) const;
492 
494  DtTaitBryan convertOrientationUnitDisplayToNative(
495  const DtTaitBryan& ori,
496  OrientationUnits unit ) const;
497 
509  std::vector<std::string> convertOrientationUnitNativeToDisplayStrings(
510  const DtTaitBryan& ori,
511  OrientationUnits unit,
512  unsigned int decimals,
513  NorthUnits northUnit,
514  bool formatPsi = false,
515  bool formatTheta = false,
516  bool formatPhi = false ) const;
517 
529  std::vector<DtUnicode> convertOrientationUnitNativeToNotatedDisplayStrings(
530  const DtTaitBryan& ori,
531  OrientationUnits unit,
532  unsigned int decimals,
533  NorthUnits northUnit,
534  bool formatPsi = false,
535  bool formatTheta = false,
536  bool formatPhi = false) const;
537 
539 
542 
544  DtVector convertRotationalVelocityUnitNativeToDisplay(
545  const DtVector& rotVel,
546  RotVelocityUnits unit ) const;
547 
549  DtVector convertRotationalVelocityUnitDisplayToNative(
550  const DtVector& rotVel,
551  RotVelocityUnits unit) const;
552 
554  std::string convertRotationalVelocityUnitNativeToDisplayString(
555  const DtVector& rotVel,
556  RotVelocityUnits unit,
557  unsigned int decimals ) const;
558 
560  DtVector convertRotationalVelocitySystemAndUnitGeocentricToDisplay(
561  const DtVector& rotVel,
562  RotVelocityUnits unit ) const;
563 
566  std::string
567  convertRotationalVelocitySystemAndUnitGeocentricToDisplayString(
568  const DtVector& rotVel,
569  RotVelocityUnits unit,
570  unsigned int decimals ) const;
571 
573 
574 
577 
579  double convertSpeedUnitNativeToDisplay(
580  const DtVector& velocity,
581  VelocityUnits unit ) const;
582 
584  double convertSpeedUnitNativeToDisplay(
585  double speed,
586  VelocityUnits unit ) const;
587 
589  double convertSpeedUnitDisplayToNative(
590  double speed,
591  VelocityUnits unit ) const;
592 
594  double convertSpeedSystemAndUnitGeocentricToDisplay(
595  const DtVector& geocLoc,
596  const DtVector& velocity,
597  VelocityUnits unit ) const;
598 
601  std::string convertSpeedUnitNativeToDisplayString(
602  const DtVector& velocity,
603  VelocityUnits unit,
604  unsigned int decimals ) const;
605 
608  std::string convertSpeedUnitNativeToDisplayString(
609  double speed,
610  VelocityUnits unit,
611  unsigned int decimals ) const;
612 
615  std::string convertSpeedSystemAndUnitGeocentricToDisplayString(
616  const DtVector& geocLoc,
617  const DtVector& velocity,
618  VelocityUnits unit,
619  unsigned int decimals ) const;
620 
622 
625 
628  double convertAccelerationMagnitudeUnitNativeToDisplay(
629  const DtVector& accel,
630  AccelerationUnits unit ) const;
631 
634  double convertAccelerationMagnitudeUnitNativeToDisplay(
635  double accel,
636  AccelerationUnits unit) const;
637 
639  double convertAccelerationMagnitudeUnitDisplayToNative(
640  double acc,
641  AccelerationUnits unit) const;
642 
645  std::string convertAccelerationMagnitudeUnitNativeToDisplayString(
646  const DtVector& accel,
647  AccelerationUnits unit,
648  unsigned int decimals ) const;
649 
652  std::string convertAccelerationMagnitudeUnitNativeToDisplayString(
653  double accel,
654  AccelerationUnits unit,
655  unsigned int decimals ) const;
656 
659  double convertAccelerationMagnitudeSystemAndUnitGeocentricToDisplay(
660  const DtVector& geocLoc,
661  const DtVector& accel,
662  AccelerationUnits unit ) const;
663 
666  std::string
667  convertAccelerationMagnitudeSystemAndUnitGeocentricToDisplayString(
668  const DtVector& geocLoc,
669  const DtVector& accel,
670  AccelerationUnits unit,
671  unsigned int decimals ) const;
673 
674 
676 
679 
681  DtTaitBryan convertHeadingPitchRollSystemAndUnitGeocentricToDisplay(
682  const DtVector& geocLoc,
683  const DtTaitBryan& geocOri,
684  OrientationUnits unit ) const;
685 
689  std::vector<DtUnicode>
690  convertHeadingPitchRollSystemAndUnitGeocentricToNotatedDisplayStrings(
691  const DtVector& geocLoc,
692  const DtTaitBryan& geocOri,
693  OrientationUnits orientationUnit,
694  DtUnicode orientationUnitNotation,
695  unsigned int decimals,
696  NorthUnits northUnit,
697  DtUnicode northUnitNotation,
698  bool suppressMagneticNorthNotation,
699  bool formatHeading = false,
700  bool formatPitch = false,
701  bool formatRoll = false ) const;
702 
706  std::vector<DtUnicode>
707  convertHeadingPitchRollSystemAndUnitGeocentricToNotatedDisplayStrings(
708  const DtVector& geocLoc,
709  const DtTaitBryan& geocOri,
710  OrientationUnits orientationUnit,
711  unsigned int decimals,
712  NorthUnits northUnit,
713  bool formatHeading = false,
714  bool formatPitch = false,
715  bool formatRoll = false ) const;
716 
728  std::vector<std::string>
729  convertHeadingPitchRollSystemAndUnitGeocentricToDisplayStrings(
730  const DtVector& geocLoc,
731  const DtTaitBryan& geocOri,
732  OrientationUnits unit,
733  unsigned int decimals,
734  NorthUnits northUnit,
735  bool formatHeading = false,
736  bool formatPitch = false,
737  bool formatRoll = false ) const;
738 
740 
741 
744 
746  double convertTemperatureUnitNativeToDisplay(
747  double temperature,
748  TemperatureUnits unit) const;
749 
751  double convertTemperatureUnitDisplayToNative(
752  double temperature,
753  TemperatureUnits unit) const;
754 
757  std::string convertTemperatureUnitNativeToDisplayString(
758  double temperature,
759  TemperatureUnits unit,
760  unsigned int decimals) const;
761 
763 
766 
768  double convertPressureUnitNativeToDisplay(
769  double pressure,
770  PressureUnits unit) const;
771 
773  double convertPressureUnitDisplayToNative(
774  double pressure,
775  PressureUnits unit) const;
776 
779  std::string convertPressureUnitNativeToDisplayString(
780  double pressure,
781  PressureUnits unit,
782  unsigned int decimals) const;
783 
785 
786  protected:
787 
796  static std::string orientationValueToText( double value, int decimals, bool additionalFormatting );
797 
807  static std::string orientationValuesToText(
808  const DtVector& ori,
809  int decimals,
810  bool formatPsi = false,
811  bool formatTheta = false,
812  bool formatPhi = false );
813 
815  static std::string valueToText( double value, int decimals );
816 
819  static std::string valuesToText( const DtVector& localVelocity, int decimals );
820 
821  protected:
822 
826 
827  // These notations are used for generating display strings. The converter
828  // caches these notations, and keeps them in sync with the shared display
829  // units settings, so that display strings can be created without a mutex lock.
830  std::unordered_map<makArchives::DtDisplayUnitsSettingsRecord::DistanceUnits, DtUnicode> myDistanceNotationCache;
831  std::unordered_map<makArchives::DtDisplayUnitsSettingsRecord::DistanceUnits, DtUnicode> myOrientationNotationCache;
832  std::unordered_map<makArchives::DtDisplayUnitsSettingsRecord::DistanceUnits, DtUnicode> myNorthNotationCache;
833  };
834 
835 
839  : public DtBaseSharedSettingsManager<makArchives::DtDisplayUnitsSettingsRecord,
840  DtSharedDisplayUnitsSettings>
841  {
842  public:
843 
845  static DtDisplayUnitsSettingsManager& instance( DtDe& de );
846 
849 
851  void connectInputSignals();
852 
855 
863  void setCoordinateSystem( DtDisplayUnitsConverter::CoordSys cs );
864 
870  void setDisplayUnitUnit(
871  const DtUnicode& displayUnitCollectionName,
872  const DtUnicode& displayUnitName,
873  unsigned int unitEnumValue
874  );
875 
880  void setDisplayUnitDecimals(
881  const DtUnicode& displayUnitCollectionName,
882  const DtUnicode& displayUnitName,
883  unsigned int decimals
884  );
885 
887 
890 
893  virtual void setFromRecord( const makArchives::DtDisplayUnitsSettingsRecord& rec );
894 
896 
899  void setSuppressMagneticNorthNotationEnabled(bool isEnabled);
900 
903  bool isSuppressMagneticNorthNotationEnabled() const;
904 
906  const DtDisplayUnitsConverter& converter();
907 
910  void slot_quit();
911 
912  protected:
913 
915  template <typename ManagerClass>
916  friend ManagerClass& defaultManagerInstanceFunction( DtDe&, bool );
917 
919  template <typename ManagerClass>
920  friend void defaultManagerRegisterInstanceFunction( DtDe&, ManagerClass* );
921 
924 
931  virtual void slot_initializeSynchronizer();
932 
937  virtual void slot_displayEngineAdded( const DtDeRecord& deRec );
938 
940  virtual void slot_backupRestored(const DtSettingsBackup* s);
941 
942  protected:
943 
945 
946  DtDisplayUnitsSettingsSynchronizerAgent* mySettingsSynchronizer;
947 
948  };
949 
950 }
DtDisplayUnitsConverter * myDisplayUnitsConverter
Definition: DtDisplayUnitsSettingsManager.h:944
Base class for shared settings managers. Extends the functionality provided by the DtCommonBaseSettin...
Definition: DtBaseSettingsManager.h:332
VelocityUnits
Enumeration of the different velocity units.
Definition: DtDisplayUnitsSettingsRecord.h:72
A unicode string. DtUnicode stores a UTF-16 encoded unicode string. Code Point, a Unicode character...
Definition: DtUnicode.h:33
std::unordered_map< makArchives::DtDisplayUnitsSettingsRecord::DistanceUnits, DtUnicode > myOrientationNotationCache
Definition: DtDisplayUnitsSettingsManager.h:831
makArchives::DtDisplayUnitsSettingsRecord::NorthUnits NorthUnits
Definition: DtDisplayUnitsSettingsManager.h:73
Abstract interface class for all coordinate system displays.
Definition: DtCoordinateDisplay.h:24
A Record of an IG instance.
Definition: DtDeRecord.h:24
Contains the interface to the world magnetic model. The class utilizes the WMM c code provided by NOA...
Definition: DtWorldMagneticModel.h:41
makArchives::DtDisplayUnitsSettingsRecord::OrientationUnits OrientationUnits
Definition: DtDisplayUnitsSettingsManager.h:69
DtDisplayUnitsSettingsSynchronizerAgent * mySettingsSynchronizer
Definition: DtDisplayUnitsSettingsManager.h:946
NorthUnits
Enumeration of the different north units.
Definition: DtDisplayUnitsSettingsRecord.h:150
makArchives::DtDisplayUnitsSettingsRecord::PressureUnits PressureUnits
Definition: DtDisplayUnitsSettingsManager.h:72
The shared settings manager, is the global object responsible for managing any shared settings object...
Definition: DtSharedSettingsManager.h:42
CoordSys
Enumeration of the different coordinate system types.
Definition: DtDisplayUnitsSettingsRecord.h:30
std::unordered_map< makArchives::DtDisplayUnitsSettingsRecord::DistanceUnits, DtUnicode > myDistanceNotationCache
Definition: DtDisplayUnitsSettingsManager.h:830
makArchives::DtDisplayUnitsSettingsRecord::RotVelocityUnits RotVelocityUnits
Definition: DtDisplayUnitsSettingsManager.h:70
PressureUnits
Enumeration of the different pressure units.
Definition: DtDisplayUnitsSettingsRecord.h:137
DistanceUnits
Enumeration of the different distance units.
Definition: DtDisplayUnitsSettingsRecord.h:56
Contains the DtSharedDisplayUnitsSettings class declaration.
RotVelocityUnits
Enumeration of the different rotational velocity units.
Definition: DtDisplayUnitsSettingsRecord.h:112
makArchives::DtDisplayUnitsSettingsRecord::AccelerationUnits AccelerationUnits
Definition: DtDisplayUnitsSettingsManager.h:68
DT_DLL_VRVCORE double distance(const makVrv::DtCoordinateSystem &, const DtVector &from, const DtVector &to)
Returns the distance from the two points. Coordinates are in local database coordinates The coordinat...
DT_DLL_vrfutil double angle(double vec1[3], double vec2[3])
makArchives::DtDisplayUnitsSettingsRecord::DistanceUnits DistanceUnits
Definition: DtDisplayUnitsSettingsManager.h:66
#define DT_DLL_VRVCORE
Definition: vrvCore.h:20
std::unordered_map< makArchives::DtDisplayUnitsSettingsRecord::DistanceUnits, DtUnicode > myNorthNotationCache
Definition: DtDisplayUnitsSettingsManager.h:832
void defaultManagerRegisterInstanceFunction(DtDe &de, ManagerClass *mgr)
Default implementation of how to register a manager, especially necessary when overriding the manager...
Definition: DtDe.h:866
Provides a method of doign settings backup.
Definition: DtSettingsBackup.h:23
Utility class for doing global unit conversion. All conversions functions use the following naming co...
Definition: DtDisplayUnitsSettingsManager.h:61
The DtCoordinateSystem is used to manage the current coordinate system of the scene.
Definition: DtCoordinateSystem.h:40
OrientationUnits
Enumeration of the different orientation units.
Definition: DtDisplayUnitsSettingsRecord.h:101
Manager for the display units settings.
Definition: DtDisplayUnitsSettingsManager.h:838
TemperatureUnits
Enumeration of the different temperature units.
Definition: DtDisplayUnitsSettingsRecord.h:126
makArchives::DtDisplayUnitsSettingsRecord::TemperatureUnits TemperatureUnits
Definition: DtDisplayUnitsSettingsManager.h:71
ManagerClass & defaultManagerInstanceFunction(DtDe &de, bool allowedInSlave)
default Manager instance function. Manager requirements: 1) Static instance function 2) Protected DtS...
Definition: DtDe.h:828
makArchives::DtDisplayUnitsSettingsRecord::VelocityUnits VelocityUnits
Definition: DtDisplayUnitsSettingsManager.h:67
makArchives::DtDisplayUnitsSettingsRecord::CoordSys CoordSys
Definition: DtDisplayUnitsSettingsManager.h:65
The DtDe is the core component of any VR-Vantage application. It owns a DtRenderer, DtDeCommunicator, as well as a DtDisplay and other things.
Definition: DtDe.h:70
const DtCoordinateSystem & myCoordinateSystem
Definition: DtDisplayUnitsSettingsManager.h:824
DtWorldMagneticModel & myWorldMagneticModel
Definition: DtDisplayUnitsSettingsManager.h:823
The makVrv::DtSettingsBackup is a lightweight class that must be subclassed from if an object wants t...
AccelerationUnits
Enumeration of the different acceleration units.
Definition: DtDisplayUnitsSettingsRecord.h:88
Contains the display units shared settings.
Definition: DtDisplayUnitsSettingsRecord.h:25
Contains the DtBaseSettingsManager class declaration.
Contains DLL export macros.
DtSharedSettingsManager & mySharedSettingsManager
Definition: DtDisplayUnitsSettingsManager.h:825

Document ID: Generated on Thu Jun 1 17:58:13 EDT 2023 from SVN revision 255404
Copyright © 2005-2021 MAK Technologies. All Rights Reserved (www.mak.com)