Files
XplorePlane/README.md
T
XplorePlane Developer 957157ae80 fix: 修复编译错误、BGA向导预览、算子重复插入及状态栏消息
## Compilation fixes
- Fix XAML namespace reference XplorePlane.Converters → XplorePlane.Helpers (EventLogView, StateDisplayView)
- Add missing using for ISampleTypeRepository / JsonSampleTypeRepository in App.xaml.cs
- Fix ILoggerService.Warn() calls using Exception as first arg instead of message string
- Serialize CncProgram to JSON when passing to MatrixLayout (expects string, not CncProgram object)
- Suppress CS8632 nullable annotation warnings project-wide

## BGA wizard fixes
- Fix preview not showing on step 3: force RefreshBgaPreview() when entering final step
- Add step validation in CanNext() to prevent skipping to preview with invalid inputs
- Notify NextCommand.CanExecuteChanged when inputs change
- Fix RunProgress runtime binding error: set Mode=OneWay for ProgressBar.Value

## Operator toolbox: prevent duplicate insertion
- Add static OperatorTarget property for direct dispatch to active pipeline
- PipelineEditorView registers as toolbox target on load (floating window only)
- CNC page sets initial target; PipelineEditorWindow resets to CNC pipeline on close
- '+' button inserts only to the active pipeline instead of broadcasting to all subscribers

## Pipeline editor status bar messages
- Add StatusBarMessageEvent / StatusBarMessagePayload to CommonEvents.cs
- PipelineEditorViewModel publishes status on all ops (add/remove/reorder/save/execute)
- MainViewModel subscribes and displays on main window bottom status bar
- Auto-clear after timeout (3s info, 5s error)

## docs
- Merge three architecture docs into consolidated XplorePlane-架构与结构说明.md
2026-07-24 15:59:16 +08:00

