Files
XplorePlane/XPData/Plan/新建检测程序.xp
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

112 lines
3.3 KiB
Plaintext

{
"Id": "bb0ac43e-48f8-4162-8a11-84516a46ea38",
"Name": "新建检测程序",
"CreatedAt": "2026-04-27T06:27:35.1741075Z",
"UpdatedAt": "2026-07-22T08:50:19.38032Z",
"Nodes": [
{
"$type": "SavePosition",
"MotionState": {
"StageX": 0,
"StageY": 0,
"SourceZ": 0,
"DetectorZ": 0,
"DetectorSwing": 0,
"FDD": 600,
"StageXSpeed": 0,
"StageYSpeed": 0,
"SourceZSpeed": 0,
"DetectorZSpeed": 0,
"DetectorSwingSpeed": 0,
"FDDSpeed": 0,
"StageRotation": 0,
"FixtureRotation": 0,
"FOD": 300,
"Magnification": 2,
"StageRotationSpeed": 0,
"FixtureRotationSpeed": 0
},
"SaveImage": false,
"ManualImagePath": "C:\\Users\\zhengxuan.zhang\\Desktop\\Images\\QFN_1_0100.bmp",
"Id": "33b15ad5-8665-48fe-a206-69af1086197e",
"Index": 0,
"NodeType": "SavePosition",
"Name": "位置1"
},
{
"$type": "InspectionModule",
"Pipeline": {
"Id": "cabd21e0-6849-40bd-83c2-0428d8d77dfd",
"Name": "检测模块_1",
"DeviceId": "",
"CreatedAt": "2026-05-15T02:36:44.0456492Z",
"UpdatedAt": "2026-06-03T02:05:02.4307364Z",
"Nodes": [
{
"Id": "42691aa0-ca3b-4d9c-ae92-102adf98ab3b",
"OperatorKey": "QfnLeadPadVoid",
"Order": 0,
"IsEnabled": true,
"Parameters": {
"RoiMode": "Polygon",
"PolyCount": 13,
"PolyX0": 89,
"PolyY0": 838,
"PolyX1": 107,
"PolyY1": 882,
"PolyX2": 188,
"PolyY2": 933,
"PolyX3": 618,
"PolyY3": 928,
"PolyX4": 815,
"PolyY4": 914,
"PolyX5": 833,
"PolyY5": 878,
"PolyX6": 872,
"PolyY6": 896,
"PolyX7": 858,
"PolyY7": 861,
"PolyX8": 900,
"PolyY8": 199,
"PolyX9": 890,
"PolyY9": 159,
"PolyX10": 835,
"PolyY10": 118,
"PolyX11": 165,
"PolyY11": 179,
"PolyX12": 169,
"PolyY12": 853,
"PadBlurSize": 5,
"PadThresholdLow": 0,
"PadThresholdHigh": 120,
"PadMorphKernel": 5,
"MinPadArea": 200,
"MaxPadArea": 100000,
"PadAspectRatioMin": 1.2,
"VoidThresholdLow": 128,
"VoidThresholdHigh": 255,
"MinVoidArea": 5,
"VoidMergeRadius": 2,
"VoidRateLimit": 50,
"MinQualifiedPadArea": 1000,
"Thickness": 2
}
}
]
},
"Id": "86fdf6e1-61f3-4646-8e52-81bc9dde7318",
"Index": 1,
"NodeType": "InspectionModule",
"Name": "模块1"
},
{
"$type": "PauseDialog",
"DialogTitle": "暂停",
"DialogMessage": "请确认后继续",
"Id": "08ae4805-081b-408f-a8aa-02ea39818177",
"Index": 2,
"NodeType": "PauseDialog",
"Name": "停顿_0"
}
]
}