From b6647218be298fd0e4de4f65a00690eb1c3a8a91 Mon Sep 17 00:00:00 2001 From: GG Z <903524121@qq.com> Date: Tue, 8 Oct 2024 16:21:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug=E5=92=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E9=83=A8=E5=88=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ConsoleApp/Program.cs | 3 + RvAddinTest/ActionWindow.xaml.cs | 445 ++++++------- RvAddinTest/CheckCollision.cs | 43 +- RvAddinTest/FluentAddin.cs | 6 +- RvAddinTest/RevitAddin.cs | 2 +- RvAddinTest/RvAddinTest.csproj | 17 +- RvAddinTest/TestGDI.cs | 64 ++ Sai.RvKits.sln | 42 +- Sai.RvKits/Properties/Resources.Designer.cs | 86 ++- Sai.RvKits/Resources/OIP-C.jpg | Bin 0 -> 16130 bytes Sai.RvKits/RvCivil/CreateOpeningsViewModel.cs | 9 +- .../RvCommon/InstanceCreatorViewModel.cs | 2 +- Sai.RvKits/RvMEP/ArrangeMEPCurveCmd.cs | 10 + Sai.RvKits/RvMEP/BloomConnectorCmd.cs | 623 +++++++++--------- Sai.RvKits/RvMEP/RotateMEPView.xaml | 2 +- Sai.RvKits/RvMEP/RotateMEPViewModel.cs | 37 +- Sai.RvKits/RvView/QuickViewSectionCmd.cs | 2 +- Sai.RvKits/RvView/QuickViewSectionView.xaml | 21 +- .../RvView/QuickViewSectionViewModel.cs | 256 +++---- Sai.RvKits/RvView/VisibilityViewModel.cs | 110 +++- Sai.RvKits/Sai.RvKits.csproj | 3 +- Sai.RvKits/TestGDI.cs | 61 -- Sai.RvKits/UIRibbon/DrawingViewApp.cs | 55 +- Sai.RvKits/UIRibbon/FamilyApp.cs | 14 +- Sai.RvKits/UIRibbon/ModifyTabApp.cs | 2 +- Sai.RvKits/UIRibbon/RvApp.cs | 112 ++-- Sai.RvKits/UIRibbon/TabManagerApp.cs | 4 +- Sai.RvKits/Variables.cs | 11 +- Sai.Toolkit.Core/Heplers/IniHelper.cs | 2 +- Sai.Toolkit.Core/Heplers/LogHelper.cs | 226 +++---- .../Heplers/SingletonViewHelper.cs | 12 +- Sai.Toolkit.Core/Heplers/StringHelper.cs | 2 +- Sai.Toolkit.Core/Heplers/WinDialogHelper.cs | 2 +- Sai.Toolkit.Core/Heplers/XmlHelper.cs | 2 +- .../Assist/ExtensibleStorageAssist.cs | 10 +- Sai.Toolkit.Revit/Assist/HostObjectAssist.cs | 3 +- Sai.Toolkit.Revit/Assist/ImageAssist.cs | 22 +- Sai.Toolkit.Revit/Assist/JIGAssist.cs | 10 + Sai.Toolkit.Revit/Assist/SpatialAssist.cs | 20 +- Sai.Toolkit.Revit/Assist/UIAssist.cs | 499 ++++++++------ .../Helpers/KeyboardShortcutService.cs | 195 ++++-- Sai.Toolkit.Revit/Sai.Toolkit.Revit.projitems | 1 + Wpf.Ui.Extend/Models/TreeModel.cs | 50 +- Wpf.Ui.Extend/Wpf.Ui.Extend.csproj | 1 - 44 files changed, 1709 insertions(+), 1390 deletions(-) create mode 100644 RvAddinTest/TestGDI.cs create mode 100644 Sai.RvKits/Resources/OIP-C.jpg create mode 100644 Sai.RvKits/RvMEP/ArrangeMEPCurveCmd.cs delete mode 100644 Sai.RvKits/TestGDI.cs create mode 100644 Sai.Toolkit.Revit/Assist/JIGAssist.cs diff --git a/ConsoleApp/Program.cs b/ConsoleApp/Program.cs index d9d27fd..87dd594 100644 --- a/ConsoleApp/Program.cs +++ b/ConsoleApp/Program.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -15,6 +16,8 @@ namespace ConsoleApp string str = ""; double a = 10.0; double b = 100; + + Debug.Assert(a == b); //确保str满足条件才能继续执行,不满足即抛出异常 Guard.IsNotNullOrEmpty(str);//抛出异常 Guard.IsLessThan(a,b); diff --git a/RvAddinTest/ActionWindow.xaml.cs b/RvAddinTest/ActionWindow.xaml.cs index b6e6ab1..2d244ab 100644 --- a/RvAddinTest/ActionWindow.xaml.cs +++ b/RvAddinTest/ActionWindow.xaml.cs @@ -22,6 +22,7 @@ using OfficeOpenXml; using Sai.Toolkit.Revit.Helpers; + namespace RvAddinTest; /// @@ -30,258 +31,258 @@ namespace RvAddinTest; [ObservableObject] public partial class ActionWindow { - public List Customers => GetCustomers().ToList(); + public List Customers => GetCustomers().ToList(); - public ActionWindow() - { - InitializeComponent(); - DataContext = this; - } + 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); - } + 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 string code; - [ObservableProperty] - private int count; + [ObservableProperty] + private int count; - [ObservableProperty] - private string prex; + [ObservableProperty] + private string prex; - private readonly ActionEventHandler handler = new(); + 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); - } + 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(); + 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(); + 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(); + //foreach (var elementId in uidoc.Selection.GetElementIds()) + //{ + // var elem = doc.GetElement(elementId); + // var param = elem.GetParameters("ID-100-编号").FirstOrDefault(); - // param?.Set($"{Code}"); - //} + // param?.Set($"{Code}"); + //} - //trans.Commit(); - } - catch (Autodesk.Revit.Exceptions.OperationCanceledException) { } - }); - } + //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 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; - } + [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); - }); - } + 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(); + 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(); + 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 (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) { } + //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, }); - //} + //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; - } - } + //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; - } + 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; - } + var assemblyFile = Path.Combine( + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), + "System.ComponentModel.Annotations.dll" + ); + return File.Exists(assemblyFile) ? Assembly.LoadFrom(assemblyFile) : null; + } } public class Customer { - public Guid Id { get; set; } - public string Name { get; set; } - public string Address { get; set; } - public string City { get; set; } - public string Country { get; set; } - public string ZipCode { get; set; } - public string Phone { get; set; } - public string Email { get; set; } - public string ContactName { get; set; } - public IEnumerable Orders { get; set; } + public Guid Id { get; set; } + public string Name { get; set; } + public string Address { get; set; } + public string City { get; set; } + public string Country { get; set; } + public string ZipCode { get; set; } + public string Phone { get; set; } + public string Email { get; set; } + public string ContactName { get; set; } + public IEnumerable Orders { get; set; } } public class Order { - public Guid Id { get; set; } - public DateTime Date { get; set; } - public Decimal OrderValue { get; set; } - public bool Shipped { get; set; } + public Guid Id { get; set; } + public DateTime Date { get; set; } + public decimal OrderValue { get; set; } + public bool Shipped { get; set; } } diff --git a/RvAddinTest/CheckCollision.cs b/RvAddinTest/CheckCollision.cs index 4f6bf97..b559592 100644 --- a/RvAddinTest/CheckCollision.cs +++ b/RvAddinTest/CheckCollision.cs @@ -1,13 +1,8 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; +using System.IO; using System.Text; -using System.Threading.Tasks; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; -using Autodesk.Revit.DB.Plumbing; using Autodesk.Revit.UI; namespace RvAddinTest @@ -19,22 +14,18 @@ namespace RvAddinTest public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { //程序UI界面 - UIApplication uiapp = commandData.Application; + var uiapp = commandData.Application; //获取元素(选择) 显示元素 视图(活动视图)管理(对象) - UIDocument uidoc = uiapp.ActiveUIDocument; - //程序 - Autodesk.Revit.ApplicationServices.Application app = uiapp.Application; + var uidoc = uiapp.ActiveUIDocument; //获取位置和场地 视图(多个视图)管理 获取元素(Revit 项目里的全部元素) - Document doc = uidoc.Document; - //获取所有打开文档 - DocumentSet docset = uiapp.Application.Documents; + var doc = uidoc.Document; //当前视图 - View view = doc.ActiveView; - List collector = new FilteredElementCollector(doc, view.Id) + var view = doc.ActiveView; + var collector = new FilteredElementCollector(doc, view.Id) .OfClass(typeof(MEPCurve)) .WhereElementIsNotElementType().ToList(); // 检查管线之间的碰撞 - List> collisions = CheckPipeCollisionsParallel(doc, collector); + var collisions = CheckPipeCollisionsParallel(doc, collector); // 显示碰撞结果 ShowCollisionResults(collisions); @@ -42,18 +33,18 @@ namespace RvAddinTest } public List> CheckPipeCollisionsParallel(Document doc, List pipes) { - List> collisions = new List>(); + var collisions = new List>(); // 使用 Parallel.For 并行检查碰撞 Parallel.For(0, pipes.Count, i => { - for (int j = i + 1; j < pipes.Count; j++) + for (var j = i + 1; j < pipes.Count; j++) { - Element pipe1 = pipes[i]; - Element pipe2 = pipes[j]; + var pipe1 = pipes[i]; + var pipe2 = pipes[j]; // 使用 ElementIntersectsElementFilter 检查碰撞 - ElementIntersectsElementFilter filter = new ElementIntersectsElementFilter(pipe1); - FilteredElementCollector collector = new FilteredElementCollector(doc, new ElementId[] { pipe2.Id }); + var filter = new ElementIntersectsElementFilter(pipe1); + var collector = new FilteredElementCollector(doc, [pipe2.Id]); collector.WherePasses(filter); if (collector.Any()) @@ -77,9 +68,9 @@ namespace RvAddinTest } else { - StringBuilder message = new StringBuilder(); + var message = new StringBuilder(); message.AppendLine("发现碰撞:"); - foreach (Tuple collision in collisions) + foreach (var collision in collisions) { message.AppendLine($"管线 {collision.Item1.Id} 与管线 {collision.Item2.Id} 发生碰撞"); } @@ -90,10 +81,10 @@ namespace RvAddinTest public void ExportCollisionResultsToFile(string content) { // 获取桌面路径 - string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + var desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); // 创建文件路径 - string filePath = Path.Combine(desktopPath, "碰撞检查.txt"); + var filePath = Path.Combine(desktopPath, "碰撞检查.txt"); // 写入文件 File.WriteAllText(filePath, content); diff --git a/RvAddinTest/FluentAddin.cs b/RvAddinTest/FluentAddin.cs index dd64ceb..da7e1cb 100644 --- a/RvAddinTest/FluentAddin.cs +++ b/RvAddinTest/FluentAddin.cs @@ -45,14 +45,14 @@ internal class FluentAddin : ExternalCommand var sb = new StringBuilder(); sb.AppendLine($"元素ID,族名称,类型名称,标记,"); var doc = Application.OpenDocumentFile(item); - var instances = doc.OfCollector().OfClass(typeof(FamilyInstance)).Cast().Where(e=>e.Symbol.FamilyName.Contains("摄像头")); - foreach(var instance in instances) + var instances = doc.OfCollector().OfClass(typeof(FamilyInstance)).Cast().Where(e => e.Symbol.FamilyName.Contains("摄像头")); + foreach (var instance in instances) { var number = instance.get_Parameter(BuiltInParameter.DOOR_NUMBER); sb.AppendLine($"{instance.Id},{instance.Symbol.FamilyName},{instance.Name},{number.AsString()},"); } var filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + $"\\{doc.Title}.txt"; - File.WriteAllText(filePath, sb.ToString(),Encoding.UTF8); + File.WriteAllText(filePath, sb.ToString(), Encoding.UTF8); doc.Close(false); } //Document.Modify(set => set.Transaction) diff --git a/RvAddinTest/RevitAddin.cs b/RvAddinTest/RevitAddin.cs index 8dd99ea..5f47494 100644 --- a/RvAddinTest/RevitAddin.cs +++ b/RvAddinTest/RevitAddin.cs @@ -127,7 +127,7 @@ public class RevitAddin : ExternalCommand { try { - var reference = UiDocument.Selection.PickObject(ObjectType.PointOnElement, new DwgBlockSelection(), "请选择dwg块"); + var reference = UiDocument.Selection.PickObject(ObjectType.PointOnElement, new DwgBlockSelection(), "请选择dwg链接的块参照"); var dwg = Document.GetElement(reference) as ImportInstance; var dwgTransform = dwg!.GetTotalTransform(); diff --git a/RvAddinTest/RvAddinTest.csproj b/RvAddinTest/RvAddinTest.csproj index 1bd09fd..0cb33b5 100644 --- a/RvAddinTest/RvAddinTest.csproj +++ b/RvAddinTest/RvAddinTest.csproj @@ -21,19 +21,24 @@ + - - - + + + - + + + + + - - - - \ No newline at end of file diff --git a/RvAddinTest/TestGDI.cs b/RvAddinTest/TestGDI.cs new file mode 100644 index 0000000..1394412 --- /dev/null +++ b/RvAddinTest/TestGDI.cs @@ -0,0 +1,64 @@ +using System.Drawing; +using System.Timers; + +using Autodesk.Revit.Attributes; +using Autodesk.Revit.DB; +using Autodesk.Revit.UI; + +using Nice3point.Revit.Toolkit.External; + +using Sai.Toolkit.Core.Helpers; + +namespace RvAddinTest; + +[Transaction(TransactionMode.Manual)] +[Regeneration(RegenerationOption.Manual)] +public class TestGDI : ExternalCommand +{ + private UIView ui; + /// + /// 设置项目基点 + /// + /// + private void SetProjectPosition(XYZ position) + { + using Transaction trans = new(Document); + trans.Start("设置项目基点"); + XYZ p = new(); + + ProjectPosition pp = new(position.X, position.Y, position.Z, 0); + //设置项目基点 + + Document.ActiveProjectLocation.SetProjectPosition(p, pp); + trans.Commit(); + } + public override void Execute() + { + + ui = UiDocument.GetOpenUIViews().FirstOrDefault(uiView => uiView.ViewId == UiDocument.ActiveView.Id); + + var corners = ui.GetZoomCorners(); + //var inptr = HookInptr.FindWindow(null, view.Name); + //Graphics graphics = Graphics.FromHwnd(inptr); + + //graphics.RenderingOrigin= + //Graphics graphics = Graphics.FromHwnd(System.Diagnostics.Process.GetCurrentProcess().Handle); + System.Timers.Timer timer = + new(2000) + { + Interval = 500, + Enabled = true + //AutoReset = true + }; + timer.Elapsed += Timer_Elapsed; + } + + private void Timer_Elapsed(object sender, ElapsedEventArgs e) + { + var rectangle = ui.GetWindowRectangle(); //屏幕坐标;原点在右上角 + var graphics = Graphics.FromHwnd(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle); + var p = new System.Drawing.Point(rectangle.Left + 1920, rectangle.Top); + var p1 = new System.Drawing.Point(rectangle.Right + 1920, rectangle.Bottom); + GdiHelper.DrawLine(graphics, p, p1); + } +} diff --git a/Sai.RvKits.sln b/Sai.RvKits.sln index c5d6a62..de980cb 100644 --- a/Sai.RvKits.sln +++ b/Sai.RvKits.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 +# 17 VisualStudioVersion = 17.1.32421.90 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sai.RvKits", "Sai.RvKits\Sai.RvKits.csproj", "{AA64ED67-E47E-46B1-A6F6-999A26193E57}" @@ -107,26 +107,26 @@ Global {1E6F7706-97B3-4929-8FF9-79DF5485801B}.Release|Any CPU.Build.0 = Release|Any CPU {1E6F7706-97B3-4929-8FF9-79DF5485801B}.Release|x64.ActiveCfg = Release|x64 {1E6F7706-97B3-4929-8FF9-79DF5485801B}.Release|x64.Build.0 = Release|x64 - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.All|Any CPU.ActiveCfg = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.All|Any CPU.Build.0 = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.All|x64.ActiveCfg = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.All|x64.Build.0 = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug One|Any CPU.ActiveCfg = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug One|Any CPU.Build.0 = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug One|x64.ActiveCfg = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug One|x64.Build.0 = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug|Any CPU.ActiveCfg = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug|Any CPU.Build.0 = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug|x64.ActiveCfg = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug|x64.Build.0 = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.DefaultBuild|Any CPU.ActiveCfg = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.DefaultBuild|Any CPU.Build.0 = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.DefaultBuild|x64.ActiveCfg = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.DefaultBuild|x64.Build.0 = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Release|Any CPU.ActiveCfg = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Release|Any CPU.Build.0 = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Release|x64.ActiveCfg = DefaultBuild - {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Release|x64.Build.0 = DefaultBuild + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.All|Any CPU.ActiveCfg = All|Any CPU + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.All|Any CPU.Build.0 = All|Any CPU + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.All|x64.ActiveCfg = All|x64 + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.All|x64.Build.0 = All|x64 + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug One|Any CPU.ActiveCfg = Debug One|Any CPU + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug One|Any CPU.Build.0 = Debug One|Any CPU + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug One|x64.ActiveCfg = Debug One|x64 + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug One|x64.Build.0 = Debug One|x64 + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug|x64.ActiveCfg = Debug|x64 + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Debug|x64.Build.0 = Debug|x64 + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.DefaultBuild|Any CPU.ActiveCfg = DefaultBuild|Any CPU + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.DefaultBuild|Any CPU.Build.0 = DefaultBuild|Any CPU + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.DefaultBuild|x64.ActiveCfg = DefaultBuild|x64 + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.DefaultBuild|x64.Build.0 = DefaultBuild|x64 + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Release|Any CPU.Build.0 = Release|Any CPU + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Release|x64.ActiveCfg = Release|x64 + {C076D0DF-C55C-461A-B6C9-8D0AC16175FD}.Release|x64.Build.0 = Release|x64 {F8C48DA5-7E26-4FA5-A9EE-4D80BA2E49F9}.All|Any CPU.ActiveCfg = Debug|Any CPU {F8C48DA5-7E26-4FA5-A9EE-4D80BA2E49F9}.All|Any CPU.Build.0 = Debug|Any CPU {F8C48DA5-7E26-4FA5-A9EE-4D80BA2E49F9}.All|x64.ActiveCfg = Debug|x64 diff --git a/Sai.RvKits/Properties/Resources.Designer.cs b/Sai.RvKits/Properties/Resources.Designer.cs index 2896a19..8246498 100644 --- a/Sai.RvKits/Properties/Resources.Designer.cs +++ b/Sai.RvKits/Properties/Resources.Designer.cs @@ -89,51 +89,7 @@ namespace Sai.RvKits.Properties { return ((System.Drawing.Bitmap)(obj)); } } - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap rotate_instance_16px - { - get - { - object obj = ResourceManager.GetObject("rotate_instance_16px", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap rotate_instance_32px - { - get - { - object obj = ResourceManager.GetObject("rotate_instance_32px", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap flip_workplane_16px - { - get - { - object obj = ResourceManager.GetObject("flip_workplane_16px", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap flip_workplane_32px - { - get - { - object obj = ResourceManager.GetObject("flip_workplane_32px", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - + /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// @@ -554,6 +510,26 @@ namespace Sai.RvKits.Properties { } } + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap flip_workplane_16px { + get { + object obj = ResourceManager.GetObject("flip_workplane_16px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap flip_workplane_32px { + get { + object obj = ResourceManager.GetObject("flip_workplane_32px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// @@ -904,6 +880,26 @@ namespace Sai.RvKits.Properties { } } + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap rotate_instance_16px { + get { + object obj = ResourceManager.GetObject("rotate_instance_16px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap rotate_instance_32px { + get { + object obj = ResourceManager.GetObject("rotate_instance_32px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// diff --git a/Sai.RvKits/Resources/OIP-C.jpg b/Sai.RvKits/Resources/OIP-C.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe41fe86d0fcc2cdc5c197dfadf695081f874d7b GIT binary patch literal 16130 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 + /// 查找所有管线定位线与元素面的碰撞点 + /// + /// + /// + /// private static List FindIntersects(Element elementToOpen, Curve curve) { var faces = elementToOpen.GetAllGeometryObjects(); diff --git a/Sai.RvKits/RvCommon/InstanceCreatorViewModel.cs b/Sai.RvKits/RvCommon/InstanceCreatorViewModel.cs index 36dde3a..dc3a24c 100644 --- a/Sai.RvKits/RvCommon/InstanceCreatorViewModel.cs +++ b/Sai.RvKits/RvCommon/InstanceCreatorViewModel.cs @@ -121,7 +121,7 @@ public partial class InstanceCreatorViewModel : ObservableObject Reference reference; try { - reference = uiDocument.Selection.PickObject(ObjectType.PointOnElement, new DwgBlockSelection(), "请选择dwg块"); + reference = uiDocument.Selection.PickObject(ObjectType.PointOnElement, new DwgBlockSelection(), "请选择dwg链接的块参照"); } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { diff --git a/Sai.RvKits/RvMEP/ArrangeMEPCurveCmd.cs b/Sai.RvKits/RvMEP/ArrangeMEPCurveCmd.cs new file mode 100644 index 0000000..b31a86b --- /dev/null +++ b/Sai.RvKits/RvMEP/ArrangeMEPCurveCmd.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Sai.RvKits.RvMEP; +internal class ArrangeMEPCurveCmd +{ +} diff --git a/Sai.RvKits/RvMEP/BloomConnectorCmd.cs b/Sai.RvKits/RvMEP/BloomConnectorCmd.cs index d6f5e33..5bef594 100644 --- a/Sai.RvKits/RvMEP/BloomConnectorCmd.cs +++ b/Sai.RvKits/RvMEP/BloomConnectorCmd.cs @@ -28,37 +28,38 @@ internal class BloomConnectorCmd : ExternalCommand //根据连接件创建一根 elemIds.Add(Document.GetElement(reference).Id); } - var pipeTypeId = ElementId.InvalidElementId; - var cableTrayTypeId = ElementId.InvalidElementId; - var conduitTypeId = ElementId.InvalidElementId; - - var filteredElementCollector = new FilteredElementCollector(Document).OfClass(typeof(DuctType)); - var roundTypeId = ElementId.InvalidElementId; - var rectangleTypeId = ElementId.InvalidElementId; - var ovalTypeId = ElementId.InvalidElementId; - - foreach (var element2 in filteredElementCollector) - { - var ductType = (DuctType)element2; - - if (ductType.FamilyName == "圆形风管" || ductType.FamilyName.Contains("Round Duct")) - { - roundTypeId = ductType.Id; - } - else if (ductType.FamilyName == "矩形风管" || ductType.FamilyName.Contains("Rectangular Duct")) - { - rectangleTypeId = ductType.Id; - } - else if (ductType.FamilyName == "椭圆形风管" || ductType.FamilyName.Contains("Oval Duct")) - { - ovalTypeId = ductType.Id; - } - } - var fabricationConfiguration = FabricationConfiguration.GetFabricationConfiguration(Document); foreach (var elemId in elemIds) { + var pipeTypeId = Document.OfClass().FirstElementId(); + var cableTrayTypeId = Document.OfClass().FirstElementId(); + var conduitTypeId = Document.OfClass().FirstElementId(); + + var filteredElementCollector = Document.OfClass(); + var roundTypeId = ElementId.InvalidElementId; + var rectangleTypeId = ElementId.InvalidElementId; + var ovalTypeId = ElementId.InvalidElementId; + + foreach (var element2 in filteredElementCollector) + { + var ductType = (DuctType)element2; + + if (ductType.FamilyName == "圆形风管" || ductType.FamilyName.Contains("Round Duct")) + { + roundTypeId = ductType.Id; + } + else if (ductType.FamilyName == "矩形风管" || ductType.FamilyName.Contains("Rectangular Duct")) + { + rectangleTypeId = ductType.Id; + } + else if (ductType.FamilyName == "椭圆形风管" || ductType.FamilyName.Contains("Oval Duct")) + { + ovalTypeId = ductType.Id; + } + } + var fabricationConfiguration = FabricationConfiguration.GetFabricationConfiguration(Document); + var elem = Document.GetElement(elemId); - if (elem.GetConnectors(true).IsEmpty) + if (elem.GetConnectors(true).IsEmpty && elem is not FamilyInstance) { continue; } @@ -72,7 +73,7 @@ internal class BloomConnectorCmd : ExternalCommand //根据连接件创建一根 { continue; } - if (conn.Domain == Domain.DomainPiping) + if (conn.Domain == Domain.DomainPiping && connector.Owner is Pipe) { pipeTypeId = connector.Owner.GetTypeId(); } @@ -112,7 +113,8 @@ internal class BloomConnectorCmd : ExternalCommand //根据连接件创建一根 Document.Invoke( _ => { - foreach (Connector connector in elem.GetConnectors(true)) + var conns = elem.GetConnectors(true); + foreach (Connector connector in conns) { Element element = null; if (elem.Category.Id.IntegerValue == (int)BuiltInCategory.OST_FabricationPipework) @@ -155,300 +157,299 @@ internal class BloomConnectorCmd : ExternalCommand //根据连接件创建一根 connector2.Height = connector.Height; } } + + continue; } - else + var extensionLength = connector.GetExtensionLength(); + var origin = connector.Origin; + var xyz2 = origin + (extensionLength * connector.CoordinateSystem.BasisZ); + var levelId = elem.LevelId; + if (levelId == ElementId.InvalidElementId) { - var extensionLength = connector.GetExtensionLength(); - var origin = connector.Origin; - var xyz2 = origin + (extensionLength * connector.CoordinateSystem.BasisZ); - var levelId = elem.LevelId; - if (levelId == ElementId.InvalidElementId) + var pa = elem.get_Parameter(BuiltInParameter.RBS_START_LEVEL_PARAM); + if (pa != null) { - levelId = elem.get_Parameter(BuiltInParameter.RBS_START_LEVEL_PARAM).AsElementId(); + levelId = pa.AsElementId(); } - if (levelId == ElementId.InvalidElementId) + } + + if (levelId == ElementId.InvalidElementId) + { + if (elem is FamilyInstance { Host: Level } instance) { - if (elem is FamilyInstance { Host: Level } instance) + levelId = instance.Host.Id; + } + } + + switch (connector.Domain) + { + //未定义 + case Domain.DomainUndefined: + break; + //风管 + case Domain.DomainHvac: + var mechanicalSystemTypes = new FilteredElementCollector(Document) + .OfClass(typeof(MechanicalSystemType)) + .Cast(); + //风管系统类型 + var mechanicalSystem = + connector.MEPSystem == null + ? connector.DuctSystemType switch + { + //送风 + DuctSystemType.SupplyAir + => mechanicalSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.SupplyAir + ), + //回风 + DuctSystemType.ReturnAir + => mechanicalSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.ReturnAir + ), + //排风 + DuctSystemType.ExhaustAir + => mechanicalSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.ExhaustAir + ), + _ + => mechanicalSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.OtherAir + ) + } + : Document.GetElement(connector.MEPSystem.GetTypeId()) as MechanicalSystemType; + + //if (new FilteredElementCollector(Document).OfClass(typeof(DuctType)).FirstElement() is not DuctType) + //{ + // break; + //} + + //风管形状 + switch (connector.Shape) { - levelId = instance.Host.Id; - } - } + case ConnectorProfileType.Round: + element = Duct.Create( + Document, + mechanicalSystem.Id, + roundTypeId, + levelId, + origin, + xyz2 + ); - switch (connector.Domain) - { - case Domain.DomainUndefined: - break; - //风管 - case Domain.DomainHvac: - var mechanicalSystemTypes = new FilteredElementCollector(Document) - .OfClass(typeof(MechanicalSystemType)) - .Cast(); - //风管系统类型 - var mechanicalSystem = - connector.MEPSystem == null - ? connector.DuctSystemType switch - { - //送风 - DuctSystemType.SupplyAir - => mechanicalSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.SupplyAir - ), - //回风 - DuctSystemType.ReturnAir - => mechanicalSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.ReturnAir - ), - //排风 - DuctSystemType.ExhaustAir - => mechanicalSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.ExhaustAir - ), - _ - => mechanicalSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.OtherAir - ) - } - : Document.GetElement(connector.MEPSystem.GetTypeId()) as MechanicalSystemType; - - //if (new FilteredElementCollector(Document).OfClass(typeof(DuctType)).FirstElement() is not DuctType) - //{ - // break; - //} - - //风管形状 - switch (connector.Shape) - { - case ConnectorProfileType.Round: - element = Duct.Create( - Document, - mechanicalSystem.Id, - roundTypeId, - levelId, - origin, - xyz2 - ); - - Document.Regenerate(); - element.get_Parameter(BuiltInParameter.RBS_CURVE_DIAMETER_PARAM).Set(connector.Radius * 2); - break; - - case ConnectorProfileType.Rectangular: - element = Duct.Create( - Document, - mechanicalSystem.Id, - rectangleTypeId, - levelId, - origin, - xyz2 - ); - Document.Regenerate(); - element.get_Parameter(BuiltInParameter.RBS_CURVE_WIDTH_PARAM).Set(connector.Width); - element.get_Parameter(BuiltInParameter.RBS_CURVE_HEIGHT_PARAM).Set(connector.Height); - break; - - case ConnectorProfileType.Oval: - element = Duct.Create(Document, mechanicalSystem.Id, ovalTypeId, levelId, origin, xyz2); - Document.Regenerate(); - element.get_Parameter(BuiltInParameter.RBS_CURVE_WIDTH_PARAM).Set(connector.Width); - element.get_Parameter(BuiltInParameter.RBS_CURVE_HEIGHT_PARAM).Set(connector.Height); - break; - - default: - element = Duct.Create( - Document, - mechanicalSystem.Id, - roundTypeId, - levelId, - origin, - xyz2 - ); - break; - } - - break; - //电气 - case Domain.DomainElectrical: - break; - //水管 - case Domain.DomainPiping: - var pipingSystemTypes = new FilteredElementCollector(Document) - .OfClass(typeof(PipingSystemType)) - .Cast(); - if (pipeTypeId == ElementId.InvalidElementId - - ) - { - pipeTypeId = new FilteredElementCollector(Document).OfClass( - typeof(PipeType)) - .FirstElementId(); + Document.Regenerate(); + element.get_Parameter(BuiltInParameter.RBS_CURVE_DIAMETER_PARAM).Set(connector.Radius * 2); break; - } - var system = connector.MEPSystem; - var pipingSystemType = - system != null - ? Document.GetElement(system.GetTypeId()) as PipingSystemType - : connector.PipeSystemType switch - { - //循环供水 - PipeSystemType.SupplyHydronic - => pipingSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.SupplyHydronic - ), - //循环回水 - PipeSystemType.ReturnHydronic - => pipingSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.ReturnHydronic - ), - //卫生设备 - PipeSystemType.Sanitary - => pipingSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.Sanitary - ), - //家用热水 - PipeSystemType.DomesticHotWater - => pipingSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.DomesticHotWater - ), - //家用冷水 - PipeSystemType.DomesticColdWater - => pipingSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.DomesticColdWater - ), - //其他 - PipeSystemType.OtherPipe - => pipingSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.OtherPipe - ), - //湿式消防系统 - PipeSystemType.FireProtectWet - => pipingSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.FireProtectWet - ), - //干式消防系统 - PipeSystemType.FireProtectDry - => pipingSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.FireProtectDry - ), - //预作用消防系统 - PipeSystemType.FireProtectPreaction - => pipingSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.FireProtectPreaction - ), - //其他消防系统 - PipeSystemType.FireProtectOther - => pipingSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.FireProtectOther - ), - //通风孔 - PipeSystemType.Vent - => pipingSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.Vent - ), - _ - => pipingSystemTypes.FirstOrDefault( - pst => - pst.SystemClassification - == Autodesk.Revit.DB.MEPSystemClassification.OtherPipe - ) - }; - element = Pipe.Create(Document, pipingSystemType.Id, pipeTypeId, levelId, origin, xyz2); - element.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM).Set(connector.Radius * 2); + case ConnectorProfileType.Rectangular: + element = Duct.Create( + Document, + mechanicalSystem.Id, + rectangleTypeId, + levelId, + origin, + xyz2 + ); + Document.Regenerate(); + element.get_Parameter(BuiltInParameter.RBS_CURVE_WIDTH_PARAM).Set(connector.Width); + element.get_Parameter(BuiltInParameter.RBS_CURVE_HEIGHT_PARAM).Set(connector.Height); + break; - break; - //电力 - case Domain.DomainCableTrayConduit: - if (cableTrayTypeId == ElementId.InvalidElementId) - { - cableTrayTypeId = new FilteredElementCollector(Document) - .OfClass(typeof(CableTrayType)) - .FirstElementId(); - } - if (conduitTypeId == ElementId.InvalidElementId) - { - conduitTypeId = new FilteredElementCollector(Document) - .OfClass(typeof(ConduitType)) - .FirstElementId(); - } + case ConnectorProfileType.Oval: + element = Duct.Create(Document, mechanicalSystem.Id, ovalTypeId, levelId, origin, xyz2); + Document.Regenerate(); + element.get_Parameter(BuiltInParameter.RBS_CURVE_WIDTH_PARAM).Set(connector.Width); + element.get_Parameter(BuiltInParameter.RBS_CURVE_HEIGHT_PARAM).Set(connector.Height); + break; - - //switch (connector.ElectricalSystemType) - //{ - // //电力 - // case ElectricalSystemType.PowerCircuit: - - // break; - //} - - switch (connector.Shape) - { - case ConnectorProfileType.Invalid: - break; - - case ConnectorProfileType.Round: - element = Conduit.Create(Document, conduitTypeId, origin, xyz2, levelId); - break; - - case ConnectorProfileType.Rectangular: - element = CableTray.Create(Document, cableTrayTypeId, origin, xyz2, levelId); - - break; - - case ConnectorProfileType.Oval: - break; - } - break; - } - - Document.Regenerate(); - //新建管线连接 - if (element == null) - { - continue; - } - var curve = element as MEPCurve; - var manager = curve.ConnectorManager; - var lter = manager.UnusedConnectors.ForwardIterator(); - while (lter.MoveNext()) - { - var connect = lter.Current as Connector; - if (connect.Origin.IsAlmostEqualTo(connector.Origin)) - { - var conn = elem.GetConnectors(true).GetNearestConnector(connector.Origin); - conn.ConnectTo(connect); - break; + default: + element = Duct.Create( + Document, + mechanicalSystem.Id, + roundTypeId, + levelId, + origin, + xyz2 + ); + break; } + + break; + //电气 + case Domain.DomainElectrical: + break; + //水管 + case Domain.DomainPiping: + var pipingSystemTypes = new FilteredElementCollector(Document) + .OfClass(typeof(PipingSystemType)) + .Cast(); + if (pipeTypeId == ElementId.InvalidElementId) + { + pipeTypeId = Document.OfClass().WhereElementIsElementType().FirstElementId(); + } + var system = connector.MEPSystem; + var pipingSystemType = + system != null + ? Document.GetElement(system.GetTypeId()) as PipingSystemType + : connector.PipeSystemType switch + { + //循环供水 + PipeSystemType.SupplyHydronic + => pipingSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.SupplyHydronic + ), + //循环回水 + PipeSystemType.ReturnHydronic + => pipingSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.ReturnHydronic + ), + //卫生设备 + PipeSystemType.Sanitary + => pipingSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.Sanitary + ), + //家用热水 + PipeSystemType.DomesticHotWater + => pipingSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.DomesticHotWater + ), + //家用冷水 + PipeSystemType.DomesticColdWater + => pipingSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.DomesticColdWater + ), + //其他 + PipeSystemType.OtherPipe + => pipingSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.OtherPipe + ), + //湿式消防系统 + PipeSystemType.FireProtectWet + => pipingSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.FireProtectWet + ), + //干式消防系统 + PipeSystemType.FireProtectDry + => pipingSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.FireProtectDry + ), + //预作用消防系统 + PipeSystemType.FireProtectPreaction + => pipingSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.FireProtectPreaction + ), + //其他消防系统 + PipeSystemType.FireProtectOther + => pipingSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.FireProtectOther + ), + //通风孔 + PipeSystemType.Vent + => pipingSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.Vent + ), + _ + => pipingSystemTypes.FirstOrDefault( + pst => + pst.SystemClassification + == Autodesk.Revit.DB.MEPSystemClassification.OtherPipe + ) + }; + + element = Pipe.Create(Document, pipingSystemType.Id, pipeTypeId, levelId, origin, xyz2); + element.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM).Set(connector.Radius * 2); + break; + //电力 + case Domain.DomainCableTrayConduit: + if (cableTrayTypeId == ElementId.InvalidElementId) + { + cableTrayTypeId = new FilteredElementCollector(Document) + .OfClass(typeof(CableTrayType)) + .FirstElementId(); + } + if (conduitTypeId == ElementId.InvalidElementId) + { + conduitTypeId = new FilteredElementCollector(Document) + .OfClass(typeof(ConduitType)) + .FirstElementId(); + } + + + //switch (connector.ElectricalSystemType) + //{ + // //电力 + // case ElectricalSystemType.PowerCircuit: + + // break; + //} + + switch (connector.Shape) + { + case ConnectorProfileType.Invalid: + break; + + case ConnectorProfileType.Round: + element = Conduit.Create(Document, conduitTypeId, origin, xyz2, levelId); + break; + + case ConnectorProfileType.Rectangular: + element = CableTray.Create(Document, cableTrayTypeId, origin, xyz2, levelId); + + break; + + case ConnectorProfileType.Oval: + break; + } + break; + } + + Document.Regenerate(); + //新建管线连接 + if (element == null) + { + continue; + } + var curve = element as MEPCurve; + var manager = curve.ConnectorManager; + var lter = manager.UnusedConnectors.ForwardIterator(); + while (lter.MoveNext()) + { + var connect = lter.Current as Connector; + if (connect.Origin.IsAlmostEqualTo(connector.Origin)) + { + var conn = elem.GetConnectors(true).GetNearestConnector(connector.Origin); + conn.ConnectTo(connect); + break; } } } diff --git a/Sai.RvKits/RvMEP/RotateMEPView.xaml b/Sai.RvKits/RvMEP/RotateMEPView.xaml index 097deb3..1494d42 100644 --- a/Sai.RvKits/RvMEP/RotateMEPView.xaml +++ b/Sai.RvKits/RvMEP/RotateMEPView.xaml @@ -14,7 +14,7 @@ MinWidth="250" MinHeight="280" d:DataContext="{d:DesignInstance Type={x:Type local:RotateMEPViewModel}}" - SizeToContent="WidthAndHeight" + SizeToContent="Height" mc:Ignorable="d"> diff --git a/Sai.RvKits/RvMEP/RotateMEPViewModel.cs b/Sai.RvKits/RvMEP/RotateMEPViewModel.cs index dcc7a61..6db9012 100644 --- a/Sai.RvKits/RvMEP/RotateMEPViewModel.cs +++ b/Sai.RvKits/RvMEP/RotateMEPViewModel.cs @@ -17,7 +17,7 @@ namespace Sai.RvKits.RvMEP public partial class RotateMEPViewModel : ObservableObject { [ObservableProperty] - private double angle; + private double angle = 90; [ObservableProperty] private bool isSingleSelect = true; [RelayCommand] @@ -40,7 +40,7 @@ namespace Sai.RvKits.RvMEP var r = uidoc.Selection.PickObject(ObjectType.Element, new FuncFilter(e => { return e is FamilyInstance && e.GetConnectors().OfType().Any(c => c.IsConnected); - }), "请选择可以连管的构件"); + }), "请选择已经连管的构件"); elemIds.Add(r.ElementId); } @@ -49,15 +49,40 @@ namespace Sai.RvKits.RvMEP elemIds = uidoc.Selection.PickObjects(ObjectType.Element, new FuncFilter(e => { return e is FamilyInstance && e.GetConnectors().OfType().Any(c => c.IsConnected); - }), "请选择可以连管的构件,并完成").Select(r => doc.GetElement(r).Id).ToList(); + }), "请选择已经连管的构件,并完成").Select(r => doc.GetElement(r).Id).ToList(); } } - foreach (var id in uidoc.Selection.GetElementIds()) + foreach (var id in elemIds) { var elem = uidoc.Document.GetElement(id); - var referConn = elem.GetConnectors().OfType().FirstOrDefault(c => c.IsConnected); + var referConn = elem.GetConnectors().OfType().FirstOrDefault(c => + { + if (c.IsConnected) + { + if (c.CoordinateSystem.BasisZ.X > 0) + { + return true; + } + else + { + if (c.CoordinateSystem.BasisZ.Y > 0) + { + return true; + + } + else + { + if (c.CoordinateSystem.BasisZ.Z > 0) + { + return true; + } + } + } + } + return false; + }); if (referConn != null) { @@ -71,7 +96,7 @@ namespace Sai.RvKits.RvMEP referConn.CoordinateSystem.Origin, referConn.CoordinateSystem.BasisZ), Angle.ToRadian()); - }, "旋转"); + }, "旋转实例"); } } }); diff --git a/Sai.RvKits/RvView/QuickViewSectionCmd.cs b/Sai.RvKits/RvView/QuickViewSectionCmd.cs index 11c0cad..c831a54 100644 --- a/Sai.RvKits/RvView/QuickViewSectionCmd.cs +++ b/Sai.RvKits/RvView/QuickViewSectionCmd.cs @@ -21,6 +21,6 @@ public class QuickViewSectionCmd : ExternalCommand { public override void Execute() { - WinDialogHelper.ShowModeless(new QuickViewSectionViewModel(UiDocument)); + WinDialogHelper.ShowModeless(new QuickViewSectionViewModel()); } } diff --git a/Sai.RvKits/RvView/QuickViewSectionView.xaml b/Sai.RvKits/RvView/QuickViewSectionView.xaml index 7cc73d9..85deb6c 100644 --- a/Sai.RvKits/RvView/QuickViewSectionView.xaml +++ b/Sai.RvKits/RvView/QuickViewSectionView.xaml @@ -9,7 +9,6 @@ Title="快速剖面" Width="250" Height="180" - MinHeight="180" d:DataContext="{d:DesignInstance Type=local:QuickViewSectionViewModel}" SizeToContent="Height" mc:Ignorable="d"> @@ -17,7 +16,7 @@ - + -