<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Dynamo Script Compatibility Issue for Wall Penetrations in Revit API Forum</title>
    <link>https://forums.autodesk.com/t5/revit-api-forum/dynamo-script-compatibility-issue-for-wall-penetrations/m-p/13262588#M1437</link>
    <description>&lt;P&gt;Question 2: family type dendencies:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;
&lt;DIV id="model-response-message-contentr_a4907cc5af839bf9" class="markdown markdown-main-panel stronger" dir="ltr"&gt;
&lt;P data-sourcepos="1:1-1:329"&gt;You're hitting on a crucial aspect of Dynamo scripting, especially when dealing with families: managing family type dependencies. When a Dynamo script relies on specific family types, it can easily break if those types are not available in the project or if their names or parameters change. Here's a breakdown of best practices:&lt;/P&gt;
&lt;P data-sourcepos="3:1-3:30"&gt;&lt;STRONG&gt;Understanding the Problem:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="5:1-5:184"&gt;Dynamo scripts often use nodes like "Family Types," "Family Instance.ByFamilyType," or nodes from custom packages that directly interact with family types. If the required family type:&lt;/P&gt;
&lt;UL data-sourcepos="7:1-10:0"&gt;
&lt;LI data-sourcepos="7:1-7:44"&gt;&lt;STRONG&gt;Doesn't exist:&lt;/STRONG&gt; The script will fail.&lt;/LI&gt;
&lt;LI data-sourcepos="8:1-8:51"&gt;&lt;STRONG&gt;Has a different name:&lt;/STRONG&gt; The script will fail.&lt;/LI&gt;
&lt;LI data-sourcepos="9:1-10:0"&gt;&lt;STRONG&gt;Has different parameters:&lt;/STRONG&gt; The script might run but produce incorrect results or errors.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-sourcepos="11:1-11:57"&gt;&lt;STRONG&gt;Best Practices for Handling Family Type Dependencies:&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL data-sourcepos="13:1-103:0"&gt;
&lt;LI data-sourcepos="13:1-21:0"&gt;
&lt;P data-sourcepos="13:5-13:37"&gt;&lt;STRONG&gt;Input Family Types as Inputs:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="15:5-15:214"&gt;The most fundamental practice is to make the family type an &lt;EM&gt;input&lt;/EM&gt; to your Dynamo script. This allows the user to select the appropriate family type each time they run the script, making it much more flexible.&lt;/P&gt;
&lt;UL data-sourcepos="17:5-19:0"&gt;
&lt;LI data-sourcepos="17:5-17:70"&gt;Use the "Select Model Elements" or "Select Family Types" node.&lt;/LI&gt;
&lt;LI data-sourcepos="18:5-19:0"&gt;This removes the hardcoded dependency on a specific family type name within the script.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-sourcepos="20:5-20:197"&gt;&lt;STRONG&gt;Example:&lt;/STRONG&gt; Instead of having a "Family Types" node that directly selects "M_Generic Model," use a "Select Family Types" node and connect its output to the "Family Instance.ByFamilyType" node.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="22:1-46:0"&gt;
&lt;P data-sourcepos="22:5-22:40"&gt;&lt;STRONG&gt;Check for Family Type Existence:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="24:5-24:124"&gt;Before attempting to create instances of a family type, check if it exists in the project. This prevents runtime errors.&lt;/P&gt;
&lt;UL data-sourcepos="26:5-27:0"&gt;
&lt;LI data-sourcepos="26:5-27:0"&gt;Use a Python script to check if the &lt;CODE&gt;doc.GetElement(familyTypeId)&lt;/CODE&gt; returns a valid element.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-sourcepos="28:5-28:39"&gt;&lt;STRONG&gt;Example (Python within Dynamo):&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class="code-block ng-tns-c1396053791-47 ng-trigger ng-trigger-codeBlockRevealAnimation"&gt;
&lt;DIV class="code-block-decoration ng-tns-c1396053791-47 header-formatted gds-title-s ng-star-inserted"&gt;&lt;SPAN class="ng-tns-c1396053791-47"&gt;Python&lt;/SPAN&gt;
&lt;DIV class="buttons ng-tns-c1396053791-47 ng-star-inserted"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="ng-tns-c1396053791-47 formatted-code-block-internal-container"&gt;
&lt;DIV class="animated-opacity ng-tns-c1396053791-47"&gt;
&lt;PRE class="ng-tns-c1396053791-47"&gt;&lt;CODE class="code-container ng-tns-c1396053791-47 formatted" role="text" data-test-id="code-content" data-sourcepos="30:5-45:38"&gt;&lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; clr

clr.AddReference(&lt;SPAN class="hljs-string"&gt;'RevitAPI'&lt;/SPAN&gt;)
&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; Autodesk.Revit.DB &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; *

doc = __revit__.ActiveUIDocument.Document
family_type_id = UnwrapElement(IN[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;]).Id &lt;SPAN class="hljs-comment"&gt;# Input from "Select Family Types" node&lt;/SPAN&gt;

