using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using AForge; using System.Drawing; using System.Text.RegularExpressions; using AForge.Genetic; //using NPOI.SS.Formula.Eval; using System.Runtime.Serialization; using Newtonsoft.Json; using System.Collections.Concurrent; using Dapper; namespace Hydro.CommonBase { public class GeneticParams { static int Count = 0; public GeneticParams(int Level) { this.Level = Level; this.ID = Count; Count++; } public void Init(string ConfigPath) { if (Db == null) Db = new Db(); if (!string.IsNullOrEmpty(ConfigPath)) Db.Init(ConfigPath); if (Quene!=null) Quene.Dispose(); Quene = new Quene(); this.Quene= Quene; //»ñȡȫ¾ÖĬÈÏÉèÖà var globalConfig = Db.Connection.QueryFirstOrDefault("SELECT FValue FROM MyConfig WHERE FKey='GlobalConfig'"); GlobalConfig = JsonConvert.DeserializeObject(globalConfig) ?? new GlobalConfig(); this.GlobalConfig = GlobalConfig; isInited = true; //return gParam; } public void Dispose() { onReportProgress = null; Db.Close(); Db = null; } public List list_BestEnerge; public List list_AvgHz; public List ranges; public List DLengths; public List accuracys; public List Dependencies; public double[] list_AtemtpArr; public string SolutionSaveName; public int populationSize; public int iterations; public int populationSize_full; public int iterations_full; public List Upopulations = null; public int selectionMethod; public int optimizationMode; public bool Ç¿ÖÆÖØ¼ÆËã; public int iterations_min; public double accuracyNum; //public int MultiTimes=0; public int MaxRobot; public int RuningRobot; public int num; public double BestOptValue; public DRange tolerance; public FinishEvent onFinished; public FinishEvent onError; public FinishEvent onReportProgress; public SetEvent setVars; public Db Db; public dynamic SolutionDBHelper = null; public GlobalConfig GlobalConfig; public bool isInited=false; public Quene Quene; public int Level; public int ID; public bool isNeedOutput = true; public double CurrentTotalDemand = -1; } public class Result { public double[] arrayTryValue = null; public float Demand; public double ObjFunctionValue; public int it_Times = 0; public int[] unitNum = null; } public class Quene { public System.Collections.Generic.Queue RequestQueues; public HashSet RequestFinished; public Dictionary ResultHash; public int Level; public Dictionary ResultDictionary; public Dictionary ResultChrome; public int MissionQueneCount; public List MissionQuene; public DateTime ScadaTime; //public List TimePoints; public double BestResult=double.MaxValue; public void Dispose() { if (RequestQueues != null) { RequestQueues.Clear(); RequestQueues = null; } if (RequestFinished != null) { RequestFinished.Clear(); RequestFinished = null; } if (ResultHash != null) { ResultHash.Clear(); ResultHash = null; } if (ResultDictionary != null) { ResultDictionary.Clear(); ResultDictionary = null; } if (ResultChrome != null) { ResultChrome.Clear(); ResultChrome = null; } if (MissionQuene != null) { MissionQuene.Clear(); MissionQuene = null; } } } [Serializable] public class WdnmoParam { public List results; public double DistriDemand; public Guid ID; public List ScadaPoints { get; set; } = new List(); public List ConfigPoints { get; set; } = new List(); public List ResultPoints { get; set; } = new List(); [JsonIgnore] public Dictionary dict_ScadaPoints = null; [JsonIgnore] public Dictionary dict_ConfigPoints = null; [JsonIgnore] public Dictionary dict_ResultPoints = null; [JsonIgnore] public Dictionary dict_ScadaPointsPattern = null; public Dictionary dict_ConfigPointsPattern = null; public Dictionary dict_ResultPointsPattern = null; public bool isBuildDict = false; public void buildDict() { dict_ScadaPoints=new Dictionary(); dict_ScadaPointsPattern = new Dictionary(); ScadaPoints.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Key) && !dict_ScadaPoints.ContainsKey(vv.Key)) { dict_ScadaPoints.Add(vv.Key, vv.Value); if (vv.Pattern!=null) { dict_ScadaPointsPattern.Add(vv.Key, vv.Pattern); } } }); dict_ConfigPoints = new Dictionary(); dict_ConfigPointsPattern = new Dictionary(); ConfigPoints.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Key) && !dict_ConfigPoints.ContainsKey(vv.Key)) { dict_ConfigPoints.Add(vv.Key, vv.Value); if (vv.Pattern != null) { dict_ConfigPointsPattern.Add(vv.Key, vv.Pattern); } } }); dict_ResultPoints = new Dictionary(); dict_ResultPointsPattern = new Dictionary(); ResultPoints.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Key) && !dict_ResultPoints.ContainsKey(vv.Key)) { dict_ResultPoints.Add(vv.Key, vv.Value); if (vv.Pattern != null) { dict_ResultPointsPattern.Add(vv.Key, vv.Pattern); } } }); isBuildDict = true; } public double Fitness = -1; public DateTime time { get; set; } = default(DateTime); //public int RunTimes = 0; public int Period { get; set; } = 0; public string ErrorMessage { get; set; } = null; public bool fullSearchMode = false; public FinishEvent onFinish; public bool isNeedOutPut = false; public Dictionary ToSearchDict() { Dictionary dict = new Dictionary(); foreach (var point in ScadaPoints) { if (!dict.ContainsKey(point.Key)) dict.Add(point.Key, new double[] { point.Value - point.SearchRange / 2, point.Value + point.SearchRange / 2 }); else dict[point.Key] = new double[] { point.Value - point.SearchRange / 2, point.Value + point.SearchRange / 2 }; } if (!dict.ContainsKey("period")) dict.Add("period", new double[] { Period - 8, Period + 8 }); else dict["period"] = new double[] { Period - 8, Period + 8 }; return dict; } //public ulong Toulong(string childSaveName) //{ //} public string ToSearchSring() { Dictionary dict = new Dictionary(); foreach (var point in ScadaPoints) { if (!dict.ContainsKey(point.Key)) dict.Add(point.Key, point.Value); else dict[point.Key] = point.Value; } if (!dict.ContainsKey("period")) dict.Add("period", Period); StringBuilder sb = new StringBuilder(); foreach (var point in dict) { sb.AppendLine(point.Key + "\t" + point.Value); } return sb.ToString(); } public Dictionary ToResultDict() { Dictionary dict = new Dictionary(); foreach (var point in ScadaPoints) { if (!dict.ContainsKey(point.Key)) dict.Add(point.Key, point.Value); else dict[point.Key] = point.Value; } if (!dict.ContainsKey("period")) dict.Add("period", Period); else dict["period"] = Period; foreach (var point in ResultPoints) { if (!point.isNeedtoSave) continue; if (!CheckExpandoVariableName(point.SaveKey)) continue; if (!dict.ContainsKey(point.SaveKey)) { dict.Add(point.SaveKey, point.Value); } else dict[point.SaveKey] = point.Value; } return dict; // ÖØÔØ == ÔËËã·û } private bool CheckExpandoVariableName(string name) { if (name == null) return false; // ÕýÔò±í´ïʽ£ºÒÔ×Öĸ»òÏ»®Ïß¿ªÍ·£¬ºóÃæ¸ú×ÅÈÎÒâ¸ö×Öĸ¡¢Êý×Ö»òÏ»®Ïß string pattern = @"^[a-zA-Z_]\w*$"; return Regex.IsMatch(name, pattern); } public void Dispose() { results?.Clear(); ScadaPoints?.Clear(); ConfigPoints?.Clear(); ResultPoints?.Clear(); onFinish = null; } public WdnmoParam Copy() { //»ñȡһ¸öеÄʵÀý£¬½«Õâ¸öÀàµÄÊôÐÔÖµ¸³Öµ¸øÐÂʵÀý WdnmoParam v = new WdnmoParam(); v.ID = this.ID; v.Fitness = this.Fitness; v.time = this.time; //v.RunTimes = this.RunTimes; v.Period = this.Period; v.ErrorMessage = this.ErrorMessage; v.fullSearchMode = this.fullSearchMode; v.onFinish = this.onFinish; v.isNeedOutPut = this.isNeedOutPut; v.results = this.results; v.ScadaPoints = new List(); foreach (var point in this.ScadaPoints) { v.ScadaPoints.Add(new TimePoint( point)); } v.ConfigPoints = this.ConfigPoints; v.ResultPoints = new List(); foreach (var point in this.ResultPoints) { v.ResultPoints.Add(new TimePoint(point)); } v.buildDict(); return v; } } public class calcParam { public double[] vars; public Guid ID; public IChromosome chromosome; public List setVars = new List(); } public class SetVar { public string ID; public bool isNode = true; public int type; public float value; public SetVar(string ID,bool isNode,int type,float value) { this.ID= ID; this.isNode = isNode; this.type = type; this.value = value; } } [Serializable] public class TimePoint { public TimePoint() { } public TimePoint(string key, double value) { Key = key; Value = value; } public TimePoint(TimePoint point) { this.Key= point.Key; this.Value = point.Value; this.Name = point.Name; this.ValueTime = point.ValueTime; this.SearchRange = point.SearchRange; this.isNeedtoSave = point.isNeedtoSave; this.SaveKey = point.SaveKey; if (point.Pattern!=null) this.Pattern= point.Pattern.ToList().ToArray(); } public string Name; public DateTime ValueTime { get; set; } public string Key { get; set; } public double Value { get; set; } public double[] Pattern { get; set; } = null; public double SearchRange = 0; public bool isNeedtoSave = false; public string SaveKey = null; public override string ToString() { return $"{Name}\t[{Key}]\t{Value}"; } } [Serializable] public delegate void FinishEvent(dynamic txt); public delegate void SetEvent(string name, WdnmoParam param); //public event FinishEvent ss; [Serializable] public enum SettingCalcType { Add = 0, Const = 1 } [Serializable] public class LogicModelParams { public Guid ID = new Guid(); public List ¼¯ºÏ = new List(); public List ³õʼÌõ¼þ = new List(); public List Ͻ׶ÎÌõ¼þ = new List(); public List Ô¼Êø±äÁ¿ = new List(); public List ÊÔËã±äÁ¿ = new List(); public List Ë®Á¿·ÖÅä±äÁ¿ = new List(); public List Ë®Á¿·ÖÅ伯ºÏ = new List(); public List ±äÁ¿ = new List(); public List ±í´ïʽ = new List(); public List Ô¤´¦Àí²å¼þ = new List(); public List ½Ó¿Ú±äÁ¿ { get { List all = new List(); all.AddRange(±äÁ¿); all.AddRange(³õʼÌõ¼þ); all.AddRange(Ͻ׶ÎÌõ¼þ); all.AddRange(±í´ïʽ); all.AddRange(Ë®Á¿·ÖÅä±äÁ¿); return all; } } public List É趨±äÁ¿ { get { List all = new List(); all.AddRange(³õʼÌõ¼þ); all.AddRange(Ͻ׶ÎÌõ¼þ); return all; } } public List ±äÁ¿È«¼¯ { get { List all = new List(); all.AddRange(³õʼÌõ¼þ); all.AddRange(Ͻ׶ÎÌõ¼þ); all.AddRange(±äÁ¿); all.AddRange(ÊÔËã±äÁ¿); all.AddRange(¼¯ºÏ); all.AddRange(±í´ïʽ); all.AddRange(Ô¼Êø±äÁ¿); if (OFunction?.variable!=null) all.Add(OFunction.variable); return all; } } //[NonSerialized] [JsonIgnore] public Dictionary dict_Name { get; set; } //[NonSerialized] [JsonIgnore] public Dictionary dict_ID { get; set; } //[NonSerialized] [JsonIgnore] public Dictionary dict_OutPut { get; set; } //public string inputFileString; [JsonIgnore] public dict map_node { get;set;} [JsonIgnore] public dict map_link { get; set; } public void buildDict() { //BookMark £º½¨Á¢±äÁ¿×Öµä dict_Name = new Dictionary(); dict_ID=new Dictionary(); dict_OutPut = new Dictionary(); ±äÁ¿È«¼¯.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Name) && !dict_Name.ContainsKey(vv.Name)) dict_Name.Add(vv.Name, vv); }); ±äÁ¿È«¼¯.ForEach(vv => { if (!dict_ID.ContainsKey(vv.ID)) dict_ID.Add(vv.ID, vv); }); ½Ó¿Ú±äÁ¿.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Name) && !dict_OutPut.ContainsKey(vv.expressString)) dict_OutPut.Add(vv.expressString, vv); }); } [NonSerialized] [JsonIgnore] public Dictionary ChildParam = new Dictionary(); public OBJFunction OFunction; public EN_Times ʱ¼ä¿Ì¶È; //public List results = new List(); public List results; //public int times; public LogicModelParams CloneResult() { var param_new = new LogicModelParams(); ³õʼÌõ¼þ.ForEach(v => param_new.³õʼÌõ¼þ.Add(new variable {ID=v.ID,CalcValue_Set=v.CalcValue,LogicValue=v.LogicValue,objListString=v.objListString })) ; Ͻ׶ÎÌõ¼þ.ForEach(v => param_new.Ͻ׶ÎÌõ¼þ.Add(new variable { ID = v.ID, CalcValue_Set = v.CalcValue, LogicValue = v.LogicValue, objListString = v.objListString })); Ô¼Êø±äÁ¿.ForEach(v => param_new.Ô¼Êø±äÁ¿.Add(new variable { ID = v.ID, CalcValue_Set = v.CalcValue, LogicValue = v.LogicValue, objListString = v.objListString })); ÊÔËã±äÁ¿.ForEach(v => param_new.ÊÔËã±äÁ¿.Add(new variable { ID = v.ID, CalcValue_Set = v.CalcValue, LogicValue = v.LogicValue, objListString = v.objListString })); Ë®Á¿·ÖÅä±äÁ¿.ForEach(v => param_new.Ë®Á¿·ÖÅä±äÁ¿.Add(new variable { ID = v.ID, CalcValue_Set = v.CalcValue, LogicValue = v.LogicValue, objListString = v.objListString })); Ë®Á¿·ÖÅ伯ºÏ.ForEach(v => param_new.Ë®Á¿·ÖÅ伯ºÏ.Add(new variable { ID = v.ID, CalcValue_Set = v.CalcValue, LogicValue = v.LogicValue, objListString = v.objListString })); ±äÁ¿.ForEach(v => param_new.±äÁ¿.Add(new variable { ID = v.ID, CalcValue_Set = v.CalcValue, LogicValue = v.LogicValue, objListString = v.objListString })); ¼¯ºÏ.ForEach(v => param_new.¼¯ºÏ.Add(new variable { ID = v.ID, CalcValue_Set = v.CalcValue, LogicValue = v.LogicValue, objListString = v.objListString })); ±í´ïʽ.ForEach(v => param_new.±í´ïʽ.Add(new variable { ID = v.ID, CalcValue_Set = v.CalcValue, LogicValue = v.LogicValue, objListString = v.objListString })); param_new.OFunction = new OBJFunction(); param_new.OFunction.value = OFunction.value; param_new.buildDict(); return param_new; } } /// /// ×Ó·½°¸²ÎÊý¼¯ /// public class childSolutionParam { /// ///¼ÆËã²ÎÊý /// public WdnmoParam wParam; public List childVars_In; public List childVars_Out; public string childSaveName; public variable childFitness_Out; //public SaveSettings saveSettings; //public string savePath; } public class EN_Times { public int duration; public int step; public int Ntimes; } [Serializable] public class variable { public static List listUsedInitValue = new List() { "³õʼ¼ÆËãÖµ", "±ä»¯Öµ", "¾ø¶Ô±ä»¯Öµ" }; public static List list_ÊäÈëÖµ = new List() { "»ù×¼Öµ(½çÃæ)", "¶¨ÒåÖµ", "»ù×¼Öµ(½Ó¿Ú)", "ģʽϵÊý(½çÃæ)", "ģʽϵÊý(½Ó¿Ú)" }; public static List listUsedScadaValue = new List { "¶¨ÒåÖµ", "»ù×¼Öµ(½Ó¿Ú)" }; public static List list_½Ó¿ÚÊä³öÖµ = new List() { "±í´ïʽ¼ÆËã", "¼ÆËãÖµ", "±ä»¯Öµ", "³õʼ¼ÆËãÖµ", "×Ó·½°¸Öµ" }; public static List list_½Ó¿ÚÊäÈëÖµ = new List() { "»ù×¼Öµ(½Ó¿Ú)", "ģʽϵÊý(½Ó¿Ú)" }; public static List list_NoNeedModelIndex = new List() { "»ù×¼Öµ(½çÃæ)", "¶¨ÒåÖµ", "»ù×¼Öµ(½Ó¿Ú)", "ģʽϵÊý(½çÃæ)", "ģʽϵÊý(½Ó¿Ú)" }; public int ID; public string modelObjectID; public string Name; public int modelIndex; public int maxTimes = 1; //CFÐÞ¶© 2023Äê7ÔÂ10ÈÕ ´¦ÀíÐòÁл¯Ê§°ÜµÄÎÊÌâ [NonSerialized] public List Vars = new List(); [NonSerialized] public Dictionary VarIndexs = new Dictionary(); [NonSerialized] public List PatternVars = new List(); // public int ParentID; public bool isNode; //public bool? isOutput; public dynamic Type; public dynamic resultType; public DRange doubleRange; public double? accuracy = null; public string expressString; public string expressType; public string defineType; public string IndicatorType; public int ObjType; public string logicType; /// /// É趨ֵ /// public double? LogicValue = null; /// /// É趨ģʽ /// public double[] LogicPattern = null; /// /// ³õʼ״̬¼ÆËãÖµ /// public double CalcValue_Init; ///// ///// Ä¿±ê״̬¼ÆËãÖµ ///// //public double? CalcValue_Calc = null; public double? CalcValue_Set { set { lock(this) { this.CalcValue = value; } } } /// /// ÊýѧģÐÍÄ¿±êÖµ /// public double? CalcValue { get;private set; }=null; /// /// ÊýѧģÐÍÄ¿±êÖµ¶àʱ¿Ì /// public double[] CalcValue_Arr = null; /// /// ÏÔʾµÄСÊýλÊý /// public int СÊýλÊý = 3; /// /// ±ê¸ß /// public double elevation = -9099; public int sort = 0; public string childSolution = ""; public string childTag = ""; public string childType = "´«Èë"; public double SearchRange = -1; public bool isNeedToSave = false; public string SaveKey = null; /// /// ÊÇ·ñÊÇÐéÄâ±äÁ¿£¨Óɼ¯ºÏ²úÉú£© /// public bool virturl = false; [NonSerialized] public dynamic Eval = null; /// /// ¶ÔÏóÇåµ¥ /// public string objListString; /// /// ¶ÔÏó±àºÅ£¨×îÓÅ£© /// public string obj_Best; public static double ErrNum = -9999999; private int _level = 0; [JsonIgnore] public int Level { get { if (_level!=0) return _level; int tempLevel = 1; if (Vars!=null) foreach (var v in Vars) { if (tempLevel < v.Level + 1) tempLevel = v.Level + 1; } _level= tempLevel; return _level; } } public override string ToString() { string value = CalcValue == null ? LogicValue.ToString() : CalcValue.ToString(); return $"[{Name}]{value}"; } public double GetValue(Func GetCalcValue = null, int? period = 0, bool isÇå³ý»º´æ = false) { double Value; var v = this; // is double dd if (v.expressType == "×Ó·½°¸Öµ"|| v.logicType=="Ä¿±êº¯Êý" ) { if (!v.CalcValue.HasValue) Value = ErrNum; //throw (new Exception("Òì³£")); else Value = (double)v.CalcValue;//v.GetCalcValue(GetCalcValue, period, false); } else if(v.logicType=="ÊÔËã²ÎÊý")//²»Çå³ý»º´æ { if (!v.CalcValue.HasValue) Value = variable.ErrNum; else Value = (double)v.CalcValue;//v.GetCalcValue(GetCalcValue, period, false); } else if (variable.list_ÊäÈëÖµ.IndexOf(v.expressType) < 0) { Value = v.GetCalcValue(GetCalcValue, period, isÇå³ý»º´æ); } else { double? d; if ((d = v.GetLogicValue()) == null) { //result = $"±äÁ¿[{v.Name}]ÅäÖôíÎó,±àºÅ[{v.modelObjectID}]ȡֵʧ°Ü"; Value = variable.ErrNum; } else { Value = (double)(v.GetLogicValue() ?? (variable.ErrNum)); } } return Value; } public double GetCalcValue(Func GetCalcValue = null, int? period = 0, bool isÇå³ý»º´æ = false) { if (isÇå³ý»º´æ) { CalcValue = null; } else { if (CalcValue!=null) return (double)CalcValue; } double CalcValue_Calc; double result; if (expressType == listUsedInitValue[0])//³õʼ¼ÆËãÖµ { result = CalcValue_Init; } else if (expressType == listUsedInitValue[1])//±ä»¯Öµ { CalcValue_Calc = GetCalcValue(this); result = CalcValue_Calc - CalcValue_Init; } else if (expressType == listUsedInitValue[2])//¾ø¶Ô±ä»¯Öµ { CalcValue_Calc = GetCalcValue(this); result = CalcValue_Calc - CalcValue_Init; if (result < 0) result *= -1; } else { CalcValue_Calc = GetCalcValue(this); result = CalcValue_Calc; }//¼ÆËãÖµ CalcValue = result; return result; } public double? GetLogicValue() { if (LogicValue != null) return (double)LogicValue; return null; } public double[] GetShowValue_Arr() { if (list_ÊäÈëÖµ.IndexOf(expressType) >= 0) //return LogicPattern; return CalcValue_Arr; else return CalcValue_Arr; } /// /// »ñÈ¡Ò³ÃæÏÔʾµÄ½á¹ûÖµ¼°Ñùʽ /// /// public string GetShowValue(bool showString = false) { //,Color.Red,Color.Blue,Color.Orange double? result; string Result; if (expressType!=null && expressType.Contains("ģʽ")) { if (LogicPattern!=null) { int LengthLimit = 16; //GlobalConfig.LengthLimit??16; string txt= LogicPattern.ToList().Select(v=>v.ToString()).Aggregate((a, b) => a + "," + b); //×±£Áô16¸ö×Ö·û if (txt.Length > LengthLimit) txt = txt.Substring(0, LengthLimit) + "..."; return txt; } result = 0; } else if (list_ÊäÈëÖµ.IndexOf(expressType) >= 0) result = LogicValue; else result = CalcValue; Result = result == null ? "-" : Math.Round(Double.Parse(result.ToString()), СÊýλÊý).ToString(); if (showString) { if (!string.IsNullOrEmpty(obj_Best)) { Result += $" [{obj_Best}]"; } } else if (Type.ToString().ToLower()== "initstatus")// is EPAModelNameSpace.EPAModelOutput.eType.INITSTATUS || Type is EPAModelNameSpace.EPAModelInput.eType.initStatus) { if (result == 0) Result = "¹Ø|Yellow"; else Result = "¿ª|DarkGreen"; } else { if (list_ÊäÈëÖµ.IndexOf(expressType) >= 0) Result += "|Blue"; else Result += "|White";// Color.DarkGreen } return Result; } public variable Copy() { //»ñȡһ¸öеÄʵÀý£¬½«Õâ¸öÀàµÄÊôÐÔÖµ¸³Öµ¸øÐÂʵÀý variable v = new variable(); v.ID = this.ID; v.IndicatorType = this.IndicatorType; v.Type = this.Type; v.expressType = this.expressType; v.expressString = this.expressString; v.defineType = this.defineType; v.isNode = this.isNode; v.ObjType = this.ObjType; v.logicType = this.logicType; v.LogicValue = this.LogicValue; v.LogicPattern = this.LogicPattern; v.СÊýλÊý = this.СÊýλÊý; v.virturl = this.virturl; v.doubleRange =new DRange( this.doubleRange); v.accuracy = this.accuracy; //v.Vars = this.Vars; v.Name = this.Name; v.modelObjectID = this.modelObjectID; v.modelIndex = this.modelIndex; v.maxTimes = this.maxTimes; v.childSolution = this.childSolution; v.childTag = this.childTag; v.childType = this.childType; v.SearchRange = this.SearchRange; v.SaveKey = this.SaveKey; v.objListString = this.objListString; v.obj_Best=this.obj_Best; v._level=this._level; return v; } } [Serializable] public class OBJFunction { public string Text_origin; public string Text_change; public string Text; public string ExpressType; public string Name; public double value; public DRange tolerance; public variable variable; //public List paramVariables; //public List paramValues; [NonSerialized] public dynamic eval; public bool isUseOriginValue = false; /// /// true£ºÊ¹Óñí´ïʽģʽ£¬false£ºÊ¹ÓñàºÅģʽ /// public bool? isUseExpression = true; public bool isUseScadaValue = false; } }