From 76ba611bd3494bb5d0a395295bb98768f6726a4b Mon Sep 17 00:00:00 2001 From: ricaun Date: Fri, 31 Oct 2025 14:48:06 -0300 Subject: [PATCH 1/8] Support `DataBuilder` in `RevitAddInsBuilder`. --- ...vitAddInsBuilder_ManifestSettings_Tests.cs | 98 +++++++++++++++++++ .../Builder/RevitAddInsBuilder.cs | 5 + CHANGELOG.md | 7 ++ Directory.Build.props | 2 +- 4 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs diff --git a/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs b/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs new file mode 100644 index 0000000..1b9459b --- /dev/null +++ b/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs @@ -0,0 +1,98 @@ +using Autodesk.PackageBuilder.Tests.Utils; +using NUnit.Framework; +using System; +using System.Xml.Serialization; + +namespace Autodesk.PackageBuilder.Tests.Addin +{ + public class RevitAddInsBuilder_ManifestSettings_Tests + { + RevitAddInsBuilder builder; + [SetUp] + public void Setup() + { + builder = BuilderUtils.Build(); + } + + [TestCase("ContextName")] + [TestCase("MyContext")] + public void Build_DataBuilder_ManifestSettings(string contextName) + { + var addIn = builder.AddIn.CreateEntry(); + var manifestSettings = new ManifestSettings + { + UseRevitContext = true, + ContextName = contextName + }; + + builder.DataBuilder.CreateElement(nameof(ManifestSettings), manifestSettings); + + builder.AssertElement(nameof(ManifestSettings.UseRevitContext), "true"); + builder.AssertElement(nameof(ManifestSettings.ContextName), contextName); + + var content = builder.ToString(); + Console.WriteLine(content); + } + + /// + /// ManifestSettings Revit 2026 + /// + /// + /// https://help.autodesk.com/view/RVT/2026/ENU/?guid=Revit_API_Revit_API_Developers_Guide_Introduction_Add_In_Integration_Add_in_Dependency_Isolation_html + /// + public class ManifestSetting : ExtensibleData + { + [XmlElement] + public bool UseRevitContext { get; set; } + [XmlElement] + public string ContextName { get; set; } + } + + [Test] + public void Build_RevitAddIns_DemoClass() + { + var builder = BuilderUtils.Build(); + var content = builder.ToString(); + Assert.AreEqual(DemoAddinBuilder.Expected, content, $"Expected: {DemoAddinBuilder.Expected}\nContent: {content}"); + } + + public class DemoAddinBuilder : RevitAddInsBuilder + { + public static string Expected => """" + + + + RevitAddin + RevitAddin.dll + 11111111-2222-3333-4444-555555555555 + RevitAddin.App + RevitAddin + RevitAddin + + + true + ContextName + + + """"; + public DemoAddinBuilder() + { + AddIn.CreateEntry("Application") + .Name("RevitAddin") + .Assembly("RevitAddin.dll") + .AddInId("11111111-2222-3333-4444-555555555555") + .FullClassName("RevitAddin.App") + .VendorId("RevitAddin") + .VendorDescription("RevitAddin"); + + var manifestSettings = new ManifestSettings + { + UseRevitContext = true, + ContextName = "ContextName" + }; + + DataBuilder.CreateElement(nameof(ManifestSettings), manifestSettings); + } + } + } +} \ No newline at end of file diff --git a/Autodesk.PackageBuilder/Builder/RevitAddInsBuilder.cs b/Autodesk.PackageBuilder/Builder/RevitAddInsBuilder.cs index 0172000..77bec43 100644 --- a/Autodesk.PackageBuilder/Builder/RevitAddInsBuilder.cs +++ b/Autodesk.PackageBuilder/Builder/RevitAddInsBuilder.cs @@ -26,6 +26,11 @@ public class RevitAddInsBuilder : IBuilder /// public IRevitAddInEntryBuilder AddIn => _addInEntryBuilder; + /// + /// Gets the data builder for configuring the entry. + /// + public DataBuilderBase DataBuilder => _revitAddInsEntryBuilder.DataBuilder; + /// /// Initializes a new instance of the class. /// diff --git a/CHANGELOG.md b/CHANGELOG.md index d02fe12..742e6d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [2.0.2] / 2025-10-31 +### Features +- Support `DataBuilder` in `RevitAddInsBuilder`. +### Tests +- Add `RevitAddInsBuilder_ManifestSettings_Tests`. + ## [2.0.1] / 2025-07-15 ### Features - Support `Navisworks` extensible data. @@ -100,6 +106,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - First Release [vNext]: ../../compare/1.0.0...HEAD +[2.0.2]: ../../compare/2.0.1...2.0.2 [2.0.1]: ../../compare/2.0.0...2.0.1 [2.0.0]: ../../compare/1.0.6...1.2.0 [1.0.6]: ../../compare/1.0.5...1.0.6 diff --git a/Directory.Build.props b/Directory.Build.props index bbd074c..2a4b790 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,5 @@ - 2.0.1 + 2.0.2-alpha \ No newline at end of file From d777fc354c0a58bbe77d3b94149b37ccd863db33 Mon Sep 17 00:00:00 2001 From: ricaun Date: Fri, 31 Oct 2025 14:51:14 -0300 Subject: [PATCH 2/8] Fix test typo --- .../Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs b/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs index 1b9459b..ff12a46 100644 --- a/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs +++ b/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs @@ -40,7 +40,7 @@ public void Build_DataBuilder_ManifestSettings(string contextName) /// /// https://help.autodesk.com/view/RVT/2026/ENU/?guid=Revit_API_Revit_API_Developers_Guide_Introduction_Add_In_Integration_Add_in_Dependency_Isolation_html /// - public class ManifestSetting : ExtensibleData + public class ManifestSettings : ExtensibleData { [XmlElement] public bool UseRevitContext { get; set; } From 94b688a0028e7cde3e138e30ceef05684cf5b6f5 Mon Sep 17 00:00:00 2001 From: ricaun Date: Fri, 31 Oct 2025 14:52:40 -0300 Subject: [PATCH 3/8] Update docs --- .../Builder/Abstractions/BuilderBase.cs | 55 ++++++++++++++----- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/Autodesk.PackageBuilder/Builder/Abstractions/BuilderBase.cs b/Autodesk.PackageBuilder/Builder/Abstractions/BuilderBase.cs index 00d7ec0..95fbd3f 100644 --- a/Autodesk.PackageBuilder/Builder/Abstractions/BuilderBase.cs +++ b/Autodesk.PackageBuilder/Builder/Abstractions/BuilderBase.cs @@ -4,38 +4,47 @@ using System.Linq; using System.Runtime.CompilerServices; /// - /// BuilderBase + /// Provides a base class for builders that construct and manipulate data models of type . /// - /// - /// + /// The type of the builder class inheriting from this base class. + /// The type of the data model being built, which must inherit from and have a parameterless constructor. public abstract class BuilderBase where TBuilder : class where TData : ExtensibleData, new() { /// - /// Data + /// Gets or sets the data model being built. /// protected TData Data { get; set; } + /// - /// DataBuilder + /// Gets a instance for manipulating the underlying data model. /// public DataBuilderBase DataBuilder => new(Data); + /// - /// SetNewPropertyValue + /// Sets a new property value on the data model, creating the property if it does not already exist. /// - /// - /// - /// - /// + /// The type of the property to set, which must have a parameterless constructor. + /// The value to set for the property. + /// The name of the property to set. Defaults to the name of the calling member. + /// The current builder instance for method chaining. protected TBuilder SetNewPropertyValue(object value, [CallerMemberName] string propertyName = null) where T : new() { return SetNewPropertyValue(Data, propertyName, value); } + /// + /// Retrieves the value of a property of the specified type from the given instance, creating the property if it does not already exist. + /// + /// The type of the property to retrieve, which must have a parameterless constructor. + /// The object instance from which to retrieve the property value. + /// The value of the property. + /// Thrown if no property of the specified type exists on the instance. internal T GetNewPropertyValue(object instance) where T : new() { var type = instance.GetType(); - var property = type.GetProperties().FirstOrDefault(e=>e.PropertyType == typeof(T)) ?? + var property = type.GetProperties().FirstOrDefault(e => e.PropertyType == typeof(T)) ?? throw new NullReferenceException( $"Property with type '{typeof(T)}' in class {type.Name} not found"); @@ -45,6 +54,14 @@ public abstract class BuilderBase return (T)property.GetValue(instance); } + /// + /// Sets a new property value on the specified instance, creating the property if it does not already exist. + /// + /// The type of the property to set, which must have a parameterless constructor. + /// The object instance on which to set the property value. + /// The name of the property to set. + /// The value to set for the property. + /// The current builder instance for method chaining. private TBuilder SetNewPropertyValue(object instance, string propertyName, object value) where T : new() { var data = GetNewPropertyValue(instance); @@ -52,16 +69,24 @@ public abstract class BuilderBase } /// - /// SetPropertyValue + /// Sets the value of a property on the data model. /// - /// - /// - /// + /// The value to set for the property. + /// The name of the property to set. Defaults to the name of the calling member. + /// The current builder instance for method chaining. protected TBuilder SetPropertyValue(object value, [CallerMemberName] string propertyName = null) { return SetPropertyValue(Data, propertyName, value); } + /// + /// Sets the value of a property on the specified instance. + /// + /// The object instance on which to set the property value. + /// The name of the property to set. + /// The value to set for the property. + /// The current builder instance for method chaining. + /// Thrown if the specified property does not exist on the instance. private TBuilder SetPropertyValue(object instance, string propertyName, object value) { var type = instance.GetType(); From d10d9cb4cedd40ef0163f20d2be8a070abb1f083 Mon Sep 17 00:00:00 2001 From: ricaun Date: Fri, 31 Oct 2025 14:59:49 -0300 Subject: [PATCH 4/8] Remove `net6.0` target framework in tests. --- .../Autodesk.PackageBuilder.Example.csproj | 2 +- .../Autodesk.PackageBuilder.Tests.csproj | 2 +- CHANGELOG.md | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Autodesk.PackageBuilder.Examples/Autodesk.PackageBuilder.Example.csproj b/Autodesk.PackageBuilder.Examples/Autodesk.PackageBuilder.Example.csproj index 56ae28d..ddf0a05 100644 --- a/Autodesk.PackageBuilder.Examples/Autodesk.PackageBuilder.Example.csproj +++ b/Autodesk.PackageBuilder.Examples/Autodesk.PackageBuilder.Example.csproj @@ -2,7 +2,7 @@ Exe - net4.8;net6.0;net8.0 + net4.8;net8.0 false true diff --git a/Autodesk.PackageBuilder.Tests/Autodesk.PackageBuilder.Tests.csproj b/Autodesk.PackageBuilder.Tests/Autodesk.PackageBuilder.Tests.csproj index e3e9840..b97fe06 100644 --- a/Autodesk.PackageBuilder.Tests/Autodesk.PackageBuilder.Tests.csproj +++ b/Autodesk.PackageBuilder.Tests/Autodesk.PackageBuilder.Tests.csproj @@ -1,7 +1,7 @@  - net48;net6.0;net8.0 + net48;net8.0 false latest diff --git a/CHANGELOG.md b/CHANGELOG.md index 742e6d2..df4c2ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [2.0.2] / 2025-10-31 ### Features -- Support `DataBuilder` in `RevitAddInsBuilder`. +- Support `DataBuilder` in `RevitAddInsBuilder`. (Fix: #21) ### Tests - Add `RevitAddInsBuilder_ManifestSettings_Tests`. +- Remove `net6.0` target framework in tests. ## [2.0.1] / 2025-07-15 ### Features From d9e4bc4c406930177426647309eb9f341fcf9e66 Mon Sep 17 00:00:00 2001 From: ricaun Date: Fri, 31 Oct 2025 15:21:21 -0300 Subject: [PATCH 5/8] Add `RevitAddInsBuilderManifestSettingsExtensions` with extension to create `ManifestSettings`. --- ...AddInsBuilderManifestSettingsExtensions.cs | 45 +++++++++++++++++++ ...vitAddInsBuilder_ManifestSettings_Tests.cs | 15 ++++++- CHANGELOG.md | 1 + Directory.Build.props | 2 +- 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilderManifestSettingsExtensions.cs diff --git a/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilderManifestSettingsExtensions.cs b/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilderManifestSettingsExtensions.cs new file mode 100644 index 0000000..51a29c9 --- /dev/null +++ b/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilderManifestSettingsExtensions.cs @@ -0,0 +1,45 @@ +using System.Xml.Serialization; +using Autodesk.PackageBuilder; + +namespace Autodesk.PackageBuilder.Tests.Addin +{ + /// + /// Provides extension methods for the class. + /// + public static class RevitAddInsBuilderManifestSettingsExtensions + { + /// + /// Creates a new instance of and adds it to the builder. + /// + /// The instance to extend. + /// A new instance of . + public static ManifestSettings CreateManifestSettings(this RevitAddInsBuilder builder) + { + var manifestSettings = new ManifestSettings(); + builder.DataBuilder.CreateElement(nameof(ManifestSettings), manifestSettings); + return manifestSettings; + } + + /// + /// Represents the manifest settings for Revit 2026. + /// + /// + /// For more information, see: + /// https://help.autodesk.com/view/RVT/2026/ENU/?guid=Revit_API_Revit_API_Developers_Guide_Introduction_Add_In_Integration_Add_in_Dependency_Isolation_html + /// + public class ManifestSettings + { + /// + /// Gets or sets a value indicating whether to use the Revit context. + /// + [XmlElement] + public bool UseRevitContext { get; set; } + + /// + /// Gets or sets the name of the context. + /// + [XmlElement] + public string ContextName { get; set; } + } + } +} \ No newline at end of file diff --git a/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs b/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs index ff12a46..8c91da0 100644 --- a/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs +++ b/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs @@ -29,9 +29,20 @@ public void Build_DataBuilder_ManifestSettings(string contextName) builder.AssertElement(nameof(ManifestSettings.UseRevitContext), "true"); builder.AssertElement(nameof(ManifestSettings.ContextName), contextName); + } - var content = builder.ToString(); - Console.WriteLine(content); + [TestCase("ContextName")] + [TestCase("MyContext")] + public void Build_CreateManifestSettings(string contextName) + { + var addIn = builder.AddIn.CreateEntry(); + + var manifestSettings = builder.CreateManifestSettings(); + manifestSettings.UseRevitContext = true; + manifestSettings.ContextName = contextName; + + builder.AssertElement(nameof(ManifestSettings.UseRevitContext), "true"); + builder.AssertElement(nameof(ManifestSettings.ContextName), contextName); } /// diff --git a/CHANGELOG.md b/CHANGELOG.md index df4c2ac..15cc8ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Tests - Add `RevitAddInsBuilder_ManifestSettings_Tests`. - Remove `net6.0` target framework in tests. +- Add `RevitAddInsBuilderManifestSettingsExtensions` with extension to create `ManifestSettings`. ## [2.0.1] / 2025-07-15 ### Features diff --git a/Directory.Build.props b/Directory.Build.props index 2a4b790..134e0a6 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,5 @@ - 2.0.2-alpha + 2.0.2-beta \ No newline at end of file From ac918da019f919baa4826b1d85de0857ce858cbc Mon Sep 17 00:00:00 2001 From: ricaun Date: Fri, 31 Oct 2025 15:28:01 -0300 Subject: [PATCH 6/8] Version 2.0.2-rc --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 134e0a6..aa743a7 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,5 @@ - 2.0.2-beta + 2.0.2-rc \ No newline at end of file From 0a756ca7199645a4924c7c8aa4ee00134fcae0d2 Mon Sep 17 00:00:00 2001 From: ricaun Date: Fri, 31 Oct 2025 15:28:10 -0300 Subject: [PATCH 7/8] Version 2.0.2 --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index aa743a7..b9291b3 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,5 @@ - 2.0.2-rc + 2.0.2 \ No newline at end of file From 5a30199225577059ceef08d7436207f23ba725a6 Mon Sep 17 00:00:00 2001 From: ricaun Date: Fri, 31 Oct 2025 15:28:26 -0300 Subject: [PATCH 8/8] Version 2.0.2 --- Directory.Build.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index b9291b3..b44debd 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,5 @@ - - 2.0.2 - + + 2.0.2 + \ No newline at end of file