family_type = doc.GetElement(family_type_id)

&lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; family_type:
    OUT = family_type
&lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt;:
    OUT = &lt;SPAN class="hljs-string"&gt;"Family type not found."&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="47:1-89:0"&gt;
&lt;P data-sourcepos="47:5-47:76"&gt;&lt;STRONG&gt;Use Family Name and Type Name for Robust Selection (with Fallbacks):&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="49:5-49:219"&gt;If you need to automate the selection of a family type (without user input), use both the family name and the type name to find it. This is more robust than relying on just the type name, as type names might change.&lt;/P&gt;
&lt;P data-sourcepos="51:5-51:39"&gt;&lt;STRONG&gt;Example (Python within Dynamo):&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class="code-block ng-tns-c1396053791-48 ng-trigger ng-trigger-codeBlockRevealAnimation"&gt;
&lt;DIV class="code-block-decoration ng-tns-c1396053791-48 header-formatted gds-title-s ng-star-inserted"&gt;&lt;SPAN class="ng-tns-c1396053791-48"&gt;Python&lt;/SPAN&gt;
&lt;DIV class="buttons ng-tns-c1396053791-48 ng-star-inserted"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="ng-tns-c1396053791-48 formatted-code-block-internal-container"&gt;
&lt;DIV class="animated-opacity ng-tns-c1396053791-48"&gt;
&lt;PRE class="ng-tns-c1396053791-48"&gt;&lt;CODE class="code-container ng-tns-c1396053791-48 formatted" role="text" data-test-id="code-content" data-sourcepos="53:5-88:46"&gt;&lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; clr

clr.AddReference(&lt;SPAN class="hljs-string"&gt;'RevitAPI'&lt;/SPAN&gt;)
&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; Autodesk.Revit.DB &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; *

doc = __revit__.ActiveUIDocument.Document
family_name = IN[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;]  &lt;SPAN class="hljs-comment"&gt;# Input: Family name (string)&lt;/SPAN&gt;
type_name = IN[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;]    &lt;SPAN class="hljs-comment"&gt;# Input: Type name (string)&lt;/SPAN&gt;

collector = FilteredElementCollector(doc)
collector.OfClass(FamilySymbol)

found_type = &lt;SPAN class="hljs-literal"&gt;None&lt;/SPAN&gt;
&lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; fs &lt;SPAN class="hljs-keyword"&gt;in&lt;/SPAN&gt; collector:
    family = doc.GetElement(fs.Family.Id)
    &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; family.Name == family_name &lt;SPAN class="hljs-keyword"&gt;and&lt;/SPAN&gt; fs.Name == type_name:
        found_type = fs
        &lt;SPAN class="hljs-keyword"&gt;break&lt;/SPAN&gt;

&lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; found_type:
    OUT = found_type
&lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt;:
    &lt;SPAN class="hljs-comment"&gt;#Fallback if type is not found&lt;/SPAN&gt;
    collector.WhereElementIsElementType()
    collector.OfClass(FamilySymbol)
    &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; fs &lt;SPAN class="hljs-keyword"&gt;in&lt;/SPAN&gt; collector:
        family = doc.GetElement(fs.Family.Id)
        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; family.Name == family_name:
            found_type = fs
            &lt;SPAN class="hljs-keyword"&gt;break&lt;/SPAN&gt;
    &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; found_type:
        OUT = &lt;SPAN class="hljs-string"&gt;"Type not found, but family found, using first type: "&lt;/SPAN&gt; + found_type.Name
    &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt;:
        OUT = &lt;SPAN class="hljs-string"&gt;"Family and Type not found."&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="90:1-95:0"&gt;
