using System.Diagnostics; using System.IO; using System.Reflection; using System.Text; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using EPPlus.Core.Extensions; using Microsoft.Win32; using Nice3point.Revit.Toolkit.External.Handlers; using OfficeOpenXml; using ShrlAlgoToolkit.Revit.Assists; namespace ShrlAlgo.Addin.Test; /// /// ActionWindow.xaml 的交互逻辑 /// [ObservableObject] public partial class ActionWindow { // public List Customers => GetCustomers().ToList(); public ActionWindow() { InitializeComponent(); DataContext = this; } // public IEnumerable GetCustomers() // { // Randomizer.Seed = new Random(123456); // var ordergenerator = new Faker() // .RuleFor(o => o.Id, Guid.NewGuid) // .RuleFor(o => o.Date, f => f.Date.Past(3)) // .RuleFor(o => o.OrderValue, f => f.Finance.Amount(0, 10000)) // .RuleFor(o => o.Shipped, f => f.Random.Bool(0.9f)); // var customerGenerator = new Faker() // .RuleFor(c => c.Id, Guid.NewGuid()) // .RuleFor(c => c.Name, f => f.Company.CompanyName()) // .RuleFor(c => c.Address, f => f.Address.FullAddress()) // .RuleFor(c => c.City, f => f.Address.City()) // .RuleFor(c => c.Country, f => f.Address.Country()) // .RuleFor(c => c.ZipCode, f => f.Address.ZipCode()) // .RuleFor(c => c.Phone, f => f.Phone.PhoneNumber()) // .RuleFor(c => c.Email, f => f.Internet.Email()) // .RuleFor(c => c.ContactName, (f, c) => f.Name.FullName()) // .RuleFor(c => c.Orders, f => ordergenerator.Generate(f.Random.Number(10)).ToList()); // return customerGenerator.Generate(100); // } [ObservableProperty] private string code; [ObservableProperty] private int count; [ObservableProperty] private string prex; private readonly ActionEventHandler handler = new(); private void Button_Click(object sender, System.Windows.RoutedEventArgs e) { handler.Raise(uiapp => { try { Element elem; var uidoc = uiapp.ActiveUIDocument; var doc = uidoc.Document; if (uidoc.Selection.GetElementIds().Any()) { elem = doc.GetElement(uidoc.Selection.GetElementIds().FirstOrDefault()); } else { var reference = uidoc.Selection.PickObject(ObjectType.Element, new GenericFilter()); elem = doc.GetElement(reference); } if (!elem.IsValidObject) { return; } using var trans = new Transaction(doc, "编号填写"); trans.Start(); var param = elem.GetParameters("ID-100-编号").FirstOrDefault(); var code = Convert.ToInt32(Code); if (Count == 1) { param?.Set($"{Prex}0{code}"); } if (Count == 2) { param?.Set($"{Prex}00{code}"); } trans.Commit(); Code = $"{code + 1}"; //trans.Start(); //foreach (var elementId in uidoc.Selection.GetElementIds()) //{ // var elem = doc.GetElement(elementId); // var param = elem.GetParameters("ID-100-编号").FirstOrDefault(); // param?.Set($"{Code}"); //} //trans.Commit(); } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { } }); } [RelayCommand] private void BrowserExcelFile() { OpenFileDialog dialog = new() { CheckFileExists = true, Filter = "Excel文件|*.xlsx", Multiselect = false, InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), }; if (dialog.ShowDialog() != true) { return; } ReadExcel(dialog.FileName); } [RelayCommand] private void ExportExcelFile() { handler.Raise(uiapp => { StringBuilder sb = new(); var n = 0; var doc = uiapp.ActiveUIDocument.Document; var elems = new FilteredElementCollector(doc) .OfCategory(BuiltInCategory.OST_SecurityDevices) .WhereElementIsNotElementType() .OfType(); foreach (var elem in elems) { if (!elem.Symbol.FamilyName.Contains("摄像")) { continue; } var param = elem.GetParameters("ID-100-编号").FirstOrDefault(); var param1 = elem.get_Parameter(BuiltInParameter.DOOR_NUMBER); sb.AppendLine($"{elem.Name}--{elem.Id}--{param.AsString()}--{param1.AsString()}"); n++; } sb.AppendLine($"合计{n}个"); var filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\导出结果.txt"; File.WriteAllText(filePath, sb.ToString()); Process.Start(filePath); }); } private void ReadExcel(string path) { FileInfo fi = new(path); using ExcelPackage package = new(fi); var worksheet = package.Workbook.Worksheets[1]; ////获取worksheet的行数 //int rows = worksheet .Dimension.End.Row; ////获取worksheet的列数 //int cols = worksheet .Dimension.End.Column; //worksheet.TrimLastEmptyRows(); AppDomain.CurrentDomain.AssemblyResolve += CurrentDomainOnAssemblyResolve; try { var items = package.ToList(1, configuration => configuration.SkipCastingErrors()); handler.Raise(uiapp => { var doc = uiapp.ActiveUIDocument.Document; var elems = new FilteredElementCollector(doc) .OfCategory(BuiltInCategory.OST_SecurityDevices) .WhereElementIsNotElementType(); StringBuilder sb = new(); using var trans = new Transaction(doc, "替换字段"); trans.Start(); foreach (var elem in elems) { foreach (var item in items) { var param = elem.GetParameters("ID-100-编号").FirstOrDefault(); if (param?.HasValue != true) { sb.AppendLine(elem.Id.ToString()); } var param1 = elem.get_Parameter(BuiltInParameter.DOOR_NUMBER); if (param.AsString() == item.Origin) { param1.Set($"{item.Target}"); } } } trans.Commit(); if (sb.Length > 0) { System.Windows.MessageBox.Show(sb.ToString()); } }); //foreach (ParamterModel eamFacility in Items) { } //var groups = Facilities .GroupBy(x => x.Story); //foreach (var group in groups) //{ // if (group .Key == null) // { // continue; // } // StoryCodeMappers .Add(new() { Story = group.Key, }); //} //IsMapper = false; //IsComparison = false; //Instances .ForEach(ins => ins.IsMapped = false); } catch (EPPlus.Core.Extensions.Exceptions.ExcelValidationException) { System.Windows.MessageBox.Show("列名不存在或不匹配或检查表头是否存在换行。"); } finally { AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomainOnAssemblyResolve; } } private static Assembly CurrentDomainOnAssemblyResolve(object sender, ResolveEventArgs args) { if (!args.Name.Contains("ComponentModel.Annotations")) { return null; } var assemblyFile = Path.Combine( Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "System.ComponentModel.Annotations.dll" ); return File.Exists(assemblyFile) ? Assembly.LoadFrom(assemblyFile) : null; } }