205 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## XplorePlane 平面CT软件
### 系统目标
XplorePlane 系统用于控制平面 CT 设备的各个子系统(射线源、探测器、运动控制、相机)并完成采集图像的处理与分析,为研发与调试提供统一的软件平台。
### 总体架构
- 客户端框架: WPF + Prism MVVM(目标框架 net8.0-windows
- 图像处理内核: ImageProcessing.Core(算子基类)+ ImageProcessing.Processors(具体算子),基于 EmguCV
- 相机控制: XP.CameraBasler pylon SDK 封装,支持软件触发、参数读写)
- 硬件抽象: XP.Common + XP.Hardware.RaySource(射线源控制)
- 日志: Serilog
- UI 组件: Telerik RadRibbonView、Fluent.Ribbon
### 解决方案结构
```
XplorePlane.sln
├── XplorePlane/ # 主应用程序(WPF + Prism
├── XP.Common/ # 公共基础库:日志、数据库、Dump、通用控件等
├── XP.Camera/ # 相机控制库(Basler / Hikvision 等)
├── XP.Hardware.Detector/ # 探测器硬件抽象与实现
├── XP.Hardware.MotionControl/ # 运动控制模块
├── XP.Hardware.PLC/ # PLC 通信模块
├── XP.Hardware.PLC.Sentry/ # PLC 信号监控 / Sentry 工具
├── XP.Hardware.RaySource/ # 射线源控制模块
├── XP.Hardware.RaySource.Comet.Host/ # Comet 射线源独立 Host 进程
├── XP.Hardware.RaySource.Comet.Messages/# Comet Host 通信消息定义
├── XP.ImageProcessing.Core/ # 图像处理算子基类与核心模型
├── XP.ImageProcessing.Processors/ # 具体图像处理算子实现
├── XP.ImageProcessing.CfgControl/ # 图像处理配置控件
├── XP.ImageProcessing.RoiControl/ # ROI 绘制与测量控件
├── XP.ImageProcessing.SmokeTest/ # 图像处理冒烟测试程序
├── XP.Scan/ # 扫描模式相关模块
├── XP.Calibration/ # 校准模块
├── XP.ReportEngine/ # 报告生成模块
├── XplorePlane.Tests/ # 单元测试项目(不一定参与当前 sln 构建)
├── ExternalLibraries/ # 外部 DLL、模板、模型等运行依赖
├── ReleaseFiles/ # 已整理的发布文件快照
└── bin/ # 当前主程序构建输出目录(由 XplorePlane.csproj 配置)
```
> 当前主程序 [XplorePlane/XplorePlane.csproj](XplorePlane/XplorePlane.csproj) 通过 `BaseOutputPath=..\bin\` 将输出放在解决方案根目录的 `bin/` 下,而不是 `XplorePlane/bin/` 下。`XP.App/` 是旧输出路径,不再作为当前主程序输出目录使用。
### 运行时目录与数据存储
运行时产生的数据统一放在源码仓库外的 `D:\XPData`,避免数据库、日志、采集图像、Dump 和报告污染 `D:\XplorePlane` 源码目录。
默认配置见 [XplorePlane/App.config](XplorePlane/App.config)
```xml
<add key="XpData:RootPath" value="D:\XPData" />
<add key="Serilog:LogPath" value="D:\XPData\Logs" />
<add key="Sqlite:DbFilePath" value="D:\XPData\DataBase\XP.db" />
<add key="Detector:SavePath" value="D:\XPData\DetectorImages" />
<add key="Dump:StoragePath" value="D:\XPData\Dump" />
<add key="Report:OutputDirectory" value="D:\XPData\Report" />
```
推荐目录结构:
```
D:\XPData
├── DataBase\ # SQLite 数据库,例如 XP.db
├── DetectorImages\ # 探测器采集图像
├── Logs\ # Serilog 运行日志
├── Dump\ # 异常 Dump 文件
├── Report\ # 报告输出目录
├── Plan\ # 工艺 / CNC / 检测程序数据
├── Tools\ # 工具相关数据
└── Data\ # 其他运行数据
```
`XplorePlane.Services.Storage.XpDataPathService` 会确保上述受管目录存在。发布目录 [ReleaseFiles/](ReleaseFiles/) 中的 `App.config``XplorePlane.dll.config` 也应保持同样的运行时路径。
源码目录下旧的运行数据目录(如 `DataBase/XP.db``DetectorImages/``Dump/``Report/``Logs/`)不应提交到 Git,已在 [.gitignore](.gitignore) 中忽略。
### XplorePlane 主项目结构
```
XplorePlane/
├── App.xaml / App.xaml.cs # 应用入口 + DI 容器配置(AppBootstrapper
├── Views/
│ ├── Main/
│ │ ├── MainWindow.xaml # 主窗口(Telerik Ribbon + 三栏布局)
│ │ ├── NavigationPropertyPanelView.xaml # 相机实时预览面板
│ │ └── MotionControlPanelView.xaml # 运动控制面板
│ ├── Cnc/ # CNC 编辑器 / 矩阵编排视图
│ ├── ImageProcessing/ # 图像处理面板视图
│ └── CameraSettingsWindow.xaml # 相机参数设置对话框
├── ViewModels/
│ ├── Main/
│ │ ├── MainViewModel.cs # 主窗口 ViewModel
│ │ └── NavigationPropertyPanelViewModel.cs # 相机预览 ViewModel
│ ├── Cnc/ # CNC / 矩阵 ViewModel
│ └── ImageProcessing/ # 图像处理 / 流水线 ViewModel
├── Services/
│ ├── AppState/ # 全局状态管理(线程安全)
│ ├── Camera/ # 相机服务
│ ├── Cnc/ # CNC 程序服务
│ ├── Matrix/ # 矩阵编排服务
│ ├── Measurement/ # 测量数据服务
│ ├── Pipeline/ # 流水线执行 / 持久化
│ └── Recipe/ # 检测配方服务
├── Models/ # 数据模型(State、CNC、Matrix、Pipeline 等)
├── Events/ # Prism 事件
├── Libs/
│ ├── Hardware/ # 硬件库 DLLXP.Common、XP.Hardware.RaySource
│ └── Native/ # 原生依赖库
└── Assets/Icons/ # 工具栏图标
```
### 相机集成
相机实时影像集成在主窗口左下角的 NavigationPropertyPanelView 中:
- 连接/断开相机(Basler,通过 ICameraController
- 开始/停止采集(软件触发模式)
- 实时预览(Live View,勾选"实时"复选框)
- 鼠标悬停显示像素坐标
- 相机参数设置对话框(曝光时间、增益、分辨率、像素格式)
- 主界面 Ribbon 硬件栏提供"相机设置"快捷按钮
相机控制逻辑移植自 ImageProcessing 项目,使用 XP.Camera.PixelConverter 进行像素数据转换,通过 Application.Dispatcher.Invoke 保证 UI 线程安全。
### 依赖注入(DI
使用 Prism + DryIoc,在 AppBootstrapper.RegisterTypes() 中统一注册:
- ICameraFactory / ICameraController / ICameraService(单例)
- IRaySourceService / IRaySourceFactory(单例)
- IAppStateService(单例,线程安全状态管理)
- NavigationPropertyPanelViewModel(单例,相机预览共享实例)
- 各 Service 和 ViewModel(按需注册)
### 构建与输出
本解决方案采用“入口程序、硬件与 Native 依赖项目固定 x64,纯托管类库保持 Any CPU”的平台策略,避免一刀切把所有类库强制为 x64。
[ReleaseFiles/](ReleaseFiles/) 是发布文件快照,不是普通编译输出目录;清理或更新运行依赖时需要同步检查该目录。
```bash
# Debug
dotnet build XplorePlane.sln -c Debug -p:Platform=x64
# Release
dotnet build XplorePlane.sln -c Release -p:Platform=x64
# 只构建主程序
dotnet build XplorePlane/XplorePlane.csproj -c Release -p:Platform=x64
```
当前解决方案面向 x64 平台,主程序输出目录由 [XplorePlane/XplorePlane.csproj](XplorePlane/XplorePlane.csproj) 配置为:
```text
D:\XplorePlane\bin\<Platform>\<Configuration>\net8.0-windows\win-x64\
```
当前 Debug 生成目录格式:
```text
D:\XplorePlane\bin\x64\Debug\net8.0-windows\win-x64\
```
当前生成目录结构:
```text
D:\XplorePlane\bin\
└── x64\
└── Debug\
└── net8.0-windows\
└── win-x64\
├── XplorePlane.exe
├── XplorePlane.dll
├── XplorePlane.dll.config
├── Host\ # Comet Host 输出目录
├── runtimes\ # NuGet / runtime 原生依赖
└── ... # 其他程序集、资源与运行依赖
```
Comet Host 编译后会复制到当前主程序输出目录的 `Host/` 子目录:
```text
D:\XplorePlane\bin\x64\Debug\net8.0-windows\win-x64\Host\
```
### 平台配置策略
### TO-DO List
- [x] 软件基于 WPF + Prism 基础的框架
- [x] 日志库的引用(通过 XP.Common.dll
- [x] 按推荐的 DLL 目录结构进行修改
- [x] 通过库依赖的方式调用日志功能
- [x] 界面的布局
- [x] 相机实时影像集成(连接、采集、Live View、像素坐标显示)
- [x] 相机参数设置对话框(曝光、增益、分辨率、像素格式)
- [x] 主界面硬件栏相机设置按钮
- [x] 打通与硬件层的调用流程
- [x] 打通与图像层的调用流程
- [ ] CNC的执行、存储逻辑的开发测试
- [ ] 涉及到图像校准,矩阵