&lt;P data-sourcepos="90:5-90:26"&gt;&lt;STRONG&gt;Parameter Mapping:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="92:5-92:217"&gt;If your script relies on specific parameters within the family type, map these parameters by name rather than index. This ensures that your script still works even if the order of parameters in the family changes.&lt;/P&gt;
&lt;UL data-sourcepos="94:5-95:0"&gt;
&lt;LI data-sourcepos="94:5-95:0"&gt;Use &lt;CODE&gt;LookupParameter()&lt;/CODE&gt; to get parameters by name.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="96:1-99:0"&gt;
&lt;P data-sourcepos="96:5-96:25"&gt;&lt;STRONG&gt;Family Templates:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="98:5-98:189"&gt;Consider using family templates to create the required families in the project before running the Dynamo script. This ensures that the necessary families and types are always available.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="100:1-103:0"&gt;
&lt;P data-sourcepos="100:5-100:46"&gt;&lt;STRONG&gt;Dynamo Packages for Family Management:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="102:5-102:230"&gt;Some Dynamo packages offer nodes specifically designed for family management, such as creating, loading, and modifying families. These can simplify some tasks but be careful about version dependency of the packages themselves.&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-sourcepos="104:1-104:41"&gt;&lt;STRONG&gt;Example Scenario (Wall Penetrations):&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="106:1-106:70"&gt;Imagine your script creates penetrations using a generic model family.&lt;/P&gt;
&lt;UL data-sourcepos="108:1-111:0"&gt;
&lt;LI data-sourcepos="108:1-108:95"&gt;&lt;STRONG&gt;Bad Practice:&lt;/STRONG&gt; Hardcoding the family type name "M_Generic Model" directly in the script.&lt;/LI&gt;
&lt;LI data-sourcepos="109:1-109:104"&gt;&lt;STRONG&gt;Good Practice:&lt;/STRONG&gt; Using a "Select Family Types" node to let the user choose the penetration family.&lt;/LI&gt;
&lt;LI data-sourcepos="110:1-111:0"&gt;&lt;STRONG&gt;Better Practice:&lt;/STRONG&gt; Using the Python script to check for family type existence and providing a fallback if the type is not found, or using the family name and type name to find the type.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-sourcepos="112:1-112:25"&gt;&lt;STRONG&gt;Combining Techniques:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="114:1-114:55"&gt;For the most robust solution, combine these techniques:&lt;/P&gt;
&lt;OL data-sourcepos="116:1-119:0"&gt;
&lt;LI data-sourcepos="116:1-116:51"&gt;Use "Select Family Types" as the primary input.&lt;/LI&gt;
&lt;LI data-sourcepos="117:1-117:100"&gt;Use the Python script to validate the selected family type and provide feedback if it's invalid.&lt;/LI&gt;
&lt;LI data-sourcepos="118:1-119:0"&gt;Implement parameter mapping to access family parameters by name.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-sourcepos="120:1-120:189"&gt;By following these best practices, you can create Dynamo scripts that are much more resilient to changes in Revit projects and family libraries, making them more reliable and easier to use.&lt;/P&gt;
&lt;P data-sourcepos="120:1-120:189"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;
&lt;/DIV&gt;</description>
    <pubDate>Wed, 15 Jan 2025 16:41:19 GMT</pubDate>
    <dc:creator>jeremy_tammik</dc:creator>
    <dc:date>2025-01-15T16:41:19Z</dc:date>
    <item>
      <title>Dynamo Script Compatibility Issue for Wall Penetrations</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/dynamo-script-compatibility-issue-for-wall-penetrations/m-p/13262124#M1435</link>
      <description>&lt;P&gt;Our team has found a Dynamo script to automate the creation of wall penetrations for MEP services in Revit. The script works effectively in Revit 2021 but fails to function in other Revit versions.&lt;/P&gt;&lt;P&gt;Could anyone provide insights on:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;How to ensure Dynamo scripts are version-independent?&lt;/LI&gt;&lt;LI&gt;Best practices for handling family type dependencies in Dynamo?&lt;/LI&gt;&lt;LI&gt;Any specific nodes or workarounds we should consider for broader compatibility?&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;We’d appreciate any advice, suggestions, or similar experiences from the community.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 15 Jan 2025 13:21:12 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/dynamo-script-compatibility-issue-for-wall-penetrations/m-p/13262124#M1435</guid>
      <dc:creator>nikhilvenugopal11</dc:creator>
      <dc:date>2025-01-15T13:21:12Z</dc:date>
    </item>
    <item>
      <title>Re: Dynamo Script Compatibility Issue for Wall Penetrations</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/dynamo-script-compatibility-issue-for-wall-penetrations/m-p/13262582#M1436</link>
      <description>&lt;P&gt;Question 1: version independency:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV id="model-response-message-contentr_6b975880b8927197" class="markdown markdown-main-panel stronger" dir="ltr"&gt;
