news 2026/6/11 19:47:00

Solution.cs SolutionInfo.cs 完整解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Solution.cs SolutionInfo.cs 完整解析

Solution.cs(433行,全局大脑):

  • 单例模式,Ins可被CreateSolution()覆盖重建
  • ProjectList管理 N 个流程,End流程永远插在末尾,新建流程自动 ID 分配
  • 四组运行控制:全局StartRun/ExecuteOnce/StopRun+ 单流程StartRun/ExecuteOnce/StopRun(id)StopRun会先启动 End 流程作为收尾钩子
  • SetIsEnable()运行/空闲状态切换时禁用/恢复所有 UI 按钮
  • QueueDic+QueueSignDic全局队列(跨 Project DataIn/DataOut 共享)
  • LoadCommunacation/UpdataCommunacation通讯设备的序列化/恢复桥梁

SolutionInfo.cs(765行,数据结构库):

  • 20+ 个几何/标定/测量数据结构,全部[Serializable]
  • ROIBase抽象基类(genRegion/genXLD/getTuple三接口)
  • 核心类型:Line_Info(自动计算中点/方向)、Circle_Info(弧支持)、Coord_Info(项目中使用最频繁的 X/Y/Phi/Score)、Cal_Info(17 字段标定信息)、RPoint(支持-运算符和GetDistance属性)
  • 完整生命周期流程图:从反序列化恢复 → 运行中 → 保存序列化

Solution.cs & SolutionInfo.cs 完整解析

文件:Services\Solution.cs(433行) +Services\SolutionInfo.cs(765行)
角色: Solution = 全局大脑 (流程管理/单例/运行控制) | SolutionInfo = 数据结构库 (几何类型/标定信息)
总计: ~1200行


一、Solution.cs — 全局大脑

1.1 架构定位

Solution (单例) │ ┌───────────┼───────────┐ ▼ ▼ ▼ ProjectList QueueDic SysVar (N个流程) (数据队列) (全局变量) │ ┌────┼────┐ ▼ ▼ ▼ Home 主流程 End

1.2 单例模式

