This commit is contained in:
2026-04-17 14:55:32 -04:00
commit bc3ac1d4c9
18017 changed files with 4371742 additions and 0 deletions

View File

@@ -0,0 +1,544 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using DTS.Common.Base;
using DTS.Common.DataModel;
using DTS.Common.ISO;
namespace DataPROWin7.DataModel
{
public class TestObjectTemplate : BasePropertyChanged, IComparable<TestObjectTemplate>
{
#region enums and constants
public enum Tags
{
ChannelCountText,
PossibleChannelCountText,
TemplateName,
TemplateDescription,
TestObject,
TestObjectType,
TemplateAllUIChannels,
TemplateZones,
AvailableTestObjectTypes,
TestObjectIndex,
TestObjectTypeIndex,
CurrentZone,
CurrentZoneIndex,
AreZoneControlsEnabled,
TemplateAllChannels,
RequiredChannels
}
private enum GroupTemplateChannelFields
{
TestObjectNumber,
NameOfTheChannel,
LaboratoryChannelCode,
CustomerChannelCode,
Comments1,
Location,
Dimension,
Direction,
ChannelFrequencyClass,
Unit,
ReferenceSystem,
TransducerType,
TransducerId,
PreFilterType,
CutOffFrequency,
ChannelAmplitudeClass,
ReferenceChannel,
ReferenceChannelName,
DataSource,
DataStatus,
SamplingInterval,
BitResolution,
TimeOfFirstSample,
NumberOfSamples,
OffsetPostTest,
TransducerNaturalFrequency,
TransducerDampingRatio,
Comments,
FirstGlobalMaximumValue,
TimeOfMaximumValue,
FirstGlobalMinimumValue,
TimeOfMinimumValue,
StartOffsetInterval,
EndOffsetInterval,
MMEChannelId,
MMEChannelType,
Required,
DisplayOrder,
LocalOnly
}
private enum GroupTemplateFields
{
TemplateName,
Icon,
Description,
LocalOnly,
Version,
LastModifiedBy,
LastModified,
CRC32,
TestObjectType,
TestObject,
ParentTemplate,
SysBuilt,
OriginalTemplateName,
Embedded
};
#endregion
#region properties
private string _lastModifiedBy = "N/A";
public string LastModifiedBy
{
get => _lastModifiedBy;
set => SetProperty(ref _lastModifiedBy, value, "LastModifiedBy");
}
private DateTime _lastModified = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
public DateTime LastModified
{
get => _lastModified;
set => SetProperty(ref _lastModified, value, "LastModified");
}
private DTS.Common.ISO.TestObjectTemplate _template;
private List<TestObjectTemplateChannel> _requiredChannels = new List<TestObjectTemplateChannel>();
public List<TestObjectTemplateChannel> RequiredChannels
{
get => _requiredChannels;
set { _requiredChannels = value; OnPropertyChanged("RequiredChannels"); }
}
private string _templateParent = "";
public string TemplateParent
{
get => _templateParent;
set => SetProperty(ref _templateParent, value, "TemplateParent");
}
private bool _sysBuilt;
public bool SysBuilt
{
get => _sysBuilt;
set => SetProperty(ref _sysBuilt, value, "SysBuilt");
}
private bool _embedded;
public bool Embedded
{
get => _embedded;
set
{
_embedded = value;
if (null != _template) { _template.Embedded = value; }
}
}
private string _originalTemplateName = "";
public string OriginalTemplateName
{
get => _originalTemplateName;
set
{
_originalTemplateName = value;
if (null != _template) { _template.OriginalTemplateName = value; }
}
}
private string _name;
public string TemplateName
{
get => _name;
set => SetProperty(ref _name, value, Tags.TemplateName.ToString());
}
private string _desc;
public string TemplateDescription
{
get => _desc;
set => SetProperty(ref _desc, value, Tags.TemplateDescription.ToString());
}
private bool _bLocalOnly;
public bool IsLocalOnly
{
get => _bLocalOnly;
set => SetProperty(ref _bLocalOnly, value, "IsLocalOnly");
}
private MMETestObjects _testObject;
public MMETestObjects TestObject
{
get => _testObject;
set
{
SetProperty(ref _testObject, value, Tags.TestObject.ToString());
if (null == _testObject) return;
AvailableTestObjectTypes = ApplicationProperties.IsoDb.GetUniquePossibleChannelTypes(TestObjectTemplateChannel.NONISOCHANNELTYPE);
if (AvailableTestObjectTypes.Length > 0) { TestObjectTypeIndex = 0; }
else { TestObjectTypeIndex = -1; }
}
}
private string _testObjectType;
public string TestObjectType
{
get => _testObjectType;
set
{
SetProperty(ref _testObjectType, value, Tags.TestObjectType.ToString());
_channels = new List<MMEPossibleChannels>(ApplicationProperties.IsoDb.GetPossibleChannelsForType(_testObjectType));
TemplateAllChannels = _channels.Select(pc => new TestObjectTemplateChannel(new TestObjectTemplateChannel(pc), /*ref db,*/ _template)).ToArray();
AssignOrders();
OnPropertyChanged(Tags.PossibleChannelCountText.ToString());
OnPropertyChanged(Tags.ChannelCountText.ToString());
OnPropertyChanged(Tags.TestObjectTypeIndex.ToString());
}
}
public void AssignOrders()
{
var allChannels = TemplateAllChannels.ToList();
if (!allChannels.Any()) { return; }
allChannels.Sort();
var maxDisplayOrder = (from ch in allChannels select ch.DisplayOrder).Max();
foreach (var ch in allChannels)
{
if (-1 == ch.DisplayOrder)
{
ch.DisplayOrder = ++maxDisplayOrder;
}
}
}
private List<MMEPossibleChannels> _channels = new List<MMEPossibleChannels>();
//11287 Out of memory exception when importing large CSV Test Setup files
//reduced one collection of channels to refer to channel super class members
public TestObjectTemplateChannel[] TemplateAllChannels
{
get
{
var channels = (from ch in _allUIChannels select ch.Channel).ToArray();
return channels;
}
set
{
TemplateAllUIChannels = value.Select(c => new TemplateChannelUI(c)).ToArray();
}
}
private List<TemplateChannelUI> _allUIChannels = new List<TemplateChannelUI>();
public TemplateChannelUI[] TemplateAllUIChannels
{
get => _allUIChannels.ToArray();
set => SetProperty(ref _allUIChannels, new List<TemplateChannelUI>(value), Tags.TemplateAllUIChannels.ToString());
}
private List<MMETestObjects> _testObjects = new List<MMETestObjects>();
private List<string> _availableTestObjectTypes = null;
public string[] AvailableTestObjectTypes
{
get
{
if (null != _availableTestObjectTypes) return _availableTestObjectTypes.ToArray();
if (null == TestObject) { return new string[0]; }
_availableTestObjectTypes = new List<string>(ApplicationProperties.IsoDb.GetTestObjectTypeForTestObject(TestObject.Test_Object));
return _availableTestObjectTypes.ToArray();
}
set => SetProperty(ref _availableTestObjectTypes, new List<string>(value), Tags.AvailableTestObjectTypes.ToString());
}
private int _testObjectTypeIndex = -1;
public int TestObjectTypeIndex
{
get
{
if (string.IsNullOrEmpty(TestObjectType)) { return -1; }
return _availableTestObjectTypes.IndexOf(TestObjectType);
}
set
{
TestObjectType = value >= 0 ? _availableTestObjectTypes[value] : null;
SetProperty(ref _testObjectTypeIndex, value, Tags.TestObjectTypeIndex.ToString());
TemplateAllChannels = _channels.Select(pc => new TestObjectTemplateChannel(new TestObjectTemplateChannel(pc), /*ref db,*/ _template)).ToArray();
AssignOrders();
}
}
#endregion
#region methods
public void MarkChanged(string tag)
{
OnPropertyChanged(tag);
}
public int CompareTo(TestObjectTemplate rhs)
{
if (null == rhs) { return 1; }
return this == rhs ? 0 : string.Compare(TemplateName, rhs.TemplateName, StringComparison.Ordinal);
}
public override string ToString()
{
return Embedded ? OriginalTemplateName : TemplateName;
}
public DTS.Common.ISO.TestObjectTemplate ToISOTestObjectTemplate()
{
var template = new DTS.Common.ISO.TestObjectTemplate(TemplateName, IsLocalOnly)
{
Description = TemplateDescription,
OriginalTemplateName = OriginalTemplateName,
Embedded = Embedded,
Icon = "",
LocalOnly = IsLocalOnly,
TestObject = TestObject.Test_Object,
TestObjectType = TestObjectType
};
template.TemplateParent = TemplateParent;
template.Channels = TemplateAllChannels;
template.SysBuilt = SysBuilt;
return template;
}
#endregion
#region constructors and initialization
public TestObjectTemplate(TestObjectTemplate copy, ref ISO13499FileDb db)
{
if (null != copy._template) { _template = new DTS.Common.ISO.TestObjectTemplate(copy._template, ref db); }
TemplateDescription = copy.TemplateDescription;
TemplateParent = copy.TemplateParent;
TemplateName = copy.TemplateName;
LastModified = copy.LastModified;
LastModifiedBy = copy.LastModifiedBy;
TestObject = copy.TestObject;
TestObjectType = copy.TestObjectType;
foreach (var c in copy.RequiredChannels)
{
RequiredChannels.Add(new TestObjectTemplateChannel(c, /*ref db,*/ _template));
}
TemplateAllChannels = copy.TemplateAllChannels.Select(c => new TestObjectTemplateChannel(c, /*ref db,*/ _template)).ToArray();
SysBuilt = copy.SysBuilt;
Embedded = copy.Embedded;
OriginalTemplateName = copy.OriginalTemplateName;
}
public TestObjectTemplate(DTS.Common.ISO.TestObjectTemplate template, ref ISO13499FileDb db)
{
Initialize(template, ref db, null);
}
public TestObjectTemplate(DTS.Common.ISO.TestObjectTemplate template, ref ISO13499FileDb db, List<MMETestObjects> testObjects)
{
Initialize(template, ref db, testObjects);
}
private void Initialize(DTS.Common.ISO.TestObjectTemplate template, ref ISO13499FileDb db, List<MMETestObjects> testObjects)
{
_template = template;
TemplateDescription = template.Description;
TemplateName = template.TemplateName;
LastModified = template.LastModified;
LastModifiedBy = template.LastModifiedBy;
//if a list of test objects is provided, check if the test object we wish is in the list, if so use it
var bFoundTestObject = false;
if (null != testObjects)
{
var matches = from to in testObjects where to.Test_Object == template.TestObject select to;
var mmeTestObjectses = matches as MMETestObjects[] ?? matches.ToArray();
if (mmeTestObjectses.Any())
{
TestObject = mmeTestObjectses[0];
bFoundTestObject = true;
}
}
if (!bFoundTestObject)
{
TestObject = ApplicationProperties.IsoDb.GetTestObjectByIso(template.TestObject);
}
TestObjectType = template.TestObjectType;
OriginalTemplateName = template.OriginalTemplateName;
Embedded = template.Embedded;
TemplateAllChannels = template.Channels.Select(c => new TestObjectTemplateChannel(c, /*ref db,*/ _template)).ToArray();
TemplateParent = template.TemplateParent;
SysBuilt = template.SysBuilt;
}
public TestObjectTemplate()
{
TemplateName = string.Empty;
TemplateDescription = string.Empty;
TemplateParent = string.Empty;
TestObject = ApplicationProperties.IsoDb.GetTestObjects(false).FirstOrDefault();
}
#endregion
#region XML Serialization
public static DTS.Common.ISO.TestObjectTemplate ReadXML(System.Xml.XmlElement root, Dictionary<long, MMEPossibleChannels> importChannels)
{
var template = new DTS.Common.ISO.TestObjectTemplate("", false);
foreach (var node in root.ChildNodes)
{
if (node is System.Xml.XmlElement) { ProcessXMLElement(node as System.Xml.XmlElement, ref template, importChannels); }
}
return template;
}
private static void ProcessXMLElement(System.Xml.XmlElement node, ref DTS.Common.ISO.TestObjectTemplate template, Dictionary<long, MMEPossibleChannels> importChannels)
{
if (Enum.TryParse(node.Name, out GroupTemplateFields field))
{
switch (field)
{
case GroupTemplateFields.CRC32: template.CRC32 = Convert.ToInt32(node.InnerText, System.Globalization.CultureInfo.InvariantCulture); break;
case GroupTemplateFields.Description: template.Description = node.InnerText; break;
case GroupTemplateFields.Icon: template.Icon = node.InnerText; break;
case GroupTemplateFields.LastModified: template.LastModified = DateTime.Parse(node.InnerText, System.Globalization.CultureInfo.InvariantCulture); break;
case GroupTemplateFields.LastModifiedBy: template.LastModifiedBy = node.InnerText; break;
case GroupTemplateFields.LocalOnly: template.LocalOnly = Convert.ToBoolean(node.InnerText); break;
case GroupTemplateFields.ParentTemplate: template.TemplateParent = node.InnerText; break;
case GroupTemplateFields.SysBuilt: template.SysBuilt = Convert.ToBoolean(node.InnerText); break;
case GroupTemplateFields.TemplateName: template.TemplateName = node.InnerText.Trim(); break;
case GroupTemplateFields.TestObject: template.TestObject = node.InnerText; break;
case GroupTemplateFields.TestObjectType: template.TestObjectType = node.InnerText; break;
case GroupTemplateFields.Version: template.Version = Convert.ToInt32(node.InnerText, System.Globalization.CultureInfo.InvariantCulture); break;
case GroupTemplateFields.OriginalTemplateName: template.OriginalTemplateName = node.InnerText; break;
case GroupTemplateFields.Embedded: template.Embedded = Convert.ToBoolean(node.InnerText); break;
default: throw new NotSupportedException("TestObjectTemplate::ProcessXMLElement unknown field: " + field.ToString());
}
}
else if (node.Name == "TemplateChannels")
{
foreach (var child in node.ChildNodes)
{
ProcessChannelXMLNode(child as System.Xml.XmlElement, ref template, importChannels);
}
var channels = new List<TestObjectTemplateChannel>(template.Channels);
channels.Sort();
template.Channels = channels.ToArray();
}
}
private static void ProcessChannelXMLNode(System.Xml.XmlElement root, ref DTS.Common.ISO.TestObjectTemplate template, Dictionary<long, MMEPossibleChannels> importChannels)
{
var existingChannels = new List<TestObjectTemplateChannel>(template.Channels);
var values = new Dictionary<GroupTemplateChannelFields, string>();
foreach (var child in root.ChildNodes)
{
var node = child as System.Xml.XmlElement;
if (null == node) { continue; }
if (Enum.TryParse(node.Name, out GroupTemplateChannelFields field)) { values[field] = node.InnerText; }
}
if (!values.ContainsKey(GroupTemplateChannelFields.MMEChannelId) || !values.ContainsKey(GroupTemplateChannelFields.MMEChannelType)) { return; }
if (!long.TryParse(values[GroupTemplateChannelFields.MMEChannelId], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out long id))
{
return;
}
if (!int.TryParse(values[GroupTemplateChannelFields.MMEChannelType], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out int cType))
{
return;
}
MMEPossibleChannels mChannel;
if (cType == (int)MMEPossibleChannels.MMEChannelTypes.SQL && importChannels.ContainsKey(id))
{
mChannel = importChannels[id];
}
else { mChannel = ApplicationProperties.IsoDb.GetPossibleChannel(id, cType); }
if (null == mChannel) { return; }
var channel = new TestObjectTemplateChannel(mChannel);
using (var enumeratorGroupChannelFieldSettings = values.GetEnumerator())
{
while (enumeratorGroupChannelFieldSettings.MoveNext())
{
switch (enumeratorGroupChannelFieldSettings.Current.Key)
{
case GroupTemplateChannelFields.BitResolution: break;
case GroupTemplateChannelFields.ChannelAmplitudeClass: break;
case GroupTemplateChannelFields.ChannelFrequencyClass: break;
case GroupTemplateChannelFields.Comments: break;
case GroupTemplateChannelFields.Comments1: break;
case GroupTemplateChannelFields.CustomerChannelCode: break;
case GroupTemplateChannelFields.CutOffFrequency: break;
case GroupTemplateChannelFields.DataSource: break;
case GroupTemplateChannelFields.DataStatus: break;
case GroupTemplateChannelFields.Dimension: break;
case GroupTemplateChannelFields.Direction: break;
case GroupTemplateChannelFields.DisplayOrder:
channel.DisplayOrder = Convert.ToInt32(enumeratorGroupChannelFieldSettings.Current.Value,
System.Globalization.CultureInfo.InvariantCulture);
break;
case GroupTemplateChannelFields.EndOffsetInterval: break;
case GroupTemplateChannelFields.FirstGlobalMaximumValue: break;
case GroupTemplateChannelFields.FirstGlobalMinimumValue: break;
case GroupTemplateChannelFields.LaboratoryChannelCode: break;
case GroupTemplateChannelFields.LocalOnly:
channel.LocalOnly = Convert.ToBoolean(enumeratorGroupChannelFieldSettings.Current.Value);
break;
case GroupTemplateChannelFields.Location: break;
case GroupTemplateChannelFields.MMEChannelId: break;
case GroupTemplateChannelFields.MMEChannelType: break;
case GroupTemplateChannelFields.NameOfTheChannel:
channel.NameOfTheChannel = enumeratorGroupChannelFieldSettings.Current.Value;
break;
case GroupTemplateChannelFields.NumberOfSamples: break;
case GroupTemplateChannelFields.OffsetPostTest: break;
case GroupTemplateChannelFields.PreFilterType: break;
case GroupTemplateChannelFields.ReferenceChannel: break;
case GroupTemplateChannelFields.ReferenceChannelName: break;
case GroupTemplateChannelFields.ReferenceSystem: break;
case GroupTemplateChannelFields.Required:
channel.Required = Convert.ToBoolean(enumeratorGroupChannelFieldSettings.Current.Value);
break;
case GroupTemplateChannelFields.SamplingInterval: break;
case GroupTemplateChannelFields.StartOffsetInterval: break;
case GroupTemplateChannelFields.TestObjectNumber: break;
case GroupTemplateChannelFields.TimeOfFirstSample: break;
case GroupTemplateChannelFields.TimeOfMaximumValue: break;
case GroupTemplateChannelFields.TimeOfMinimumValue: break;
case GroupTemplateChannelFields.TransducerDampingRatio: break;
case GroupTemplateChannelFields.TransducerId: break;
case GroupTemplateChannelFields.TransducerNaturalFrequency: break;
case GroupTemplateChannelFields.TransducerType: break;
case GroupTemplateChannelFields.Unit: break;
default:
throw new NotSupportedException(
"TestObjectTemplate::ProcessChannelXMLNode unsupported field: " + enumeratorGroupChannelFieldSettings.Current.Key);
}
}
}
existingChannels.Add(channel);
var maxDisplayOrder = (from ch in existingChannels select ch.DisplayOrder).Max();
foreach (var ch in existingChannels)
{
if (-1 == ch.DisplayOrder)
{
ch.DisplayOrder = ++maxDisplayOrder;
}
}
template.Channels = existingChannels.ToArray();
}
#endregion
}
}