Files

380 lines
18 KiB
C#
Raw Permalink Normal View History

2026-04-17 14:55:32 -04:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DTS.Slice.PedestrianAndHeadReports
{
public class MeasurementUnit
{
private string _mainDisplayUnit;
public string MainDisplayUnit
{
get { return _mainDisplayUnit; }
set { _mainDisplayUnit = value; }
}
private string[] _alternateDisplayUnits;
public string[] AlternateDisplayUnits
{
get { return _alternateDisplayUnits; }
set { _alternateDisplayUnits = value; }
}
private string _dimension = "00";
public string Dimension
{
get { return _dimension; }
set { _dimension = value; }
}
public MeasurementUnit(string mainUnit, string[] alternateUnits, MeasurementUnit.UnitConversion [] conversions, string dimension)
{
MainDisplayUnit = mainUnit;
AlternateDisplayUnits = alternateUnits;
UnitConversions = conversions;
Dimension = dimension;
}
public MeasurementUnit(System.Xml.XmlElement node)
{
foreach (var childnode in node.ChildNodes)
{
System.Xml.XmlElement elem = childnode as System.Xml.XmlElement;
if (null == elem) { continue; }
try
{
switch (elem.Name)
{
case "MainDisplayUnit":
MainDisplayUnit = elem.InnerText;
break;
case "AlternateDisplayUnits":
{
var nodes = elem.GetElementsByTagName("String");
List<string> aunits = new List<string>();
foreach (var node2 in nodes)
{
System.Xml.XmlElement element = node2 as System.Xml.XmlElement;
if (null == element) { continue; }
try
{
aunits.Add(element.InnerText);
}
catch (System.Exception) { }
}
AlternateDisplayUnits = aunits.ToArray();
}
break;
case "Dimension":
{
Dimension = elem.InnerText;
}
break;
case "UnitConversions":
{
var nodes = elem.GetElementsByTagName("UnitConversion");
foreach (var node2 in nodes)
{
System.Xml.XmlElement element = node2 as System.Xml.XmlElement;
if (null == element) { continue; }
try
{
_unitConversions.Add(new UnitConversion(element));
}
catch (System.Exception) { }
}
}
break;
default:
System.Diagnostics.Trace.WriteLine("didn't handle " + elem.Name);
break;
}
}
catch (System.Exception ex)
{
DTS.Utilities.Logging.APILogger.Log("Failed to parse xml", ex, elem.Name, elem.Value);
}
}
}
public bool UnitMatches(string unit)
{
unit = unit.Trim().ToLower();
if (MainDisplayUnit.ToLower() == unit) { return true; }
foreach (string aunit in AlternateDisplayUnits)
{
if (aunit.ToLower() == unit) { return true; }
}
return false;
}
public double GetScalerConversion(string newUnit)
{
if (UnitMatches(newUnit)) { return 1D; }
foreach (var uc in UnitConversions)
{
if (uc.UnitMatches(newUnit)) { return uc.Scaler; }
}
throw new InvalidCastException(string.Format("No conversion available from {0} to {1}", newUnit, MainDisplayUnit));
}
public double GetScalerConversionFrom(string oldUnit)
{
if (UnitMatches(oldUnit)) { return 1D; }
foreach (var uc in UnitConversions)
{
if (uc.UnitMatches(oldUnit)) { return 1D / uc.Scaler; }
}
throw new InvalidCastException(string.Format("No conversion available from {0} to {1}", oldUnit, MainDisplayUnit));
}
private List<UnitConversion> _unitConversions = new List<UnitConversion>();
public UnitConversion[] UnitConversions { get { return _unitConversions.ToArray(); } set { _unitConversions = new List<UnitConversion>(value); } }
public class UnitConversion
{
private string _unit;
public string Unit { get { return _unit; } set { _unit = value; } }
private double _scaler;
public double Scaler { get { return _scaler; } set { _scaler = value; } }
public bool UnitMatches(string unit)
{
return (Unit.ToLower() == unit.Trim().ToLower());
}
public void WriteToXML(System.Xml.XmlWriter writer)
{
writer.WriteStartElement("UnitConversion");
DTS.DASLib.Service.XMLHelper.PutString(writer, "Unit", Unit);
DTS.DASLib.Service.XMLHelper.PutDouble(writer, "Scaler", Scaler);
writer.WriteEndElement();
}
public UnitConversion(string unit, double scaler) { Unit = unit; Scaler = scaler; }
public UnitConversion(System.Xml.XmlElement node)
{
foreach (var childnode in node.ChildNodes)
{
System.Xml.XmlElement elem = childnode as System.Xml.XmlElement;
if (null == elem) { continue; }
try
{
switch (elem.Name)
{
case "Unit":
Unit = elem.InnerText;
break;
case "Scaler":
Scaler = double.Parse(elem.InnerText);
break;
default:
System.Diagnostics.Trace.WriteLine("didn't handle " + elem.Name);
break;
}
}
catch (System.Exception ex)
{
DTS.Utilities.Logging.APILogger.Log("Failed to parse xml", ex, elem.Name, elem.Value);
}
}
}
}
public void WriteToXML(System.Xml.XmlWriter writer)
{
writer.WriteStartElement("MeasurementUnit");
DTS.DASLib.Service.XMLHelper.PutString(writer, "MainDisplayUnit", MainDisplayUnit);
DTS.DASLib.Service.XMLHelper.PutString(writer, "Dimension", Dimension);
writer.WriteStartElement("AlternateDisplayUnits");
foreach (var unit in AlternateDisplayUnits)
{
writer.WriteStartElement("String");
writer.WriteValue(unit);
writer.WriteEndElement();
}
writer.WriteEndElement();
//DTS.DASLib.Service.XMLHelper.PutString(writer, "AlternateDisplayUnits", string.Join("×", AlternateDisplayUnits));
writer.WriteStartElement("UnitConversions");
foreach (var uc in UnitConversions) { uc.WriteToXML(writer); }
writer.WriteEndElement();
writer.WriteEndElement();
}
public override string ToString()
{
return MainDisplayUnit;
}
}
public class MeasurementUnitList
{
private static MeasurementUnitList _instance;
private static object MyLock = new object();
private Dictionary<string, MeasurementUnit> _units = new Dictionary<string, MeasurementUnit>();
private MeasurementUnit [] GetAllUnits(){ return _units.Values.ToArray();}
public static MeasurementUnit[] GetAllMeasurementUnits()
{
lock (MyLock)
{
if (null == _instance) { _instance = new MeasurementUnitList(); }
return _instance.GetAllUnits();
}
}
public static MeasurementUnit GetMeasurementUnit(string key)
{
lock (MyLock)
{
if (null == _instance) { _instance = new MeasurementUnitList(); }
var units = from u in _instance.GetAllUnits() where u.UnitMatches(key) select u;
if (units.Count() > 0) { return units.First(); }
else
{
_instance._units.Add(key, new MeasurementUnit(key, new string[] { key }, new MeasurementUnit.UnitConversion[0], "00"));
return _instance._units[key];
}
}
}
private MeasurementUnitList()
{
LoadAllMeasurementUnits();
}
public void SaveToXML()
{
StringBuilder sb = new StringBuilder();
System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings();
settings.OmitXmlDeclaration = false;
settings.Indent = true;
using (System.Xml.XmlWriter xmlWriter = System.Xml.XmlTextWriter.Create(sb, settings))
{
xmlWriter.WriteStartDocument(true);
xmlWriter.WriteStartElement("MeasurementUnits");
var e1 = _units.GetEnumerator();
while (e1.MoveNext())
{
e1.Current.Value.WriteToXML(xmlWriter);
}
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
xmlWriter.Flush();
}
System.IO.File.WriteAllText(FILE_NAME, sb.ToString());
}
private void CreateDefaultMeasurementUnitsFile()
{
MeasurementUnit mu = new MeasurementUnit("G", new string[] { "G" }, new MeasurementUnit.UnitConversion[] {
new MeasurementUnit.UnitConversion("m/sec^2", 9.80665D), new MeasurementUnit.UnitConversion("ft/s^2", 32.17405D)}, "AC");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("m/sec^2", new string[] { "m/sec^2", "m/s^2", "m/sec2", "m/s2" }, new MeasurementUnit.UnitConversion[] {
new MeasurementUnit.UnitConversion("G", .101971621), new MeasurementUnit.UnitConversion("ft/s^2", 3.28084D),
new MeasurementUnit.UnitConversion("cm/s^2", 100D)}, "AC");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("deg", new string[] { "deg", "degree", "degrees" }, new MeasurementUnit.UnitConversion[0], "AN");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("Nm", new string[] { "Nm", "N -m", "N-m" }, new MeasurementUnit.UnitConversion[0], "DC");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("mm", new string[] { "mm", "M-m", "M -m" }, new MeasurementUnit.UnitConversion[0], "DC");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("deg/sec", new string[] { "deg/sec", "degrees/sec", "d/sec", "deg/s" }, new MeasurementUnit.UnitConversion[0], "AA");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("kN", new string[] { "kn", "K-n", "k -n", "kilonewton" }, new MeasurementUnit.UnitConversion[]{
new MeasurementUnit.UnitConversion("N", 1000)
}, "FO");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("N", new string[] { "n", "newton" }, new MeasurementUnit.UnitConversion[]{
new MeasurementUnit.UnitConversion("kN", .001D)
}, "FO");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("ft/s^2", new string[] { "ft/s2", "ft/s^2", "ft/sec^2" }, new MeasurementUnit.UnitConversion[] {
new MeasurementUnit.UnitConversion("cm/s^2", 30.48D), new MeasurementUnit.UnitConversion("m/sec^2", .3048D)}, "AC");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("cm/s^2", new string[] { "cm/s^2", "cm/s2", "cm/sec^2" }, new MeasurementUnit.UnitConversion[]{
new MeasurementUnit.UnitConversion("ft/s^2", .032808D), new MeasurementUnit.UnitConversion("m/sec^2", .01D)
}, "AC");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("Ampere", new string[] { "Amp", "Amper", "Amps" }, new MeasurementUnit.UnitConversion[] {
new MeasurementUnit.UnitConversion("mAmp", 1000D)
}, "CU");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("mAmp", new string[] { "mAmp", "m Amp", "milliampere", "milliamp" }, new MeasurementUnit.UnitConversion[]{
new MeasurementUnit.UnitConversion("Ampere", .001D)}, "CU");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("Hz", new string[] { "hertz", "cycle/sec", "cyc/s" }, new MeasurementUnit.UnitConversion[] {
new MeasurementUnit.UnitConversion("kHz", .001D)}, "FR");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("kHz", new string[] { "kHertz", "kilohertz" }, new MeasurementUnit.UnitConversion[] {
new MeasurementUnit.UnitConversion("Hz", 1000D)}, "FR");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("m", new string[] { "m", "Meter" }, new MeasurementUnit.UnitConversion[] {
new MeasurementUnit.UnitConversion("mm", 100D)},"DC");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("V", new string[] { "volt", "VO" }, new MeasurementUnit.UnitConversion[] {
new MeasurementUnit.UnitConversion("mV", 100D)}, "VO");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("mV", new string[] { "mv", "millivolt", "mVolt" }, new MeasurementUnit.UnitConversion[]{
new MeasurementUnit.UnitConversion("V", .001D)}, "VO");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
mu = new MeasurementUnit("degC", new string[] { "C", "degC", "Celsius" }, new MeasurementUnit.UnitConversion[0], "??");
if (!_units.ContainsKey(mu.MainDisplayUnit)) { _units.Add(mu.MainDisplayUnit, mu); }
SaveToXML();
}
private void LoadAllMeasurementUnits()
{
if (!System.IO.File.Exists(FILE_NAME))
{
CreateDefaultMeasurementUnitsFile();
}
else
{
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
string xml = System.IO.File.ReadAllText(FILE_NAME);
doc.LoadXml(xml);
var nodes = doc.GetElementsByTagName("MeasurementUnits");
foreach (var node in nodes)
{
System.Xml.XmlElement element = node as System.Xml.XmlElement;
if (null == element) { continue; }
foreach (var childNode in element.GetElementsByTagName("MeasurementUnit"))
{
System.Xml.XmlElement elem = childNode as System.Xml.XmlElement;
if (null == elem) { continue; }
LoadMeasurementUnit(elem);
}
}
CreateDefaultMeasurementUnitsFile();
}
}
private const string FILE_NAME = "MeasurementUnits.xml";
private void LoadMeasurementUnit(System.Xml.XmlElement node)
{
try
{
MeasurementUnit mu = new MeasurementUnit(node);
if (!_units.ContainsKey(mu.MainDisplayUnit))
{
_units.Add(mu.MainDisplayUnit, mu);
}
else
{
_units[mu.MainDisplayUnit] = mu;
}
}
catch (System.Exception ex) { DTS.Utilities.Logging.APILogger.Log("failed to get node from measurement unit db, ", ex); }
}
}
}