privatestaticSolution_Instance=null;publicstaticSolutionIns{get{if(_Instance==null)_Instance=newSolution();return_Instance;}set{_Instance=value;}// ← 可被外部覆盖!}

set的意义:CreateSolution()会执行Ins = new Solution()覆盖旧实例 — 这是"新建方案"的实现方式。

1.3 属性全景

流程相关
属性类型说明
ProjectListList<Project>所有流程/方法/文件夹
CurrentProjectProject当前激活的流程
CurrentProjectIDint当前流程ID
全局数据
属性类型说明
QueueDicDictionary<string, DataOut>DataIn/DataOut 共享队列
QueueSignDicDictionary<string, AutoResetEvent>队列信号量
SysVarObservableCollection<VarModel>全局变量 (所有流程共享)
UI/配置
属性类型说明
UIDesignTextstring自定义UI布局XAML
IsUseUIDesignbool是否启用自定义UI
QuickModebool快速模式 (跳过UI刷新和延时)
ViewModeeViewMode画布显示模式
eCommunacationsList<ECommunacation>通讯设备列表 (序列化持久化)

1.4 核心方法详解

SetIsEnable() — UI按钮状态切换
publicvoidSetIsEnable(){boolrunning=GetStates();// 检查是否有任何流程在运行if(running){// ★ 运行中: 禁用所有编辑操作, 开启停止/继续按钮IsEnableControl.Ins.Stop=true;IsEnableControl.Ins.RunCycle=false;IsEnableControl.Ins.NewSolution=false;// ...ProcessView.Ins.btnRunOnce.ToolTip="继续运行(F5)";}else{// ★ 空闲中: 恢复所有按钮IsEnableControl.Ins.Stop=false;IsEnableControl.Ins.RunOnce=true;IsEnableControl.Ins.NewSolution=true;// ...ProcessView.Ins.btnRunOnce.ToolTip="当前项目单次执行";}}

调用时机: 每次Project.ThreadStatus变化时触发 (set { _ThreadStatus = value; Solution.Ins.SetIsEnable(); })

CreateSolution() — 新建方案
publicvoidCreateSolution(){// ① 确认弹窗MessageView.Ins.MessageBoxShow("创建新的解决方案会覆盖掉当前已有的解决方案...",...);// ② 清空 + 重建Ins=newSolution();// ③ 创建三个默认流程: Home, 主流程, EndIns.CreateProject(eProjectType.Process);// → HomeIns.CreateProject(eProjectType.Process);// → 主流程Ins.CreateProject(eProjectType.Process);// → EndIns.ProjectList[0].ProjectInfo.ProcessName="Home";Ins.ProjectList[1].ProjectInfo.ProcessName="主流程";Ins.ProjectList[2].ProjectInfo.ProcessName="End";}
CreateProject() — 创建流程 (自动ID分配)
publicintCreateProject(eProjectTypeprojectType,intparentId=0){Projectproject=newProject();// ← 构造函数启动后台线程!// ① 自动分配不重复的ID (轮询最小未被占用的)intid=0;do{flag=true;foreach(ProjectprjinProjectList)if(prj.ProjectInfo.ProjectID==id){id++;flag=false;break;}}while(!flag);project.ProjectInfo.ProjectID=id;project.ProjectInfo.ProcessName=$"流程{id}";// 默认名// ② Method 类型插入到父级后面, 其他类型插入到倒数第二个 (End之前)if(projectType==eProjectType.Method)ProjectList.Insert(parentIndex+1,project);elseProjectList.Insert(ProjectList.Count-1,project);// End 永远在最后CurrentProject=project;returnid;}

关键设计: 任何新建流程都插入到End之前 —End流程永远在列表末尾, 是停止运行的专用流程。

运行控制 — 四组方法
// ===== 全局运行 (全部"主动执行"的流程) =====StartRun()// 循环运行 (RunCycle)ExecuteOnce()// 单次运行 (RunOnce)ExecuteOnceHome()// 仅运行 Home 流程StopRun()// 停止: 运行 End 流程 + 其他流程 Stop()// ===== 单流程运行 (指定 projectID) =====StartRun(intprojectID)// 循环ExecuteOnce(intprojectID)// 单次StopRun(intprojectID)// 停止

全局 StopRun 的特殊处理:

publicvoidStopRun(){ProjectList.ForEach(item=>{if(item.ProjectInfo.ProcessName=="End"){item.RunMode=eRunMode.RunOnce;item.Start();// ★ 运行 End 流程 (做清理/收尾工作)}else{item.Stop();}});}

End流程不停止, 反而被启动 — 这是一个"收尾钩子"设计: 在停止所有流程前运行一次 End 流程。

LoadCommunacation / UpdataCommunacation — 通讯设备持久化
// 反序列化后调用: 把持久化的设备列表恢复到全局字典并连接publicvoidLoadCommunacation(){foreach(varitemineCommunacations){item.IsConnected=false;// 反序列化后状态均为断开item.IsHasObjectConnected=false;}EComManageer.setEcomList(eCommunacations);// → 恢复字典 + 逐个 Connect()}// 序列化前调用: 把全局字典的最新状态写入持久化列表publicvoidUpdataCommunacation(){eCommunacations=EComManageer.GetEcomList();}

二、SolutionInfo.cs — 几何数据结构库

2.1 文件定位

这是一个纯数据结构文件— 没有方法逻辑, 全部是class/struct定义。物理上放在Services/SolutionInfo.cs, 命名空间也是JGTechVision.Services, 但逻辑上独立于 Solution。

2.2 类/结构体全景

ROIBase (抽象基类) ├── Line_Info 直线信息 (起点/终点/法向量/方向) ├── Circle_Info 圆信息 (圆心/半径/起止角度) ├── Ellipse_Info 椭圆信息 (中心/Phi/两个半径) ├── Rect_Info 矩形信息 (左上+右下角) ├── Rect2_Info 旋转矩形 (中心/角度/两半边长) ├── DrawRoi_Info 自定义形状 │ ├── Coord_Info 十字坐标 (X/Y/Phi/Score) ├── Cal_Info 标定信息 (17个字段) ├── Meas_Info 测量信息 (长度/宽度/阈值/间隔) ├── NPoint 九点信息 (索引/像素XY/机械XY) ├── RectRoiInfo 矩形阵列返回信息 ├── Point3DF 3D点 (X/Y/Z) ├── Plane_Info 平面信息 ├── TagVector 向量 ├── PtoP_Info 点到点信息 ├── Text_Info 文本信息 ├── Rtn_Info 返回信息 ├── Set_Info 显示设置信息 ├── Luma_Info 亮度信息 ├── Save_Info 保存信息 ├── Char_Info 运算信息 └── RPoint 机器人点位 (支持 - 运算符)

2.3 核心类型详解

ROIBase — 几何抽象基类
[Serializable]publicabstractclassROIBase{publicstringsColor{get;set;}="cyan";publicabstractHRegiongenRegion();// 生成 Halcon RegionpublicabstractHXLDContgenXLD();// 生成 Halcon XLD 轮廓publicabstractHTuplegetTuple();// 序列化为 Halcon 元组}

所有几何类型继承它, 统一了"区域→轮廓→序列化"三个接口。

Line_Info — 直线信息
publicclassLine_Info:ROIBase,ICloneable{publicdoubleStartX,StartY;// 起点publicdoubleEndX,EndY;// 终点publicdoubleMidX,MidY;// 中点 (构造函数自动计算)publicdoublePhi;// 方向角 (构造函数自动计算)publicdoubleNx,Ny;// 法向量publicdoubleDist;// 到原点的距离}

构造函数中的自动计算:Phi = HMisc.AngleLx(StartY, StartX, EndY, EndX)+MidY = (StartY+EndY)/2— 减少外部冗余代码。

Circle_Info — 圆信息
publicclassCircle_Info:ROIBase,ICloneable{publicdoubleCenterY,CenterX,Radius;publicdoubleStartPhi=0.0,EndPhi=Math.PI*2;// 弧的起止角度publicstringPointOrder="positive";// 点顺序}
Coord_Info — 十字坐标
publicstructCoord_Info{publicboolStatus;publicdoubleY,X,Phi,Score;// 注意: 存储顺序是 Y, X (Halcon惯例 row→col)}

这个 struct 在整个项目中大量使用 — 模板匹配、坐标补正、测量结果都依赖它。

Cal_Info — 标定信息 (17字段)
publicstructCal_Info{publicdoubleParallelX,ParallelY;// 平移publicdoublePixelX,PixelY;// 像素当量publicdoubleRotationAngle;// 旋转角度publicdoubleTiltAngle;// 倾斜角度publicdoubleRMS;// 均方根误差publicdoubleRrotationCenterX,Y;// 旋转中心publicdoubleRotateX_Robot,Y_Robot;// 旋转中心机械坐标publicboolRotatingEnabled;// 旋转启用publicboolSameDirection;// 方向一致publicboolCameraFix;// 相机固定/移动publicdoubleMarkX,MarkY;// Mark点publicdoubleBaselineX,Y,Angel;// 基准坐标/角度}
RPoint — 机器人点位 (支持运算符)
publicclassRPoint{publicdoubleX,Y,R;// ★ 支持减法运算符publicstaticRPointoperator-(RPointp1,RPointp2){returnnewRPoint(p1.X-p2.X,p1.Y-p2.Y,p1.R-p2.R);}// ★ 属性计算距离publicdoubleGetDistance=>Math.Sqrt(X*X+Y*Y);}

三、Solution 完整生命周期

启动 │ ▼ 反序列化 Solution 对象 │ ├→ Solution.Ins = 反序列化结果 (覆盖单例) ├→ LoadCommunacation() │ └→ EComManageer.setEcomList(eCommunacations) │ └→ 每个设备 Connect() │ ├→ ProjectList 被恢复 │ └→ 每个 Project 构造 → 启动后台线程 → WaitOne 阻塞 │ └→ UI 就绪, 显示 ProjectList ════════ 运行中 ════════ 用户点击"连续运行" │ ▼ Solution.StartRun() ├→ 遍历 ProjectList (排除 Home/End) ├→ RunMode = RunCycle └→ item.Start() → ThreadStatus=true → Set() 用户点击"停止" │ ▼ Solution.StopRun() ├→ End 流程 → Start() (收尾钩子) └→ 其余流程 → Stop() → ThreadStatus=false ════════ 保存 ════════ 用户点击"保存" │ ▼ Solution.UpdataCommunacation() └→ eCommunacations = EComManageer.GetEcomList() 序列化 Solution ├→ ProjectList (含 ModuleList, OutputMap...) ├→ eCommunacations ├→ SysVar └→ UIDesignText

文档说明: 基于 Solution.cs (433行) + SolutionInfo.cs (765行) 源码静态分析生成。Solution 是全局单例, 序列化时持久化流程列表、通讯设备和全局变量。SolutionInfo 定义 20+ 几何/标定数据结构, 全部实现[Serializable]。当前版本 2026-06-10。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 19:46:53

揭秘Genesis Plus GX:如何用精准模拟技术复活世嘉经典游戏机

揭秘Genesis Plus GX&#xff1a;如何用精准模拟技术复活世嘉经典游戏机 【免费下载链接】Genesis-Plus-GX An enhanced port of Genesis Plus - accurate & portable Sega 8/16 bit emulator 项目地址: https://gitcode.com/gh_mirrors/ge/Genesis-Plus-GX 在复古游…

作者头像 李华
网站建设 2026/6/11 19:43:36

3个关键问题:KubeEdge如何重新定义边缘计算的技术边界?

3个关键问题&#xff1a;KubeEdge如何重新定义边缘计算的技术边界&#xff1f; 【免费下载链接】kubeedge Kubernetes Native Edge Computing Framework (project under CNCF) 项目地址: https://gitcode.com/GitHub_Trending/ku/kubeedge KubeEdge是CNCF旗下的Kubernet…

作者头像 李华
网站建设 2026/6/11 19:35:52

Burp Suite、爬虫、目录扫描工具实操深度总结

Burp Suite、爬虫、目录扫描工具实操深度总结赵新明文章标签&#xff1a;#Web 安全 #BurpSuite #渗透测试 #爬虫技术 #ZAP 目录扫描文章简介为期多单元的 Web 安全实训课程已全部完成&#xff0c;课程完整覆盖爬虫协议规则、HTTP 底层请求原理、主流渗透工具实操三大核心板块&a…

作者头像 李华
网站建设 2026/6/11 19:34:53

开发踩坑学习记录|若依Vue3\+Pinia\+Vite\+FBX模型 实战报错复盘

开发踩坑学习记录|若依Vue3+Pinia+Vite+FBX模型 实战报错复盘 开发环境:Vite + Vue3 script-setup + Pinia + ElementPlus + 若依Cloud-Vue3 一、若依Vue2 / Vue3 语法适配(项目首个高频报错) 1. 核心报错信息 Cannot read properties of undefined (reading $tab) 报错…

作者头像 李华
网站建设 2026/6/11 19:33:55

如何高效使用downkyi哔哩下载姬实现B站视频资源技术化管理

如何高效使用downkyi哔哩下载姬实现B站视频资源技术化管理 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff09;。…

作者头像 李华