using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; using System.Runtime.CompilerServices; namespace Laservall.Solidworks.Model { public class BomColumnConfig : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private string name; public string Name { get => name; set { if (name != value) { name = value; OnPropertyChanged(); } } } private bool isVisible = true; public bool IsVisible { get => isVisible; set { if (isVisible != value) { isVisible = value; OnPropertyChanged(); } } } private bool isExport = true; public bool IsExport { get => isExport; set { if (isExport != value) { isExport = value; OnPropertyChanged(); } } } /// /// 固定列(图号、零件名称等内置列)不可删除 /// public bool IsFixed { get; set; } /// /// 用户手动添加的自定义属性键(非从零件中自动收集) /// public bool IsUserAdded { get; set; } } public class BomSettings { public List Columns { get; set; } = new List(); /// /// 用户主动删除的动态列名称,防止 MergeDynamicKeys 重新添加 /// public HashSet RemovedKeys { get; set; } = new HashSet(); private static readonly List<(string Name, bool DefaultVisible)> BuiltInColumns = new List<(string, bool)> { ("层级", true), ("图号", true), ("零件名称", true), ("属性", true), ("材料", true), ("材质", true), ("数量", true), ("装配体", true), ("外购件", true) }; private static string GetSettingsFilePath() { string dir = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Laservall", "Solidworks"); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } return Path.Combine(dir, "bom_columns.json"); } public void Save() { try { string json = JsonConvert.SerializeObject(this, Formatting.Indented); File.WriteAllText(GetSettingsFilePath(), json); } catch { } } public static BomSettings Load() { try { string path = GetSettingsFilePath(); if (File.Exists(path)) { string json = File.ReadAllText(path); var settings = JsonConvert.DeserializeObject(json); if (settings != null && settings.Columns != null && settings.Columns.Count > 0) { if (settings.RemovedKeys == null) { settings.RemovedKeys = new HashSet(); } foreach (var builtIn in BuiltInColumns) { if (!settings.Columns.Any(c => c.Name == builtIn.Name)) { settings.Columns.Add(new BomColumnConfig { Name = builtIn.Name, IsVisible = builtIn.DefaultVisible, IsExport = builtIn.DefaultVisible, IsFixed = true, IsUserAdded = false }); } else { var col = settings.Columns.First(c => c.Name == builtIn.Name); col.IsFixed = true; } } return settings; } } } catch { } return CreateDefault(); } public static BomSettings CreateDefault() { var settings = new BomSettings(); foreach (var builtIn in BuiltInColumns) { settings.Columns.Add(new BomColumnConfig { Name = builtIn.Name, IsVisible = builtIn.DefaultVisible, IsExport = builtIn.DefaultVisible, IsFixed = true, IsUserAdded = false }); } return settings; } /// /// 将从零件收集到的动态属性键合并到配置中(保留已有配置状态) /// public void MergeDynamicKeys(List discoveredKeys) { var builtInNames = new HashSet(BuiltInColumns.Select(b => b.Name)); foreach (var key in discoveredKeys) { if (builtInNames.Contains(key)) { continue; } if (RemovedKeys.Contains(key)) { continue; } if (!Columns.Any(c => c.Name == key)) { Columns.Add(new BomColumnConfig { Name = key, IsVisible = true, IsExport = true, IsFixed = false, IsUserAdded = false }); } } } public BomColumnConfig GetColumn(string name) { return Columns.FirstOrDefault(c => c.Name == name); } public bool IsColumnVisible(string name) { var col = GetColumn(name); return col == null || col.IsVisible; } public bool IsColumnExport(string name) { var col = GetColumn(name); return col == null || col.IsExport; } public List GetDynamicColumns() { var builtInNames = new HashSet(BuiltInColumns.Select(b => b.Name)); return Columns.Where(c => !builtInNames.Contains(c.Name)).ToList(); } } }