PCB决策引擎:多维决策表转决策树
准备设计一个PCB使用的决策引擎,需要用到决策表,而单维决策表不能满足业务要求,
这里主要是为了实现:用户编辑的是决策表,实际底层存储的是树结构,树的的各个节点挂上业务决策逻辑.
这里将多维决策表转决策树构思整理如下:
一.决策表(多维表头结构UI编辑界面)
用户可编辑的规则界面,规则决策表交由用户配制,可实现任意多表头结构的决策表。
二.决策树(TreeNode 简易界面)
TreeNode 是从决策表中转换过来的,可以实现节点决策控制,后续转换TreeNodeVIew用户可以附加属性编辑
左表头 上表头


三.DB数据库存储结构
多表头结构:

交叉行列号存储值表:

四.决策表转决策树 C#程序实现代码:
/// <summary>
/// 采用TreeNode做为树根结点做为起始点递归实现
/// </summary>
/// <param name="TreeNode_"></param>
private void ExcelHeadToTreeNodes(TreeNode TreeNode_)
{
T_RuleTableRowColumnMultiExpression ModTableCell_ = (T_RuleTableRowColumnMultiExpression)TreeNode_.Tag;
if (ModTableCell_ == null)
return; int StartColumnIndex = ;
int EndColumnIndex = ;
int ColumnCount = ;
int StartRowIndex = ;
if (ModTableCell_.DimensionNum == ) //维度1 列
{
ColumnCount = ModTableCell_.EndColumnIndex - ModTableCell_.StartColumnIndex + ;
if (ColumnCount == ) return;
StartColumnIndex = ModTableCell_.StartColumnIndex;
EndColumnIndex = ModTableCell_.EndColumnIndex;
StartRowIndex = ModTableCell_.StartRowIndex + ;
}
else if (ModTableCell_.DimensionNum == )//维度1 行
{
ColumnCount = ModTableCell_.EndRowIndex - ModTableCell_.StartRowIndex + ;
if (ColumnCount == ) return;
StartColumnIndex = ModTableCell_.StartRowIndex;
EndColumnIndex = ModTableCell_.EndRowIndex;
StartRowIndex = ModTableCell_.StartColumnIndex + ;
}
else
{
return;
}
int LayerIndexCurrent = ModTableCell_.LayerIndex + ;
int i = ; //层次
while (StartColumnIndex <= EndColumnIndex)
{
Excel.Range cell;
int StartRowIndex_ = , StartColumnIndex_ = , EndRowIndex_ = , EndColumnIndex_ = , ColumnCount_ = ;
string CellStringID_ = "", CellVal_ = "";
if (ModTableCell_.DimensionNum == ) //维度1 列头
{
cell = ((Excel.Range)_WorkSheet.Cells[StartRowIndex, StartColumnIndex]);
var CellMergeArea = cell.MergeArea;
var CellRowsCount = CellMergeArea.Rows.Count;
var CellColumnsCount = CellMergeArea.Columns.Count;
CellVal_ = cell.Text.ToString();
StartRowIndex_ = ModTableCell_.EndRowIndex + ;
StartColumnIndex_ = StartColumnIndex;
EndRowIndex_ = StartRowIndex_ + (CellRowsCount - );
EndColumnIndex_ = StartColumnIndex_ + (CellColumnsCount - );
ColumnCount_ = CellColumnsCount;
CellStringID_ = Convert.ToChar(StartColumnIndex_ + ).ToString() + ((StartColumnIndex_ == EndColumnIndex_) ? "" : "_" + Convert.ToChar(EndColumnIndex_ + ).ToString()); }
else if (ModTableCell_.DimensionNum == ) //维度2 行头
{
cell = ((Excel.Range)_WorkSheet.Cells[StartColumnIndex, StartRowIndex]);
var CellMergeArea = cell.MergeArea;
var CellRowsCount = CellMergeArea.Rows.Count;
var CellColumnsCount = CellMergeArea.Columns.Count;
CellVal_ = cell.Text.ToString();
StartRowIndex_ = StartColumnIndex;
StartColumnIndex_ = ModTableCell_.EndColumnIndex + ;
EndRowIndex_ = StartRowIndex_ + (CellRowsCount - );
EndColumnIndex_ = StartColumnIndex_ + (CellColumnsCount - );
ColumnCount_ = CellRowsCount;
CellStringID_ = StartRowIndex_.ToString() + ((StartRowIndex_ == EndRowIndex_) ? "" : "_" + EndRowIndex_.ToString());
} T_RuleTableRowColumnMultiExpression ModTableCell_new = new T_RuleTableRowColumnMultiExpression();
ModTableCell_new.LayerIndex = LayerIndexCurrent;
ModTableCell_new.StartRowIndex = StartRowIndex_;
ModTableCell_new.StartColumnIndex = StartColumnIndex_;
ModTableCell_new.EndRowIndex = EndRowIndex_;
ModTableCell_new.EndColumnIndex = EndColumnIndex_;
ModTableCell_new.LayerOrder = i;
ModTableCell_new.CellStringID = CellStringID_;
ModTableCell_new.ParentCellStringID = ModTableCell_.CellStringID;
ModTableCell_new.DimensionNum = ModTableCell_.DimensionNum;
ModTableCell_new.TableNo = ModTableCell_.TableNo;
ModTableCell_new.Text = CellVal_;
ModTableCell_new.Value = CellVal_;
ModTableCell_new.Remark = CellVal_;
ModTableCell_new.Expression = CellVal_;
ModTableCell_new.DisplayName = CellVal_ + "________" + ModTableCell_new.CellStringID;
ModTableCell_new.AllOrder = ModTableCell_.AllOrder + ;
TreeNode TreeNodeNew_ = new TreeNode(ModTableCell_new.DisplayName);
TreeNodeNew_.Tag = ModTableCell_new;
TreeNode_.Nodes.Add(TreeNodeNew_); ExcelHeadToTreeNodes(TreeNodeNew_); StartColumnIndex = StartColumnIndex + (ColumnCount_ - ) + ; i++;
} }
/// <summary>
/// 多维二维表结构
/// </summary>
public class T_RuleTableRowColumnMultiExpression
{
/// <summary>
/// 规则表名ID
/// </summary>
public int TableNo { get; set; }
/// <summary>
/// 维度
/// </summary>
public int DimensionNum { get; set; }
/// <summary>
/// 层次深度
/// </summary>
public int LayerIndex { get; set; }
/// <summary>
/// 层次排序号
/// </summary>
public int LayerOrder { get; set; }
/// <summary>
/// 节点单元格值ID
/// </summary>
public string CellStringID { get; set; }
/// <summary>
/// 父节点单元格值ID
/// </summary>
public string ParentCellStringID { get; set; }
/// <summary>
/// 节点:显示名
/// </summary>
public string DisplayName { get; set; }
/// <summary>
/// 节点:表达式
/// </summary>
public string Expression { get; set; }
/// <summary>
/// 节点:文本内容
/// </summary>
public string Text { get; set; }
/// <summary>
/// 节点:值
/// </summary>
public string Value { get; set; }
/// <summary>
/// 节点:备注
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 开始行号
/// </summary>
public int StartRowIndex { get; set; }
/// <summary>
/// 开始列号
/// </summary>
public int StartColumnIndex { get; set; }
/// <summary>
/// 终止行号
/// </summary>
public int EndRowIndex { get; set; }
/// <summary>
/// 终止列号
/// </summary>
public int EndColumnIndex { get; set; }
/// <summary>
/// 总排序
/// </summary>
public int AllOrder { get; set; }
}
PCB决策引擎:多维决策表转决策树的更多相关文章
- PCB 围绕CAM自动化,打造PCB规则引擎
AutoCAM自动化平台,前端管理订单,而后端执行任务,前端UIl界面有板厚,铜厚,板材,表面处理,层数等信息,而这些信息并不是后端最终所需要的信息后.拿钻孔补偿来说,后端需要的是钻孔补偿值,但前端并 ...
- PCB 规则引擎之脚本语言JavaScript应用评测
世界上没有好做的软件,觉得好做,只是你的系统简单而已,而不是哪个行业简单,特别像我们PCB制造企业务逻辑的很复杂的,仅仅靠决策树中的每个节点布置决策逻辑是不能满足要求的,所以我们在制作PCB规则引擎必 ...
- PCB 规则引擎之JSON对象查看器
在PCB规则引擎开发中,JavaScript V8引擎是处理业务逻辑的, 当然业务逻辑需要数据支撑才行, 即需有将数据推进入到V8引擎.目前这边数据传输到JavaScript V8引擎以C# Mod ...
- StartDT AI Lab | 视觉智能引擎+数据决策引擎——打造商业“智能沙盘”
众所周知,线上商家可以通过淘宝平台的大量前端“埋点”轻松获取商品的加购率.收藏率.转化率.成交额等大量基础信息,甚至商家能够在更精细的层面,获取商品关键字变化或者上新/爆款带来的流量变化数据,更甚者商 ...
- 通俗地说决策树算法(三)sklearn决策树实战
前情提要 通俗地说决策树算法(一)基础概念介绍 通俗地说决策树算法(二)实例解析 上面两篇介绍了那么多决策树的知识,现在也是时候来实践一下了.Python有一个著名的机器学习框架,叫sklearn.我 ...
- PCB 规则引擎之编辑器(语法着色,错误提示,代码格式化)
对于一个规则引擎中的脚本代码编辑器是非常关键的,因为UI控件直接使用对象是规则维护者,关系到用户体验,在选用脚本编辑器的功能时除了满足代码的编辑的基本编辑要求外,功能还需要包含;语法着色,错误提示,代 ...
- PCB Genesis加二维码 实现方式
使用incam可以很轻松的增加2维码,这里通过另外一种方式玩转二维码的加法, 使用谷歌zxing.dll类库实现,将文字信息转为bitmap点阵后,在Genesis绘制点即可. 一.incam增加二维 ...
- .Net规则引擎Biztalk,Workflow和CKRule的比较
微软的规则引擎 很多朋友会问,.Net平台有没有规则引擎?像Java就有很多的规则引擎,Drools,ILog都做得非常好,但.Net好像还没有哦.很多知道规则引擎,但不知道.Net的朋友都烦这个 ...
- 决策树(decision tree)
决策树是一种常见的机器学习模型.形象地说,决策树对应着我们直观上做决策的过程:经由一系列判断,得到最终决策.由此,我们引出决策树模型. 一.决策树的基本流程 决策树的跟节点包含全部样例,叶节点则对应决 ...
随机推荐
- Linux 之CentOS7使用firewalld打开关闭防火墙与端口
一.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...
- cad二次开发中各种头的定义
Database db=HostApplicationServices.WrokingDatabase; Editor ed=Autodesk.AutoCAD.ApplicationService.A ...
- 用C#在Visual Studio写Javascript单元测试(Firefox内核)
引用nuget包: 注意:Geckofx45 nuget包必须是最后引用,否则初始化会出错 编写JsRunner using Gecko; using System; using System.Col ...
- Django URL(路由系统)
Django URL Django 1.11版本 URLconf官方文档 URL配置(URLconf)就像 Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的 ...
- 【hiho一下 第146周】子矩阵求和
[题目链接]:http://hihocoder.com/contest/hiho146/problem/1 [题意] [题解] 设s[i][j]表示左上角的坐标为(i,j)的n*m的矩阵的和; 有s[ ...
- 【[Offer收割]编程练习赛12 C】矩形分割
[题目链接]:http://hihocoder.com/problemset/problem/1495 [题意] [题解] 把每个方块都再分成3*3的小块; 这样; 对于一个方块来说 如果是'\' 则 ...
- 详解Cookie、LocalStorage、SessionStorage
不管是笔试还是面试相信大家都会经常遇到问Cookie.LocalStorage.SessionStorage 这三个不同的,什么不说先上一波图先: 针对他们大小之分应用场景也有不同: 因为考虑到每个 ...
- 暑假集训D16总结
考试 日常爆炸= = T1 一看就是个树规,然而不会写方程= = T2 一看就是个分块,然而不会分= = T3 终于有点头绪,推了两个小时的30分部分分情况,然后打挂了= = 我玩个鬼啊 其实听完,觉 ...
- 清北学堂模拟赛d2t5 吃东西(eat)
题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1 ...
- jQuery WEI----DIV+CSS样式li自动适应高度,自动换行,横向排列
设置相关样式即可,按照需求自己修改样式,Demo代码如下: <li style="display:inline;;line-height:24px;height:auto;word-b ...