&lt;P data-sourcepos="1:1-1:215"&gt;You're facing a common challenge with Dynamo scripts and Revit version compatibility. Dynamo scripts can be sensitive to API changes between Revit versions. Here's a breakdown of how to improve version independence:&lt;/P&gt;
&lt;P data-sourcepos="3:1-3:30"&gt;&lt;STRONG&gt;Understanding the Problem:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="5:1-5:355"&gt;Dynamo relies on Revit API nodes. These nodes are wrappers around Revit API functions. When the Revit API changes (e.g., methods are renamed, parameters are added/removed, classes are restructured), the corresponding Dynamo nodes can break or behave unexpectedly. This is the primary reason why a script working in Revit 2021 might fail in other versions.&lt;/P&gt;
&lt;P data-sourcepos="7:1-7:54"&gt;&lt;STRONG&gt;Strategies for Version-Independent Dynamo Scripts:&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL data-sourcepos="9:1-104:0"&gt;
&lt;LI data-sourcepos="9:1-12:0"&gt;
&lt;P data-sourcepos="9:5-9:48"&gt;&lt;STRONG&gt;Use Core Dynamo Nodes Whenever Possible:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="11:5-11:225"&gt;Prefer built-in Dynamo nodes (from the core libraries like &lt;CODE&gt;Core&lt;/CODE&gt;, &lt;CODE&gt;BuiltIn&lt;/CODE&gt;, &lt;CODE&gt;Geometry&lt;/CODE&gt;) over custom nodes or packages whenever feasible. Core nodes are more likely to be updated for compatibility across Dynamo versions.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="13:1-16:0"&gt;
&lt;P data-sourcepos="13:5-13:36"&gt;&lt;STRONG&gt;Minimize API-Specific Nodes:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="15:5-15:318"&gt;Avoid using nodes that directly expose Revit API elements or methods unless absolutely necessary. These are the most likely to break between Revit versions. For example, avoid nodes that directly create &lt;CODE&gt;Wall&lt;/CODE&gt; objects using specific constructors if there are higher-level Dynamo nodes that achieve the same result.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="17:1-96:0"&gt;
&lt;P data-sourcepos="17:5-17:51"&gt;&lt;STRONG&gt;Use Python Scripting with Version Checking:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="19:5-19:117"&gt;This is the most robust approach. Embed Python scripts within your Dynamo graph to handle version-specific logic.&lt;/P&gt;
&lt;UL data-sourcepos="21:5-24:0"&gt;
&lt;LI data-sourcepos="21:5-22:0"&gt;
&lt;P data-sourcepos="21:9-21:141"&gt;&lt;STRONG&gt;Get Revit Version:&lt;/STRONG&gt; Use the &lt;CODE&gt;__revit__.Application.VersionName&lt;/CODE&gt; property within your Python script to determine the Revit version.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="23:5-24:0"&gt;
&lt;P data-sourcepos="23:9-23:206"&gt;&lt;STRONG&gt;Conditional Logic:&lt;/STRONG&gt; Use &lt;CODE&gt;if/elif/else&lt;/CODE&gt; statements in your Python script to execute different code blocks based on the Revit version. This allows you to use appropriate API calls for each version.&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-sourcepos="25:5-25:39"&gt;&lt;STRONG&gt;Example (Python within Dynamo):&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class="code-block ng-tns-c1396053791-38 ng-trigger ng-trigger-codeBlockRevealAnimation"&gt;
&lt;DIV class="code-block-decoration ng-tns-c1396053791-38 header-formatted gds-title-s ng-star-inserted"&gt;&lt;SPAN class="ng-tns-c1396053791-38"&gt;Python&lt;/SPAN&gt;
&lt;DIV class="buttons ng-tns-c1396053791-38 ng-star-inserted"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="ng-tns-c1396053791-38 formatted-code-block-internal-container"&gt;
&lt;DIV class="animated-opacity ng-tns-c1396053791-38"&gt;
&lt;PRE class="ng-tns-c1396053791-38"&gt;&lt;CODE class="code-container ng-tns-c1396053791-38 formatted" role="text" data-test-id="code-content" data-sourcepos="27:5-86:18"&gt;&lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; clr

&lt;SPAN class="hljs-comment"&gt;# Import Revit API classes&lt;/SPAN&gt;
clr.AddReference(&lt;SPAN class="hljs-string"&gt;'RevitAPI'&lt;/SPAN&gt;)
&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; Autodesk.Revit.DB &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; *

&lt;SPAN class="hljs-comment"&gt;# Get Revit version&lt;/SPAN&gt;
revit_version = __revit__.Application.VersionName

&lt;SPAN class="hljs-comment"&gt;# Input elements (e.g., walls, ducts)&lt;/SPAN&gt;
elements = IN[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;]
&lt;SPAN class="hljs-comment"&gt;#Input family symbol&lt;/SPAN&gt;
familySymbol = UnwrapElement(IN[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;])

&lt;SPAN class="hljs-comment"&gt;# Output list&lt;/SPAN&gt;
out_list = []

&lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; revit_version == &lt;SPAN class="hljs-string"&gt;"2021"&lt;/SPAN&gt;:
    &lt;SPAN class="hljs-comment"&gt;# Revit 2021 specific code (e.g., using specific API calls)&lt;/SPAN&gt;
    &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; element &lt;SPAN class="hljs-keyword"&gt;in&lt;/SPAN&gt; elements:
        &lt;SPAN class="hljs-keyword"&gt;try&lt;/SPAN&gt;:
            &lt;SPAN class="hljs-comment"&gt;#Example: Create opening by face (adapt to your penetration logic)&lt;/SPAN&gt;
            host = UnwrapElement(element)
            face = HostObjectUtils.GetSideFaces(host, ShellLayerType.Exterior).First()
            opening = doc.Create.NewOpening(host, face, XYZ.Zero, XYZ.BasisX, XYZ.BasisY)
            out_list.append(opening)
        &lt;SPAN class="hljs-keyword"&gt;except&lt;/SPAN&gt;:
            out_list.append(&lt;SPAN class="hljs-string"&gt;"Opening creation failed on this element"&lt;/SPAN&gt;)

