From 2a762396d52a7fb420fd0f989d06ed76721ac8d6 Mon Sep 17 00:00:00 2001 From: "zhengxuan.zhang" Date: Wed, 1 Apr 2026 17:08:27 +0800 Subject: [PATCH] =?UTF-8?q?#0052=20=E8=A1=A5=E5=85=85=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Doc/硬件层及UI集成技术路线.md | 0 .../Libs/Hardware/XP.Hardware.Detector.dll | Bin 0 -> 72192 bytes XplorePlane/Libs/Hardware/XP.Hardware.PLC.dll | Bin 0 -> 39424 bytes .../XP.Hardware.RaySource.Comet.Messages.dll | Bin 0 -> 13312 bytes .../XP.Hardware.RaySource_Framework.dll | Bin 0 -> 34304 bytes .../ViewModels/Cnc/CncEditorViewModel.cs | 111 ++++++++++++++++-- XplorePlane/Views/Cnc/WindowIconHelper.cs | 51 ++++++++ 7 files changed, 152 insertions(+), 10 deletions(-) rename Doc/RAYSOURCE_VIEW_INTEGRATION_TECHNICAL.md => XplorePlane/Doc/硬件层及UI集成技术路线.md (100%) create mode 100644 XplorePlane/Libs/Hardware/XP.Hardware.Detector.dll create mode 100644 XplorePlane/Libs/Hardware/XP.Hardware.PLC.dll create mode 100644 XplorePlane/Libs/Hardware/XP.Hardware.RaySource.Comet.Messages.dll create mode 100644 XplorePlane/Libs/Hardware/XP.Hardware.RaySource_Framework.dll create mode 100644 XplorePlane/Views/Cnc/WindowIconHelper.cs diff --git a/Doc/RAYSOURCE_VIEW_INTEGRATION_TECHNICAL.md b/XplorePlane/Doc/硬件层及UI集成技术路线.md similarity index 100% rename from Doc/RAYSOURCE_VIEW_INTEGRATION_TECHNICAL.md rename to XplorePlane/Doc/硬件层及UI集成技术路线.md diff --git a/XplorePlane/Libs/Hardware/XP.Hardware.Detector.dll b/XplorePlane/Libs/Hardware/XP.Hardware.Detector.dll new file mode 100644 index 0000000000000000000000000000000000000000..a9c88df48600c051f9e947aa4d3c4370962c461d GIT binary patch literal 72192 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 VlsCWYFWSgokpKTr`hO&W{|lhWQD*=E literal 0 HcmV?d00001 diff --git a/XplorePlane/Libs/Hardware/XP.Hardware.RaySource.Comet.Messages.dll b/XplorePlane/Libs/Hardware/XP.Hardware.RaySource.Comet.Messages.dll new file mode 100644 index 0000000000000000000000000000000000000000..6adcfb01a5d5cb82cc1a0e55132c1df88828209e GIT binary patch literal 13312 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 literal 0 HcmV?d00001 diff --git a/XplorePlane/Libs/Hardware/XP.Hardware.RaySource_Framework.dll b/XplorePlane/Libs/Hardware/XP.Hardware.RaySource_Framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..eb1c1c626db13476718b8e6457c6721ae559095d GIT binary patch literal 34304 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 b?0 - /// 导出 CSV(占位实现)| Export CSV (placeholder) + /// 导出当前程序为 CSV 文件 | Export current program to CSV file /// private void ExecuteExportCsv() { - // TODO: 实现 CSV 导出功能 | Implement CSV export functionality - _logger.Info("CSV 导出功能尚未实现 | CSV export not yet implemented"); + if (_currentProgram == null || _currentProgram.Nodes.Count == 0) + { + _logger.Warn("无法导出 CSV:当前无程序或节点为空 | Cannot export CSV: no program or empty nodes"); + return; + } + + try + { + var dlg = new SaveFileDialog + { + Title = "导出 CSV", + Filter = "CSV 文件 (*.csv)|*.csv|所有文件 (*.*)|*.*", + DefaultExt = ".csv", + FileName = _currentProgram.Name + }; + + if (dlg.ShowDialog() != true) + return; + + var sb = new StringBuilder(); + // CSV 表头 | CSV header + sb.AppendLine("Index,NodeType,Name,XM,YM,ZT,ZD,TiltD,Dist,Voltage_kV,Power_W,RayOn,DetectorConnected,FrameRate,Resolution,ImageFile,MarkerType,MarkerX,MarkerY,DialogTitle,DialogMessage,DelayMs,Pipeline"); + + var inv = CultureInfo.InvariantCulture; + + foreach (var node in _currentProgram.Nodes) + { + var row = node switch + { + ReferencePointNode rp => $"{rp.Index},{rp.NodeType},{Esc(rp.Name)},{rp.XM.ToString(inv)},{rp.YM.ToString(inv)},{rp.ZT.ToString(inv)},{rp.ZD.ToString(inv)},{rp.TiltD.ToString(inv)},{rp.Dist.ToString(inv)},,,,,,,,,,,,,,", + + SaveNodeWithImageNode sni => $"{sni.Index},{sni.NodeType},{Esc(sni.Name)},{sni.MotionState.XM.ToString(inv)},{sni.MotionState.YM.ToString(inv)},{sni.MotionState.ZT.ToString(inv)},{sni.MotionState.ZD.ToString(inv)},{sni.MotionState.TiltD.ToString(inv)},{sni.MotionState.Dist.ToString(inv)},{sni.RaySourceState.Voltage.ToString(inv)},{sni.RaySourceState.Power.ToString(inv)},{sni.RaySourceState.IsOn},{sni.DetectorState.IsConnected},{sni.DetectorState.FrameRate.ToString(inv)},{Esc(sni.DetectorState.Resolution)},{Esc(sni.ImageFileName)},,,,,,", + + SaveNodeNode sn => $"{sn.Index},{sn.NodeType},{Esc(sn.Name)},{sn.MotionState.XM.ToString(inv)},{sn.MotionState.YM.ToString(inv)},{sn.MotionState.ZT.ToString(inv)},{sn.MotionState.ZD.ToString(inv)},{sn.MotionState.TiltD.ToString(inv)},{sn.MotionState.Dist.ToString(inv)},{sn.RaySourceState.Voltage.ToString(inv)},{sn.RaySourceState.Power.ToString(inv)},{sn.RaySourceState.IsOn},{sn.DetectorState.IsConnected},{sn.DetectorState.FrameRate.ToString(inv)},{Esc(sn.DetectorState.Resolution)},,,,,,,", + + SavePositionNode sp => $"{sp.Index},{sp.NodeType},{Esc(sp.Name)},{sp.MotionState.XM.ToString(inv)},{sp.MotionState.YM.ToString(inv)},{sp.MotionState.ZT.ToString(inv)},{sp.MotionState.ZD.ToString(inv)},{sp.MotionState.TiltD.ToString(inv)},{sp.MotionState.Dist.ToString(inv)},,,,,,,,,,,,,,", + + InspectionModuleNode im => $"{im.Index},{im.NodeType},{Esc(im.Name)},,,,,,,,,,,,,,,,,,,{Esc(im.Pipeline?.Name ?? string.Empty)}", + + InspectionMarkerNode mk => $"{mk.Index},{mk.NodeType},{Esc(mk.Name)},,,,,,,,,,,,,,{Esc(mk.MarkerType)},{mk.MarkerX.ToString(inv)},{mk.MarkerY.ToString(inv)},,,", + + PauseDialogNode pd => $"{pd.Index},{pd.NodeType},{Esc(pd.Name)},,,,,,,,,,,,,,,,,{Esc(pd.DialogTitle)},{Esc(pd.DialogMessage)},,", + + WaitDelayNode wd => $"{wd.Index},{wd.NodeType},{Esc(wd.Name)},,,,,,,,,,,,,,,,,,,{wd.DelayMilliseconds},", + + CompleteProgramNode cp => $"{cp.Index},{cp.NodeType},{Esc(cp.Name)},,,,,,,,,,,,,,,,,,,,", + + _ => $"{node.Index},{node.NodeType},{Esc(node.Name)},,,,,,,,,,,,,,,,,,,," + }; + + sb.AppendLine(row); + } + + File.WriteAllText(dlg.FileName, sb.ToString(), Encoding.UTF8); + _logger.Info("CSV 已导出 | CSV exported: {FilePath}, 节点数={Count}", dlg.FileName, _currentProgram.Nodes.Count); + } + catch (Exception ex) + { + _logger.Error(ex, "导出 CSV 失败 | Failed to export CSV"); + } + } + + ///

