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 0000000..fe41fe8 Binary files /dev/null and b/Sai.RvKits/Resources/OIP-C.jpg differ diff --git a/Sai.RvKits/RvCivil/CreateOpeningsViewModel.cs b/Sai.RvKits/RvCivil/CreateOpeningsViewModel.cs index c7f7681..938fdf6 100644 --- a/Sai.RvKits/RvCivil/CreateOpeningsViewModel.cs +++ b/Sai.RvKits/RvCivil/CreateOpeningsViewModel.cs @@ -203,7 +203,7 @@ namespace Sai.RvKits.RvCivil catch (Autodesk.Revit.Exceptions.OperationCanceledException) { } catch (Exception e) { - LogHelper.ToLog(e.Message, Variables.LogFolder); + e.Message.ToLog(); throw; } } @@ -243,7 +243,12 @@ namespace Sai.RvKits.RvCivil return normalFace; } - + /// + /// 查找所有管线定位线与元素面的碰撞点 + /// + /// + /// + /// 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 @@ - + -