&lt;SPAN class="hljs-keyword"&gt;elif&lt;/SPAN&gt; revit_version == &lt;SPAN class="hljs-string"&gt;"2022"&lt;/SPAN&gt;:
    &lt;SPAN class="hljs-comment"&gt;# Revit 2022 specific code (if different API calls are required)&lt;/SPAN&gt;
    &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; element &lt;SPAN class="hljs-keyword"&gt;in&lt;/SPAN&gt; elements:
        &lt;SPAN class="hljs-keyword"&gt;try&lt;/SPAN&gt;:
            &lt;SPAN class="hljs-comment"&gt;#Example: Create opening by face (adapt to your penetration logic)&lt;/SPAN&gt;
            host = UnwrapElement(element)
            face = HostObjectUtils.GetSideFaces(host, ShellLayerType.Exterior).First()
            opening = doc.Create.NewOpening(host, face, XYZ.Zero, XYZ.BasisX, XYZ.BasisY)
            out_list.append(opening)
        &lt;SPAN class="hljs-keyword"&gt;except&lt;/SPAN&gt;:
            out_list.append(&lt;SPAN class="hljs-string"&gt;"Opening creation failed on this element"&lt;/SPAN&gt;)

&lt;SPAN class="hljs-keyword"&gt;elif&lt;/SPAN&gt; revit_version == &lt;SPAN class="hljs-string"&gt;"2023"&lt;/SPAN&gt;:
    &lt;SPAN class="hljs-comment"&gt;# Revit 2023 specific code (if different API calls are required)&lt;/SPAN&gt;
    &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; element &lt;SPAN class="hljs-keyword"&gt;in&lt;/SPAN&gt; elements:
        &lt;SPAN class="hljs-keyword"&gt;try&lt;/SPAN&gt;:
            &lt;SPAN class="hljs-comment"&gt;#Example: Create opening by face (adapt to your penetration logic)&lt;/SPAN&gt;
            host = UnwrapElement(element)
            face = HostObjectUtils.GetSideFaces(host, ShellLayerType.Exterior).First()
            opening = doc.Create.NewOpening(host, face, XYZ.Zero, XYZ.BasisX, XYZ.BasisY)
            out_list.append(opening)
        &lt;SPAN class="hljs-keyword"&gt;except&lt;/SPAN&gt;:
            out_list.append(&lt;SPAN class="hljs-string"&gt;"Opening creation failed on this element"&lt;/SPAN&gt;)

&lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt;:
    &lt;SPAN class="hljs-comment"&gt;# Code for other versions or a default fallback&lt;/SPAN&gt;
    out_list.append(&lt;SPAN class="hljs-string"&gt;"Script not compatible with this Revit version."&lt;/SPAN&gt;)

OUT = out_list
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P data-sourcepos="88:5-88:25"&gt;&lt;STRONG&gt;Key Improvements:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-sourcepos="90:5-96:0"&gt;
&lt;LI data-sourcepos="90:5-90:65"&gt;&lt;STRONG&gt;Version Detection:&lt;/STRONG&gt; Explicitly gets the Revit version.&lt;/LI&gt;
&lt;LI data-sourcepos="91:5-92:168"&gt;&lt;STRONG&gt;Conditional Execution:&lt;/STRONG&gt; Uses &lt;CODE&gt;if/elif/else&lt;/CODE&gt; to execute version-specific code.
&lt;UL data-sourcepos="92:9-92:168"&gt;
&lt;LI data-sourcepos="92:9-92:168"&gt;&lt;STRONG&gt;Example for creating openings:&lt;/STRONG&gt; This example uses &lt;CODE&gt;HostObjectUtils.GetSideFaces&lt;/CODE&gt; and &lt;CODE&gt;doc.Create.NewOpening&lt;/CODE&gt; which are available in Revit 2021 and later.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="93:5-93:114"&gt;&lt;STRONG&gt;Error Handling:&lt;/STRONG&gt; Includes &lt;CODE&gt;try/except&lt;/CODE&gt; blocks to catch potential errors and provide informative output.&lt;/LI&gt;
&lt;LI data-sourcepos="94:5-94:96"&gt;&lt;STRONG&gt;Clearer Structure:&lt;/STRONG&gt; The code is organized for better readability and maintainability.&lt;/LI&gt;
&lt;LI data-sourcepos="95:5-96:0"&gt;&lt;STRONG&gt;Unwrapping Elements:&lt;/STRONG&gt; Correctly unwraps Dynamo elements to Revit API elements using &lt;CODE&gt;UnwrapElement()&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="97:1-100:0"&gt;
&lt;P data-sourcepos="97:5-97:27"&gt;&lt;STRONG&gt;Package Management:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="99:5-99:150"&gt;If you must use custom packages, keep them up-to-date. Package developers often release updates to maintain compatibility with new Revit versions.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="101:1-104:0"&gt;
&lt;P data-sourcepos="101:5-101:16"&gt;&lt;STRONG&gt;Testing:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="103:5-103:149"&gt;Thoroughly test your Dynamo scripts in all Revit versions you intend to support. This is crucial for identifying and fixing compatibility issues.&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-sourcepos="105:1-105:41"&gt;&lt;STRONG&gt;Example Scenario (Wall Penetrations):&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="107:1-107:364"&gt;Let's say the way you create wall penetrations changed slightly between Revit 2021 and 2022. In 2021 you were using a specific method that was deprecated in 2022. By using the Python scripting approach, you can have one code block that uses the 2021 method when running in Revit 2021 and another code block that uses the new 2022 method when running in Revit 2022.&lt;/P&gt;
&lt;P data-sourcepos="109:1-109:29"&gt;&lt;STRONG&gt;Important Considerations:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-sourcepos="111:1-113:0"&gt;
&lt;LI data-sourcepos="111:1-111:175"&gt;&lt;STRONG&gt;API Changes Documentation:&lt;/STRONG&gt; Refer to the "What's New" sections in the Revit API documentation for each version to understand the changes that might affect your scripts.&lt;/LI&gt;
&lt;LI data-sourcepos="112:1-113:0"&gt;&lt;STRONG&gt;Backward Compatibility:&lt;/STRONG&gt; While striving for forward compatibility is important, sometimes backward compatibility (making a script work in older versions) might be very difficult or impossible due to significant API changes.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-sourcepos="114:1-114:350"&gt;By implementing these strategies, you can significantly improve the version independence of your Dynamo scripts and reduce the maintenance effort required when upgrading Revit. The Python scripting approach with version checking is the most effective way to handle API differences and ensure your scripts work reliably across multiple Revit versions.&lt;/P&gt;
&lt;P data-sourcepos="114:1-114:350"&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;/DIV&gt;</description>
      <pubDate>Wed, 15 Jan 2025 16:39:57 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/dynamo-script-compatibility-issue-for-wall-penetrations/m-p/13262582#M1436</guid>
      <dc:creator>jeremy_tammik</dc:creator>
      <dc:date>2025-01-15T16:39:57Z</dc:date>
    </item>
    <item>
      <title>Re: Dynamo Script Compatibility Issue for Wall Penetrations</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/dynamo-script-compatibility-issue-for-wall-penetrations/m-p/13262588#M1437</link>
      <description>&lt;P&gt;Question 2: family type dendencies:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;
