using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.IO; using System.Linq; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Microsoft.Win32; using OfficeOpenXml; using Sai.RvKits.IO; using Sai.RvWrapper.Shared; using SZBIM.StandardTools; using SZBIM.StandardTools.ParameterManager; namespace Sai.Common.Shared.ParameterManager { public partial class AddParamsViewModel : ObservableObject { public AddParamsViewModel(Autodesk.Revit.ApplicationServices.Application app) { this.app = app; //项目参数 projectParamsHandler = new AddProjectParamsHandler(); projectParamsEvent = ExternalEvent.Create(projectParamsHandler); //族文件添加族参数 familyFamilyParamsHandler = new AddFamilyFileFamilyParamsHandler(); familyFamilyParamsEvent = ExternalEvent.Create(familyFamilyParamsHandler); //项目文件中的族添加族参数 projectFamilyParamsHandler = new AddProjectFileFamilyParamsHandler(); projectFamilyParamsEvent = ExternalEvent.Create(projectFamilyParamsHandler); } private readonly Autodesk.Revit.ApplicationServices.Application app; /// /// 添加到文件的外部事件(族参数) /// private readonly ExternalEvent familyFamilyParamsEvent; /// /// 添加族参数到族文件 /// private readonly AddFamilyFileFamilyParamsHandler familyFamilyParamsHandler; /// /// 项目参数(绑定类别的外部事件) /// private readonly ExternalEvent projectFamilyParamsEvent; /// /// 项目文件的族参数 /// private readonly AddProjectFileFamilyParamsHandler projectFamilyParamsHandler; /// /// 项目中的族添加族参数(共享,非共享) /// private readonly ExternalEvent projectParamsEvent; /// /// 添加参数为项目参数绑定类别 /// private readonly AddProjectParamsHandler projectParamsHandler; [ObservableProperty] private string excelPath; private string excelWorkbook; [ObservableProperty] private string familyPath; [ObservableProperty] private BuiltInParameterGroup group; private bool? isAddToFile; [ObservableProperty] private bool isFamilyParam; [ObservableProperty] private bool isSharedFamilyParam; [ObservableProperty] [NotifyPropertyChangedFor(nameof(IsNotSharedProjectParam))] [NotifyCanExecuteChangedFor(nameof(AddParamsToFilesCommand))] private bool isSharedProjectParam; [ObservableProperty] private Parameter parameter; //[ObservableProperty] //private UnitType unitType; [ObservableProperty] private System.Collections.IEnumerable workSheets; public bool? IsAddToFile { get => isAddToFile; set => SetProperty(ref isAddToFile, value); } private bool IsNotSharedProjectParam => !isSharedProjectParam; public ObservableCollection ParamsList { get; set; } public List Models { get; } = new(); [RelayCommand] private void AddParamItem() { if (ParamsList == null) { ParamsList = new ObservableCollection { new() }; } else { ParamsList.Add(new ParamModel()); } } [RelayCommand(CanExecute = nameof(IsNotSharedProjectParam))] private void AddParamsToFiles() { familyFamilyParamsHandler.IsFamilyParam = IsFamilyParam; familyFamilyParamsHandler.ParameterList = ParamsList.ToList(); familyFamilyParamsEvent.Raise(); } /// /// 添加到项目中的族(包含绑定类别的共享参数和族参数) /// [RelayCommand] private void AddParamsToProject() { if (IsSharedProjectParam) { projectParamsHandler.ParameterList = ParamsList.ToList(); projectParamsEvent.Raise(); return; } projectFamilyParamsHandler.ParameterList = ParamsList.ToList(); if (IsFamilyParam) { projectFamilyParamsHandler.IsFamilyParam = true; projectFamilyParamsEvent.Raise(); } if (IsSharedFamilyParam) { projectFamilyParamsHandler.IsFamilyParam = false; projectFamilyParamsEvent.Raise(); } } private void GenerateArchiTree(IList paramsData) { var majors = paramsData.GroupBy(param => param.Major); //专业 foreach (var major in majors) { List majorChildren = new List(); TreeModel majorTreeModel = new TreeModel { Name = major.Key, Icon = null, IsChecked = false, IsExpanded = false, Children = majorChildren, Tag = null }; Models.Add(majorTreeModel); //构件 var components = major.GroupBy(p => p.Component); foreach (IGrouping component in components) { TreeModel componentTreeModel = new TreeModel { Id = null, Name = component.Key, Icon = null, IsExpanded = false, Parent = null, Children = null, Tag = component.ToList() }; majorChildren.Add(componentTreeModel); } } } [RelayCommand] private void ImportExcel() { string filter = "导入文件(*.xlsx)|*.xlsx"; OpenFileDialog openDialog = new OpenFileDialog { Filter = filter, Title = "选择Excel文件" }; openDialog.ShowDialog(); excelWorkbook = openDialog.FileName; if (excelWorkbook != null) { ExcelPath = excelWorkbook; ExcelPackage p = new ExcelPackage(new FileInfo(excelWorkbook)); WorkSheets = p.Workbook.Worksheets; //CBSheetName.ItemsSource = p.Workbook.Worksheets.ToList(); } } [RelayCommand] private void ImportParams() { DataTable dt = new DataTable(); DirectoryInfo dir = new DirectoryInfo(FamilyPath); //path为某个目录,如: “D:\Program Files” FileInfo[] fiAr = dir.GetFiles(); foreach (FileInfo fi in fiAr) { if (fi.Extension.Equals(".rfa")) { Document doc = app.OpenDocumentFile(fi.FullName); FamilyManager fm = doc.FamilyManager; doc.Invoke(ts => { for (int i = 0; i < dt.Rows.Count; i++) { string typestr = dt.Rows[i][3].ToString(); bool isInstance; if (typestr == "实例") { isInstance = true; } else if (typestr == "类型") { isInstance = false; } else { continue; } Type tybpg = typeof(BuiltInParameterGroup); var bpgAr = Enum.GetNames(typeof(BuiltInParameterGroup)); BuiltInParameterGroup bpg = BuiltInParameterGroup.INVALID; foreach (string m in bpgAr) { bpg = (BuiltInParameterGroup)Enum.Parse(tybpg, m); if (m == "Invalid" || m == "FamilyType") { continue; } string name = LabelUtils.GetLabelFor(bpg); string tabname = dt.Rows[i][0].ToString(); if (name == tabname) break; } Type type = typeof(ParameterType); var names = Enum.GetNames(typeof(ParameterType)); ParameterType pt = ParameterType.Invalid; foreach (string n in names) { pt = (ParameterType)Enum.Parse(type, n); if (n == "Invalid" || n == "FamilyType") { continue; } string name = LabelUtils.GetLabelFor(pt); string tabname = dt.Rows[i][2].ToString(); if (name == tabname) break; //System.Windows.MessageBox.ShowTop(string.Format("{0}{1}{2}", "第", i + 1, "行参数类型错误")); } fm.AddParameter(dt.Rows[i][1].ToString(), bpg, pt, isInstance); //string na = LabelUtils.GetLabelFor(BuiltInParameterGroup.INVALID); } }, "添加族参数"); doc.Close(true); } } } private void ImportSharedParams(Autodesk.Revit.ApplicationServices.Application app) { DataTable dt = new DataTable(); DefinitionFile dfile = app.OpenSharedParameterFile(); DefinitionGroups gps = dfile.Groups; for (int i = 0; i < dt.Rows.Count; i++) { var gp = gps.get_Item(dt.Rows[i][0].ToString()) ?? gps.Create(dt.Rows[i][0].ToString()); var strAr = Enum.GetNames(typeof(ParameterType)); foreach (string n in strAr) { ParameterType pt = (ParameterType)Enum.Parse(typeof(ParameterType), n); if (n == "Invalid" || n == "FamilyType") { continue; } string name = LabelUtils.GetLabelFor(pt); string tabname = dt.Rows[i][2].ToString(); if (name == tabname) { ExternalDefinitionCreationOptions op = new ExternalDefinitionCreationOptions(dt.Rows[i][1].ToString(), pt); op.UserModifiable = true; Definition df = gp.Definitions.Create(op); break; } //else //{ // System.Windows.MessageBox.ShowTop("第" + i + 1 + "行参数类型错误"); //} } } } [RelayCommand] private void RemoveParamItem(object obj) { if (obj is ParamModel paramModel) { ParamsList.Remove(paramModel); } } [RelayCommand] private void SelectFamilies() { VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog(); //dialog.Description = "请选择文件路径"; //dialog.SeletcedPath = @"C:\Users\ZGG\Documents"; if (dialog.ShowDialog()) { FamilyPath = dialog.SelectedPath; } } } }