{"id":2322,"date":"2025-02-13T10:30:00","date_gmt":"2025-02-13T00:30:00","guid":{"rendered":"https:\/\/digitalbbq.au\/?p=2322"},"modified":"2025-01-25T17:19:55","modified_gmt":"2025-01-25T07:19:55","slug":"automating-metadata-cleanup-in-revit-a-custom-live-updater","status":"publish","type":"post","link":"https:\/\/digitalbbq.au\/index.php\/2025\/02\/13\/automating-metadata-cleanup-in-revit-a-custom-live-updater\/","title":{"rendered":"Automating Metadata Cleanup in Revit \u2013 A Custom Live Updater"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">When working in Revit, copied elements will inherit instance parameter values that should be unique\u2014room numbers, tracking codes, asset IDs, or any other metadata that doesn\u2019t logically carry over.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem:<\/strong> Copying elements can introduce data inconsistencies if certain instance parameters retain values they shouldn\u2019t.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution:<\/strong> A Revit API Updater that automatically clears specific parameters whenever elements are copied.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This tutorial will walk you through:<br>\u2705 <strong>How the Updater Works<\/strong><br>\u2705 <strong>Setting Up the Revit Ribbon UI (Enable\/Disable Feature)<\/strong><br>\u2705 <strong>Registering the Updater<\/strong><br>\u2705 <strong>Code Implementation<\/strong><br>\u2705 <strong>How to Extend the Tool for Your Own Needs<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How the Revit Updater Works<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Updater leverages <strong>Revit\u2019s Dynamic Model Update (DMU) API<\/strong>, which allows you to react to changes in the model:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Detects when elements are copied or added<\/li>\n\n\n\n<li>Checks if the copied element contains the specified parameter<\/li>\n\n\n\n<li>Automatically clears the parameter value<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Why Use This?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Prevents copied elements from inheriting unique metadata<\/li>\n\n\n\n<li>Reduces errors in schedules and exported data<\/li>\n\n\n\n<li>Ensures compliance with data integrity requirements<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 1: Setting Up the Revit Ribbon UI<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To provide <strong>better user control<\/strong>, this tool includes a simple <strong>Revit Ribbon UI<\/strong> that allows users to toggle the updater <strong>on or off<\/strong>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>How the UI Works<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Activate button<\/strong> \u2013 Enables the updater<br><strong>Deactivate button<\/strong> \u2013 Disables the updater<br><strong>Placed inside a custom Revit tab: &#8220;Updater Tool&#8221;<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Activate button<\/strong> \u2013 Enables the updater<\/li>\n\n\n\n<li><strong>Deactivate button<\/strong> \u2013 Disables the updater<\/li>\n\n\n\n<li><strong>Placed inside a custom Revit tab: &#8220;Updater Tool&#8221;<\/strong><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Code: Creating the Revit UI (ExternalProgram.cs)<\/h4>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Click to expand and see the code<\/summary><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> System;\n<span class=\"hljs-keyword\">using<\/span> System.IO;\n<span class=\"hljs-keyword\">using<\/span> Autodesk.Revit.DB;\n<span class=\"hljs-keyword\">using<\/span> Autodesk.Revit.UI;\n<span class=\"hljs-keyword\">using<\/span> System.Windows.Media.Imaging;\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">UpdaterTool<\/span>\n{\n    &#91;<span class=\"hljs-meta\">Transaction(TransactionMode.Manual)<\/span>]\n    &#91;<span class=\"hljs-meta\">Regeneration(RegenerationOption.Manual)<\/span>]\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ExternalProgram<\/span> : <span class=\"hljs-title\">IExternalApplication<\/span>\n    {\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> Result <span class=\"hljs-title\">OnStartup<\/span>(<span class=\"hljs-params\">UIControlledApplication application<\/span>)<\/span>\n        {\n            application.CreateRibbonTab(<span class=\"hljs-string\">\"Updater Tool\"<\/span>);\n\n            <span class=\"hljs-keyword\">string<\/span> appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);\n            <span class=\"hljs-keyword\">string<\/span> dllPath = Path.Combine(appData, <span class=\"hljs-string\">@\"Autodesk\\REVIT\\Addins\\2023\\UpdaterTool.dll\"<\/span>);\n            <span class=\"hljs-keyword\">string<\/span> appFolderPath = Path.Combine(appData, <span class=\"hljs-string\">@\"Autodesk\\REVIT\\Addins\\2023\"<\/span>);\n\n            RibbonPanel ribbonPanel = application.CreateRibbonPanel(<span class=\"hljs-string\">\"Updater Tool\"<\/span>, <span class=\"hljs-string\">\"Updater\"<\/span>);\n\n            RadioButtonGroupData radioButtonGroupData1 = <span class=\"hljs-keyword\">new<\/span> RadioButtonGroupData(<span class=\"hljs-string\">\"radioButtonGroup1\"<\/span>);\n            RadioButtonGroup radioButtonGroup1 = ribbonPanel.AddItem(radioButtonGroupData1) <span class=\"hljs-keyword\">as<\/span> RadioButtonGroup;\n\n            ToggleButtonData toggleButton1 = <span class=\"hljs-keyword\">new<\/span> ToggleButtonData(<span class=\"hljs-string\">\"toggleButton1\"<\/span>, <span class=\"hljs-string\">\"Deactivate\"<\/span>, dllPath, <span class=\"hljs-string\">\"UpdaterTool.Deactivated\"<\/span>);\n            toggleButton1.LargeImage = <span class=\"hljs-keyword\">new<\/span> BitmapImage(<span class=\"hljs-keyword\">new<\/span> Uri(Path.Combine(appFolderPath, <span class=\"hljs-string\">\"Stop.png\"<\/span>)));\n\n            ToggleButtonData toggleButton2 = <span class=\"hljs-keyword\">new<\/span> ToggleButtonData(<span class=\"hljs-string\">\"toggleButton2\"<\/span>, <span class=\"hljs-string\">\"Activate\"<\/span>, dllPath, <span class=\"hljs-string\">\"UpdaterTool.Activated\"<\/span>);\n            toggleButton2.LargeImage = <span class=\"hljs-keyword\">new<\/span> BitmapImage(<span class=\"hljs-keyword\">new<\/span> Uri(Path.Combine(appFolderPath, <span class=\"hljs-string\">\"Check.png\"<\/span>)));\n\n            radioButtonGroup1.AddItem(toggleButton1);\n            radioButtonGroup1.AddItem(toggleButton2);\n\n            <span class=\"hljs-keyword\">return<\/span> Result.Succeeded;\n        }\n\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> Result <span class=\"hljs-title\">OnShutdown<\/span>(<span class=\"hljs-params\">UIControlledApplication application<\/span>)<\/span>\n        {\n            <span class=\"hljs-keyword\">return<\/span> Result.Succeeded;\n        }\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/details>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 2: Registering the Updater<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To enable the updater, we <strong>register it inside a separate command class (InternalProgram.cs)<\/strong>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Code: Activating &amp; Deactivating the Updater<\/strong><\/h4>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Click to expand and see the code<\/summary><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> System;\n<span class=\"hljs-keyword\">using<\/span> Autodesk.Revit.DB;\n<span class=\"hljs-keyword\">using<\/span> Autodesk.Revit.UI;\n<span class=\"hljs-keyword\">using<\/span> Autodesk.Revit.Attributes;\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">UpdaterTool<\/span>\n{\n    &#91;<span class=\"hljs-meta\">Transaction(TransactionMode.Manual)<\/span>]\n    &#91;<span class=\"hljs-meta\">Regeneration(RegenerationOption.Manual)<\/span>]\n    <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Activated<\/span> : <span class=\"hljs-title\">IExternalCommand<\/span>\n    {\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> Result <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\">ExternalCommandData commandData, <span class=\"hljs-keyword\">ref<\/span> <span class=\"hljs-keyword\">string<\/span> message, ElementSet elements<\/span>)<\/span>\n        {\n            UIApplication uiapp = commandData.Application;\n            AddInId addInId = uiapp.ActiveAddInId;\n\n            UpdaterClass updater = <span class=\"hljs-keyword\">new<\/span> UpdaterClass(addInId);\n            UpdaterId updaterId = updater.GetUpdaterId();\n\n            <span class=\"hljs-keyword\">if<\/span> (!UpdaterRegistry.IsUpdaterRegistered(updaterId))\n            {\n                UpdaterRegistry.RegisterUpdater(updater);\n                UpdaterRegistry.EnableUpdater(updaterId);\n                TaskDialog.Show(<span class=\"hljs-string\">\"Updater\"<\/span>, <span class=\"hljs-string\">\"Updater Activated!\"<\/span>);\n            }\n            <span class=\"hljs-keyword\">else<\/span>\n            {\n                TaskDialog.Show(<span class=\"hljs-string\">\"Updater\"<\/span>, <span class=\"hljs-string\">\"Updater is already active.\"<\/span>);\n            }\n\n            <span class=\"hljs-keyword\">return<\/span> Result.Succeeded;\n        }\n    }\n\n    &#91;<span class=\"hljs-meta\">Transaction(TransactionMode.Manual)<\/span>]\n    &#91;<span class=\"hljs-meta\">Regeneration(RegenerationOption.Manual)<\/span>]\n    <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Deactivated<\/span> : <span class=\"hljs-title\">IExternalCommand<\/span>\n    {\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> Result <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\">ExternalCommandData commandData, <span class=\"hljs-keyword\">ref<\/span> <span class=\"hljs-keyword\">string<\/span> message, ElementSet elements<\/span>)<\/span>\n        {\n            UIApplication uiapp = commandData.Application;\n            AddInId addInId = uiapp.ActiveAddInId;\n\n            UpdaterClass updater = <span class=\"hljs-keyword\">new<\/span> UpdaterClass(addInId);\n            UpdaterId updaterId = updater.GetUpdaterId();\n\n            <span class=\"hljs-keyword\">if<\/span> (UpdaterRegistry.IsUpdaterRegistered(updaterId))\n            {\n                UpdaterRegistry.RemoveAllTriggers(updaterId);\n                UpdaterRegistry.DisableUpdater(updaterId);\n                UpdaterRegistry.UnregisterUpdater(updaterId);\n                TaskDialog.Show(<span class=\"hljs-string\">\"Updater\"<\/span>, <span class=\"hljs-string\">\"Updater Deactivated!\"<\/span>);\n            }\n            <span class=\"hljs-keyword\">else<\/span>\n            {\n                TaskDialog.Show(<span class=\"hljs-string\">\"Updater\"<\/span>, <span class=\"hljs-string\">\"Updater was not active.\"<\/span>);\n            }\n\n            <span class=\"hljs-keyword\">return<\/span> Result.Succeeded;\n        }\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/details>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 3: The Updater Logic<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The core functionality of this tool is inside UpdaterClass.cs.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Listens for new elements being added (including copied elements)<\/li>\n\n\n\n<li>If the new element has the target parameter, it clears the value<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Listens for new elements being added (including copied elements)<br>If the new element has the target parameter, it clears the value<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Code: UpdaterClass.cs<\/strong><\/h4>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Click to expand and see the code<\/summary><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> System;\n<span class=\"hljs-keyword\">using<\/span> Autodesk.Revit.DB;\n<span class=\"hljs-keyword\">using<\/span> Autodesk.Revit.UI;\n\n<span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">UpdaterTool<\/span>\n{\n    <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UpdaterClass<\/span> : <span class=\"hljs-title\">IUpdater<\/span>\n    {\n        <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> AddInId addInId;\n        <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> UpdaterId updaterId;\n\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">UpdaterClass<\/span>(<span class=\"hljs-params\">AddInId addInId<\/span>)<\/span>\n        {\n            UpdaterClass.addInId = addInId;\n            updaterId = <span class=\"hljs-keyword\">new<\/span> UpdaterId(UpdaterClass.addInId, <span class=\"hljs-keyword\">new<\/span> Guid(<span class=\"hljs-string\">\"FBFBF6B2-4C06-42d4-97C1-D1B4EB593EFF\"<\/span>));\n        }\n\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\">UpdaterData data<\/span>)<\/span>\n        {\n            Document doc = data.GetDocument();\n\n            <span class=\"hljs-keyword\">using<\/span> (SubTransaction str = <span class=\"hljs-keyword\">new<\/span> SubTransaction(doc))\n            {\n                <span class=\"hljs-keyword\">try<\/span>\n                {\n                    str.Start();\n\n                    <span class=\"hljs-keyword\">var<\/span> addedElementIds = data.GetAddedElementIds();\n                    <span class=\"hljs-keyword\">foreach<\/span> (ElementId id <span class=\"hljs-keyword\">in<\/span> addedElementIds)\n                    {\n                        Element element = doc.GetElement(id);\n                        <span class=\"hljs-keyword\">if<\/span> (element == <span class=\"hljs-literal\">null<\/span>) <span class=\"hljs-keyword\">continue<\/span>;\n\n                        Parameter param = element.LookupParameter(<span class=\"hljs-string\">\"YourParameterNameHere\"<\/span>);\n                        <span class=\"hljs-keyword\">if<\/span> (param != <span class=\"hljs-literal\">null<\/span> &amp;&amp; !param.IsReadOnly)\n                        {\n                            param.Set(<span class=\"hljs-string\">\"\"<\/span>);  <span class=\"hljs-comment\">\/\/ Clears the copied parameter<\/span>\n                        }\n                    }\n\n                    str.Commit();\n                }\n                <span class=\"hljs-keyword\">catch<\/span>\n                {\n                    str.RollBack();\n                }\n            }\n        }\n\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> UpdaterId <span class=\"hljs-title\">GetUpdaterId<\/span>(<span class=\"hljs-params\"><\/span>)<\/span> =&gt; updaterId;\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> ChangePriority <span class=\"hljs-title\">GetChangePriority<\/span>(<span class=\"hljs-params\"><\/span>)<\/span> =&gt; ChangePriority.FreeStandingComponents;\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">GetUpdaterName<\/span>(<span class=\"hljs-params\"><\/span>)<\/span> =&gt; <span class=\"hljs-string\">\"Custom Parameter Updater\"<\/span>;\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">GetAdditionalInformation<\/span>(<span class=\"hljs-params\"><\/span>)<\/span> =&gt; <span class=\"hljs-string\">\"Clears a specific parameter when elements are copied.\"<\/span>;\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/details>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Summary<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 Created a Revit Updater that listens for copied elements<br>\u2705 Clears specified instance parameters to prevent unintended metadata retention<br>\u2705 Included a Revit UI toggle to enable or disable the updater<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>How Can You Extend This?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Modify the parameter name to suit your project needs<\/li>\n\n\n\n<li>Expand functionality to reset multiple parameters<\/li>\n\n\n\n<li>Add logging to track when elements are modified<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>When working in Revit, copied elements will inherit instance parameter values that should be unique\u2014room numbers, tracking codes, asset IDs, or any other metadata that doesn\u2019t logically carry over. Problem: Copying elements can introduce data inconsistencies if certain instance parameters retain values they shouldn\u2019t. Solution: A Revit API Updater that automatically clears specific parameters whenever elements are copied. This tutorial&#8230;<\/p>\n","protected":false},"author":1,"featured_media":2325,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"Prevent copied elements from inheriting unwanted metadata in Revit. Learn how to build a Revit API Updater that clears instance parameters automatically.","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"Tired of copied elements retaining metadata they shouldn\u2019t? This Revit Updater clears specific parameters on copy\u2014ensuring data integrity. Check out the full tutorial! #Revit #BIM #Automation","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-2322","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-digital"],"jetpack_publicize_connections":[],"jetpack-related-posts":[{"id":2560,"url":"https:\/\/digitalbbq.au\/index.php\/2026\/02\/26\/revit-cloud-model-upgrades-part-1-how-the-acc-project-updater-works-and-common-misconceptions\/","url_meta":{"origin":2322,"position":0},"title":"Revit Cloud Model Upgrades Part 1 &#8211; How the ACC Project Updater Works and Common Misconceptions","author":"Ryan Lenihan","date":"26 February 2026","format":false,"excerpt":"Upgrading cloud-shared Revit models via Autodesk Construction Cloud\u2019s Cloud Model Upgrade tool can initially feel daunting. It often surfaces a flurry of errors and warnings, but the key insight is that most issues indicate pre-existing model \u201ctechnical debt\u201d, not bugs in Autodesk\u2019s tool. Understanding Technical Debt Technical debt is a\u2026","rel":"","context":"In &quot;Digital&quot;","block_context":{"text":"Digital","link":"https:\/\/digitalbbq.au\/index.php\/category\/digital\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/02\/yell_at_cloud.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/02\/yell_at_cloud.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/02\/yell_at_cloud.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/02\/yell_at_cloud.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/02\/yell_at_cloud.jpg?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":2351,"url":"https:\/\/digitalbbq.au\/index.php\/2025\/03\/13\/cleaning-up-the-mess-automating-the-removal-of-unused-project-parameters-in-revit\/","url_meta":{"origin":2322,"position":1},"title":"Cleaning Up the Mess \u2013 Automating the Removal of Unused Project Parameters in Revit","author":"Ryan Lenihan","date":"13 March 2025","format":false,"excerpt":"I once took over a Revit project that was an absolute mess. The modelling practices were sloppy, content was pulled in from everywhere, and the result was a bloated model filled with hundreds of unused parameters. There were:\u2705 Parameters from other consultants\u2705 Random project parameters no one could explain\u2705 Parameters\u2026","rel":"","context":"In &quot;Digital&quot;","block_context":{"text":"Digital","link":"https:\/\/digitalbbq.au\/index.php\/category\/digital\/"},"img":{"alt_text":"Destroyed messy office desk","src":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/01\/destroyed-messy-office-desk.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/01\/destroyed-messy-office-desk.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/01\/destroyed-messy-office-desk.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/01\/destroyed-messy-office-desk.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/01\/destroyed-messy-office-desk.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/01\/destroyed-messy-office-desk.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":2403,"url":"https:\/\/digitalbbq.au\/index.php\/2025\/07\/17\/why-your-pipe-fittings-are-missing-materials-in-ifc-exports-and-how-to-fix-it\/","url_meta":{"origin":2322,"position":2},"title":"Your Pipe Fittings Are Grey in IFC? Here&#8217;s Why (And How to Fix It)","author":"Ryan Lenihan","date":"17 July 2025","format":false,"excerpt":"You\u2019ve exported your model to IFC. Pipes look great. Fittings? Grey. Again. What\u2019s going on? This one trips up a lot of teams, because pipe fittings in Revit don\u2019t actually carry system data, even though they look like they do. So when you rely on system-assigned materials for your IFC\u2026","rel":"","context":"In &quot;How to guides&quot;","block_context":{"text":"How to guides","link":"https:\/\/digitalbbq.au\/index.php\/category\/how-to-guides\/"},"img":{"alt_text":"Set of blue PVC pipe fittings isolated on dark background. Blue plastic water pipe. PVC accessories","src":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/set-of-blue-pvc-pipe-fittings-isolated-on-dark-background-blue-plastic-water-pipe-pvc-accessories.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/set-of-blue-pvc-pipe-fittings-isolated-on-dark-background-blue-plastic-water-pipe-pvc-accessories.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/set-of-blue-pvc-pipe-fittings-isolated-on-dark-background-blue-plastic-water-pipe-pvc-accessories.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/set-of-blue-pvc-pipe-fittings-isolated-on-dark-background-blue-plastic-water-pipe-pvc-accessories.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/set-of-blue-pvc-pipe-fittings-isolated-on-dark-background-blue-plastic-water-pipe-pvc-accessories.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/set-of-blue-pvc-pipe-fittings-isolated-on-dark-background-blue-plastic-water-pipe-pvc-accessories.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":2371,"url":"https:\/\/digitalbbq.au\/index.php\/2025\/03\/27\/fixing-the-failed-to-open-document-error-in-cloud-hosted-revit-models\/","url_meta":{"origin":2322,"position":3},"title":"Fixing the &#8220;Failed to Open Document&#8221; Error in Cloud-Hosted Revit Models","author":"Ryan Lenihan","date":"27 March 2025","format":false,"excerpt":"Having trouble opening cloud-hosted #Revit models? If you're getting the \"Failed to open document\" error, there's a simple fix that can save you hours of troubleshooting. \ud83d\udee0\ufe0f The issue often happens when transferring files via #DesktopConnector\u2014Revit models appear as .rvt but are actually .zip files. \u2705 Solution: Rename, extract, and\u2026","rel":"","context":"In &quot;Digital&quot;","block_context":{"text":"Digital","link":"https:\/\/digitalbbq.au\/index.php\/category\/digital\/"},"img":{"alt_text":"Upset stressed African American man negative emotion fail business project with laptop desperate","src":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/02\/upset-stressed-african-american-man-negative-emotion-fail-business-project-with-laptop-desperate.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/02\/upset-stressed-african-american-man-negative-emotion-fail-business-project-with-laptop-desperate.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/02\/upset-stressed-african-american-man-negative-emotion-fail-business-project-with-laptop-desperate.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/02\/upset-stressed-african-american-man-negative-emotion-fail-business-project-with-laptop-desperate.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/02\/upset-stressed-african-american-man-negative-emotion-fail-business-project-with-laptop-desperate.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/02\/upset-stressed-african-american-man-negative-emotion-fail-business-project-with-laptop-desperate.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":2689,"url":"https:\/\/digitalbbq.au\/index.php\/2026\/07\/23\/acc-model-upgrades-surprise-part-6-its-not-the-tech-that-breaks-you\/","url_meta":{"origin":2322,"position":4},"title":"ACC Model Upgrades. Surprise Part 6. It\u2019s Not the Tech That Breaks You","author":"Ryan Lenihan","date":"23 July 2026","format":false,"excerpt":"I thought I was done with the ACC model upgrade series. Five posts in, it really felt like I\u2019d covered it all \u2014 how the updater works, what breaks, how to check models before upgrading, how to get usable reports out the other side. I\u2019d written about every technical failure\u2026","rel":"","context":"In &quot;Digital&quot;","block_context":{"text":"Digital","link":"https:\/\/digitalbbq.au\/index.php\/category\/digital\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/the-road-to-success-is-a-slippery-one-at-best-2026-01-09-10-02-26-utc.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/the-road-to-success-is-a-slippery-one-at-best-2026-01-09-10-02-26-utc.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/the-road-to-success-is-a-slippery-one-at-best-2026-01-09-10-02-26-utc.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/the-road-to-success-is-a-slippery-one-at-best-2026-01-09-10-02-26-utc.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/the-road-to-success-is-a-slippery-one-at-best-2026-01-09-10-02-26-utc.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/the-road-to-success-is-a-slippery-one-at-best-2026-01-09-10-02-26-utc.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":2672,"url":"https:\/\/digitalbbq.au\/index.php\/2026\/07\/09\/a-short-story-about-how-nested-families-work-when-exported-to-ifc\/","url_meta":{"origin":2322,"position":5},"title":"A Short Story About How Nested Families Work When Exported to Ifc.","author":"Ryan Lenihan","date":"9 July 2026","format":false,"excerpt":"I had a question come through that\u2019ll sound familiar if you\u2019ve ever pushed Revit \u2192 IFC on a live job: Nested families are carrying asset data in Revit, but that data disappears in the IFC. LOI attributes, classification, IDs.. gone. What's going on? This comes up more than it should,\u2026","rel":"","context":"In &quot;How to guides&quot;","block_context":{"text":"How to guides","link":"https:\/\/digitalbbq.au\/index.php\/category\/how-to-guides\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/house-model-on-floor-real-estate-and-housing-aspi-2026-03-25-09-14-22-utc.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/house-model-on-floor-real-estate-and-housing-aspi-2026-03-25-09-14-22-utc.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/house-model-on-floor-real-estate-and-housing-aspi-2026-03-25-09-14-22-utc.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/house-model-on-floor-real-estate-and-housing-aspi-2026-03-25-09-14-22-utc.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/house-model-on-floor-real-estate-and-housing-aspi-2026-03-25-09-14-22-utc.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/house-model-on-floor-real-estate-and-housing-aspi-2026-03-25-09-14-22-utc.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]}],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/digitalbbq.au\/wp-content\/uploads\/2025\/01\/vintage-computer-from-the-seventies-representing-retro-technology-and-innovation.jpg","_links":{"self":[{"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/posts\/2322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/comments?post=2322"}],"version-history":[{"count":3,"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/posts\/2322\/revisions"}],"predecessor-version":[{"id":2326,"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/posts\/2322\/revisions\/2326"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/media\/2325"}],"wp:attachment":[{"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/media?parent=2322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/categories?post=2322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/tags?post=2322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}