&lt;DIV id="model-response-message-contentr_a4907cc5af839bf9" class="markdown markdown-main-panel stronger" dir="ltr"&gt;
&lt;P data-sourcepos="1:1-1:329"&gt;You're hitting on a crucial aspect of Dynamo scripting, especially when dealing with families: managing family type dependencies. When a Dynamo script relies on specific family types, it can easily break if those types are not available in the project or if their names or parameters change. Here's a breakdown of best practices:&lt;/P&gt;
&lt;P data-sourcepos="3:1-3:30"&gt;&lt;STRONG&gt;Understanding the Problem:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="5:1-5:184"&gt;Dynamo scripts often use nodes like "Family Types," "Family Instance.ByFamilyType," or nodes from custom packages that directly interact with family types. If the required family type:&lt;/P&gt;
&lt;UL data-sourcepos="7:1-10:0"&gt;
&lt;LI data-sourcepos="7:1-7:44"&gt;&lt;STRONG&gt;Doesn't exist:&lt;/STRONG&gt; The script will fail.&lt;/LI&gt;
&lt;LI data-sourcepos="8:1-8:51"&gt;&lt;STRONG&gt;Has a different name:&lt;/STRONG&gt; The script will fail.&lt;/LI&gt;
&lt;LI data-sourcepos="9:1-10:0"&gt;&lt;STRONG&gt;Has different parameters:&lt;/STRONG&gt; The script might run but produce incorrect results or errors.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-sourcepos="11:1-11:57"&gt;&lt;STRONG&gt;Best Practices for Handling Family Type Dependencies:&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL data-sourcepos="13:1-103:0"&gt;
&lt;LI data-sourcepos="13:1-21:0"&gt;
&lt;P data-sourcepos="13:5-13:37"&gt;&lt;STRONG&gt;Input Family Types as Inputs:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="15:5-15:214"&gt;The most fundamental practice is to make the family type an &lt;EM&gt;input&lt;/EM&gt; to your Dynamo script. This allows the user to select the appropriate family type each time they run the script, making it much more flexible.&lt;/P&gt;
&lt;UL data-sourcepos="17:5-19:0"&gt;
&lt;LI data-sourcepos="17:5-17:70"&gt;Use the "Select Model Elements" or "Select Family Types" node.&lt;/LI&gt;
&lt;LI data-sourcepos="18:5-19:0"&gt;This removes the hardcoded dependency on a specific family type name within the script.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-sourcepos="20:5-20:197"&gt;&lt;STRONG&gt;Example:&lt;/STRONG&gt; Instead of having a "Family Types" node that directly selects "M_Generic Model," use a "Select Family Types" node and connect its output to the "Family Instance.ByFamilyType" node.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="22:1-46:0"&gt;
&lt;P data-sourcepos="22:5-22:40"&gt;&lt;STRONG&gt;Check for Family Type Existence:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="24:5-24:124"&gt;Before attempting to create instances of a family type, check if it exists in the project. This prevents runtime errors.&lt;/P&gt;
&lt;UL data-sourcepos="26:5-27:0"&gt;
&lt;LI data-sourcepos="26:5-27:0"&gt;Use a Python script to check if the &lt;CODE&gt;doc.GetElement(familyTypeId)&lt;/CODE&gt; returns a valid element.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-sourcepos="28:5-28:39"&gt;&lt;STRONG&gt;Example (Python within Dynamo):&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class="code-block ng-tns-c1396053791-47 ng-trigger ng-trigger-codeBlockRevealAnimation"&gt;
&lt;DIV class="code-block-decoration ng-tns-c1396053791-47 header-formatted gds-title-s ng-star-inserted"&gt;&lt;SPAN class="ng-tns-c1396053791-47"&gt;Python&lt;/SPAN&gt;
&lt;DIV class="buttons ng-tns-c1396053791-47 ng-star-inserted"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="ng-tns-c1396053791-47 formatted-code-block-internal-container"&gt;
&lt;DIV class="animated-opacity ng-tns-c1396053791-47"&gt;
&lt;PRE class="ng-tns-c1396053791-47"&gt;&lt;CODE class="code-container ng-tns-c1396053791-47 formatted" role="text" data-test-id="code-content" data-sourcepos="30:5-45:38"&gt;&lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; clr

clr.AddReference(&lt;SPAN class="hljs-string"&gt;'RevitAPI'&lt;/SPAN&gt;)
&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; Autodesk.Revit.DB &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; *

doc = __revit__.ActiveUIDocument.Document
family_type_id = UnwrapElement(IN[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;]).Id &lt;SPAN class="hljs-comment"&gt;# Input from "Select Family Types" node&lt;/SPAN&gt;

family_type = doc.GetElement(family_type_id)

&lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; family_type:
    OUT = family_type
&lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt;:
    OUT = &lt;SPAN class="hljs-string"&gt;"Family type not found."&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="47:1-89:0"&gt;
&lt;P data-sourcepos="47:5-47:76"&gt;&lt;STRONG&gt;Use Family Name and Type Name for Robust Selection (with Fallbacks):&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="49:5-49:219"&gt;If you need to automate the selection of a family type (without user input), use both the family name and the type name to find it. This is more robust than relying on just the type name, as type names might change.&lt;/P&gt;
&lt;P data-sourcepos="51:5-51:39"&gt;&lt;STRONG&gt;Example (Python within Dynamo):&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class="code-block ng-tns-c1396053791-48 ng-trigger ng-trigger-codeBlockRevealAnimation"&gt;
&lt;DIV class="code-block-decoration ng-tns-c1396053791-48 header-formatted gds-title-s ng-star-inserted"&gt;&lt;SPAN class="ng-tns-c1396053791-48"&gt;Python&lt;/SPAN&gt;
&lt;DIV class="buttons ng-tns-c1396053791-48 ng-star-inserted"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="ng-tns-c1396053791-48 formatted-code-block-internal-container"&gt;
&lt;DIV class="animated-opacity ng-tns-c1396053791-48"&gt;
&lt;PRE class="ng-tns-c1396053791-48"&gt;&lt;CODE class="code-container ng-tns-c1396053791-48 formatted" role="text" data-test-id="code-content" data-sourcepos="53:5-88:46"&gt;&lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; clr

clr.AddReference(&lt;SPAN class="hljs-string"&gt;'RevitAPI'&lt;/SPAN&gt;)
&lt;SPAN class="hljs-keyword"&gt;from&lt;/SPAN&gt; Autodesk.Revit.DB &lt;SPAN class="hljs-keyword"&gt;import&lt;/SPAN&gt; *

doc = __revit__.ActiveUIDocument.Document
family_name = IN[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;]  &lt;SPAN class="hljs-comment"&gt;# Input: Family name (string)&lt;/SPAN&gt;
type_name = IN[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;]    &lt;SPAN class="hljs-comment"&gt;# Input: Type name (string)&lt;/SPAN&gt;

collector = FilteredElementCollector(doc)
collector.OfClass(FamilySymbol)

found_type = &lt;SPAN class="hljs-literal"&gt;None&lt;/SPAN&gt;
&lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; fs &lt;SPAN class="hljs-keyword"&gt;in&lt;/SPAN&gt; collector:
    family = doc.GetElement(fs.Family.Id)
    &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; family.Name == family_name &lt;SPAN class="hljs-keyword"&gt;and&lt;/SPAN&gt; fs.Name == type_name:
        found_type = fs
        &lt;SPAN class="hljs-keyword"&gt;break&lt;/SPAN&gt;

&lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; found_type:
    OUT = found_type
&lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt;:
    &lt;SPAN class="hljs-comment"&gt;#Fallback if type is not found&lt;/SPAN&gt;
    collector.WhereElementIsElementType()
    collector.OfClass(FamilySymbol)
    &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; fs &lt;SPAN class="hljs-keyword"&gt;in&lt;/SPAN&gt; collector:
        family = doc.GetElement(fs.Family.Id)
        &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; family.Name == family_name:
            found_type = fs
            &lt;SPAN class="hljs-keyword"&gt;break&lt;/SPAN&gt;
    &lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; found_type:
        OUT = &lt;SPAN class="hljs-string"&gt;"Type not found, but family found, using first type: "&lt;/SPAN&gt; + found_type.Name
    &lt;SPAN class="hljs-keyword"&gt;else&lt;/SPAN&gt;:
        OUT = &lt;SPAN class="hljs-string"&gt;"Family and Type not found."&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="90:1-95:0"&gt;
&lt;P data-sourcepos="90:5-90:26"&gt;&lt;STRONG&gt;Parameter Mapping:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="92:5-92:217"&gt;If your script relies on specific parameters within the family type, map these parameters by name rather than index. This ensures that your script still works even if the order of parameters in the family changes.&lt;/P&gt;
&lt;UL data-sourcepos="94:5-95:0"&gt;
&lt;LI data-sourcepos="94:5-95:0"&gt;Use &lt;CODE&gt;LookupParameter()&lt;/CODE&gt; to get parameters by name.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="96:1-99:0"&gt;
&lt;P data-sourcepos="96:5-96:25"&gt;&lt;STRONG&gt;Family Templates:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="98:5-98:189"&gt;Consider using family templates to create the required families in the project before running the Dynamo script. This ensures that the necessary families and types are always available.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI data-sourcepos="100:1-103:0"&gt;
&lt;P data-sourcepos="100:5-100:46"&gt;&lt;STRONG&gt;Dynamo Packages for Family Management:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="102:5-102:230"&gt;Some Dynamo packages offer nodes specifically designed for family management, such as creating, loading, and modifying families. These can simplify some tasks but be careful about version dependency of the packages themselves.&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-sourcepos="104:1-104:41"&gt;&lt;STRONG&gt;Example Scenario (Wall Penetrations):&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="106:1-106:70"&gt;Imagine your script creates penetrations using a generic model family.&lt;/P&gt;
&lt;UL data-sourcepos="108:1-111:0"&gt;
&lt;LI data-sourcepos="108:1-108:95"&gt;&lt;STRONG&gt;Bad Practice:&lt;/STRONG&gt; Hardcoding the family type name "M_Generic Model" directly in the script.&lt;/LI&gt;
&lt;LI data-sourcepos="109:1-109:104"&gt;&lt;STRONG&gt;Good Practice:&lt;/STRONG&gt; Using a "Select Family Types" node to let the user choose the penetration family.&lt;/LI&gt;
&lt;LI data-sourcepos="110:1-111:0"&gt;&lt;STRONG&gt;Better Practice:&lt;/STRONG&gt; Using the Python script to check for family type existence and providing a fallback if the type is not found, or using the family name and type name to find the type.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-sourcepos="112:1-112:25"&gt;&lt;STRONG&gt;Combining Techniques:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-sourcepos="114:1-114:55"&gt;For the most robust solution, combine these techniques:&lt;/P&gt;
&lt;OL data-sourcepos="116:1-119:0"&gt;
&lt;LI data-sourcepos="116:1-116:51"&gt;Use "Select Family Types" as the primary input.&lt;/LI&gt;
&lt;LI data-sourcepos="117:1-117:100"&gt;Use the Python script to validate the selected family type and provide feedback if it's invalid.&lt;/LI&gt;
&lt;LI data-sourcepos="118:1-119:0"&gt;Implement parameter mapping to access family parameters by name.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-sourcepos="120:1-120:189"&gt;By following these best practices, you can create Dynamo scripts that are much more resilient to changes in Revit projects and family libraries, making them more reliable and easier to use.&lt;/P&gt;
&lt;P data-sourcepos="120:1-120:189"&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;
&lt;/DIV&gt;</description>
      <pubDate>Wed, 15 Jan 2025 16:41:19 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/dynamo-script-compatibility-issue-for-wall-penetrations/m-p/13262588#M1437</guid>
      <dc:creator>jeremy_tammik</dc:creator>
      <dc:date>2025-01-15T16:41:19Z</dc:date>
    </item>
    <item>
      <title>Re: Dynamo Script Compatibility Issue for Wall Penetrations</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/dynamo-script-compatibility-issue-for-wall-penetrations/m-p/13262596#M1438</link>
      <description>&lt;P&gt;I hope those two explanations help you get started with your task. Good luck! Oh, btw, you might want to raise Dynamo-specific question in the Dynamo forum, rather than here in the pure Revit API one:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://forum.dynamobim.com" target="_blank"&gt;https://forum.dynamobim.com&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 15 Jan 2025 16:44:57 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/dynamo-script-compatibility-issue-for-wall-penetrations/m-p/13262596#M1438</guid>
      <dc:creator>jeremy_tammik</dc:creator>
      <dc:date>2025-01-15T16:44:57Z</dc:date>
    </item>
  </channel>
</rss>

