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