Files
wg_cpso/CaeModel/Parameters/EquationParameterCollection.cs

201 lines
7.9 KiB
C#
Raw Normal View History

2026-03-25 18:20:24 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.Common;
using System.Runtime.InteropServices;
using System.Text;
using CaeGlobals;
using CaeMesh;
namespace CaeModel
{
[Serializable]
public class EquationParameterCollection
{
// Variables
private OrderedDictionary<string, EquationParameter> _parameters;
private OrderedDictionary<string, EquationParameter> _overriddenParameters;
// Properties
public EquationParameter this[string name]
{
get { return _parameters[name]; }
set
{
EquationParameter parameter;
if (_overriddenParameters.TryGetValue(name, out parameter)) _parameters[name] = parameter;
else _parameters[name] = value;
}
}
// OverriddenParameters are used only during regeneration
public OrderedDictionary<string, EquationParameter> OverriddenParameters { get { return _overriddenParameters; } }
public ICollection<string> Keys
{
get { return _parameters.Keys; }
}
public ICollection<EquationParameter> Values
{
get { return _parameters.Values; }
}
// Constructors
public EquationParameterCollection()
{
StringComparer sc = StringComparer.OrdinalIgnoreCase;
_parameters = new OrderedDictionary<string, EquationParameter>("Parameters", sc);
_overriddenParameters = new OrderedDictionary<string, EquationParameter>("OverriddenParameters", sc);
}
public EquationParameterCollection(OrderedDictionary<string, EquationParameter> parameters)
: this()
{
// Use for each to keep the string comparer OrdinalIgnoreCase
foreach (var entry in parameters) _parameters.Add(entry.Key, entry.Value);
}
public EquationParameterCollection(EquationParameterCollection collection)
: this()
{
if (collection._parameters != null) _parameters = collection._parameters.DeepCopy();
if (collection._overriddenParameters != null) _overriddenParameters = collection._overriddenParameters.DeepCopy();
}
// Methods
public IEnumerator<KeyValuePair<string, EquationParameter>> GetEnumerator()
{
foreach (var entry in _parameters)
yield return new KeyValuePair<string, EquationParameter>(entry.Key, this[entry.Key]);
}
public void Add(string name, EquationParameter value)
{
EquationParameter parameter;
if (_overriddenParameters.TryGetValue(name, out parameter)) _parameters.Add(name, parameter);
else _parameters.Add(name, value);
}
public void AddOverriddenParametersFromString(string parametersString)
{
double value;
string[] tmp;
//đ+'špoiuztrfedsa
if (parametersString.Contains("="))
{
string[] parameters = parametersString.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
EquationParameter p;
//
foreach (string parameter in parameters)
{
tmp = parameter.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
if (tmp.Length == 2 && double.TryParse(tmp[1], out value))
{
p = new EquationParameter();
p.Name = tmp[0];
p.Equation.SetEquationFromValue(value);
AddOverriddenParameter(p.Name, p);
}
else throw new CaeException("The parameter " + parameter + " cannot be parsed.");
}
}
else
{
ImportFromFile(parametersString, true);
}
}
public void AddOverriddenParameter(string name, EquationParameter parameter)
{
_overriddenParameters.Add(name, parameter);
}
public bool TryGetValue(string name, out EquationParameter parameter)
{
return _parameters.TryGetValue(name, out parameter);
}
public void Replace(string oldName, EquationParameter parameter)
{
EquationParameter op;
if (_overriddenParameters.TryGetValue(parameter.Name, out op)) _parameters.Replace(oldName, parameter.Name, op);
else _parameters.Replace(oldName, parameter.Name, parameter);
}
public bool Remove(string name)
{
return _parameters.Remove(name);
}
public void Clear()
{
_parameters.Clear();
}
//
public string GetNextNumberedKey(string key, string postFix = "", string separator = "-")
{
return _parameters.GetNextNumberedKey(key, postFix, separator);
}
public EquationParameterCollection DeepCopy()
{
return new EquationParameterCollection(this);
}
//
public void ExportToFile(string fileName)
{
StringBuilder sb = new StringBuilder();
//
sb.AppendFormat("${0};{1};{2}", "Name", "Value/Equation", "Evaluates to");
//
foreach (var entry in _parameters)
{
sb.AppendLine();
sb.AppendFormat("{0};{1};{2}", entry.Value.Name, entry.Value.EquationStr.Equation, entry.Value.Value);
}
//
System.IO.File.WriteAllText(fileName, sb.ToString());
}
public void ImportFromFile(string fileName, bool overriddenParameters = false)
{
string[] lines = System.IO.File.ReadAllLines(fileName);
//
string line;
string[] tmp;
string[] splitter = new string[] { ";" };
//
List<EquationParameter> parameters = new List<EquationParameter>();
//
for (int i = 0; i < lines.Length; i++)
{
line = lines[i].Trim();
if (line[0] == '$') continue;
tmp = line.Split(splitter, StringSplitOptions.RemoveEmptyEntries);
if (tmp.Length >= 2)
{
try
{
EquationParameter parameter = new EquationParameter();
parameter.Name = tmp[0].Trim();
parameter.Equation.SetEquation(new EquationString(tmp[1].Trim()));
//
parameters.Add(parameter);
}
catch (Exception ex)
{
throw new CaeException("Line " + (i + 1) + " of the parametes file in not correctly formated.");
}
}
else throw new CaeException("Line " + (i+1) + " of the parametes file in not correctly formated.");
}
//
if (overriddenParameters)
{
_overriddenParameters.Clear();
foreach (var parameter in parameters) _overriddenParameters.Add(parameter.Name, parameter);
}
else
{
_parameters.Clear();
foreach (var parameter in parameters) _parameters.Add(parameter.Name, parameter);
}
}
public void OnDeserialization(object sender)
{
_parameters.OnDeserialization(sender);
_overriddenParameters.OnDeserialization(sender);
}
}
}