# FCSChart
**Repository Path**: yiliaokeji/FCSChart
## Basic Information
- **Project Name**: FCSChart
- **Description**: FCS文件图表控件
- **Primary Language**: C#
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 11
- **Created**: 2023-06-28
- **Last Updated**: 2023-10-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 开源不易,感谢支持

# FCSChart
FCS文件图表控件
Chart:不带门的显示控件
ChartWithGraphicals:带门绘制的显示控件
轴类型有:线性(Line)、对数(Log10)、负数对数(Log10Biex)
门类型有:多边形门(PolygonGraphical)、四边形门(RectangleGraphical)、段选门(SegmentXGraphical、SegmentYGraphical)、直线门(LineHorizontalGraphical、LineVerticalGraphical)、四象限门(QuadrantGraphical)

## 文件目录结构 ##
| 名称 | 说明 |
| --- | --- |
| Axis | XY轴上的分隔刻度控件 |
| Converters | IValueConverter的实现类,用于值的转换,方便在WPF界面上显示 |
| Graphical | 门 |
| Series | 主要的图表数据显示控件,图表中心区域显示的内容由此目录下的类实现 |
| Themes | WPF样式模板等资源文件 |
| Chart | 图表控件基类 |
| ChartWithGraphicals | 带门绘制的图表控件 |
| ChartInCollecting | 带阈值和增益调整功能的图表控件 |
| DelegateCommand | ICommand实现类 |
| Helper | 帮助类,一些静态方法,包括随机颜色值等 |
| NotifyPropertyChanged | INotifyPropertyChanged实现类 |
## Chart图表控件主要属性 ##
| 属性 | 含义 | 类型 | 说明 |
| --- | --- | --- | --- |
| XSource | X轴数据源 | IList | 依赖属性。IList里的数据必须为可转成double的数据 |
| YSource | Y轴数据源 | IList | 依赖属性。IList里的数据必须为可转成double的数据 |
| Indexs | 数据源的过滤集合 | IList< int > | 依赖属性。数据源中的数据,索引在此集合的才显示。为空时表示使用数据源的所有值 |
| XValueConverter | XSource值转换方法 | Func< object, double > | 依赖属性。FCS文件里面的数据源是通道值,需要转换成刻度值 |
| YValueConverter | YSource值转换方法 | Func< object, double > | 依赖属性。FCS文件里面的数据源是通道值,需要转换成刻度值 |
| Series | 图形绘制类型 | ISeries | 依赖属性。ISeries类的子类对象,ContourSeries(等高线图)、DensitySeries(密度图)、HistogramSeries(直方图)、ScatterSeries(散点图) |
| XAxis | X轴类型 | IAxis | 依赖属性。IAxis类的子类对象,可选 LinearNumberAxis(线性)、LogarithmicNumberAxis(对数)、LogicleBiexAxis(可负数的对数) |
| YAxis | Y轴类型 | IAxis | 依赖属性。 IAxis类的子类对象,可选 LinearNumberAxis(线性)、LogarithmicNumberAxis(对数)、LogicleBiexAxis(可负数的对数)|
| ZoomType | 缩放方式 | AxisChangeType | 可指定鼠标滚轮缩放时,缩放X轴、Y轴或者两者都缩放或者都不缩放 |
| MoveType | 移动方式 | AxisChangeType | 可指定鼠标左键在图表显示区域按下并移动时,X轴、Y轴或者两者或者都不跟随鼠标改变最大最小值 |
## ChartWithGraphicals图表控件主要属性和方法(继承自Chart) ##
| 属性 | 含义 | 类型 | 说明 |
| --- | --- | --- | --- |
| Graphicals | 门集合 | ObservableCollection< BaseGraphical > | 该图表内所绘制的门的集合 |
| AllAreas | 门划分的区域集合 | ObservableCollection< GraphicalArea > | 添加门后,门划分的区域会在此集合内。多图的集合共用同一个对象时,散点图和直方图会以不同颜色显示所有门的区域 |
| AreaNameForeground | 区域名称显示的文字颜色 | Brush | 图表上区域内会显示一个名称 |
| AreaNameFontSize | 区域名称显示的字体大小 | double | 图表上区域内会显示一个名称 |
| GraphicalAreaAddCommand | 区域添加命令 | ICommand | 添加一个区域后会执行此命令 |
| GraphicalAreaRemoveCommand | 区域删除命令 | ICommand | 删除一个区域后会执行此命令 |
| PolygonCommand | 画多边形门命令 | ICommand | 依赖属性 |
| RectangleCommand | 画四边形门命令 | ICommand | 依赖属性 |
| SegmentXCommand | 画X轴段选门命令 | ICommand | 依赖属性 |
| SegmentYCommand | 画Y轴段选门命令 | ICommand | 依赖属性 |
| QuadrantCommand | 画四象限门命令 | ICommand | 依赖属性 |
| LineHorizontalCommand | 画横线门命令 | ICommand | 依赖属性 |
| LineVerticalCommand | 画竖线门命令 | ICommand | 依赖属性 |
| AddGraphicalFromModel(BaseGraphicalModel model) | 向图表添加一个门 | void | 根据不同的model类型添加不同类型的门 |
## ChartInCollecting图表控件主要属性和方法(继承自ChartWithGraphicals) ##
| 属性 | 含义 | 类型 | 说明 |
| --- | --- | --- | --- |
| MinGain | 增益最小值 | double | |
| MaxGain | 增益最大值 | double | |
| ShowXGain | 是否显示x轴上的增益 | bool | |
| ShowYGain | 是否显示y轴上的增益 | bool | |
| XGainValue | x轴的增益值 | double | 控制方式是移动x轴上的Thumb控件,鼠标移动到图表控件上时可见 |
| YGainValue | y轴的增益值 | double | 控制方式是移动y轴上的Thumb控件,鼠标移动到图表控件上时可见 |
| XGainChangedCommand | x轴上的增益更改完成命令 | ICommand | |
| YGainChangedCommand | y轴上的增益更改完成命令 | ICommand | |
| ShowXThreshold | 显示x轴上的阈值 | bool | |
| ShowYThreshold | 显示y轴上的阈值 | bool | |
| XThresholdValue | x轴上的阈值 | double | 控制方式是移动图中垂直于x轴的Line控件 |
| YThresholdValue | y轴上的阈值 | double | 控制方式是移动图中垂直于y轴的Line控件 |
| XThresholdChangedCommand | x轴阈值发生变化命令 | ICommand | |
| YThresholdChangedCommand | y轴阈值发生变化命令 | ICommand | |
## 示例 ##
### 前端 ###
```
```
### 后端 ###
使用到[FCS](https://gitee.com/Lvwl-CN/FCS)库
```
var fcss = FCS.Factory.ReadFCSFile(@"C:\test.fcs").ToList();
if (fcss.Count > 0)
{
var fcs = fcslist[0];
c1.XValueConverter = fcs.Measurements[1].ConvertChannelToScaleValue;
c1.YValueConverter = fcs.Measurements[4].ConvertChannelToScaleValue;
c1.XSource = fcs.Measurements[1].Values;
c1.YSource = fcs.Measurements[4].Values;
c1.AddGraphicalFromModel(new FCSChart.Graphical.PolygonGraphicalModel() { AreaNames = new List() { "test" }, Points = new List() { new Point(100, 100), new Point(10000, 100), new Point(10000, 10000) } });
}
```