957157ae80
## 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
112 lines
3.3 KiB
Plaintext
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"
|
|
}
|
|
]
|
|
} |