Commit a731e151 authored by 潘栩锋's avatar 潘栩锋 🚴

优化 curve模块 改为json保存数据。和obj.reflect 通信方式

parent 682d3e2c
......@@ -268,10 +268,7 @@ namespace FLY.Thick.Base.UI
if (!WdPassword.Authorize("Curve"))
return;
mCurveService.CorrectWay = this.CorrectWay;
mCurveService.Flag = this.Flag;
mCurveService.Curves = this.Curves.ToList();
mCurveService.Apply();
mCurveService.Apply(this.CorrectWay, this.Flag, this.Curves.ToArray());
FLY.ControlLibrary.Window_Tip.Show("应用成功",
null,
TimeSpan.FromSeconds(2));
......
......@@ -322,8 +322,8 @@ namespace FLY.Thick.Base.UI
if (!WdPassword.Authorize("Curve"))
return;
curveService.Curves = curveCore.Curves;
curveService.Apply();
curveService.Apply(curveService.CorrectWay, curveService.Flag, curveCore.Curves.ToArray());
FLY.ControlLibrary.Window_Tip.Show("应用成功",
null,
TimeSpan.FromSeconds(2));
......
......@@ -15,8 +15,9 @@ namespace FLY.Thick.Base.Client
/// <summary>
/// AD 曲线服务 客户端代理
/// </summary>
public class CurveServiceClient : FObjServiceClient, ICurveService
public class CurveServiceClient : FObjBase.Reflect.Reflect_SeviceClient, ICurveService
{
protected override Type InterfaceType => typeof(ICurveService);
/// <summary>
/// AD 曲线服务 客户端代理
/// </summary>
......@@ -39,7 +40,8 @@ namespace FLY.Thick.Base.Client
public CurveType Flag { get; set; }
[PropertyChanged.DoNotCheckEquality]
public List<CurveCell> Curves { get; set; }
public CurveCell[] Curves { get; set; }
public void SetRevised()
{
for (int i = 0; i < Curves.Count(); i++)
......@@ -47,216 +49,12 @@ namespace FLY.Thick.Base.Client
Curves[i].AD = Curves[i].RevisedAD;
}
}
public void Apply()
{
Curves.OrderBy(c => c.Value);
var p = new CURVE_OBJ_INTERFACE.Pack_CurveList();
p.list = Curves;
p.flag = Flag;
p.correctway = CorrectWay;
string json = Newtonsoft.Json.JsonConvert.SerializeObject(p);
CurrObjSys.SetValueEx(
mConn, mServerID, ID,
CURVE_OBJ_INTERFACE.SET_CURVELIST,
Misc.Converter.StringToBytes(json)
);
}
#region E
int AD2Value_E(int ad, AD2ValueFlag flag)
{
int i;
int thick;
if (Curves.Count < 1) return -1;
if (ad < 0) return -1;
if (ad == 0) ad = 1;
if (flag == AD2ValueFlag.NoRevised)
{
for (i = 0; i < Curves.Count; i++)
{
if (ad < Curves[i].AD)
continue;
else
break;
}
}
else
{
for (i = 0; i < Curves.Count; i++)
{
if (ad < Curves[i].RevisedAD)
continue;
else
break;
}
}
if (i >= Curves.Count) i = Curves.Count - 1;
if (i == 0) i = 1;
if (flag == AD2ValueFlag.NoRevised)
{
double adi_ad0 = Math.Log(Curves[i].AD) - Math.Log(Curves[i - 1].AD);
double vi_v0 = Curves[i].Value - Curves[i - 1].Value;
double a = vi_v0 / adi_ad0;
double b = Curves[i - 1].Value - Math.Log(Curves[i - 1].AD) * a;
thick = (int)(Math.Log(ad) * a + b);
//double u;
//u = Math.Log((double)Curves[i - 1].AD / Curves[i].AD, Math.E) * 100 / (Curves[i].Value - Curves[i - 1].Value);
//thick = (int)(Math.Log((double)Curves[i - 1].AD / ad, Math.E) * 100 / u + Curves[i - 1].Value);
}
else
{
double adi_ad0 = Math.Log(Curves[i].RevisedAD) - Math.Log(Curves[i - 1].RevisedAD);
double vi_v0 = Curves[i].Value - Curves[i - 1].Value;
double a = vi_v0 / adi_ad0;
double b = Curves[i - 1].Value - Math.Log(Curves[i - 1].RevisedAD) * a;
thick = (int)(Math.Log(ad) * a + b);
//double u;
//u = Math.Log((double)Curves[i - 1].RevisedAD / Curves[i].RevisedAD, Math.E) * 100 / (Curves[i].Value - Curves[i - 1].Value);
//thick = (int)(Math.Log((double)Curves[i - 1].RevisedAD / ad, Math.E) * 100 / u + Curves[i - 1].Value);
}
//if (thick < 0)
// return 0;
return thick;
}
#endregion
#region 线性
int AD2Value_Line(int ad, AD2ValueFlag flag)
public void Apply(CurveCorrectWay correctWay, CurveType flag, CurveCell[] curves)
{
int i;
int thick;
if (Curves.Count < 2) return -1;
if (ad < 0) return -1;
if (ad == 0) ad = 1;
bool isDescending = true;//降序排列
if (Curves[0].AD < Curves[1].AD)
isDescending = false;
//找 ad0<ad<adi
if (flag == AD2ValueFlag.NoRevised)
{
if (isDescending)//降序排列
{
for (i = 0; i < Curves.Count; i++)
{
if (ad < Curves[i].AD)
continue;
else
break;
}
}
else
{
for (i = 0; i < Curves.Count; i++)
{
if (ad > Curves[i].AD)
continue;
else
break;
}
}
if (i >= Curves.Count) i = Curves.Count - 1;
if (i == 0) i = 1;
double adi_ad0 = Curves[i].AD - Curves[i - 1].AD;
double vi_v0 = Curves[i].Value - Curves[i - 1].Value;
double a = vi_v0 / adi_ad0;
double b = Curves[i - 1].Value - Curves[i - 1].AD * a;
thick = (int)(ad * a + b);
return thick;
}
else
{
if (isDescending)//降序排列
{
for (i = 0; i < Curves.Count; i++)
{
if (ad < Curves[i].RevisedAD)
continue;
else
break;
}
}
else
{
for (i = 0; i < Curves.Count; i++)
{
if (ad > Curves[i].RevisedAD)
continue;
else
break;
}
}
if (i >= Curves.Count) i = Curves.Count - 1;
if (i == 0) i = 1;
double adi_ad0 = Curves[i].AD - Curves[i - 1].RevisedAD;
double vi_v0 = Curves[i].Value - Curves[i - 1].Value;
double a = vi_v0 / adi_ad0;
double b = Curves[i - 1].Value - Curves[i - 1].RevisedAD * a;
thick = (int)(ad * a + b);
return thick;
}
Call(nameof(Apply), new { correctWay, flag, curves });
}
#endregion
public int AD2Value(int ad, AD2ValueFlag flag)
{
switch (Flag)
{
case CurveType.Line:
return AD2Value_Line(ad, flag);
default:
return AD2Value_E(ad, flag);
}
}
#endregion
public override void ConnectNotify(IFConn from)
{
base.ConnectNotify(from);
if (from.IsConnected)
{
CurrObjSys.SenseConfigEx(
mConn, mServerID, ID, 0xffffffff, SENSE_CONFIG.ADD);
CurrObjSys.GetValueEx(
mConn, mServerID, ID,
CURVE_OBJ_INTERFACE.GET_CURVELIST);
}
}
public override void PushGetValue(IFConn from, uint srcid, ushort memid, byte[] infodata)
{
PushInfo(from, srcid, memid, infodata);
}
public override void PushInfo(IFConn from, uint srcid, ushort infoid, byte[] infodata)
{
switch (infoid)
{
case CURVE_OBJ_INTERFACE.PUSH_CURVELIST:
{
string json = Misc.Converter.BytesToString(infodata);
var p = Newtonsoft.Json.JsonConvert.DeserializeObject<CURVE_OBJ_INTERFACE.Pack_CurveList>(json);
CorrectWay = p.correctway;
Flag = p.flag;
Curves = p.list;
} break;
}
}
}
}
......@@ -10,12 +10,8 @@ using System.Collections.ObjectModel;
namespace FLY.Thick.Base.Common
{
public class CurveCell : Misc.ISaveToXml, INotifyPropertyChanged
public class CurveCell : INotifyPropertyChanged
{
static CurveCell()
{
Misc.SaveToXmlHepler.Regist(typeof(CurveCell));
}
public override string ToString()
{
return "value=" + Value.ToString() + " ad=" + AD.ToString() + " revisedad=" + RevisedAD.ToString();
......@@ -33,18 +29,6 @@ namespace FLY.Thick.Base.Common
/// </summary>
public int RevisedAD { get; set; }
#region ISaveToXml 成员
public string[] GetSavePropertyNames()
{
return new string[]{
"Value",
"AD"};
}
#endregion
#region INotifyPropertyChanged 成员
public event PropertyChangedEventHandler PropertyChanged;
......
......@@ -13,16 +13,17 @@ namespace FLY.Thick.Base.IService
/// <summary>
/// AD曲线校正方式
/// </summary>
CurveCorrectWay CorrectWay { get; set; }
CurveCorrectWay CorrectWay { get; }
/// <summary>
/// 标记,用于告诉 客户端,当前的曲线类型, 自然对数 / 直线拟合 / 二次拟合
/// </summary>
CurveType Flag { get; set; }
CurveType Flag { get; }
/// <summary>
/// 曲线
/// </summary>
List<CurveCell> Curves { get; set; }
void Apply();
int AD2Value(int ad, AD2ValueFlag flag);
CurveCell[] Curves { get; }
void Apply(CurveCorrectWay correctWay, CurveType flag, CurveCell[] curves);
}
}
......@@ -7,93 +7,96 @@ using System.ComponentModel;
using FLY.Thick.Base.Common;
using FLY.Thick.Base.IService;
using AutoMapper;
using System.IO;
using Newtonsoft.Json;
namespace FLY.Thick.Base.Server
{
public class CurveCollection : ICurveService, Misc.ISaveToXml
public class CurveCollection : ICurveService
{
#region 数据文件需要保存的数据项
CurveCorrectWay correctWay = CurveCorrectWay.OnePointIsScale;
/// <summary>
/// AD曲线校正方式
/// </summary>
public CurveCorrectWay CorrectWay { get; set; }
public CurveCorrectWay CorrectWay { get; set; } = CurveCorrectWay.OnePointIsScale;
public CurveType Flag { get; set; }
public CurveType Flag { get; set; } = CurveType.E;
/// <summary>
/// 输入的曲线, 排列顺序,Value 从 小到大
/// </summary>
[PropertyChanged.DoNotCheckEquality]
public List<CurveCell> Curves { get; set; } = new List<CurveCell>();
public CurveCell[] Curves { get; set; }
#endregion
public event ActiveEventHandler ActiveEvent;
public class ExChange : Misc.ISaveToXml
public struct ExChange
{
static ExChange()
{
Misc.SaveToXmlHepler.Regist(typeof(ExChange));
public ExChange(int orgAd, int currAd) {
OrgAD = orgAd;
CurrAD = currAd;
}
public int OrgAD { get; set; }
public int CurrAD { get; set; }
public string[] GetSavePropertyNames()
{
return new string[]{
"OrgAD",
"CurrAD"};
}
}
/// <summary>
/// 真实样品校正点
/// </summary>
List<ExChange> RevisingCurves = new List<ExChange>();
private string param_path = "curve.xml";
private string param_path = "curve.json";
public CurveCollection()
{
SetDefault();
ReviseCurve();
}
public CurveCollection(string param_path)
{
if (!string.IsNullOrEmpty(param_path))
this.param_path = param_path;
SetDefault();
Load();
if (!Load()) {
Save();
}
Curves = Curves.OrderBy(c => c.Value).ToArray();
RevisingCurves.Clear();
ReviseCurve();
}
void SetDefault()
{
CorrectWay = CurveCorrectWay.OnePointIsScale;
Flag = CurveType.E;
Curves.Add(new CurveCell() { AD = 57564, Value = 0 });
Curves.Add(new CurveCell() { AD = 30850, Value = 8800 });
Curves.Add(new CurveCell() { AD = 19000, Value = 17600 });
Curves.Add(new CurveCell() { AD = 12528, Value = 26400 });
Curves.Add(new CurveCell() { AD = 8409, Value = 35200 });
Curves.Add(new CurveCell() { AD = 5650, Value = 44000 });
Curves.Add(new CurveCell() { AD = 3779, Value = 52800 });
Curves.Add(new CurveCell() { AD = 2513, Value = 61600 });
Curves.Add(new CurveCell() { AD = 1660, Value = 70400 });
Curves = new CurveCell[] {
new CurveCell() { AD = 57564, Value = 0 },
new CurveCell() { AD = 30850, Value = 8800 },
new CurveCell() { AD = 19000, Value = 17600 },
new CurveCell() { AD = 12528, Value = 26400 },
new CurveCell() { AD = 8409, Value = 35200 },
new CurveCell() { AD = 5650, Value = 44000 },
new CurveCell() { AD = 3779, Value = 52800 },
new CurveCell() { AD = 2513, Value = 61600 },
new CurveCell() { AD = 1660, Value = 70400 }
};
}
public void Apply()
public void Apply(CurveCorrectWay correctWay, CurveType flag, CurveCell[] curves)
{
CorrectWay = correctWay;
Flag = flag;
Curves = curves;
ClearExChange();
ReviseCurve();
if (ActiveEvent != null)
ActiveEvent(this);
ActiveEvent?.Invoke(this);
Save();
}
public void Clear()
{
Curves.Clear();
ClearExChange();
}
#region ExChange
......@@ -188,7 +191,7 @@ namespace FLY.Thick.Base.Server
double uh = ((double)RevisingCurves[0].CurrAD) / adh;
double ul = ((double)RevisingCurves[1].CurrAD) / adl;
for (int i = 0, j = 1; i < Curves.Count; i++)
for (int i = 0, j = 1; i < Curves.Count(); i++)
{
double ux = uh - (adh - Curves[i].AD) * (uh - ul) / (adh - adl);
Curves[i].RevisedAD = (int)(Curves[i].AD * ux);
......@@ -204,12 +207,12 @@ namespace FLY.Thick.Base.Server
int i;
int thick;
if (Curves.Count < 1) return -1;
if (Curves.Count() < 1) return -1;
if (ad < 0) return -1;
if (ad == 0) ad = 1;
if (flag == AD2ValueFlag.NoRevised)
{
for (i = 0; i < Curves.Count; i++)
for (i = 0; i < Curves.Count(); i++)
{
if (ad < Curves[i].AD)
continue;
......@@ -219,7 +222,7 @@ namespace FLY.Thick.Base.Server
}
else
{
for (i = 0; i < Curves.Count; i++)
for (i = 0; i < Curves.Count(); i++)
{
if (ad < Curves[i].RevisedAD)
continue;
......@@ -227,7 +230,7 @@ namespace FLY.Thick.Base.Server
break;
}
}
if (i >= Curves.Count) i = Curves.Count - 1;
if (i >= Curves.Count()) i = Curves.Count() - 1;
if (i == 0) i = 1;
if (flag == AD2ValueFlag.NoRevised)
......@@ -257,7 +260,7 @@ namespace FLY.Thick.Base.Server
int i;
int thick;
if (Curves.Count < 2) return -1;
if (Curves.Count() < 2) return -1;
if (ad < 0) return -1;
if (ad == 0) ad = 1;
bool isDescending = true;//降序排列
......@@ -269,7 +272,7 @@ namespace FLY.Thick.Base.Server
{
if (isDescending)//降序排列
{
for (i = 0; i < Curves.Count; i++)
for (i = 0; i < Curves.Count(); i++)
{
if (ad < Curves[i].AD)
continue;
......@@ -279,7 +282,7 @@ namespace FLY.Thick.Base.Server
}
else
{
for (i = 0; i < Curves.Count; i++)
for (i = 0; i < Curves.Count(); i++)
{
if (ad > Curves[i].AD)
continue;
......@@ -287,7 +290,7 @@ namespace FLY.Thick.Base.Server
break;
}
}
if (i >= Curves.Count) i = Curves.Count - 1;
if (i >= Curves.Count()) i = Curves.Count() - 1;
if (i == 0) i = 1;
double adi_ad0 = Curves[i].AD - Curves[i - 1].AD;
......@@ -302,7 +305,7 @@ namespace FLY.Thick.Base.Server
{
if (isDescending)//降序排列
{
for (i = 0; i < Curves.Count; i++)
for (i = 0; i < Curves.Count(); i++)
{
if (ad < Curves[i].RevisedAD)
continue;
......@@ -312,7 +315,7 @@ namespace FLY.Thick.Base.Server
}
else
{
for (i = 0; i < Curves.Count; i++)
for (i = 0; i < Curves.Count(); i++)
{
if (ad > Curves[i].RevisedAD)
continue;
......@@ -320,7 +323,7 @@ namespace FLY.Thick.Base.Server
break;
}
}
if (i >= Curves.Count) i = Curves.Count - 1;
if (i >= Curves.Count()) i = Curves.Count() - 1;
if (i == 0) i = 1;
double adi_ad0 = Curves[i].RevisedAD - Curves[i - 1].RevisedAD;
......@@ -334,47 +337,97 @@ namespace FLY.Thick.Base.Server
}
#endregion
public int AD2Value(int ad, AD2ValueFlag flag)
public double AD2Value(int ad, AD2ValueFlag flag)
{
int value;
switch (Flag)
{
case CurveType.Line:
return AD2Value_Line(ad, flag);
value = AD2Value_Line(ad, flag);
break;
default:
return AD2Value_E(ad, flag);
value = AD2Value_E(ad, flag);
break;
}
return value / 100.0;
}
#region ITDParam 成员
public bool Load()
{
bool ret = Misc.SaveToXmlHepler.Load("curve.xml", this);
RevisingCurves.Clear();
Curves.OrderBy(c => c.Value);
return ret;
return CurveCollectionJsonDb.Load(this, param_path);
}
public void Save()
public bool Save()
{
Misc.SaveToXmlHepler.Save("curve.xml", this);
return CurveCollectionJsonDb.Save(this, param_path);
}
#region INotifyPropertyChanged 成员
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
#endregion
}
#region ISaveToXml 成员
public string[] GetSavePropertyNames()
public class CurveCollectionJsonDb
{
static Mapper Mapper { get; } = new AutoMapper.Mapper(new MapperConfiguration(c =>
{
return new string[]{
"CorrectWay",
"Flag",
"Curves"};
c.CreateMap<CurveCollection, CurveCollectionJsonDb>().ReverseMap();
}));
public static bool Load(CurveCollection src, string filePath)
{
try
{
if (File.Exists(filePath))
{
string json = File.ReadAllText(filePath);
var p = JsonConvert.DeserializeObject<CurveCollectionJsonDb>(json);
Mapper.Map(p, src);
return true;
}
}
catch
{
//异常,没有json 解码失败
}
return false;
}
public static bool Save(CurveCollection src, string filePath)
{
var p = Mapper.Map<CurveCollectionJsonDb>(src);
try
{
File.WriteAllText(filePath, JsonConvert.SerializeObject(p, Formatting.Indented));
return true;
}
catch
{
//异常,没有json 编码失败
#endregion
}
return false;
#region INotifyPropertyChanged 成员
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
#endregion
/// <summary>
/// AD曲线校正方式
/// </summary>
public CurveCorrectWay CorrectWay = CurveCorrectWay.OnePointIsScale;
public CurveType Flag = CurveType.E;
public CurveCell[] Curves = new CurveCell[] {
new CurveCell() { AD = 57564, Value = 0 },
new CurveCell() { AD = 30850, Value = 8800 },
new CurveCell() { AD = 19000, Value = 17600 },
new CurveCell() { AD = 12528, Value = 26400 },
new CurveCell() { AD = 8409, Value = 35200 },
new CurveCell() { AD = 5650, Value = 44000 },
new CurveCell() { AD = 3779, Value = 52800 },
new CurveCell() { AD = 2513, Value = 61600 },
new CurveCell() { AD = 1660, Value = 70400 }
};
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment