261 lines
8.8 KiB
C#
261 lines
8.8 KiB
C#
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;
|
|
|
|
namespace ShrlAlgo.Addin.Test;
|
|
|
|
/// <summary>
|
|
/// ActionWindow.xaml 的交互逻辑
|
|
/// </summary>
|
|
[ObservableObject]
|
|
public partial class ActionWindow
|
|
{
|
|
// public List<Customer> Customers => GetCustomers().ToList();
|
|
|
|
public ActionWindow()
|
|
{
|
|
InitializeComponent();
|
|
DataContext = this;
|
|
}
|
|
|
|
// public IEnumerable<Customer> GetCustomers()
|
|
// {
|
|
// Randomizer.Seed = new Random(123456);
|
|
// var ordergenerator = new Faker<Order>()
|
|
// .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<Customer>()
|
|
// .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<FamilyInstance>());
|
|
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<FamilyInstance>();
|
|
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<CodeItem>(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;
|
|
}
|
|
} |