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/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 new file mode 100644 index 0000000..8c91da0 --- /dev/null +++ b/Autodesk.PackageBuilder.Tests/Addin/RevitAddInsBuilder_ManifestSettings_Tests.cs @@ -0,0 +1,109 @@ +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); + } + + [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); + } + + /// + /// 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 ManifestSettings : 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.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/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(); 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..15cc8ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ 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`. (Fix: #21) +### 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 - Support `Navisworks` extensible data. @@ -100,6 +108,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..b44debd 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,5 @@ - - 2.0.1 - + + 2.0.2 + \ No newline at end of file