+ /// CSV 字段转义:含逗号、引号或换行时用双引号包裹 + /// Escape CSV field: wrap with double quotes if it contains comma, quote, or newline + /// + private static string Esc(string value) + { + if (string.IsNullOrEmpty(value)) return string.Empty; + if (value.Contains(',') || value.Contains('"') || value.Contains('\n')) + return $"\"{value.Replace("\"", "\"\"")}\""; + return value; } // ── 辅助方法 | Helper methods ─────────────────────────────────── diff --git a/XplorePlane/Views/Cnc/WindowIconHelper.cs b/XplorePlane/Views/Cnc/WindowIconHelper.cs new file mode 100644 index 0000000..f5dbc15 --- /dev/null +++ b/XplorePlane/Views/Cnc/WindowIconHelper.cs @@ -0,0 +1,51 @@ +using System; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Interop; + +namespace XplorePlane.Views.Cnc +{ + /// + /// 通过 Win32 API 移除 WPF 窗口标题栏图标。 + /// + internal static class WindowIconHelper + { + private const int GWL_EXSTYLE = -20; + private const int WS_EX_DLGMODALFRAME = 0x0001; + private const int SWP_NOSIZE = 0x0001; + private const int SWP_NOMOVE = 0x0002; + private const int SWP_NOZORDER = 0x0004; + private const int SWP_FRAMECHANGED = 0x0020; + private const uint WM_SETICON = 0x0080; + + [DllImport("user32.dll")] + private static extern int GetWindowLong(IntPtr hwnd, int index); + + [DllImport("user32.dll")] + private static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle); + + [DllImport("user32.dll")] + private static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, + int x, int y, int cx, int cy, uint flags); + + [DllImport("user32.dll")] + private static extern IntPtr SendMessage(IntPtr hwnd, uint msg, IntPtr wParam, IntPtr lParam); + + public static void RemoveIcon(Window window) + { + var hwnd = new WindowInteropHelper(window).Handle; + + // 添加 WS_EX_DLGMODALFRAME 扩展样式以移除图标 + int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE); + SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_DLGMODALFRAME); + + // 清除大小图标 + SendMessage(hwnd, WM_SETICON, IntPtr.Zero, IntPtr.Zero); + SendMessage(hwnd, WM_SETICON, new IntPtr(1), IntPtr.Zero); + + // 刷新窗口非客户区 + SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); + } + } +}