WallCrossSection Renaming in the Revit 2022.1 API

Breaking news from the Revit development team:

WallCrossSection versus WallCrossSectionDefinition

Last week, we mentioned the unfortunate breaking change inadvertently introduced with the Revit 2022.1 API update
by renaming WallCrossSection to WallCrossSectionDefinition and
suggested a fix for the BuiltInParameterGroup enumeration value.

Here is the workaround suggested by the development team to also address the ForgeTypeId modification to support both versions of the API:

As you know from
the Revit API discussion forum thread
on Revit API 2022.1 update change WallCrossSection to WallCrossSectionDefinition,
there was a breaking change introduced in Revit 2022.1:

  • BuiltInParameterGroup.PG_WALL_CROSS_SECTION
  • ForgeTypeId.WallCrossSection

were renamed to

  • BuiltInParameterGroup.PG_WALL_CROSS_SECTION_DEFINITION
  • ForgeTypeId.WallCrossSectionDefinition

respectively.

A solution for the first name change in the enum value was already suggested in the forum discussion thread:

The actual integer value can be used instead to define a constant like this:


var PG_WALL_CROSS_SECTION = (BuiltInParameterGroup) (-5000228);

This value be used in both Revit 2022.0 and Revit 2022.1 without causing the problem.

A workaround for the second rename, the WallCrossSection property of the ForgeTypeId class, can be implemented using Reflection in all .NET languages.

Here is a sample code snippet in C#:


using System.Reflection;
. . .
ForgeTypeId id = new ForgeTypeId();
Type type = typeof(GroupTypeId);
PropertyInfo propOld = type.GetProperty("WallCrossSection",
BindingFlags.Public | BindingFlags.Static);
PropertyInfo propOld = type.GetProperty("WallCrossSection",
BindingFlags.Public | BindingFlags.Static);
if (null != propOld)
{
id = (ForgeTypeId) propOld.GetValue(null, null);
}
else
{
PropertyInfo propNew = type.GetProperty("WallCrossSectionDefinition",
BindingFlags.Public | BindingFlags.Static);
id = (ForgeTypeId) propNew.GetValue(null, null);
}

Or, if you prefer a more succinct version, use this:


  Type type = typeof(GroupTypeId);
  PropertyInfo prop = type.GetProperty("WallCrossSection", 
    BindingFlags.Public | BindingFlags.Static) 
      ?? type.GetProperty("WallCrossSectionDefinition", 
        BindingFlags.Public | BindingFlags.Static);
  ForgeTypeId id = (ForgeTypeId) prop.GetValue(null, null);

We tested it here, and it works for both Revit 2022.0 and Revit 2022.1.

Non-breaking change

Non-breaking change – © Datamation


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading