第四部分介绍如何从后台获取业务数据及在窗体上展示绘图库图形
分为4个项目:
1)UI项目,此项目包含了View和Controller的基类的定义,以及某种View和Controller的实现。
这里并没有使用IOC的容器,而是用泛型参数的形式把view声明到controller里,在controller构造的时候,用反射的方式创建特定的View对象,同时需要绘制图件的Painter
对象和需要的数据服务也会被创建。
View对象中声明窗体展示,数据加载,创建painter等事件,声明需方法LoadData和backgroundwork,使用异步的方式加载数据。
Controller代码示例:
public class OController<TView> : IOController where TView : OWatcher
{
public EventHandler ResetWatcherScroll;
public event EventHandler<iEventArgs<OWatcher>> ToolStripMerging;
protected OController()
{
CreateWatcher();
}
private void CreateWatcher()
{
View = Activator.CreateInstance<TView>();
View.ViewScale = Setting.ViewScale;
TopPainter = new CanvaPainter
{
RtDataMaxInterval = Setting.RtDataMaxInterval,
UiLanguage = Setting.UiLanguage
}; //单位秒
DepthWitsCodes = string.Empty;
TopPainter.StatusWriting += TopPainter_StatusWriting;
TopPainter.WatcherRefresh += TopPainter_WatcherRefresh;
TopPainter.RtTimerStart += TopPainter_RtTimerStart;
//启动一个进程,获取(预加载)数据
PrepareBackGroundWorker();
Service = DataService.CreateInstance();
Service.StatusWriting += TopPainter_StatusWriting;
}
View代码示例:
2)Model项目,定义了绘图与业务相关的模型。
代码示例:
/// <summary>
/// 曲线数据源数据描述
/// </summary>
public class DataMetadataBase
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 标识
/// </summary>
public string Code { get; set; }
/// <summary>
/// wits代码,唯一标识
/// </summary>
public string WitsCode { get; set; }
/// <summary>
/// 计量单位
/// </summary>
public string Unit { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 最大值
/// </summary>
public double MaxValue { set; get; }
/// <summary>
/// 最小值
/// </summary>
public double MinValue { set; get; }
public DataMetadataBase()
{
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace RST.Plot.Model.Curve
{
public class DepthDataMetadata : DataMetadataBase
{
/// <summary>
/// 主属性 1-通道对象, 2-表对象,3-流对象
/// </summary>
public int Attr { get; set; }
/// <summary>
/// 子属性,1-曲线对象;2-波形对象;3-地层测试对象;4-时深时对象
/// </summary>
public int SubAttr { get; set; }
/// <summary>
/// 数据类型
/// </summary>
public int DataType { get; set; }
/// <summary>
/// 数据类型长度
/// </summary>
public int DataTypeLen { get; set; }
/// <summary>
/// 维数,最大为4维
/// </summary>
public int NumOfDimension { get; set; }
/// <summary>
/// 维信息定义
/// </summary>
public Dimension[] Dimensions { get; set; }
/// <summary>
/// 开始时间
/// </summary>
public DateTime? StartTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
public DateTime? EndTime { get; set; }
/// <summary>
/// 开始深度
/// </summary>
public float StartDepth { get; set; }
/// <summary>
/// 截止深度
/// </summary>
public float EndDepth { get; set; }
public DepthDataMetadata()
{
}
public DepthDataMetadata(string name)
{
Name = name;
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
public override bool Equals(object obj)
{
if (!(obj is DepthDataMetadata))
{
return false;
}
return Name.Equals(((DepthDataMetadata)obj).Name);
}
}
public class Dimension
{
public Dimension()
{
}
/// <summary>
/// 维名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 维的单位
/// </summary>
public string Unit { get; set; }
/// <summary>
/// 维的起始值
/// </summary>
public double StartVal { get; set; }
/// <summary>
/// 维的数据采样点数,值为0,采样点数为可变值,数据中记录该值。对于第一维数据,值不能为0。
/// </summary>
public int Samples { get; set; }
}
}
3)Service项目主要定义了绘图库展示相关的服务。因为没有单独创建接口声明的项目,conrtroller接口定义放在了service项目中,如果接口比较多可以单独创建一个Service.Interface的项目。
4)Data项目,包含远程的数据代理及本地数据获取提供。