From 9696128f03eb4ab2ece5a0cfc73fc7adb582afbf Mon Sep 17 00:00:00 2001 From: GG Z <903524121@qq.com> Date: Mon, 10 Feb 2025 20:53:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .filenesting.json | 3 + ConsoleApp/ConsoleApp.csproj | 2 +- ConsoleApp/Program.cs | 50 +- RvAddinTest/AddWallTypeParam.cs | 153 +++ RvAddinTest/CorrectSlope.cs | 57 - RvAddinTest/CreateWindow.xaml.cs | 31 +- RvAddinTest/DeleteCmd.cs | 105 -- RvAddinTest/FluentAddin.cs | 492 ++++----- RvAddinTest/GASInstancesCreator.cs | 35 +- RvAddinTest/HideElementsAllViews.cs | 48 - RvAddinTest/InstancesCreator.cs | 11 +- RvAddinTest/ModifySystemTypeCmd.cs | 62 +- RvAddinTest/RemoveParamCmd.cs | 3 +- RvAddinTest/ReplaceCode.cs | 178 ++-- RvAddinTest/RevitAddin.cs | 3 - RvAddinTest/RvAddinTest.csproj | 13 +- RvAddinTest/SetDimensions.cs | 94 -- RvAddinTest/TempCmd.cs | 26 +- Sai.RvKits.sln | 24 +- .../ModelManager/ModelCheckViewModel.cs | 145 +-- Sai.RvKits/ModelManager/SeparateModelCmd.cs | 17 + .../ModelManager/SeparateModelViewModel.cs | 76 ++ Sai.RvKits/ModelManager/SeparateModelWin.xaml | 37 + .../ModelManager/SeparateModelWin.xaml.cs | 14 + .../ModelManager/TemplateManagerViewModel.cs | 67 +- Sai.RvKits/Properties/Resources.Designer.cs | 40 +- Sai.RvKits/Properties/Resources.resx | 8 +- .../Resources/adaptive_MEP_tag_16px.png | Bin 0 -> 258 bytes .../Resources/adaptive_MEP_tag_32px.png | Bin 0 -> 447 bytes .../RvCommon/ModelByCurveCreatorViewModel.cs | 2 +- .../RvFamily/FamilyLibrary/RevitFileUtil.cs | 3 +- Sai.RvKits/RvMEP/CorrectMEPCurveSlopeCmd.cs | 41 +- Sai.RvKits/RvView/AdaptiveMEPTagCmd.cs | 57 + Sai.RvKits/RvView/ElementControlDock.xaml | 14 +- Sai.RvKits/RvView/ElementControlDock.xaml.cs | 295 +++--- Sai.RvKits/Sai.RvKits.csproj | 23 +- Sai.RvKits/UIRibbon/DrawingViewApp.cs | 14 +- ...Converter.cs => InvertBooleanConverter.cs} | 0 Sai.Toolkit.Mvvm/Sai.Toolkit.Mvvm.projitems | 2 +- Sai.Toolkit.Revit/Assist/CollectorAssist.cs | 4 + Sai.Toolkit.Revit/Assist/DebugAssist.cs | 6 +- Sai.Toolkit.Revit/Assist/ElementAssist.cs | 8 +- Sai.Toolkit.Revit/Helpers/Filters.cs | 4 +- .../Helpers/KeyboardShortcutService.cs | 77 +- Sai.Toolkit.Revit/Helpers/ParameterAssist.cs | 996 +++++++++--------- WPFUIAPP/App.config | 6 + WPFUIAPP/App.xaml | 19 + WPFUIAPP/App.xaml.cs | 26 + WPFUIAPP/MainWindow.xaml | 131 +++ WPFUIAPP/MainWindow.xaml.cs | 89 ++ WPFUIAPP/Properties/AssemblyInfo.cs | 52 + WPFUIAPP/Properties/Resources.Designer.cs | 71 ++ WPFUIAPP/Properties/Resources.resx | 117 ++ WPFUIAPP/Properties/Settings.Designer.cs | 30 + WPFUIAPP/Properties/Settings.settings | 7 + WPFUIAPP/ViewModel.cs | 160 +++ WPFUIAPP/ViewModel2.cs | 71 ++ WPFUIAPP/WPFUIAPP.csproj | 18 + Wpf.Ui.Extend/Wpf.Ui.Extend.csproj | 2 +- WpfApp/MainViewModel.cs | 27 +- WpfApp/MainWindow.xaml | 1 + WpfApp/WpfApp.csproj | 8 +- 62 files changed, 2567 insertions(+), 1608 deletions(-) create mode 100644 .filenesting.json create mode 100644 RvAddinTest/AddWallTypeParam.cs delete mode 100644 RvAddinTest/CorrectSlope.cs delete mode 100644 RvAddinTest/DeleteCmd.cs delete mode 100644 RvAddinTest/HideElementsAllViews.cs delete mode 100644 RvAddinTest/SetDimensions.cs create mode 100644 Sai.RvKits/ModelManager/SeparateModelCmd.cs create mode 100644 Sai.RvKits/ModelManager/SeparateModelViewModel.cs create mode 100644 Sai.RvKits/ModelManager/SeparateModelWin.xaml create mode 100644 Sai.RvKits/ModelManager/SeparateModelWin.xaml.cs create mode 100644 Sai.RvKits/Resources/adaptive_MEP_tag_16px.png create mode 100644 Sai.RvKits/Resources/adaptive_MEP_tag_32px.png create mode 100644 Sai.RvKits/RvView/AdaptiveMEPTagCmd.cs rename Sai.Toolkit.Mvvm/Converters/{BoolInverterConverter.cs => InvertBooleanConverter.cs} (100%) create mode 100644 WPFUIAPP/App.config create mode 100644 WPFUIAPP/App.xaml create mode 100644 WPFUIAPP/App.xaml.cs create mode 100644 WPFUIAPP/MainWindow.xaml create mode 100644 WPFUIAPP/MainWindow.xaml.cs create mode 100644 WPFUIAPP/Properties/AssemblyInfo.cs create mode 100644 WPFUIAPP/Properties/Resources.Designer.cs create mode 100644 WPFUIAPP/Properties/Resources.resx create mode 100644 WPFUIAPP/Properties/Settings.Designer.cs create mode 100644 WPFUIAPP/Properties/Settings.settings create mode 100644 WPFUIAPP/ViewModel.cs create mode 100644 WPFUIAPP/ViewModel2.cs create mode 100644 WPFUIAPP/WPFUIAPP.csproj diff --git a/.filenesting.json b/.filenesting.json new file mode 100644 index 0000000..0b71966 --- /dev/null +++ b/.filenesting.json @@ -0,0 +1,3 @@ +{ + "help":"https://go.microsoft.com/fwlink/?linkid=866610" +} \ No newline at end of file diff --git a/ConsoleApp/ConsoleApp.csproj b/ConsoleApp/ConsoleApp.csproj index 7aee2c3..71f7aa1 100644 --- a/ConsoleApp/ConsoleApp.csproj +++ b/ConsoleApp/ConsoleApp.csproj @@ -11,7 +11,7 @@ - + \ No newline at end of file diff --git a/ConsoleApp/Program.cs b/ConsoleApp/Program.cs index 823dc63..ff37c02 100644 --- a/ConsoleApp/Program.cs +++ b/ConsoleApp/Program.cs @@ -9,10 +9,13 @@ using System.Threading.Tasks; using ACadSharp.Entities; using CommunityToolkit.Diagnostics; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; using CSMath; -using OpenAI.Chat; +//using OpenAI.Chat; namespace ConsoleApp { @@ -21,10 +24,17 @@ namespace ConsoleApp static void Main(string[] args) { //TEST(); + var re = new Receive(); + var p = new Person(); + var value = new ValueChangedMessage(p); + var propChange = new PropertyChangedMessage(new Program(),nameof(Person.Name),"bob","jenny"); - ChatClient client = new ChatClient("gpt-4o", Environment.GetEnvironmentVariable("OPEN_API_KEY")); - ChatCompletion completion = client.CompleteChat("say 'this is a test.'"); - Console.WriteLine($"[ASSISTANT]:{completion.Content[0].Text}"); + WeakReferenceMessenger.Default.Send(propChange); + WeakReferenceMessenger.Default.Send(value); + WeakReferenceMessenger.Default.Send(p); + //ChatClient client = new ChatClient("gpt-4o", Environment.GetEnvironmentVariable("OPEN_API_KEY")); + //ChatCompletion completion = client.CompleteChat("say 'this is a test.'"); + //Console.WriteLine($"[ASSISTANT]:{completion.Content[0].Text}"); } private static void TEST() @@ -125,4 +135,36 @@ namespace ConsoleApp //} } } + public class Person + { + public int Id { get; set; } + public string Name { get; set; } + } + public partial class Receive:ObservableRecipient,IRecipient>,IRecipient,IRecipient> + { + public Receive() + { + IsActive = true; + //WeakReferenceMessenger.Default + // .Register( + // this, + // (r, m) => + // { + + // }); + } + + void IRecipient>.Receive(ValueChangedMessage message) + { + } + + void IRecipient.Receive(Person message) + { + } + + void IRecipient>.Receive(PropertyChangedMessage message) + { + + } + } } diff --git a/RvAddinTest/AddWallTypeParam.cs b/RvAddinTest/AddWallTypeParam.cs new file mode 100644 index 0000000..ae60397 --- /dev/null +++ b/RvAddinTest/AddWallTypeParam.cs @@ -0,0 +1,153 @@ +using System; + +using Autodesk.Revit.Attributes; +using Autodesk.Revit.DB; +using Autodesk.Revit.UI; +using Autodesk.Revit.UI.Selection; + +using Nice3point.Revit.Toolkit.External; + +using Sai.Toolkit.Revit.Assist; +using Sai.Toolkit.Revit.Helpers; + +namespace RvAddinTest; +[Transaction(TransactionMode.Manual)] +[Regeneration(RegenerationOption.Manual)] +public class AddWallTypeParam : ExternalCommand +{ + public Result Executex(ExternalCommandData commandData, ref string message, ElementSet elements) + { + //程序UI界面 + UIApplication uiapp = commandData.Application; + //获取元素(选择) 显示元素 视图(活动视图)管理(对象) + UIDocument uidoc = uiapp.ActiveUIDocument; + //程序 + Autodesk.Revit.ApplicationServices.Application app = uiapp.Application; + //获取位置和场地 视图(多个视图)管理 获取元素(Revit 项目里的全部元素) + Document doc = uidoc.Document; + //获取所有打开文档 + DocumentSet docset = uiapp.Application.Documents; + //当前视图 + View view = doc.ActiveView; + + #region FilterExecute + + var walls = new FilteredElementCollector(doc).OfClass(typeof(Wall)).ToElements(); + using (Transaction trans = new Transaction(doc, "default")) + { + try + { + trans.Start(); + //Do Something. + trans.Commit(); + } + catch (Exception ex) + { + message = ex.Message; + if (trans.GetStatus() == TransactionStatus.Started) + { + trans.RollBack(); + } + return Result.Failed; + } + } + + #endregion FilterExecute + + #region RepeatExecute + + bool isCoutine = true; + using (Transaction trans = new Transaction(doc, "default")) + { + try + { + while (isCoutine) + { + try + { + trans.Start(); + //do something. + trans.Commit(); + } + catch (Exception) + { + trans.Commit(); + return Result.Succeeded; + } + } + } + catch (Autodesk.Revit.Exceptions.OperationCanceledException) + { + if (trans.GetStatus() == TransactionStatus.Started) + { + trans.Commit(); + } + } + catch (Exception ex) + { + message = ex.Message; + if (trans.GetStatus() == TransactionStatus.Started) + { + trans.Commit(); + } + + return Result.Succeeded; + } + } + + #endregion RepeatExecute + + #region SelectExecute + + using (Transaction trans = new Transaction(doc, "default")) + { + try + { + Reference refer = uidoc.Selection.PickObject(ObjectType.Element, "请选择XXX"); + Element e = uidoc.Document.GetElement(refer); + + trans.Start(); + //Do Something. + trans.Commit(); + } + catch (Autodesk.Revit.Exceptions.OperationCanceledException ex) + { + if (trans.GetStatus() == TransactionStatus.Started) + { + trans.Commit(); + } + + return Result.Succeeded; + } + catch (Exception ex) + { + message = ex.Message; + if (trans.GetStatus() == TransactionStatus.Started) + { + trans.RollBack(); + } + return Result.Failed; + } + } + + #endregion SelectExecute + + return Result.Succeeded; + } + + public override void Execute() + { + Document.Invoke( + ts => + { + var file = ParameterAssist.OpenSharedParametersFile(Application); + var group = file.Groups.get_Item("Atkore"); + var definition = group.Definitions.get_Item("test"); + var categories = Application.Create.NewCategorySet(); + categories.Insert(Category.GetCategory(Document, BuiltInCategory.OST_Walls)); + var newIB = Application.Create.NewTypeBinding(categories); + var b = Document.ParameterBindings.ReInsert(definition, newIB); + }); + + } +} \ No newline at end of file diff --git a/RvAddinTest/CorrectSlope.cs b/RvAddinTest/CorrectSlope.cs deleted file mode 100644 index 5e08b5e..0000000 --- a/RvAddinTest/CorrectSlope.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using Autodesk.Revit.Attributes; -using Autodesk.Revit.DB; - -using Nice3point.Revit.Toolkit.External; -using Nice3point.Revit.Toolkit.Utils; - -using Sai.Toolkit.Revit.Assist; - -namespace RvAddinTest; -[Transaction(TransactionMode.Manual)] -[Regeneration(RegenerationOption.Manual)] -internal class CorrectSlope : ExternalCommand -{ - public override void Execute() - { - var ids = UiDocument.Selection.GetElementIds(); - Document.Modify( - set => set.Transaction).Commit((doc, t) => - { - foreach (var id in ids) - { - var elem = Document.GetElement(id); - if (elem is MEPCurve mep) - { - var loc = mep.GetCurve() as Line; - var x = Math.Round(loc.Direction.X); - var y = Math.Round(loc.Direction.Y); - var z = Math.Round(loc.Direction.Z); - //if (Math.Abs(x) < 10E-5) - //{ - // x = 0; - //} - //if (Math.Abs(y) < 10E-5) - //{ - // y = 0; - //} - //if (Math.Abs(z) < 10E-5) - //{ - // z = 0; - //} - var dir = new XYZ(x, y, z); - var endPoint = loc.Origin + dir * loc.Length; - var li = Line.CreateBound(loc.Origin, endPoint); - var locx = mep.GetLocationCurve(); - locx.Curve = li; - } - } - }); - - } -} diff --git a/RvAddinTest/CreateWindow.xaml.cs b/RvAddinTest/CreateWindow.xaml.cs index 9eaed9b..773eab3 100644 --- a/RvAddinTest/CreateWindow.xaml.cs +++ b/RvAddinTest/CreateWindow.xaml.cs @@ -1,24 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; +using System.Windows; using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Shapes; using Autodesk.Revit.DB; -using Autodesk.Revit.UI; using Nice3point.Revit.Toolkit.External.Handlers; -using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; - namespace RvAddinTest; /// /// CreateWindow.xaml 的交互逻辑 @@ -52,21 +38,6 @@ public partial class CreateWindow catch (Autodesk.Revit.Exceptions.OperationCanceledException) { } - //uiapp.Application.DocumentChanged -= Application_DocumentChanged; }); } - - private void Application_DocumentChanged(object sender, Autodesk.Revit.DB.Events.DocumentChangedEventArgs e) - { - if (e.GetAddedElementIds().Count == 1) - { - var id = e.GetAddedElementIds().FirstOrDefault(); - var elem = e.GetDocument().GetElement(id); - if (elem is FamilyInstance ins && ins.Symbol.FamilyName.Contains("铜球阀")) - { - - } - } - - } } diff --git a/RvAddinTest/DeleteCmd.cs b/RvAddinTest/DeleteCmd.cs deleted file mode 100644 index 01dae11..0000000 --- a/RvAddinTest/DeleteCmd.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Reflection; -using System.Windows; - -using Autodesk.Revit.Attributes; -using Autodesk.Revit.DB; -using Autodesk.Revit.DB.Plumbing; -using Autodesk.Revit.UI; -using Autodesk.Revit.UI.Selection; - -using Sai.Toolkit.Revit.Assist; - -namespace RvAddinTest; -[Transaction(TransactionMode.Manual)] -[Regeneration(RegenerationOption.Manual)] -public class DeleteCmd : IExternalCommand -{ - public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) - { - //程序UI界面 - var uiapp = commandData.Application; - //获取元素(选择) 显示元素 视图(活动视图)管理(对象) - var uidoc = uiapp.ActiveUIDocument; - //程序 - var app = uiapp.Application; - //获取位置和场地 视图(多个视图)管理 获取元素(Revit 项目里的全部元素) - var doc = uidoc.Document; - //获取所有打开文档 - var docset = uiapp.Application.Documents; - //当前视图 - var view = doc.ActiveView; - - #region FilterExecute - //if (doc.IsFamilyDocument) - //{ - // var manager = doc.FamilyManager; - // using (var trans = new Transaction(doc, "default")) - // { - // try - // { - // trans.Start(); - // var param = manager.AddParameter( - // "测试", - // BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES, - // ParameterType.Number, - // true); - // trans.Commit(); - // } - // catch (Exception ex) - // { - // throw ex; - // } - // } - //} - var docType = doc.GetType(); - var method = docType.GetMethod("GetUnusedFamilies", BindingFlags.NonPublic | BindingFlags.Instance); - if (method != null) - { - var unusedFamilyIds = method.Invoke(doc, null) as ISet; - using (var trans = new Transaction(doc, nameof(DeleteCmd))) - { - trans.Start(); - //foreach (var id in unusedFamilyIds) - //{ - // doc.Delete(id); - //} - MessageBox.Show(unusedFamilyIds.Count.ToString()); - trans.Commit(); - } - } - //var instances = new FilteredElementCollector(doc).OfClass(typeof(Pipe)).ToElements(); - //using (Transaction trans = new Transaction(doc, "default")) - //{ - // try - // { - // trans.Start(); - // var ids = new List(); - // foreach (Pipe pipe in instances) - // { - // if (Math.Abs(pipe.Diameter - 32 / 304.8) < 10E-5) - // { - // ids.Add(pipe.Id); - // } - // } - // //doc.Delete(ids); - // uidoc.Selection.SetElementIds(ids); - // //Do Something. - // trans.Commit(); - // } - // catch (Exception ex) - // { - // message = ex.Message; - // if (trans.GetStatus() == TransactionStatus.Started) - // { - // trans.RollBack(); - // } - // return Result.Failed; - // } - //} - - #endregion FilterExecute - - return Result.Succeeded; - } -} \ No newline at end of file diff --git a/RvAddinTest/FluentAddin.cs b/RvAddinTest/FluentAddin.cs index 6fc70b7..f46d96b 100644 --- a/RvAddinTest/FluentAddin.cs +++ b/RvAddinTest/FluentAddin.cs @@ -1,28 +1,15 @@  using System.Diagnostics; -using System.IO; -using System.Management.Instrumentation; using System.Text; using System.Windows; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; -using Autodesk.Revit.DB.Mechanical; -using Autodesk.Revit.DB.Plumbing; -using Autodesk.Revit.UI; -using Autodesk.Revit.UI.Selection; - -using eTransmitForRevitDB; - -using Microsoft.Win32; using Nice3point.Revit.Toolkit.External; using Nice3point.Revit.Toolkit.Utils; -using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; - using Sai.Toolkit.Revit.Assist; -using Sai.Toolkit.Revit.Helpers; namespace RvAddinTest; @@ -30,98 +17,169 @@ namespace RvAddinTest; [Regeneration(RegenerationOption.Manual)] internal class FluentAddin : ExternalCommand { - public static bool Purge(Document doc) + /// + /// 设备类型是否为空 + /// + private void CableTrayCheck() { - var eTransmitUpgradeOMatic = new eTransmitUpgradeOMatic(doc.Application); + //var list = Document.OfClass().Cast().ToList(); + var list = Document.OfCollector().OfCategory(BuiltInCategory.OST_CableTrayFitting).WhereElementIsNotElementType().ToList(); + var ids = new List(); + foreach (var item in list) + { + var elem = Document.GetElement(item.GetTypeId()); + var value = item.get_Parameter(BuiltInParameter.RBS_CTC_SERVICE_TYPE).AsString(); + if (string.IsNullOrEmpty(value)) + { + ids.Add(item.Id); + continue; + } + if (elem.Name.Contains(value)) + { + continue; + } + ids.Add(item.Id); - var result = eTransmitUpgradeOMatic.purgeUnused(doc); + } + UiDocument.Selection.SetElementIds(ids); + } - return result == UpgradeFailureType.UpgradeSucceeded; + /// + /// 修改名称 + /// + private void ModifyName() + { + Document.Modify(set => set.Transaction) + .Commit( + (d, t) => + { + //var point = Point.Create(new XYZ(10,10,10), new ElementId(1236)); + //Document.CreateTransientElements([point]); + var fittings = Document + .OfClass() + .WhereElementIsElementType().Cast(); + //var fittings = Document.OfCollector() + // .OfCategory(BuiltInCategory.OST_DuctFitting) + // .WhereElementIsElementType().Cast(); + foreach (var item in fittings) + { + //point=Point.Create(XYZ.BasisX); + //if (item.Name.StartsWith("DN")) + //{ + // item.Name = item.FamilyName + "-" + item.Name; + //} + if (item.Name == "标准" || item.Name == "默认") + { + item.Name = item.FamilyName; + } + + //try + //{ + // item.get_Parameter(BuiltInParameter.ALL_MODEL_URL).Set(""); + // item.get_Parameter(BuiltInParameter.ALL_MODEL_DESCRIPTION).Set(""); + //} + //catch (Exception) + //{ + // MessageBox.Show(item.Name); + //} + } + }); + } + /// + /// 坡度检查 + /// + private void SlopeCheck() + { + var mepCurves = ActiveView.OfClass(); + var ids = new List(); + foreach (var mepCurve in mepCurves) + { + var p1 = mepCurve.get_Parameter(BuiltInParameter.RBS_START_OFFSET_PARAM).AsDouble(); + var p2 = mepCurve.get_Parameter(BuiltInParameter.RBS_END_OFFSET_PARAM).AsDouble(); + var l = mepCurve.get_Parameter(BuiltInParameter.CURVE_ELEM_LENGTH).AsDouble(); + var sin = Math.Abs(p1 - p2) / l; + var radian = Math.Asin(sin); + var slope = Math.Tan(radian); + var isError = slope is (> 10E-6 and < 0.25) || (slope > Math.PI && Math.Abs(radian - Math.PI / 2) > 10E-6); + if (isError) + { + Debug.WriteLine($"角度:{radian}"); + Debug.WriteLine($"坡度:{slope}"); + ids.Add(mepCurve.Id); + } + } + UiDocument.Selection.SetElementIds(ids); } public override void Execute() { - //var elemIds = Document.OfAllModelElements().Select(e=>e.Id).ToList(); + var textTypes = Document.OfClass().ToList(); + var accessoryTypes = Document.OfClass().OfCategory(BuiltInCategory.OST_PipeAccessory).WhereElementIsElementType().ToList(); + var filledRegionTypes = Document.OfClass().ToList(); + var materialToClean = Document.OfClass().Where(m => m.Name.StartsWith("渲染材质")).Select(e => e.Id).ToList(); + Application.DocumentChanged += Application_DocumentChanged; + Document.Invoke( + ts => + { + //var id = UiDocument.Selection.GetElementIds().FirstOrDefault(); + //var elem = Document.GetElement(id); + //var typeId = elem.GetTypeId(); + //CleanImportLinePattern(Document); + //try + //{ + // foreach (var item in accessoryTypes) + // { + // if (item is FamilySymbol symbol) + // { + // symbol.Name = $"{symbol.FamilyName}-{symbol.Name}"; + // } + // } + //} + //catch (Exception ex) + //{ + // throw ex; + //} + //foreach (var type in textTypes) + //{ + // CleanTextTypes(type); + + //} + //foreach (var item in filledRegionTypes) + //{ + // if (item is FilledRegionType type) + // { + // var foreFillType = type.ForegroundPatternId; + // var foreFillColor = type.ForegroundPatternColor; + // var backFillType = type.BackgroundPatternId; + // var backFillColor = type.BackgroundPatternColor; + + // } + + //} + //Document.Delete(materialToClean); + + }); + + //string input = type.Name; + //int lastDashIndex = input.LastIndexOf('-'); + + //if (lastDashIndex != -1) + //{ + // string result = input.Substring(0, lastDashIndex); + // type.Name = result; + //} //UiDocument.Selection.SetElementIds(elemIds); - var refer=UiDocument.Selection.PickObject(ObjectType.Element); - var elem=Document.GetElement(refer); - var conn=elem.GetConnectors().Cast().Where(c=>c.IsConnected).FirstOrDefault(); - var connto = conn.GetConnectedConnector(); - Debug.WriteLine("管线:"); - Debug.WriteLine(conn.CoordinateSystem.BasisX); - Debug.WriteLine(conn.CoordinateSystem.BasisY); - Debug.WriteLine(conn.CoordinateSystem.BasisZ); - Debug.WriteLine("管件:"); - Debug.WriteLine(connto.CoordinateSystem.BasisX); - Debug.WriteLine(connto.CoordinateSystem.BasisY); - Debug.WriteLine(connto.CoordinateSystem.BasisZ); - //StringBuilder sb = new StringBuilder(); - //var n = 1; - //foreach (var item in elems) + + //var refer = UiDocument.Selection.PickObject(ObjectType.Element); + //var elem = Document.GetElement(refer); + //var conn = elem.GetConnectors().Cast().Where(c => c.IsConnected).FirstOrDefault(); + + //var docType = Document.GetType(); + //var method = docType.GetMethod("GetUnusedFamilies", BindingFlags.NonPublic | BindingFlags.Instance); + //if (method != null) //{ - // sb.Append(n +":"+ item.Name + item.Id.ToString()+"new"); - // n++; + // var unusedFamilyIds = method.Invoke(Document, null) as ISet; //} - //MessageBox.Show(sb.ToString()); - //StringBuilder sb = new(); - //var regions = Document.OfCollector().OfCategory(BuiltInCategory.OST_DetailComponents).WhereElementIsNotElementType().ToList(); - //sb.AppendLine(regions.Count.ToString()); - //regions.ToList().ForEach(f => sb.AppendLine($"{f.Id}")); - //MessageBox.Show(sb.ToString()); - //UiDocument.Selection.SetElementIds(elements); - #region MyRegion - //OpenFileDialog openFileDialog = new OpenFileDialog() { Multiselect = true, Filter = "Revit文件|*.rvt" }; - //if (openFileDialog.ShowDialog() == false) - //{ - // return; - //}; - - //foreach (var file in openFileDialog.FileNames) - //{ - // var doc = UiApplication.Application.OpenDocumentFile(file); - // var options = new SaveAsOptions() - // { - // Compact = true, - // OverwriteExistingFile = true, - // MaximumBackups = 3, - // }; - // try - // { - // var ids = doc.OfCollector().OfCategory(BuiltInCategory.OST_Lines).Select(e => e.Id).ToList(); - // doc.Modify(set => set.Transaction) - // .Commit( - // (doc, t) => - // { - // doc.Delete(ids); - // }); - // for (var i = 0; i < 5; i++) - // { - // Purge(doc); - // } - // //doc.SaveAs(file, options); - // doc.Close(true); - // } - // catch (Exception) - // { - // doc.Close(); - // } - - //} - //MessageBox.Show("处理完成"); - #endregion - - //var b = Document.ActiveView.ViewTemplateId == null; - //MessageExtensions.ShowMessage(b.ToString()); - //var h = Document.ActiveView - // .OfClass() - // .Cast() - // .Where( - // d => - // d.ConnectorManager.Connectors.OfType().FirstOrDefault().Shape - // != ConnectorProfileType.Round - // ) - // .Max(d => d.Height); - //Document.Invoke #region RegionName //OpenFileDialog dialog = new() { Filter = "Revit(*.rvt)|*.rvt", Multiselect = true }; //dialog.ShowDialog(); @@ -154,162 +212,126 @@ internal class FluentAddin : ExternalCommand // //var importInstance = doc.GetElement(refer) as ImportInstance; // //ConvertToMassCurve(importInstance); // }); - //DebugAssist.CreateTransientGeometries(Document,Point.Create(Document.ActiveView.CropBox.Transform.Origin)); - //DebugAssist.CreateTransientGeometries(Document,Point.Create(Document.ActiveView.CropBox.Min)); - //DebugAssist.CreateTransientGeometries(Document,Point.Create(Document.ActiveView.CropBox.Max)); - - //var mepCurve = UiDocument.SelectObject(); - //if (mepCurve != null) - //{ - // var list = new List(); - // mepCurve.GetAllConnectedElements(list); - // UiDocument.Selection.SetElementIds(list); - //} } - - private void GetDiffSystemFittings() + private void Application_DocumentChanged(object sender, Autodesk.Revit.DB.Events.DocumentChangedEventArgs e) { - var elbows = Document.OfClass() - .OfCategory(BuiltInCategory.OST_PipeFitting) - .Cast() - .Where(fi => fi.MEPModel is MechanicalFitting fitting && fitting.PartType == PartType.Elbow); - var elementId = ElementId.InvalidElementId; - foreach (var elbow in elbows) + StringBuilder sb = new StringBuilder(); + var doc = e.GetDocument(); + bool b = true; + foreach (var idAdd in e.GetAddedElementIds()) { - if (elbow.Id.IntegerValue == 9437638) + if (b) { + sb.AppendLine(); + sb.AppendLine("新增的元素"); + b = !b; } + var elem = doc.GetElement(idAdd); + var typeId = elem.GetTypeId(); + if (typeId != ElementId.InvalidElementId) + { + var type = doc.GetElement(idAdd); + sb.Append($"类型名称:{type.Name}"); + } + sb.Append($"元素ID:{elem.Id};元素名称:{elem.Name} "); + } + b = true; + foreach (var idDel in e.GetDeletedElementIds()) + { + if (b) + { + sb.AppendLine(); + sb.AppendLine("删除的元素"); + b = !b; + } + var elem = doc.GetElement(idDel); + var typeId = elem.GetTypeId(); + if (typeId != ElementId.InvalidElementId) + { + var type = doc.GetElement(idDel); + sb.Append($"类型名称:{type.Name}"); + } + sb.Append($"元素ID:{elem.Id};元素名称:{elem.Name} "); + } + b = true; + foreach (var idModify in e.GetModifiedElementIds()) + { + if (b) + { + sb.AppendLine(); + + sb.AppendLine("修改的元素"); + b = !b; + } + var elem = doc.GetElement(idModify); + var typeId = elem.GetTypeId(); + if (typeId != ElementId.InvalidElementId) + { + var type = doc.GetElement(idModify); + sb.Append($"类型名称:{type.Name}"); + } + sb.Append($"元素ID:{elem.Id};元素名称:{elem.Name} "); + } + if (sb.Length > 0) + { + MessageBox.Show(sb.ToString()); + } + } + /// + /// 清理导入的线型图案 + /// + /// + private static void CleanImportLinePattern(Document doc) + { + var templates = doc.OfClass() + .Cast() + .Where(e => e.Name.StartsWith("IMPORT")) + .Select(e => e.Id).ToList(); + doc.Delete(templates); + } + /// + /// 清理文字样式 + /// + /// + private void CleanTextTypes(Element type) + { + if (type is TextNoteType textNoteType) + { + try { - var connectors = elbow.GetConnectors(); - var connector1 = connectors.OfType().ElementAt(0); - var connector2 = connectors.OfType().ElementAt(1); - var system1 = connector1.AllRefs.OfType().FirstOrDefault(c => c.Owner.Id != elbow.Id).MEPSystem; - var system2 = connector2.AllRefs.OfType().FirstOrDefault(c => c.Owner.Id != elbow.Id).MEPSystem; - //MEPSystem tempSystem = null; - //foreach (Connector conn in connectors) - //{ - // foreach (Connector item in conn.AllRefs) - // { - // if (tempSystem==null) - // { - // tempSystem = item.MEPSystem; - // continue; - // } - // if (tempSystem==item.MEPSystem) - // { - // continue; - // } - // if (tempSystem.Name) - // { - - // } - // } - //} - if (system1.Name != system2.Name) + var font = textNoteType.get_Parameter(BuiltInParameter.TEXT_FONT).AsString(); + var size = textNoteType.get_Parameter(BuiltInParameter.TEXT_SIZE).AsValueString().TrimEnd('m'); + var dSize = Math.Round(Convert.ToDouble(size), 1, MidpointRounding.AwayFromZero); + if (dSize < 0.23) { - elementId = elbow.Id; - break; + return; + } + textNoteType.get_Parameter(BuiltInParameter.TEXT_SIZE).SetValueString(dSize.ToString()); + var scale = textNoteType.get_Parameter(BuiltInParameter.TEXT_WIDTH_SCALE).AsValueString(); + //var color = textNoteType.get_Parameter(BuiltInParameter.LINE_COLOR).AsInteger(); + var name = $"{font}-{dSize}mm-{scale}"; + var textTypes = Document.OfClass().ToList(); + var isExist = textTypes.FirstOrDefault(t => t.Name == name); + if (isExist != null) + { + var texts = Document.OfClass().Where(e => e.GetTypeId() == textNoteType.Id).ToList(); + texts.ForEach(e => e.ChangeTypeId(isExist.Id)); + Document.Regenerate(); + Document.Delete(textNoteType.Id); + } + else + { + textNoteType.Name = name; } } catch (Exception) { - //MessageBox.Show(elbow.Id.ToString()); - continue; + throw; } } - if (elementId != ElementId.InvalidElementId) - { - UiDocument.Selection.SetElementIds([elementId]); - } - } - - private void ModifyName() - { - Document.Modify(set => set.Transaction) - .Commit( - (d, t) => - { - //var point = Point.Create(new XYZ(10,10,10), new ElementId(1236)); - //Document.CreateTransientGeometries([point]); - var fittings = Document - .OfClass() - .WhereElementIsElementType().Cast(); - //var fittings = Document.OfCollector() - // .OfCategory(BuiltInCategory.OST_DuctFitting) - // .WhereElementIsElementType().Cast(); - foreach (var item in fittings) - { - //point=Point.Create(XYZ.BasisX); - //if (item.Name.StartsWith("DN")) - //{ - // item.Name = item.FamilyName + "-" + item.Name; - //} - if (item.Name == "标准") - { - item.Name = item.FamilyName; - } - - //try - //{ - // item.get_Parameter(BuiltInParameter.ALL_MODEL_URL).Set(""); - // item.get_Parameter(BuiltInParameter.ALL_MODEL_DESCRIPTION).Set(""); - //} - //catch (Exception) - //{ - // MessageBox.Show(item.Name); - //} - } - }); - } - - private void CableTrayCheck() - { - //var list = Document.OfClass().Cast().ToList(); - var list = Document.OfCollector().OfCategory(BuiltInCategory.OST_CableTrayFitting).WhereElementIsNotElementType().ToList(); - var ids = new List(); - foreach (var item in list) - { - var elem = Document.GetElement(item.GetTypeId()); - var value = item.get_Parameter(BuiltInParameter.RBS_CTC_SERVICE_TYPE).AsString(); - if (string.IsNullOrEmpty(value)) - { - ids.Add(item.Id); - continue; - } - if (elem.Name.Contains(value)) - { - continue; - } - ids.Add(item.Id); - - } - UiDocument.Selection.SetElementIds(ids); - } - - private void SlopeCheck() - { - var mepCurves = ActiveView.OfClass(); - var ids = new List(); - foreach (var mepCurve in mepCurves) - { - var p1 = mepCurve.get_Parameter(BuiltInParameter.RBS_START_OFFSET_PARAM).AsDouble(); - var p2 = mepCurve.get_Parameter(BuiltInParameter.RBS_END_OFFSET_PARAM).AsDouble(); - var l = mepCurve.get_Parameter(BuiltInParameter.CURVE_ELEM_LENGTH).AsDouble(); - var sin = Math.Abs(p1 - p2) / l; - var radian = Math.Asin(sin); - var slope = Math.Tan(radian); - var isError = slope is (> 10E-6 and < 0.25) || (slope > Math.PI && Math.Abs(radian - Math.PI / 2) > 10E-6); - if (isError) - { - Debug.WriteLine($"角度:{radian}"); - Debug.WriteLine($"坡度:{slope}"); - ids.Add(mepCurve.Id); - } - } - UiDocument.Selection.SetElementIds(ids); } } diff --git a/RvAddinTest/GASInstancesCreator.cs b/RvAddinTest/GASInstancesCreator.cs index fd5d1f6..afdfd73 100644 --- a/RvAddinTest/GASInstancesCreator.cs +++ b/RvAddinTest/GASInstancesCreator.cs @@ -1,28 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Windows.Documents; - + using ACadSharp.Entities; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; -using Autodesk.Revit.UI; -using Autodesk.Revit.UI.Selection; + +using Autodesk.Revit.DB.Plumbing; using CSMath; -using XYZ = Autodesk.Revit.DB.XYZ; -using Nice3point.Revit.Toolkit.External; -using Nice3point.Revit.Toolkit.Options; -using Nice3point.Revit.Toolkit.Utils; -using Line = Autodesk.Revit.DB.Line; -using Autodesk.Revit.DB.Plumbing; -using System.IO; -using System.Collections.ObjectModel; -using Sai.Toolkit.Revit.Assist; + using Microsoft.Win32; -using Sai.Toolkit.Core.Helpers; + +using Nice3point.Revit.Toolkit.External; + +using System; +using System.IO; +using System.Linq; +using System.Text; + +using Line = Autodesk.Revit.DB.Line; +using XYZ = Autodesk.Revit.DB.XYZ; namespace RvAddinTest { @@ -63,7 +59,6 @@ namespace RvAddinTest // } //} //var conns = elem.MEPModel.ConnectorManager.UnusedConnectors.OfType().FirstOrDefault(); - } private void GASCreator() @@ -123,7 +118,7 @@ namespace RvAddinTest var locXY = line.Vertices.FirstOrDefault().Location; var firstPoint = XYToRevitXYZ(locXY); var lastPoint = XYToRevitXYZ(line.Vertices.LastOrDefault().Location); - if (firstPoint.DistanceTo(lastPoint) col = new FilteredElementCollector(doc).OfClass(typeof(View)) - .WhereElementIsNotElementType() - .Cast() - .Where(v => !v.IsTemplate); - using (Transaction ts = new Transaction(doc, "隐藏")) - { - ts.Start(); - foreach (View v in col) - { - v.HideElements(uidoc.Selection.GetElementIds()); - } - ts.Commit(); - } - - return Result.Succeeded; - } - } -} diff --git a/RvAddinTest/InstancesCreator.cs b/RvAddinTest/InstancesCreator.cs index 93b8762..c526527 100644 --- a/RvAddinTest/InstancesCreator.cs +++ b/RvAddinTest/InstancesCreator.cs @@ -1,16 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows; - -using Autodesk.Revit.Attributes; +using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; -using Autodesk.Revit.UI; -using Autodesk.Revit.UI.Selection; using Nice3point.Revit.Toolkit.External; -using Nice3point.Revit.Toolkit.Options; -using Nice3point.Revit.Toolkit.Utils; namespace RvAddinTest { diff --git a/RvAddinTest/ModifySystemTypeCmd.cs b/RvAddinTest/ModifySystemTypeCmd.cs index 3706e82..0a2f0ad 100644 --- a/RvAddinTest/ModifySystemTypeCmd.cs +++ b/RvAddinTest/ModifySystemTypeCmd.cs @@ -1,57 +1,13 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Cryptography; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Data; - -using Autodesk.Revit.Attributes; +using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Plumbing; using Autodesk.Revit.UI; -using Sai.Toolkit.Revit.Assist; - namespace RvAddinTest; [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] internal class ModifySystemTypeCmd : IExternalCommand { - /// - /// 获取标高 - /// - /// - /// - public ElementId GetLevelId(Element model) - { - // 定义需要检查的参数列表 - var parametersToCheck = new BuiltInParameter[] - { - BuiltInParameter.WALL_BASE_CONSTRAINT, // 墙 - BuiltInParameter.SCHEDULE_BASE_LEVEL_PARAM, // 柱子标高 - BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM, // 梁标高 - BuiltInParameter.STAIRS_BASE_LEVEL_PARAM, // 楼梯标高 - BuiltInParameter.INSTANCE_ELEVATION_PARAM, // 族实例明细表标高 - BuiltInParameter.ROOF_CONSTRAINT_LEVEL_PARAM,//屋顶 - BuiltInParameter.INSTANCE_SCHEDULE_ONLY_LEVEL_PARAM,// 族实例明细表标高 - BuiltInParameter.RBS_START_LEVEL_PARAM// 管线标高 - }; - // 依次检查每个参数 - foreach (var param in parametersToCheck) - { - var baseLevelId = model.get_Parameter(param)?.AsElementId(); - if (baseLevelId != ElementId.InvalidElementId && baseLevelId != null) - { - return baseLevelId; - } - } - - //最后检查楼板或族基准标高 - return model.LevelId; - } public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { //程序UI界面 @@ -178,21 +134,6 @@ internal class ModifySystemTypeCmd : IExternalCommand //} #region RegionName - //var templates = doc.OfClass() - // .Cast() - // .Where(e => e.Name.StartsWith("IMPORT")) - // .Select(e => e.Id).ToList(); - //using (var trans = new Transaction(doc, nameof(ModifySystemTypeCmd))) - //{ - // trans.Start(); - // doc.Delete(templates); - // //foreach (var id in uidoc.Selection.GetElementIds()) - // //{ - // // var elem = doc.GetElement(id); - // // elem.ChangeTypeId(systemType.Id); - // //} - // trans.Commit(); - //} #endregion try { @@ -230,4 +171,5 @@ internal class ModifySystemTypeCmd : IExternalCommand } return Result.Succeeded; } + } diff --git a/RvAddinTest/RemoveParamCmd.cs b/RvAddinTest/RemoveParamCmd.cs index c9d81ba..eea4a66 100644 --- a/RvAddinTest/RemoveParamCmd.cs +++ b/RvAddinTest/RemoveParamCmd.cs @@ -1,4 +1,5 @@ using System.Text; +using System.Windows; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; @@ -162,7 +163,7 @@ public class RemoveParamCmd : ExternalCommand ts.Commit(); } - famdoc.LoadFamily(Document, new FamilyLoadOption()); + famdoc.LoadFamily(Document); famdoc.Close(false); } } diff --git a/RvAddinTest/ReplaceCode.cs b/RvAddinTest/ReplaceCode.cs index a0651de..ceeafd5 100644 --- a/RvAddinTest/ReplaceCode.cs +++ b/RvAddinTest/ReplaceCode.cs @@ -1,14 +1,9 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; +using System.IO; using System.Reflection; using System.Text; -using System.Threading.Tasks; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; -using Autodesk.Revit.UI; using EPPlus.Core.Extensions; @@ -22,92 +17,103 @@ namespace RvAddinTest; [Regeneration(RegenerationOption.Manual)] internal class ReplaceCode : ExternalCommand { - public override void Execute() - { - - } + public override void Execute() + { + var ids = UiDocument.Selection.GetElementIds(); + List li = new List(); + foreach (var id in ids) + { + var elem = Document.GetElement(id); + var param = elem.get_Parameter(BuiltInParameter.DOOR_NUMBER).AsString(); + if (string.IsNullOrEmpty(param)) + { + li.Add(elem.Id); + } + } + UiDocument.Selection.SetElementIds(li); + } - 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()); + AppDomain.CurrentDomain.AssemblyResolve += CurrentDomainOnAssemblyResolve; + try + { + var items = package.ToList(1, configuration => configuration.SkipCastingErrors()); - var elems = new FilteredElementCollector(Document) - .OfCategory(BuiltInCategory.OST_SecurityDevices) - .WhereElementIsNotElementType(); - StringBuilder sb = new(); - using var trans = new Transaction(Document, "读取Excel"); - trans.Start(); + var elems = new FilteredElementCollector(Document) + .OfCategory(BuiltInCategory.OST_SecurityDevices) + .WhereElementIsNotElementType(); + StringBuilder sb = new(); + using var trans = new Transaction(Document, "读取Excel"); + trans.Start(); - foreach (var elem in elems) - { - foreach (var item in items) - { - var param = elem.GetParameters("ID-100-编号").FirstOrDefault(); - if (param?.HasValue != true) - { - sb.AppendLine(elem.Id.ToString()); - } - var param1 = elem.get_Parameter(BuiltInParameter.DOOR_NUMBER); - if (param.AsString() == item.Origin) - { - param1.Set($"{item.Target}"); - } - } - } - trans.Commit(); - if (sb.Length > 0) - { - System.Windows.MessageBox.Show(sb.ToString()); - } - //foreach (ParamterModel eamFacility in Items) { } + foreach (var elem in elems) + { + foreach (var item in items) + { + var param = elem.GetParameters("ID-100-编号").FirstOrDefault(); + if (param?.HasValue != true) + { + sb.AppendLine(elem.Id.ToString()); + } + var param1 = elem.get_Parameter(BuiltInParameter.DOOR_NUMBER); + if (param.AsString() == item.Origin) + { + param1.Set($"{item.Target}"); + } + } + } + trans.Commit(); + if (sb.Length > 0) + { + System.Windows.MessageBox.Show(sb.ToString()); + } + //foreach (ParamterModel eamFacility in Items) { } - //var groups = Facilities .GroupBy(x => x.Story); - //foreach (var group in groups) - //{ - // if (group .Key == null) - // { - // continue; - // } - // StoryCodeMappers .Add(new() { Story = group.Key, }); - //} + //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; + } } diff --git a/RvAddinTest/RevitAddin.cs b/RvAddinTest/RevitAddin.cs index 5f47494..83b4ece 100644 --- a/RvAddinTest/RevitAddin.cs +++ b/RvAddinTest/RevitAddin.cs @@ -1,13 +1,10 @@ using System.IO; using System.Reflection; using System.Text; -using System.Windows; -using System.Xml.Linq; using Autodesk.Revit.Attributes; using Autodesk.Revit.Creation; using Autodesk.Revit.DB; -using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; using Nice3point.Revit.Toolkit.External; diff --git a/RvAddinTest/RvAddinTest.csproj b/RvAddinTest/RvAddinTest.csproj index 3b60799..ee0bb63 100644 --- a/RvAddinTest/RvAddinTest.csproj +++ b/RvAddinTest/RvAddinTest.csproj @@ -12,6 +12,7 @@ AnyCPU;x64 false false + 2018 $(DefineConstants);REVIT2018 @@ -26,17 +27,17 @@ - - - - - + + + + + - + diff --git a/RvAddinTest/SetDimensions.cs b/RvAddinTest/SetDimensions.cs deleted file mode 100644 index 2580832..0000000 --- a/RvAddinTest/SetDimensions.cs +++ /dev/null @@ -1,94 +0,0 @@ -using Autodesk.Revit.Attributes; -using Autodesk.Revit.DB; -using Autodesk.Revit.DB.Mechanical; -using Autodesk.Revit.UI; - -namespace RvAddinTest -{ - [Transaction(TransactionMode.Manual)] - [Regeneration(RegenerationOption.Manual)] - public class SetDimensions : IExternalCommand - { - public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) - { - //程序UI界面 - var uiapp = commandData.Application; - //获取元素(选择) 显示元素 视图(活动视图)管理(对象) - var uidoc = uiapp.ActiveUIDocument; - //程序 - var app = uiapp.Application; - //获取位置和场地 视图(多个视图)管理 获取元素(Revit 项目里的全部元素) - var doc = uidoc.Document; - //获取所有打开文档 - var docset = uiapp.Application.Documents; - //当前视图 - var view = doc.ActiveView; - try - { - var refers = uidoc.Selection.GetElementIds(); - var toRotate = new List(); - var toDelete = new List(); - foreach (var item in refers) - { - var e = doc.GetElement(item) as IndependentTag; - var mep = doc.GetElement(e.TaggedElementId.HostElementId); - var loc = mep.Location as LocationCurve; - var c = loc.Curve.Length < 2; - if (c || Math.Abs((loc.Curve as Line).Direction.Z) > 0.2) - { - toDelete.Add(item); - continue; - } - if (loc.Curve is Line l) - { - var ra = l.Direction.AngleTo(XYZ.BasisX); - if (ra > Math.PI / 4 && ra < Math.PI / 4 * 3) - { - toRotate.Add(e); - } - } - } - using (var ts = new Transaction(doc, "旋转标注")) - { - ts.Start(); - foreach (var item in toRotate) - { - item.TagOrientation = TagOrientation.Vertical; - } - doc.Delete(toDelete); - ts.Commit(); - } - } - catch (Exception ex) - { - - } - - #region FilterExecute - //System.Collections.Generic.List col = new FilteredElementCollector(doc, doc.ActiveView.Id).WhereElementIsNotElementType() - // .Where(e => e.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS)?.AsString() == "380/220V电源") - // .Select(e => e.Id).ToList(); - //uidoc.Selection.SetElementIds(col); - //Reference refer = uidoc.Selection.PickObject(ObjectType.Element, "请选择XXX"); - //var revitLink = uidoc.Document.GetElement(refer) as RevitLinkInstance; - //var linkDoc = revitLink.GetLinkDocument(); - //var wallIds = new FilteredElementCollector(linkDoc).OfClass(typeof(Wall)).ToElementIds (); - //Debug.WriteLine(wallIds.Count); - //using (var ts=new Transaction(doc,"Copy")) - //{ - // ts.Start(); - // ElementTransformUtils.CopyElements(linkDoc, wallIds, doc, Transform.Identity, new CopyPasteOptions()); - // ts.Commit(); - //} - - //foreach (Wall wall in walls) - //{ - // Debug.WriteLine(wall.Id); - // Thread.Sleep(500); - //} - #endregion SelectExecute - - return Result.Succeeded; - } - } -} \ No newline at end of file diff --git a/RvAddinTest/TempCmd.cs b/RvAddinTest/TempCmd.cs index 02a5733..83a75ae 100644 --- a/RvAddinTest/TempCmd.cs +++ b/RvAddinTest/TempCmd.cs @@ -1,20 +1,11 @@ -using System; -using System.Net; -using System.Windows; - -using Autodesk.Revit.Attributes; +using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; -using Autodesk.Revit.DB.Mechanical; using Autodesk.Revit.DB.Plumbing; -using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; -using CommunityToolkit.Mvvm.DependencyInjection; - using Nice3point.Revit.Toolkit.External; using Sai.Toolkit.Revit.Assist; -using Sai.Toolkit.Revit.Helpers; namespace RvAddinTest; [Transaction(TransactionMode.Manual)] @@ -204,19 +195,4 @@ public class TempCmd : ExternalCommand } }, "CMD"); } - - public class ArrangeElement - { - public XYZ Translation { get; set; } - - public int Index { get; set; } - - public Element ElementToMove { get; set; } - - /// - /// 与基准元素的间距及方向向量 - /// - public XYZ HorizonDistanceVector { get; set; } - - } } \ No newline at end of file diff --git a/Sai.RvKits.sln b/Sai.RvKits.sln index de980cb..a91249a 100644 --- a/Sai.RvKits.sln +++ b/Sai.RvKits.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# 17 +# Visual Studio Version 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}" @@ -33,6 +33,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sai.RvKits Setup", "Sai.RvK EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp", "ConsoleApp\ConsoleApp.csproj", "{3F3C932B-851E-48D4-9D35-09DDBDD0F690}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFUIAPP", "WPFUIAPP\WPFUIAPP.csproj", "{B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution All|Any CPU = All|Any CPU @@ -207,6 +209,26 @@ Global {3F3C932B-851E-48D4-9D35-09DDBDD0F690}.Release|Any CPU.Build.0 = Release|Any CPU {3F3C932B-851E-48D4-9D35-09DDBDD0F690}.Release|x64.ActiveCfg = Release|Any CPU {3F3C932B-851E-48D4-9D35-09DDBDD0F690}.Release|x64.Build.0 = Release|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.All|Any CPU.ActiveCfg = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.All|Any CPU.Build.0 = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.All|x64.ActiveCfg = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.All|x64.Build.0 = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.Debug One|Any CPU.ActiveCfg = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.Debug One|Any CPU.Build.0 = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.Debug One|x64.ActiveCfg = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.Debug One|x64.Build.0 = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.Debug|x64.ActiveCfg = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.Debug|x64.Build.0 = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.DefaultBuild|Any CPU.ActiveCfg = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.DefaultBuild|Any CPU.Build.0 = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.DefaultBuild|x64.ActiveCfg = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.DefaultBuild|x64.Build.0 = Debug|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.Release|Any CPU.Build.0 = Release|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.Release|x64.ActiveCfg = Release|Any CPU + {B0794664-92A5-44AC-AAD2-DB7C4A79A3A9}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Sai.RvKits/ModelManager/ModelCheckViewModel.cs b/Sai.RvKits/ModelManager/ModelCheckViewModel.cs index d32419a..f4b9b55 100644 --- a/Sai.RvKits/ModelManager/ModelCheckViewModel.cs +++ b/Sai.RvKits/ModelManager/ModelCheckViewModel.cs @@ -14,7 +14,6 @@ using CommunityToolkit.Mvvm.Input; using Microsoft.Win32; using Nice3point.Revit.Toolkit.External.Handlers; -using Nice3point.Revit.Toolkit.Utils; using Sai.RvKits.Windows; @@ -24,36 +23,10 @@ namespace Sai.RvKits.RvFamily; public partial class ModelCheckViewModel : ObservableObject { - private readonly ActionEventHandler showElementsSectionBox = new(); private readonly CorrectReferLevelExecutes correctReferLevelExecutes; - [ObservableProperty] - private bool useSectionBox; - [ObservableProperty] - private bool isCheckEqual; - - [ObservableProperty] - private bool isCheckLength; - - [ObservableProperty] - private bool isCheckLevel; - - [ObservableProperty] - private bool isCheckName; - - [ObservableProperty] - private bool isCheckProps; - - [ObservableProperty] - private bool isCheckSlope; - - [ObservableProperty] - private bool isCheckSymbolGeometry; - - [ObservableProperty] - private int errorCount; - private readonly ActionEventHandler modifyModel = new(); + private readonly ActionEventHandler showElementsSectionBox = new(); private readonly UIApplication uiapp; public ModelCheckViewModel(UIApplication uiapp) @@ -66,6 +39,15 @@ public partial class ModelCheckViewModel : ObservableObject FindBasePoint(); } + private bool CanExport() + { + return Items.Any(); + } + private static bool CanShowElement(object obj) + { + return obj is MessageModel { IsInstance: true }; + } + [RelayCommand] private /*async Task*/ void CheckModel(/*CancellationToken token*/) { @@ -357,45 +339,6 @@ public partial class ModelCheckViewModel : ObservableObject ExportToExcelCommand.NotifyCanExecuteChanged(); } - private void FindBasePoint() - { - var basePoints = uiapp.ActiveUIDocument.Document.OfClass().OfType(); - foreach (var item in basePoints) - { - //南北 - var ns = Math.Round( - item.get_Parameter(BuiltInParameter.BASEPOINT_NORTHSOUTH_PARAM).AsDouble() * 0.3048, - 4, - MidpointRounding.AwayFromZero - ); - //东西 - var ew = Math.Round(item.get_Parameter(BuiltInParameter.BASEPOINT_EASTWEST_PARAM).AsDouble() * 0.3048, 4, MidpointRounding.AwayFromZero); - //高程 - var elev = Math.Round( - item.get_Parameter(BuiltInParameter.BASEPOINT_ELEVATION_PARAM).AsDouble() * 0.3048, - 4, - MidpointRounding.AwayFromZero - ); - if (item.IsShared)//测量点 - { - SharedBasePoint = $"南北:{ns}m;东西:{ew}m;高程:{elev}m"; - continue; - } - - if (item.Category.GetHashCode() == -2001271)//项目基点 - { - //正北角度 - var angle = item.get_Parameter(BuiltInParameter.BASEPOINT_ANGLETON_PARAM).AsValueString(); - ProjectBasePoint = $"南北:{ns}m;东西:{ew}m;高程:{elev}m;角度:{angle}"; - } - } - } - - private bool CanExport() - { - return Items.Any(); - } - [RelayCommand(CanExecute = nameof(CanExport))] private void ExportToExcel() { @@ -488,6 +431,40 @@ public partial class ModelCheckViewModel : ObservableObject } } + private void FindBasePoint() + { + var basePoints = uiapp.ActiveUIDocument.Document.OfClass().OfType(); + foreach (var item in basePoints) + { + //南北 + var ns = Math.Round( + item.get_Parameter(BuiltInParameter.BASEPOINT_NORTHSOUTH_PARAM).AsDouble() * 0.3048, + 4, + MidpointRounding.AwayFromZero + ); + //东西 + var ew = Math.Round(item.get_Parameter(BuiltInParameter.BASEPOINT_EASTWEST_PARAM).AsDouble() * 0.3048, 4, MidpointRounding.AwayFromZero); + //高程 + var elev = Math.Round( + item.get_Parameter(BuiltInParameter.BASEPOINT_ELEVATION_PARAM).AsDouble() * 0.3048, + 4, + MidpointRounding.AwayFromZero + ); + if (item.IsShared)//测量点 + { + SharedBasePoint = $"南北:{ns}m;东西:{ew}m;高程:{elev}m"; + continue; + } + + if (item.Category.GetHashCode() == -2001271)//项目基点 + { + //正北角度 + var angle = item.get_Parameter(BuiltInParameter.BASEPOINT_ANGLETON_PARAM).AsValueString(); + ProjectBasePoint = $"南北:{ns}m;东西:{ew}m;高程:{elev}m;角度:{angle}"; + } + } + } + [RelayCommand] private void ModifyModel() { @@ -576,10 +553,6 @@ public partial class ModelCheckViewModel : ObservableObject SingletonChildWindowManager.ShowOrActivate(uiapp.ActiveUIDocument, errorItems, "未解决错误"); }); } - private static bool CanShowElement(object obj) - { - return obj is MessageModel { IsInstance: true }; - } [RelayCommand(CanExecute = nameof(CanShowElement))] private void ShowElement(object obj) @@ -629,11 +602,39 @@ public partial class ModelCheckViewModel : ObservableObject } [ObservableProperty] - private ObservableCollection items; + public partial int ErrorCount { get; set; } + + [ObservableProperty] + public partial bool IsCheckEqual { get; set; } + + [ObservableProperty] + public partial bool IsCheckLength { get; set; } + + [ObservableProperty] + public partial bool IsCheckLevel { get; set; } + + [ObservableProperty] + public partial bool IsCheckName { get; set; } + + [ObservableProperty] + public partial bool IsCheckProps { get; set; } + + [ObservableProperty] + public partial bool IsCheckSlope { get; set; } + [ObservableProperty] + public partial bool IsCheckSymbolGeometry { get; set; } + + [ObservableProperty] + public partial ObservableCollection Items { get; set; } + [ObservableProperty] + public partial int MyProperty { get; set; } public string ProjectBasePoint { get; set; } public string SharedBasePoint { get; set; } + + [ObservableProperty] + public partial bool UseSectionBox { get; set; } } public enum ModelCheckType diff --git a/Sai.RvKits/ModelManager/SeparateModelCmd.cs b/Sai.RvKits/ModelManager/SeparateModelCmd.cs new file mode 100644 index 0000000..df63bb3 --- /dev/null +++ b/Sai.RvKits/ModelManager/SeparateModelCmd.cs @@ -0,0 +1,17 @@ +using Autodesk.Revit.Attributes; +using Autodesk.Revit.DB; + +using Nice3point.Revit.Toolkit.External; + +namespace Sai.RvKits.ModelManager; +[Transaction(TransactionMode.Manual)] +[Regeneration(RegenerationOption.Manual)] +public class SeparateModelCmd : ExternalCommand +{ + public override void Execute() + { + //var win = new SeparateModelWin(); + //win.Show(); + SingletonChildWindowManager.ShowOrActivate(); + } +} \ No newline at end of file diff --git a/Sai.RvKits/ModelManager/SeparateModelViewModel.cs b/Sai.RvKits/ModelManager/SeparateModelViewModel.cs new file mode 100644 index 0000000..1efad09 --- /dev/null +++ b/Sai.RvKits/ModelManager/SeparateModelViewModel.cs @@ -0,0 +1,76 @@ +using System.IO; +using System.Windows; + +using Autodesk.Revit.DB; + +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; + +using Nice3point.Revit.Toolkit.External.Handlers; + +using UIFrameworkServices; + +namespace Sai.RvKits.ModelManager +{ + public partial class SeparateModelViewModel : ObservableObject + { + private readonly ActionEventHandler separate = new(); + + [ObservableProperty] + private string fileName = "示例"; + [ObservableProperty] + private string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + + [RelayCommand] + private void Separate() + { + separate.Raise( + uiapp => + { + var uidoc = uiapp.ActiveUIDocument; + var doc = uidoc.Document; + var list = uidoc.Selection.GetElementIds(); + + if (list.Count == 0) + { + MessageBox.Show("未选中元素", "提示"); + return; + } + SpearateByIds(doc, list); + doc.Invoke( + ts => + { + doc.Delete(list); + }, + "删除元素"); + }); + } + private void SpearateByIds(Document doc, ICollection list) + { + var allOthers = doc.OfModelCollector() + .Excluding(list) + .ToElementIds(); + var ids = doc.OfClass().ToElementIds(); + var modelLineIds = doc.OfCollector().OfCategory(BuiltInCategory.OST_Lines).Select(e => e.Id).ToList(); + var texts = doc.OfCollector().OfCategory(BuiltInCategory.OST_TextNotes).Select(e => e.Id).ToList(); + doc.Invoke( + ts => + { + doc.Delete(allOthers); + doc.Delete(ids); + doc.Delete(modelLineIds); + doc.Delete(texts); + }, + "删除其他"); + if (!Directory.Exists(FolderPath)) + { + Directory.CreateDirectory(FolderPath); + } + var filePath = Path.Combine(FolderPath, $"{FileName}.rvt"); + SaveAsOptions options = new SaveAsOptions() { OverwriteExistingFile = true, PreviewViewId = doc.ActiveView.Id, Compact = true }; + + doc.SaveAs(filePath, options); + QuickAccessToolBarService.performMultipleUndoRedoOperations(true, 1); + } + } +} \ No newline at end of file diff --git a/Sai.RvKits/ModelManager/SeparateModelWin.xaml b/Sai.RvKits/ModelManager/SeparateModelWin.xaml new file mode 100644 index 0000000..979897c --- /dev/null +++ b/Sai.RvKits/ModelManager/SeparateModelWin.xaml @@ -0,0 +1,37 @@ + + + + + + + + + + + + diff --git a/Sai.RvKits/ModelManager/SeparateModelWin.xaml.cs b/Sai.RvKits/ModelManager/SeparateModelWin.xaml.cs new file mode 100644 index 0000000..9d89dea --- /dev/null +++ b/Sai.RvKits/ModelManager/SeparateModelWin.xaml.cs @@ -0,0 +1,14 @@ +using Wpf.Ui.Extend.Controls; + +namespace Sai.RvKits.ModelManager; +/// +/// SeparateModelWin.xaml 的交互逻辑 +/// +public partial class SeparateModelWin : FluentWindowEx +{ + public SeparateModelWin() + { + InitializeComponent(); + } + +} diff --git a/Sai.RvKits/ModelManager/TemplateManagerViewModel.cs b/Sai.RvKits/ModelManager/TemplateManagerViewModel.cs index 9f01ca5..1d8ead1 100644 --- a/Sai.RvKits/ModelManager/TemplateManagerViewModel.cs +++ b/Sai.RvKits/ModelManager/TemplateManagerViewModel.cs @@ -1,6 +1,5 @@ using System.Drawing; using System.Drawing.Text; -using System.Windows; using Autodesk.Revit.DB; @@ -32,6 +31,56 @@ public partial class TemplateManagerViewModel : ObservableObject fontFamilies = installedFonts.Families; } [RelayCommand] + private void CleanFontType() + { + handler.Raise( + uiapp => + { + var doc = uiapp.ActiveUIDocument.Document; + var textTypes = doc.OfClass().ToList(); + + foreach (var type in textTypes) + { + { + if (type is TextNoteType textNoteType) + { + + try + { + var font = textNoteType.get_Parameter(BuiltInParameter.TEXT_FONT).AsString(); + var size = textNoteType.get_Parameter(BuiltInParameter.TEXT_SIZE).AsValueString().TrimEnd('m'); + var dSize = Math.Round(Convert.ToDouble(size), 1, MidpointRounding.AwayFromZero); + if (dSize < 0.23) + { + return; + } + textNoteType.get_Parameter(BuiltInParameter.TEXT_SIZE).SetValueString(dSize.ToString()); + var scale = textNoteType.get_Parameter(BuiltInParameter.TEXT_WIDTH_SCALE).AsValueString(); + //var color = textNoteType.get_Parameter(BuiltInParameter.LINE_COLOR).AsInteger(); + var name = $"{font}-{dSize}mm-{scale}"; + var isExist = textTypes.FirstOrDefault(t => t.Name == name); + if (isExist != null) + { + var texts = doc.OfClass().Where(e => e.GetTypeId() == textNoteType.Id).ToList(); + texts.ForEach(e => e.ChangeTypeId(isExist.Id)); + doc.Regenerate(); + doc.Delete(textNoteType.Id); + } + else + { + textNoteType.Name = name; + } + } + catch (Exception) + { + throw; + } + } + } + } + }); + } + [RelayCommand] private void ModifyFont() { handler.Raise( @@ -44,9 +93,9 @@ public partial class TemplateManagerViewModel : ObservableObject var col = doc.OfClass() .Cast() .Where(f => f.FamilyCategory.CategoryType == CategoryType.Annotation); - foreach(var family in col) + foreach (var family in col) { - if(!family.IsEditable) + if (!family.IsEditable) { continue; } @@ -56,7 +105,7 @@ public partial class TemplateManagerViewModel : ObservableObject ts => { var textElements = familyEditing.OfClass().Cast(); - foreach(var text in textElements) + foreach (var text in textElements) { var type = text.Symbol; ElementType typeCopy; @@ -64,7 +113,8 @@ public partial class TemplateManagerViewModel : ObservableObject { typeCopy = type.Duplicate( $"{SelectFontFamily.Name} {FontSize} - {WidthScale}"); - } catch(Autodesk.Revit.Exceptions.ArgumentException) + } + catch (Autodesk.Revit.Exceptions.ArgumentException) { } type.get_Parameter(BuiltInParameter.TEXT_FONT)?.SetValueString( @@ -76,14 +126,15 @@ public partial class TemplateManagerViewModel : ObservableObject } var textNotes = familyEditing.OfClass().Cast(); - foreach(var text in textNotes) + foreach (var text in textNotes) { var type = text.Symbol; try { var typeCopy = type.Duplicate( $"{SelectFontFamily.Name} {FontSize} - {WidthScale}"); - } catch(Autodesk.Revit.Exceptions.ArgumentException) + } + catch (Autodesk.Revit.Exceptions.ArgumentException) { } type.get_Parameter(BuiltInParameter.TEXT_FONT)?.SetValueString( @@ -101,7 +152,7 @@ public partial class TemplateManagerViewModel : ObservableObject }, "载入族"); } - },"调整文字"); + }, "调整文字"); }); } } \ No newline at end of file diff --git a/Sai.RvKits/Properties/Resources.Designer.cs b/Sai.RvKits/Properties/Resources.Designer.cs index 1014542..d8d1101 100644 --- a/Sai.RvKits/Properties/Resources.Designer.cs +++ b/Sai.RvKits/Properties/Resources.Designer.cs @@ -60,6 +60,26 @@ namespace Sai.RvKits.Properties { } } + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap adaptive_MEP_tag_16px { + get { + object obj = ResourceManager.GetObject("adaptive_MEP_tag_16px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap adaptive_MEP_tag_32px { + get { + object obj = ResourceManager.GetObject("adaptive_MEP_tag_32px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// @@ -220,16 +240,6 @@ namespace Sai.RvKits.Properties { } } - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap arrange_mep_16px1 { - get { - object obj = ResourceManager.GetObject("arrange_mep_16px1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// @@ -240,16 +250,6 @@ namespace Sai.RvKits.Properties { } } - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap arrange_mep_32px1 { - get { - object obj = ResourceManager.GetObject("arrange_mep_32px1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// diff --git a/Sai.RvKits/Properties/Resources.resx b/Sai.RvKits/Properties/Resources.resx index 6f2517d..c54d1f4 100644 --- a/Sai.RvKits/Properties/Resources.resx +++ b/Sai.RvKits/Properties/Resources.resx @@ -499,10 +499,10 @@ ..\Resources\add_insulation_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\arrange_mep_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\adaptive_MEP_tag_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\arrange_mep_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\adaptive_MEP_tag_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/Sai.RvKits/Resources/adaptive_MEP_tag_16px.png b/Sai.RvKits/Resources/adaptive_MEP_tag_16px.png new file mode 100644 index 0000000000000000000000000000000000000000..77de7138b5ec86a15c9dc07b3a48e417f4ae9c07 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|_ISEDhFJJ7 zowSknkb#IxyjdcTRfmi4Miw6?ABTesEuIZsZB0##8Y?3je<-;(=}XpkPuAIaV)uXj z=Uw)pqMy7I*m4?I-w0~vHsE_;wPAKpGphl6+yTBF(SUvy&L^dFZuFlRlG`zZ6_XC%-c44$rjF6*2U FngH;;WJ3S| literal 0 HcmV?d00001 diff --git a/Sai.RvKits/Resources/adaptive_MEP_tag_32px.png b/Sai.RvKits/Resources/adaptive_MEP_tag_32px.png new file mode 100644 index 0000000000000000000000000000000000000000..b4fa7cbed9805ec0ea920984cb68ae081145b6a7 GIT binary patch literal 447 zcmV;w0YLtVP)Px$c}YY;R9Hvtma#4cK@^6+tD;h?@CL#Q@Fo-yt;1>7*mYv!Ka4^+zaxGQfY4ruLu*vSu;(Z-3@sq~M(@tf3f6jH_ zxH&_@$zclt<^U*cs=l{)N(&S)iCw!2vXUNaPs{1qRTzym+tO zi|X04Zt7?ZpqS0>AZx3gJ00O6fYRdg&ie<5I-u)Tbl|uUYQiREV2E2V set.Transaction).Commit((doc, t) => + { + foreach (var id in ids) + { + var elem = Document.GetElement(id); + if (elem is MEPCurve mep) + { + var loc = mep.GetCurve() as Line; + var x = Math.Round(loc.Direction.X); + var y = Math.Round(loc.Direction.Y); + var z = Math.Round(loc.Direction.Z); + //if (Math.Abs(x) < 10E-5) + //{ + // x = 0; + //} + //if (Math.Abs(y) < 10E-5) + //{ + // y = 0; + //} + //if (Math.Abs(z) < 10E-5) + //{ + // z = 0; + //} + var dir = new XYZ(x, y, z); + var endPoint = loc.Origin + dir * loc.Length; + var li = Line.CreateBound(loc.Origin, endPoint); + var locx = mep.GetLocationCurve(); + locx.Curve = li; + } + } + }); + } private void ModifyMEPCurve(MEPCurve mepCurve) { var loc = mepCurve.Location as LocationCurve; diff --git a/Sai.RvKits/RvView/AdaptiveMEPTagCmd.cs b/Sai.RvKits/RvView/AdaptiveMEPTagCmd.cs new file mode 100644 index 0000000..d33dc94 --- /dev/null +++ b/Sai.RvKits/RvView/AdaptiveMEPTagCmd.cs @@ -0,0 +1,57 @@ +using Autodesk.Revit.Attributes; +using Autodesk.Revit.DB; + +using Nice3point.Revit.Toolkit.External; + +namespace Sai.RvKits.RvView; + +[Transaction(TransactionMode.Manual)] +[Regeneration(RegenerationOption.Manual)] +public class AdaptiveMEPTagCmd : ExternalCommand +{ + public override void Execute() + { + try + { + var tags = UiDocument.SelectObjects(); + var toRotate = new List(); + var toDelete = new List(); + foreach (var tag in tags) + { + var mep = Document.GetElement(tag.TaggedElementId.HostElementId); + var loc = mep.Location as LocationCurve; + var c = loc.Curve.Length < 2; + if (c || Math.Abs((loc.Curve as Line).Direction.Z) > 0.2) + { + toDelete.Add(tag.Id); + continue; + } + if (loc.Curve is Line l) + { + var ra = l.Direction.AngleTo(XYZ.BasisX); + if (ra > Math.PI / 4 && ra < Math.PI / 4 * 3) + { + toRotate.Add(tag); + } + } + } + Document.Invoke( + ts => + { + foreach (var item in toRotate) + { + item.TagOrientation = TagOrientation.Vertical; + } + Document.Delete(toDelete); + }, "旋转标注"); + } + catch (Autodesk.Revit.Exceptions.OperationCanceledException) + { + + } + catch (Exception) + { + + } + } +} \ No newline at end of file diff --git a/Sai.RvKits/RvView/ElementControlDock.xaml b/Sai.RvKits/RvView/ElementControlDock.xaml index 6a3ead5..5d85681 100644 --- a/Sai.RvKits/RvView/ElementControlDock.xaml +++ b/Sai.RvKits/RvView/ElementControlDock.xaml @@ -18,11 +18,17 @@ Spacing="5"> + @@ -80,15 +80,15 @@ --> - - - + + + - + - + - + @@ -106,6 +106,7 @@ --> + @@ -142,6 +143,11 @@ + + + + + @@ -166,6 +172,9 @@ + + Code + True True diff --git a/Sai.RvKits/UIRibbon/DrawingViewApp.cs b/Sai.RvKits/UIRibbon/DrawingViewApp.cs index eb74c8c..dec6b59 100644 --- a/Sai.RvKits/UIRibbon/DrawingViewApp.cs +++ b/Sai.RvKits/UIRibbon/DrawingViewApp.cs @@ -1,7 +1,5 @@ -using System; -using System.Windows; +using System.Windows; -using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Windows; @@ -10,8 +8,6 @@ using Nice3point.Revit.Toolkit.External.Handlers; using Sai.RvKits.Properties; using Sai.RvKits.RvView; -using adWin = Autodesk.Windows; - namespace Sai.RvKits.UIRibbon; public class DrawingViewApp @@ -46,6 +42,12 @@ public class DrawingViewApp Resources.two_lines_16px, "选择要标注的两条平行的几何模型边缘线进行标注。" ); + var adaptiveMEPTag = UIAssist.NewPushButtonData( + "自适应标记", + Resources.adaptive_MEP_tag_32px, + Resources.adaptive_MEP_tag_16px, + "删除距离过密的标记及管上标记方向调整" + ); var visibilityControl = UIAssist.NewPushButtonData( "可见性", @@ -98,7 +100,7 @@ public class DrawingViewApp "元素菜单控制" ); - ribbonPanel.AddStackedItems(dim2Line, autoAlignTags, arrangeTags); + ribbonPanel.AddSplitButton("标记工具", dim2Line, autoAlignTags, arrangeTags, adaptiveMEPTag); ribbonPanel.AddStackedItems(visibilityControl, sectionBox, filter); //ribbonPanel.AddSplitButton(splitBtn1, dim2Line, autoAlignTags, arrangeTags); diff --git a/Sai.Toolkit.Mvvm/Converters/BoolInverterConverter.cs b/Sai.Toolkit.Mvvm/Converters/InvertBooleanConverter.cs similarity index 100% rename from Sai.Toolkit.Mvvm/Converters/BoolInverterConverter.cs rename to Sai.Toolkit.Mvvm/Converters/InvertBooleanConverter.cs diff --git a/Sai.Toolkit.Mvvm/Sai.Toolkit.Mvvm.projitems b/Sai.Toolkit.Mvvm/Sai.Toolkit.Mvvm.projitems index 19c1b54..c6088a7 100644 --- a/Sai.Toolkit.Mvvm/Sai.Toolkit.Mvvm.projitems +++ b/Sai.Toolkit.Mvvm/Sai.Toolkit.Mvvm.projitems @@ -24,7 +24,7 @@ - + diff --git a/Sai.Toolkit.Revit/Assist/CollectorAssist.cs b/Sai.Toolkit.Revit/Assist/CollectorAssist.cs index 983bb0f..f71fc9d 100644 --- a/Sai.Toolkit.Revit/Assist/CollectorAssist.cs +++ b/Sai.Toolkit.Revit/Assist/CollectorAssist.cs @@ -138,6 +138,10 @@ public static class CollectorAssist && e is not Panel && e is not Mullion && e is not RevitLinkInstance)).Select(e => e.Id).ToList(); + if (li.Count == 0) + { + return new FilteredElementCollector(doc); + } return new FilteredElementCollector(doc, li); } diff --git a/Sai.Toolkit.Revit/Assist/DebugAssist.cs b/Sai.Toolkit.Revit/Assist/DebugAssist.cs index 6325205..60259ff 100644 --- a/Sai.Toolkit.Revit/Assist/DebugAssist.cs +++ b/Sai.Toolkit.Revit/Assist/DebugAssist.cs @@ -1,9 +1,7 @@ -using System.Collections.Generic; -using System.Diagnostics; +using System.Diagnostics; using System.Reflection; using Autodesk.Revit.DB; -using Autodesk.Revit.UI; namespace Sai.Toolkit.Revit.Assist; @@ -29,7 +27,7 @@ public static class DebugAssist /// /// /// - public static ElementId CreateTransientGeometries(this Document doc, params GeometryObject[] geoms) + public static ElementId CreateTransientElements(this Document doc, params GeometryObject[] geoms) { var list = new List(geoms); var method = GenerateTransientDisplayMethod(); diff --git a/Sai.Toolkit.Revit/Assist/ElementAssist.cs b/Sai.Toolkit.Revit/Assist/ElementAssist.cs index 085f33e..f706541 100644 --- a/Sai.Toolkit.Revit/Assist/ElementAssist.cs +++ b/Sai.Toolkit.Revit/Assist/ElementAssist.cs @@ -65,9 +65,9 @@ public static class ElementAssist /// /// 获取标高 /// - /// + /// /// - public static ElementId GetLevelId(this Element model) + public static ElementId GetLevelId(this Element element) { // 定义需要检查的参数列表 var parametersToCheck = new BuiltInParameter[] @@ -84,7 +84,7 @@ public static class ElementAssist // 依次检查每个参数 foreach (var param in parametersToCheck) { - var baseLevelId = model.get_Parameter(param)?.AsElementId(); + var baseLevelId = element.get_Parameter(param)?.AsElementId(); if (baseLevelId != ElementId.InvalidElementId && baseLevelId != null) { return baseLevelId; @@ -92,7 +92,7 @@ public static class ElementAssist } //最后检查楼板或族基准标高 - return model.LevelId; + return element.LevelId; } /// /// 转换类型 diff --git a/Sai.Toolkit.Revit/Helpers/Filters.cs b/Sai.Toolkit.Revit/Helpers/Filters.cs index 7193b1a..85b9f51 100644 --- a/Sai.Toolkit.Revit/Helpers/Filters.cs +++ b/Sai.Toolkit.Revit/Helpers/Filters.cs @@ -82,7 +82,9 @@ public class ElementInLinkOrCurrentDocument : ISelectionFilter && e is not Panel; } } - +/// +/// dwg块选择过滤 +/// public class DwgBlockSelection : ISelectionFilter { private Element e; diff --git a/Sai.Toolkit.Revit/Helpers/KeyboardShortcutService.cs b/Sai.Toolkit.Revit/Helpers/KeyboardShortcutService.cs index 2a831a2..e78e9dc 100644 --- a/Sai.Toolkit.Revit/Helpers/KeyboardShortcutService.cs +++ b/Sai.Toolkit.Revit/Helpers/KeyboardShortcutService.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; +using System.Reflection; using Autodesk.Revit.UI; @@ -37,8 +34,26 @@ namespace Sai.Toolkit.Revit.Helpers } dictionary.Add(id, shortcutItem); List list = dictionary.Select((KeyValuePair e) => e.Value).ToList(); - this.SaveShortcuts(list); - this.ArmCommands(); + + /* 项目“Sai.RvKits (net481)”的未合并的更改 + 在此之前: + this.SaveShortcuts(list); + this.ArmCommands(); + 在此之后: + SaveShortcuts(list); + this.ArmCommands(); + */ + KeyboardShortcutService.SaveShortcuts(list); + + /* 项目“Sai.RvKits (net481)”的未合并的更改 + 在此之前: + this.ArmCommands(); + return true; + 在此之后: + ArmCommands(); + return true; + */ + KeyboardShortcutService.ArmCommands(); return true; } return false; @@ -71,8 +86,26 @@ namespace Sai.Toolkit.Revit.Helpers } dictionary.Add(item.Key, shortcutItem); List list = dictionary.Select((KeyValuePair e) => e.Value).ToList(); - this.SaveShortcuts(list); - this.ArmCommands(); + + /* 项目“Sai.RvKits (net481)”的未合并的更改 + 在此之前: + this.SaveShortcuts(list); + this.ArmCommands(); + 在此之后: + SaveShortcuts(list); + this.ArmCommands(); + */ + KeyboardShortcutService.SaveShortcuts(list); + + /* 项目“Sai.RvKits (net481)”的未合并的更改 + 在此之前: + this.ArmCommands(); + return true; + 在此之后: + ArmCommands(); + return true; + */ + KeyboardShortcutService.ArmCommands(); return true; } } @@ -155,8 +188,26 @@ namespace Sai.Toolkit.Revit.Helpers { dictionary.Remove(id); List list = dictionary.Select((KeyValuePair e) => e.Value).ToList(); - this.SaveShortcuts(list); - this.ArmCommands(); + + /* 项目“Sai.RvKits (net481)”的未合并的更改 + 在此之前: + this.SaveShortcuts(list); + this.ArmCommands(); + 在此之后: + SaveShortcuts(list); + this.ArmCommands(); + */ + KeyboardShortcutService.SaveShortcuts(list); + + /* 项目“Sai.RvKits (net481)”的未合并的更改 + 在此之前: + this.ArmCommands(); + return true; + 在此之后: + ArmCommands(); + return true; + */ + KeyboardShortcutService.ArmCommands(); return true; } return false; @@ -214,7 +265,7 @@ namespace Sai.Toolkit.Revit.Helpers /// /// 加载命令 /// - public void LoadCommands() + public static void LoadCommands() { ShortcutsHelper.LoadCommands(); } @@ -228,7 +279,7 @@ namespace Sai.Toolkit.Revit.Helpers /// /// 应用更改 /// - private void ArmCommands() + private static void ArmCommands() { ShortcutsHelper.ArmCommands(); } @@ -244,7 +295,7 @@ namespace Sai.Toolkit.Revit.Helpers /// 保存ShortcutItems /// /// - private void SaveShortcuts(ICollection shortcutList) + private static void SaveShortcuts(ICollection shortcutList) { ShortcutsHelper.SaveShortcuts(shortcutList); } diff --git a/Sai.Toolkit.Revit/Helpers/ParameterAssist.cs b/Sai.Toolkit.Revit/Helpers/ParameterAssist.cs index 82489fc..c520647 100644 --- a/Sai.Toolkit.Revit/Helpers/ParameterAssist.cs +++ b/Sai.Toolkit.Revit/Helpers/ParameterAssist.cs @@ -1,404 +1,31 @@ using System.Diagnostics; using System.IO; using System.Reflection; -using System.Windows.Data; using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.DB; using Autodesk.Revit.UI; +using Sai.Toolkit.Revit.Assist; namespace Sai.Toolkit.Revit.Helpers; public class ParameterAssist { - public static Dictionary GetDefinitionBindings(Document doc) + private static ExternalDefinition GetSharedParameter(DefinitionFile file, string groupname, string paramname) { - Dictionary dict = []; - var dep = doc.ParameterBindings.ForwardIterator(); - while (dep.MoveNext()) + var myGroups = file.Groups; + var myGroup = myGroups.get_Item(groupname); + + ExternalDefinition extDef = null; + + if (myGroup != null) { - var definition = dep.Key; - var binding = dep.Current as ElementBinding; - dict.Add(definition, binding); + extDef = myGroup.Definitions.get_Item(paramname) as ExternalDefinition; } - return dict; - } - /// - /// 判断参数是什么参数,true是项目参数,false是共享参数的项目参数,null,都不是 - /// - /// - /// - public static bool? IsProjectParameter(Parameter param) - { - var doc = param.Element.Document; - var dict = GetParameterElementBindings(doc); - - var ds = dict.Where( - e => e.Key.GetDefinition().Id == (param.Definition as InternalDefinition)?.Id); - if (ds.Any())//说明是项目参数 - { - var d = ds.FirstOrDefault(); - var parameter = d.Key; - var binding = d.Value; - if (binding.Categories.Size == 1)//如果只剩下一个类别,则直接移除 - { - if (parameter is SharedParameterElement)//共享参数 - { - return true; - } - else//项目参数 - { - return false; - } - } - } - return null; - } - public static void RemoveFamilyParameter(FamilyInstance instance, string paramName) - { - Document famdoc = null; - Document Document = instance.Document; - try - { - Family family = instance.Symbol.Family; - - if (family.IsEditable) - { - famdoc = instance.Document.EditFamily(family); - } - else - { - Debug.WriteLine($"{family.Name} 不可编辑。"); - } - - if (famdoc != null) - { - using (Transaction ts = new(famdoc, "删除参数")) - { - ts.Start(); - var parametersToRemove = famdoc.FamilyManager - .GetParameters() - .Where(fp => paramName == fp.Definition.Name); - foreach (FamilyParameter fp in parametersToRemove) - { - famdoc.FamilyManager.RemoveParameter(fp); - } - ts.Commit(); - } - - famdoc.LoadFamily(Document); - famdoc.Close(false); - } - } - catch (Exception) - { - Debug.WriteLine($"{famdoc.Title} 发生错误!"); - } - } - /// - /// 移除元素上的项目参数 - /// - /// - public static void RemoveProjectParameter(Parameter param) - { - Element element = param.Element; - var doc = element.Document; - - var dict = GetParameterElementBindings(doc); - var bindings = doc.ParameterBindings; - - var ds = dict.Where( - e => e.Key.GetDefinition().Id == (param.Definition as InternalDefinition)?.Id); - if (ds.Any())//说明是项目参数 - { - var d = ds.FirstOrDefault(); - var parameter = d.Key; - var binding = d.Value; - if (binding.Categories.Size == 1)//如果只剩下一个类别,则直接移除 - { - if (parameter is SharedParameterElement)//共享参数 - { - bindings.Remove(param.Definition); - } - else//项目参数 - { - doc.Delete(parameter.Id); - } - } - else//否则只移除一个类别 - { - binding.Categories.Erase(element.Category); - doc.ParameterBindings.ReInsert(parameter.GetDefinition(), binding); - } - } - } - public static IEnumerable InstanceCategories - { - get - { - yield return "HVAC 区"; - yield return "专用设备"; - yield return "体量"; - yield return "停车场"; - yield return "卫浴装置"; - yield return "喷头"; - yield return "图纸"; - yield return "地形"; - yield return "场地"; - yield return "坡道"; - yield return "墙"; - yield return "天花板"; - yield return "安全设备"; - yield return "家具"; - yield return "家具系统"; - yield return "导线"; - yield return "屋顶"; - yield return "常规模型"; - yield return "幕墙嵌板"; - yield return "幕墙竖梃"; - yield return "幕墙系统"; - yield return "开关系统"; - yield return "房间"; - yield return "护理呼叫设备"; - yield return "数据设备"; - yield return "机械设备"; - yield return "材质"; - yield return "柱"; - yield return "标高"; - yield return "栏杆扶手"; - yield return "植物"; - yield return "楼板"; - yield return "楼梯"; - yield return "橱柜"; - yield return "火警设备"; - yield return "灯具"; - yield return "照明设备"; - yield return "环境"; - yield return "电气装置"; - yield return "电气设备"; - yield return "电缆桥架"; - yield return "电缆桥架管路"; - yield return "电缆桥架配件"; - yield return "电话设备"; - yield return "电路"; - yield return "空间"; - yield return "窗"; - yield return "竖井洞口"; - yield return "管件"; - yield return "管道"; - yield return "管道占位符"; - yield return "管道系统"; - yield return "管道附件"; - yield return "线管"; - yield return "线管管路"; - yield return "线管配件"; - yield return "组成部分"; - yield return "结构加强板"; - yield return "结构区域钢筋"; - yield return "结构基础"; - yield return "结构柱"; - yield return "结构桁架"; - yield return "结构框架"; - yield return "结构梁系统"; - yield return "结构路径钢筋"; - yield return "结构连接"; - yield return "结构钢筋"; - yield return "结构钢筋网"; - yield return "结构钢筋网区域"; - yield return "视图"; - yield return "详图项目"; - yield return "软管"; - yield return "软风管"; - yield return "轴网"; - yield return "通讯设备"; - yield return "道路"; - yield return "部件"; - yield return "钢筋形状"; - yield return "门"; - yield return "面积"; - yield return "项目信息"; - yield return "预制零件"; - yield return "风管"; - yield return "风管内衬"; - yield return "风管占位符"; - yield return "风管管件"; - yield return "风管系统"; - yield return "风管附件"; - yield return "风管隔热层"; - yield return "风道末端"; - } - } - - public static IEnumerable ProjectParamGroups - { - get - { - yield return "IFC参数"; - yield return "主端点"; - yield return "光域"; - yield return "其他"; - yield return "分区几何图形"; - yield return "分析平差"; - yield return "分析模型"; - yield return "分析结果"; - yield return "力"; - yield return "力矩"; - yield return "卫浴"; - yield return "可见性"; - yield return "图层"; - yield return "图形"; - yield return "尺寸标注"; - yield return "常规"; - yield return "数据"; - yield return "整个图例"; - yield return "文字"; - yield return "机械"; - yield return "机械 - 流量"; - yield return "机械 - 负荷"; - yield return "材质和装饰"; - yield return "构造"; - yield return "标识数据"; - yield return "标题文字"; - yield return "模型属性"; - yield return "次端点"; - yield return "消防系统"; - yield return "电气"; - yield return "电气 - 照明"; - yield return "电气 - 线路"; - yield return "电气 - 负荷"; - yield return "电气工程"; - yield return "管段和管件"; - yield return "结构"; - yield return "结构分析"; - yield return "绿色建筑属性"; - yield return "编辑板形状"; - yield return "能量分析"; - yield return "释放/杆件力"; - yield return "钢筋集"; - yield return "阶段化"; - yield return "限制条件"; - } - } - - public static IEnumerable TypeCategories - { - get - { - yield return "专用设备"; - yield return "体量"; - yield return "停车场"; - yield return "卫浴装置"; - yield return "喷头"; - yield return "地形"; - yield return "场地"; - yield return "坡道"; - yield return "墙"; - yield return "天花板"; - yield return "安全设备"; - yield return "家具"; - yield return "家具系统"; - yield return "导线"; - yield return "屋顶"; - yield return "常规模型"; - yield return "幕墙嵌板"; - yield return "幕墙竖梃"; - yield return "幕墙系统"; - yield return "开关系统"; - yield return "护理呼叫设备"; - yield return "数据设备"; - yield return "机械设备"; - yield return "柱"; - yield return "标高"; - yield return "栏杆扶手"; - yield return "植物"; - yield return "楼板"; - yield return "楼梯"; - yield return "橱柜"; - yield return "火警设备"; - yield return "灯具"; - yield return "照明设备"; - yield return "环境"; - yield return "电气装置"; - yield return "电气设备"; - yield return "电缆桥架"; - yield return "电缆桥架管路"; - yield return "电缆桥架配件"; - yield return "电话设备"; - yield return "窗"; - yield return "管件"; - yield return "管道"; - yield return "管道占位符"; - yield return "管道系统"; - yield return "管道附件"; - yield return "线管"; - yield return "线管管路"; - yield return "线管配件"; - yield return "组成部分"; - yield return "结构加强板"; - yield return "结构区域钢筋"; - yield return "结构基础"; - yield return "结构柱"; - yield return "结构桁架"; - yield return "结构框架"; - yield return "结构梁系统"; - yield return "结构路径钢筋"; - yield return "结构连接"; - yield return "结构钢筋"; - yield return "结构钢筋网"; - yield return "结构钢筋网区域"; - yield return "详图项目"; - yield return "软管"; - yield return "软风管"; - yield return "轴网"; - yield return "通讯设备"; - yield return "部件"; - yield return "钢筋形状"; - yield return "门"; - yield return "预制零件"; - yield return "风管"; - yield return "风管内衬"; - yield return "风管占位符"; - yield return "风管管件"; - yield return "风管系统"; - yield return "风管附件"; - yield return "风管隔热层"; - yield return "风道末端"; - } - } - /// - /// 获取参数和元素绑定 - /// - /// - /// - public static Dictionary GetParameterElementBindings(Document doc) - { - //项目中所有的参数元素实体 - var parameterElements = new FilteredElementCollector(doc).OfClass(typeof(ParameterElement)).Cast(); - - Dictionary dict = []; - //绑定 - var dep = doc.ParameterBindings.ForwardIterator(); - while (dep.MoveNext()) - { - if (dep.Key is InternalDefinition definition) - { - var binding = dep.Current as ElementBinding; - foreach (var param in parameterElements) - { - var def = param.GetDefinition(); - - if (def.Id == definition.Id) - { - dict.Add(param, binding); - } - } - } - - } - return dict; + return extDef; } /// @@ -649,7 +276,7 @@ public class ParameterAssist { var shapeFile = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + $"\\{fileName}.txt"; System.Text.StringBuilder contents = new(); - contents.AppendLine("# This is a Revit shared parameter file."); + contents.AppendLine("# This is a Revit shared parameterElement file."); contents.AppendLine("# Do not edit manually."); contents.AppendLine("*META VERSION MINVERSION"); contents.AppendLine("META 2 1"); @@ -674,7 +301,7 @@ public class ParameterAssist File.GetLastWriteTime(Assembly.GetExecutingAssembly().Location).ToUniversalTime() ); var result = - "# This is a Revit shared parameter file, generated " + "# This is a Revit shared parameterElement file, generated " + DateTime.Now.ToShortDateString() + " using " + name.Name @@ -723,35 +350,6 @@ public class ParameterAssist return result; } - public static ExternalDefinition GetDefinition( - DefinitionFile sharedParamFile, - string definitionName, -#if REVIT2018 || REVIT2020 - ParameterType paramType, -#elif REVIT2025 - ForgeTypeId paramType, -#endif - ref Guid guid, - DefinitionGroup group - ) - { - new List(); - foreach (var definitionGroup in sharedParamFile.Groups) - { - foreach (var definition in definitionGroup.Definitions) - { - var externalDefinition = (ExternalDefinition)definition; - if (externalDefinition.Name == definitionName) - { - return externalDefinition; - } - } - } - - ExternalDefinitionCreationOptions externalDefinitionCreationOptions = new(definitionName, paramType); - return group.Definitions.Create(externalDefinitionCreationOptions) as ExternalDefinition; - } - /// /// 获取或创建共享参数文件的参数组中的参数 /// @@ -787,6 +385,62 @@ public class ParameterAssist return group.Definitions.Create(opt); } + public static ExternalDefinition GetDefinition( + DefinitionFile sharedParamFile, + string definitionName, +#if REVIT2018 || REVIT2020 + ParameterType paramType, +#elif REVIT2025 + ForgeTypeId paramType, +#endif + ref Guid guid, + DefinitionGroup group + ) + { + new List(); + foreach (var definitionGroup in sharedParamFile.Groups) + { + foreach (var definition in definitionGroup.Definitions) + { + var externalDefinition = (ExternalDefinition)definition; + if (externalDefinition.Name == definitionName) + { + return externalDefinition; + } + } + } + + ExternalDefinitionCreationOptions externalDefinitionCreationOptions = new(definitionName, paramType); + return group.Definitions.Create(externalDefinitionCreationOptions) as ExternalDefinition; + } + public static Dictionary GetDefinitionBindings(Document doc) + { + Dictionary dict = []; + var dep = doc.ParameterBindings.ForwardIterator(); + while (dep.MoveNext()) + { + var definition = dep.Key; + var binding = dep.Current as ElementBinding; + dict.Add(definition, binding); + } + return dict; + } + + /// + /// 获取共享参数文件中的参数组 + /// + /// + /// 分组 + /// + public static DefinitionGroup GetGroup(DefinitionGroups groups, string groupName) + { + return groups is null + ? throw new ArgumentNullException(nameof(groups)) + : groupName is null + ? throw new ArgumentNullException(nameof(groupName)) + : groups.get_Item(groupName) ?? groups.Create(groupName); + } + public static DefinitionGroup GetGroup(DefinitionFile myDefinitionFile, string groupName, string log) { DefinitionGroup definitionGroup = null; @@ -819,21 +473,6 @@ public class ParameterAssist return definitionGroup; } - /// - /// 获取共享参数文件中的参数组 - /// - /// - /// 分组 - /// - public static DefinitionGroup GetGroup(DefinitionGroups groups, string groupName) - { - return groups is null - ? throw new ArgumentNullException(nameof(groups)) - : groupName is null - ? throw new ArgumentNullException(nameof(groupName)) - : groups.get_Item(groupName) ?? groups.Create(groupName); - } - /// /// 获取共享参数文件中的参数组 /// @@ -861,8 +500,40 @@ public class ParameterAssist return uiapp.Application.OpenSharedParameterFile()?.Groups; } + /// + /// 获取所有项目参数和定义元素绑定 + /// + /// + /// + public static Dictionary GetParameterElementBindings(Document doc) + { + //项目中所有的参数元素,包含共享参数元素 + var parameterElements = doc.OfClass().Cast(); - public void GetSharedPara(Application revitApp) + Dictionary dict = []; + //绑定 + var dep = doc.ParameterBindings.ForwardIterator(); + while (dep.MoveNext()) + { + if (dep.Key is InternalDefinition definition) + { + var binding = dep.Current as ElementBinding; + foreach (var param in parameterElements) + { + var def = param.GetDefinition(); + + if (def.Id == definition.Id) + { + dict.Add(param, binding); + } + } + } + + } + return dict; + } + + public static void GetSharedPara(Application revitApp) { // 打开共享参数文件 var definitionFile = revitApp.OpenSharedParameterFile(); @@ -926,7 +597,7 @@ public class ParameterAssist { var binding = bindingMap.get_Item(definition); - // If the parameter group's name contains type key, it's means type binding. + // 如果参数组的名称包含类型 key,则表示类型绑定。 if (!paramGroup.Name.Contains("Group")) { if (binding is InstanceBinding instanceBinding) @@ -957,22 +628,21 @@ public class ParameterAssist } } /// - /// 是否存在该项目参数(共享参数/项目参数) + /// 是否存在该项目参数 /// /// - /// - /// - /// + /// 参数名称 + /// 定义 + /// 参数绑定 /// - public bool IsExistSharedParam( + public static bool IsExistProjectParam( Document doc, string paramName, out Definition definition, out ElementBinding binding ) { - DefinitionBindingMap map = doc.ParameterBindings; - var dep = map.ForwardIterator(); + var dep = doc.ParameterBindings.ForwardIterator(); var isExist = false; binding = null; definition = null; @@ -981,12 +651,6 @@ public class ParameterAssist definition = dep.Key; var definitionName = definition.Name; binding = dep.Current as ElementBinding; - //ParameterType parameterType = definition.ParameterType; - //InstanceBinding instanceBinding = dep.Current as InstanceBinding; - //if (instanceBinding != null) - //{ - // CategorySet categorySet = instanceBinding.Categories; - //} if (definitionName == paramName) { isExist = true; @@ -996,20 +660,76 @@ public class ParameterAssist return isExist; } - /// - /// 判断共享参数和项目参数 + /// 判断参数是什么参数,true是项目参数的项目参数,false是共享参数的项目参数 /// - /// The parameter + /// /// - public bool IsSharedPara(Parameter parameter) + public static bool IsProject(Parameter param) { - var definition = parameter.Definition as InternalDefinition; + var doc = param.Element.Document; - var isSharedParameter = parameter.IsShared; //共享参数 + var dict = GetParameterElementBindings(doc); + var ds = dict.Where( + e => e.Key.GetDefinition().Id == (param.Definition as InternalDefinition)?.Id); + if (ds.Any())//说明是项目参数 + { + var d = ds.FirstOrDefault(); + var parameterElement = d.Key; + var binding = d.Value; + if (parameterElement is SharedParameterElement)//共享参数 + { + return false; + } + else//项目参数 + { + return true; + } + } + return false; + } + /// + /// 根据定义判断是什么参数 + /// + /// + /// + /// + public static bool IsShared(Document doc, Definition definition) + { + var sharedParamElems = doc.OfClass() + .Cast(); + var internalDef = definition as InternalDefinition; - var isProjectParameter = definition.BuiltInParameter == BuiltInParameter.INVALID && !parameter.IsShared; //项目参数 - return isSharedParameter; + foreach (var elem in sharedParamElems) + { + var def = elem.GetDefinition(); + if (internalDef.Id == def.Id) + { + return true; + } + } + + return false; + } + /// + /// 根据参数名判断是否是共享参数 + /// + /// + /// + /// + public static bool IsShared(Document doc, string paramName) + { + var dict = GetParameterElementBindings(doc); + foreach (var keyValue in dict) + { + var key = keyValue.Key; + if (key is SharedParameterElement && key.Name == paramName) + { + return true; + } + } + + return false; } /// @@ -1021,36 +741,37 @@ public class ParameterAssist public static void ModifyBuiltInParameter(Parameter parameter, object value) { var success = false; - if (parameter != null && !parameter.IsReadOnly) + if (parameter == null) { - switch (parameter.StorageType) - { - case StorageType.Double: - success = parameter.Set((double)value); - break; - - case StorageType.ElementId: - success = parameter.Set((ElementId)value); - break; - - case StorageType.String: - success = parameter.Set((string)value); - break; - - case StorageType.Integer: - success = parameter.Set((int)value); - break; - } - - if (!success) - { - throw new Exception("赋值失败"); - } + throw new Exception("参数为空"); } - else + if (parameter.IsReadOnly) { throw new Exception("参数是只读的"); } + switch (parameter.StorageType) + { + case StorageType.Double: + success = parameter.Set((double)value); + break; + + case StorageType.ElementId: + success = parameter.Set((ElementId)value); + break; + + case StorageType.String: + success = parameter.Set((string)value); + break; + + case StorageType.Integer: + success = parameter.Set((int)value); + break; + } + + if (!success) + { + throw new Exception("赋值失败"); + } } public static DefinitionFile OpenSharedParametersFile(Application application) @@ -1058,15 +779,56 @@ public class ParameterAssist var sharedParametersFile = application.OpenSharedParameterFile(); return sharedParametersFile; } + public static void RemoveFamilyParameter(FamilyInstance instance, string paramName) + { + Document famdoc = null; + Document Document = instance.Document; + try + { + Family family = instance.Symbol.Family; + + if (family.IsEditable) + { + famdoc = instance.Document.EditFamily(family); + } + else + { + Debug.WriteLine($"{family.Name} 不可编辑。"); + } + + if (famdoc != null) + { + using (Transaction ts = new(famdoc, "删除参数")) + { + ts.Start(); + var parametersToRemove = famdoc.FamilyManager + .GetParameters() + .Where(fp => paramName == fp.Definition.Name); + foreach (FamilyParameter fp in parametersToRemove) + { + famdoc.FamilyManager.RemoveParameter(fp); + } + ts.Commit(); + } + + famdoc.LoadFamily(Document); + famdoc.Close(false); + } + } + catch (Exception) + { + Debug.WriteLine($"{famdoc.Title} 发生错误!"); + } + } /// - /// 移除当前文档中所有族的某些参数 + /// 移除当前文档中所有可载入族的某些参数 /// /// /// - public static void RemoveParams(Document doc, params string[] paramnames) + public static void RemoveFamilyParams(Document doc, params string[] paramnames) { - var instances = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).Cast(); + var instances = doc.OfClass().Cast(); foreach (var instance in instances) { var family = instance.Symbol.Family; @@ -1101,6 +863,43 @@ public class ParameterAssist famdoc.Close(false); } } + /// + /// 移除元素上的项目参数 + /// + /// + public static void RemoveProjectParameter(Parameter param) + { + Element element = param.Element; + var doc = element.Document; + + var dict = GetParameterElementBindings(doc); + var bindings = doc.ParameterBindings; + + var ds = dict.Where( + e => e.Key.GetDefinition().Id == (param.Definition as InternalDefinition)?.Id); + if (ds.Any())//说明是项目参数 + { + var d = ds.FirstOrDefault(); + var parameter = d.Key; + var binding = d.Value; + if (binding.Categories.Size == 1)//如果只剩下一个类别,则直接移除 + { + if (parameter is SharedParameterElement)//共享参数 + { + bindings.Remove(param.Definition); + } + else//项目参数 + { + doc.Delete(parameter.Id); + } + } + else//否则只移除一个类别 + { + binding.Categories.Erase(element.Category); + doc.ParameterBindings.ReInsert(parameter.GetDefinition(), binding); + } + } + } public static void SharedParamsBindingCategoryset( UIApplication uiapp, @@ -1159,18 +958,237 @@ public class ParameterAssist } } - private static ExternalDefinition GetSharedParameter(DefinitionFile file, string groupname, string paramname) + public static IEnumerable InstanceCategories { - var myGroups = file.Groups; - var myGroup = myGroups.get_Item(groupname); - - ExternalDefinition extDef = null; - - if (myGroup != null) + get { - extDef = myGroup.Definitions.get_Item(paramname) as ExternalDefinition; + yield return "HVAC 区"; + yield return "专用设备"; + yield return "体量"; + yield return "停车场"; + yield return "卫浴装置"; + yield return "喷头"; + yield return "图纸"; + yield return "地形"; + yield return "场地"; + yield return "坡道"; + yield return "墙"; + yield return "天花板"; + yield return "安全设备"; + yield return "家具"; + yield return "家具系统"; + yield return "导线"; + yield return "屋顶"; + yield return "常规模型"; + yield return "幕墙嵌板"; + yield return "幕墙竖梃"; + yield return "幕墙系统"; + yield return "开关系统"; + yield return "房间"; + yield return "护理呼叫设备"; + yield return "数据设备"; + yield return "机械设备"; + yield return "材质"; + yield return "柱"; + yield return "标高"; + yield return "栏杆扶手"; + yield return "植物"; + yield return "楼板"; + yield return "楼梯"; + yield return "橱柜"; + yield return "火警设备"; + yield return "灯具"; + yield return "照明设备"; + yield return "环境"; + yield return "电气装置"; + yield return "电气设备"; + yield return "电缆桥架"; + yield return "电缆桥架管路"; + yield return "电缆桥架配件"; + yield return "电话设备"; + yield return "电路"; + yield return "空间"; + yield return "窗"; + yield return "竖井洞口"; + yield return "管件"; + yield return "管道"; + yield return "管道占位符"; + yield return "管道系统"; + yield return "管道附件"; + yield return "线管"; + yield return "线管管路"; + yield return "线管配件"; + yield return "组成部分"; + yield return "结构加强板"; + yield return "结构区域钢筋"; + yield return "结构基础"; + yield return "结构柱"; + yield return "结构桁架"; + yield return "结构框架"; + yield return "结构梁系统"; + yield return "结构路径钢筋"; + yield return "结构连接"; + yield return "结构钢筋"; + yield return "结构钢筋网"; + yield return "结构钢筋网区域"; + yield return "视图"; + yield return "详图项目"; + yield return "软管"; + yield return "软风管"; + yield return "轴网"; + yield return "通讯设备"; + yield return "道路"; + yield return "部件"; + yield return "钢筋形状"; + yield return "门"; + yield return "面积"; + yield return "项目信息"; + yield return "预制零件"; + yield return "风管"; + yield return "风管内衬"; + yield return "风管占位符"; + yield return "风管管件"; + yield return "风管系统"; + yield return "风管附件"; + yield return "风管隔热层"; + yield return "风道末端"; } + } - return extDef; + public static IEnumerable ProjectParamGroups + { + get + { + yield return "IFC参数"; + yield return "主端点"; + yield return "光域"; + yield return "其他"; + yield return "分区几何图形"; + yield return "分析平差"; + yield return "分析模型"; + yield return "分析结果"; + yield return "力"; + yield return "力矩"; + yield return "卫浴"; + yield return "可见性"; + yield return "图层"; + yield return "图形"; + yield return "尺寸标注"; + yield return "常规"; + yield return "数据"; + yield return "整个图例"; + yield return "文字"; + yield return "机械"; + yield return "机械 - 流量"; + yield return "机械 - 负荷"; + yield return "材质和装饰"; + yield return "构造"; + yield return "标识数据"; + yield return "标题文字"; + yield return "模型属性"; + yield return "次端点"; + yield return "消防系统"; + yield return "电气"; + yield return "电气 - 照明"; + yield return "电气 - 线路"; + yield return "电气 - 负荷"; + yield return "电气工程"; + yield return "管段和管件"; + yield return "结构"; + yield return "结构分析"; + yield return "绿色建筑属性"; + yield return "编辑板形状"; + yield return "能量分析"; + yield return "释放/杆件力"; + yield return "钢筋集"; + yield return "阶段化"; + yield return "限制条件"; + } + } + + public static IEnumerable TypeCategories + { + get + { + yield return "专用设备"; + yield return "体量"; + yield return "停车场"; + yield return "卫浴装置"; + yield return "喷头"; + yield return "地形"; + yield return "场地"; + yield return "坡道"; + yield return "墙"; + yield return "天花板"; + yield return "安全设备"; + yield return "家具"; + yield return "家具系统"; + yield return "导线"; + yield return "屋顶"; + yield return "常规模型"; + yield return "幕墙嵌板"; + yield return "幕墙竖梃"; + yield return "幕墙系统"; + yield return "开关系统"; + yield return "护理呼叫设备"; + yield return "数据设备"; + yield return "机械设备"; + yield return "柱"; + yield return "标高"; + yield return "栏杆扶手"; + yield return "植物"; + yield return "楼板"; + yield return "楼梯"; + yield return "橱柜"; + yield return "火警设备"; + yield return "灯具"; + yield return "照明设备"; + yield return "环境"; + yield return "电气装置"; + yield return "电气设备"; + yield return "电缆桥架"; + yield return "电缆桥架管路"; + yield return "电缆桥架配件"; + yield return "电话设备"; + yield return "窗"; + yield return "管件"; + yield return "管道"; + yield return "管道占位符"; + yield return "管道系统"; + yield return "管道附件"; + yield return "线管"; + yield return "线管管路"; + yield return "线管配件"; + yield return "组成部分"; + yield return "结构加强板"; + yield return "结构区域钢筋"; + yield return "结构基础"; + yield return "结构柱"; + yield return "结构桁架"; + yield return "结构框架"; + yield return "结构梁系统"; + yield return "结构路径钢筋"; + yield return "结构连接"; + yield return "结构钢筋"; + yield return "结构钢筋网"; + yield return "结构钢筋网区域"; + yield return "详图项目"; + yield return "软管"; + yield return "软风管"; + yield return "轴网"; + yield return "通讯设备"; + yield return "部件"; + yield return "钢筋形状"; + yield return "门"; + yield return "预制零件"; + yield return "风管"; + yield return "风管内衬"; + yield return "风管占位符"; + yield return "风管管件"; + yield return "风管系统"; + yield return "风管附件"; + yield return "风管隔热层"; + yield return "风道末端"; + } } } diff --git a/WPFUIAPP/App.config b/WPFUIAPP/App.config new file mode 100644 index 0000000..56efbc7 --- /dev/null +++ b/WPFUIAPP/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/WPFUIAPP/App.xaml b/WPFUIAPP/App.xaml new file mode 100644 index 0000000..6a229e2 --- /dev/null +++ b/WPFUIAPP/App.xaml @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/WPFUIAPP/App.xaml.cs b/WPFUIAPP/App.xaml.cs new file mode 100644 index 0000000..8ac3e60 --- /dev/null +++ b/WPFUIAPP/App.xaml.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +using Wpf.Ui.Violeta.Controls; + +namespace WPFUIAPP +{ + /// + /// App.xaml 的交互逻辑 + /// + public partial class App : Application + { + public App() + { + Splash.ShowAsync("pack://application:,,,/Wpf.Ui.Test;component/wpfui.png"); + InitializeComponent(); + } + + + } +} diff --git a/WPFUIAPP/MainWindow.xaml b/WPFUIAPP/MainWindow.xaml new file mode 100644 index 0000000..0c4a083 --- /dev/null +++ b/WPFUIAPP/MainWindow.xaml @@ -0,0 +1,131 @@ + + + + + + + + + + +