{"id":2413,"date":"2025-08-07T10:30:00","date_gmt":"2025-08-07T00:30:00","guid":{"rendered":"https:\/\/digitalbbq.au\/?p=2413"},"modified":"2025-07-12T08:07:02","modified_gmt":"2025-07-11T22:07:02","slug":"setting-ifc-material-overrides-for-cable-tray-and-conduit","status":"publish","type":"post","link":"https:\/\/digitalbbq.au\/index.php\/2025\/08\/07\/setting-ifc-material-overrides-for-cable-tray-and-conduit\/","title":{"rendered":"Setting IFC Material Overrides for Cable Tray and Conduit"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In a previous post, <a href=\"https:\/\/digitalbbq.au\/index.php\/2025\/07\/17\/why-your-pipe-fittings-are-missing-materials-in-ifc-exports-and-how-to-fix-it\/\" data-type=\"link\" data-id=\"https:\/\/digitalbbq.au\/index.php\/2025\/07\/17\/why-your-pipe-fittings-are-missing-materials-in-ifc-exports-and-how-to-fix-it\/\">we looked at how to set IFC material overrides for pipe fittings<\/a>. But when it comes to cable tray and conduit, things get a bit trickier. Unlike pipe and duct, cable tray and conduit don\u2019t belong to a system in Revit, so there&#8217;s no MEP System parameter to piggyback off.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That\u2019s why most teams colour them using the <strong><em>Service Type<\/em><\/strong> parameter instead. And if you don\u2019t do anything else? You&#8217;ll get dull, grey IFC exports. Every time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s how to fix that \u2014 properly..<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Problem With Cable Tray and Conduit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Electrical teams often rely on filters to colour tray and conduit in Revit which is driven by the <strong><em>Service Type<\/em><\/strong> parameter. But filters don&#8217;t carry through to IFC exports. Without materials applied directly to the elements, your exports stay grey.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To solve this, we need to generate materials based on the <strong><em>Service Type<\/em><\/strong>, then apply them via the <strong><em>IfcSingleMaterialOverride<\/em><\/strong> parameter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The most reliable approach is to set the Service Type at the type level, using predefined conduit and tray types in your template. This means the parameter applied automatically as you model, just set the view filters in your template and voila! No manual intervention. No forgotten elements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A caveat \u2014 this will mean <strong>duplicating cable tray and conduit fitting types<\/strong> (one for each service type) and updating routing settings to use those fittings for each cable tray and conduit service. While some people don\u2019t love the idea of duplication or growing the template size, the overhead is minimal, and it\u2019s a one-time job that pays off every time you get stuck into actual modelling work.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Common Pitfalls to Avoid<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">While we&#8217;re on the topic, let\u2019s be real. A lot of teams make working with electrical services harder than it needs to be by.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Using shared parameters instead of native ones.<\/li>\n\n\n\n<li>Manually updating Service Type on every tray run.<\/li>\n\n\n\n<li>Using worksets to override colours (yuck!).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">These hacks might <em>seem<\/em> faster, but they break your data consistency and create more rework later. Especially when IFC or asset data is part of the deliverable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Solution<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Update your materials, collect your elements, and push the correct override \u2014 all based on Service Type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83e\udde0 Pro tip: watch out for inconsistent abbreviations, in the example below, both &#8220;E&#8221; and &#8220;LV&#8221; refer to Low Voltage. Either clean them up in your current file or template or handle them in the mapping of your code.<\/p>\n\n\n<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\">\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SetElectricalMaterialOverrides<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n\u00a0 {\n\u00a0\u00a0 UIDocument uidoc = <span class=\"hljs-keyword\">this<\/span>.ActiveUIDocument;\n\u00a0\u00a0 Document doc = uidoc.Document;\n\n\u00a0\u00a0 <span class=\"hljs-comment\">\/\/ Define service type to material name mapping<\/span>\n\u00a0\u00a0 Dictionary&lt;<span class=\"hljs-keyword\">string<\/span>, <span class=\"hljs-keyword\">string<\/span>&gt; serviceToMaterial = <span class=\"hljs-keyword\">new<\/span> Dictionary&lt;<span class=\"hljs-keyword\">string<\/span>, <span class=\"hljs-keyword\">string<\/span>&gt;\n\u00a0\u00a0 {\n\u00a0\u00a0\u00a0 { <span class=\"hljs-string\">\"LV\"<\/span>, <span class=\"hljs-string\">\"EL_LV\"<\/span> },\n\u00a0\u00a0\u00a0 { <span class=\"hljs-string\">\"E\"<\/span>, <span class=\"hljs-string\">\"EL_LV\"<\/span> }, <span class=\"hljs-comment\">\/\/ No consistency! E is also LV!<\/span>\n\u00a0\u00a0\u00a0 { <span class=\"hljs-string\">\"HV\"<\/span>, <span class=\"hljs-string\">\"EL_HV\"<\/span> },\n\u00a0\u00a0\u00a0 { <span class=\"hljs-string\">\"S\"<\/span>, <span class=\"hljs-string\">\"EL_Security\"<\/span> },\n\u00a0\u00a0\u00a0 { <span class=\"hljs-string\">\"C\"<\/span>, <span class=\"hljs-string\">\"EL_Comms\"<\/span> },\n\u00a0\u00a0\u00a0 { <span class=\"hljs-string\">\"F\"<\/span>, <span class=\"hljs-string\">\"EL_Fire\"<\/span> }\n\u00a0\u00a0\u00a0 <span class=\"hljs-comment\">\/\/ Add more mappings as needed<\/span>\n\u00a0\u00a0 };\n\n\u00a0\u00a0 <span class=\"hljs-comment\">\/\/ Define material colors (RGB)<\/span>\n\u00a0\u00a0 Dictionary&lt;<span class=\"hljs-keyword\">string<\/span>, Color&gt; materialColors = <span class=\"hljs-keyword\">new<\/span> Dictionary&lt;<span class=\"hljs-keyword\">string<\/span>, Color&gt;\n\u00a0\u00a0 {\n\u00a0\u00a0\u00a0 { <span class=\"hljs-string\">\"EL_LV\"<\/span>, <span class=\"hljs-keyword\">new<\/span> Color(<span class=\"hljs-number\">255<\/span>, <span class=\"hljs-number\">128<\/span>, <span class=\"hljs-number\">0<\/span>) },\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-comment\">\/\/ Orange<\/span>\n\u00a0\u00a0\u00a0 { <span class=\"hljs-string\">\"EL_HV\"<\/span>, <span class=\"hljs-keyword\">new<\/span> Color(<span class=\"hljs-number\">128<\/span>, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>) },\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-comment\">\/\/ Brown\/Maroon<\/span>\n\u00a0\u00a0\u00a0 { <span class=\"hljs-string\">\"EL_Security\"<\/span>, <span class=\"hljs-keyword\">new<\/span> Color(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">128<\/span>, <span class=\"hljs-number\">255<\/span>) },\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-comment\">\/\/ Blue<\/span>\n\u00a0\u00a0\u00a0 { <span class=\"hljs-string\">\"EL_Comms\"<\/span>, <span class=\"hljs-keyword\">new<\/span> Color(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">128<\/span>, <span class=\"hljs-number\">0<\/span>) },\u00a0\u00a0\u00a0 <span class=\"hljs-comment\">\/\/ Green<\/span>\n\u00a0\u00a0\u00a0 { <span class=\"hljs-string\">\"EL_Fire\"<\/span>, <span class=\"hljs-keyword\">new<\/span> Color(<span class=\"hljs-number\">128<\/span>, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">255<\/span>) }\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-comment\">\/\/ Purple<\/span>\n\u00a0\u00a0 };\n\u00a0\u00a0 \n\u00a0\u00a0 <span class=\"hljs-keyword\">int<\/span> updatedCount = <span class=\"hljs-number\">0<\/span>;\n\n\u00a0\u00a0 <span class=\"hljs-keyword\">using<\/span> (Transaction tx = <span class=\"hljs-keyword\">new<\/span> Transaction(doc, <span class=\"hljs-string\">\"Set Electrical Material Overrides\"<\/span>))\n\u00a0\u00a0 {\n\u00a0\u00a0\u00a0 tx.Start();\n\n\u00a0\u00a0\u00a0 <span class=\"hljs-comment\">\/\/ Step 1: Ensure materials exist<\/span>\n\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> kvp <span class=\"hljs-keyword\">in<\/span> materialColors)\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">string<\/span> matName = kvp.Key;\n\u00a0\u00a0\u00a0\u00a0 Color color = kvp.Value;\n\n\u00a0\u00a0\u00a0\u00a0 Material existingMat = <span class=\"hljs-keyword\">new<\/span> FilteredElementCollector(doc)\n\u00a0\u00a0\u00a0\u00a0\u00a0 .OfClass(<span class=\"hljs-keyword\">typeof<\/span>(Material))\n\u00a0\u00a0\u00a0\u00a0\u00a0 .Cast&lt;Material&gt;()\n\u00a0\u00a0\u00a0\u00a0\u00a0 .FirstOrDefault(m =&gt; m.Name == matName);\n\n\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">if<\/span> (existingMat == <span class=\"hljs-literal\">null<\/span>)\n\u00a0\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0 ElementId newMatId = Material.Create(doc, matName);\n\u00a0\u00a0\u00a0\u00a0\u00a0 Material newMat = doc.GetElement(newMatId) <span class=\"hljs-keyword\">as<\/span> Material;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">if<\/span> (newMat != <span class=\"hljs-literal\">null<\/span>)\n\u00a0\u00a0\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 newMat.Color = color;\n\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0 <span class=\"hljs-comment\">\/\/ Step 2: Collect cable trays and conduits<\/span>\n\n\u00a0\u00a0\u00a0 FilteredElementCollector elements = <span class=\"hljs-keyword\">new<\/span> FilteredElementCollector(doc)\n\u00a0\u00a0\u00a0\u00a0 .WherePasses(<span class=\"hljs-keyword\">new<\/span> LogicalOrFilter(<span class=\"hljs-keyword\">new<\/span> List&lt;ElementFilter&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">new<\/span> ElementCategoryFilter(BuiltInCategory.OST_CableTray),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">new<\/span> ElementCategoryFilter(BuiltInCategory.OST_CableTrayFitting),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">new<\/span> ElementCategoryFilter(BuiltInCategory.OST_Conduit),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">new<\/span> ElementCategoryFilter(BuiltInCategory.OST_ConduitFitting)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }))\n\u00a0\u00a0\u00a0\u00a0 .WhereElementIsNotElementType();\n\n\u00a0\u00a0\u00a0 <span class=\"hljs-comment\">\/\/ Step 3: Apply material override<\/span>\n\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">foreach<\/span> (Element elem <span class=\"hljs-keyword\">in<\/span> elements)\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0 Parameter serviceParam = elem.LookupParameter(<span class=\"hljs-string\">\"Service Type\"<\/span>);\n\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">if<\/span> (serviceParam == <span class=\"hljs-literal\">null<\/span> || !serviceParam.HasValue)\n\u00a0\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">continue<\/span>;\n\n\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">string<\/span> serviceType = serviceParam.AsString();\n\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">if<\/span> (<span class=\"hljs-keyword\">string<\/span>.IsNullOrEmpty(serviceType))\n\u00a0\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">continue<\/span>;\n\n\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">if<\/span> (!serviceToMaterial.ContainsKey(serviceType))\n\u00a0\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">continue<\/span>;\n\n\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">string<\/span> materialName = serviceToMaterial&#91;serviceType];\n\n\u00a0\u00a0\u00a0\u00a0 Parameter overrideParam = elem.LookupParameter(<span class=\"hljs-string\">\"IfcSingleMaterialOverride\"<\/span>);\n\u00a0\u00a0\u00a0\u00a0 <span class=\"hljs-keyword\">if<\/span> (overrideParam != <span class=\"hljs-literal\">null<\/span> &amp;&amp; !overrideParam.IsReadOnly)\n\u00a0\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0 overrideParam.Set(materialName);\n\u00a0\u00a0\u00a0\u00a0\u00a0 updatedCount++;\n\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0 tx.Commit();\n\u00a0\u00a0 }\n\n\u00a0\u00a0 TaskDialog.Show(<span class=\"hljs-string\">\"Done\"<\/span>, <span class=\"hljs-string\">\"Electrical material overrides applied to \"<\/span>+updatedCount+<span class=\"hljs-string\">\" elements.\"<\/span>);\n\u00a0 }<\/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>\n\n\n<h3 class=\"wp-block-heading\">How It Works<\/h3>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Define mappings for Service Type \u2192 Material name and colour<\/li>\n\n\n\n<li>Create missing materials automatically<\/li>\n\n\n\n<li>Collect tray and conduit elements<\/li>\n\n\n\n<li>Apply the override to <strong><em>IfcSingleMaterialOverride<\/em><\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This method ensures your IFC exports look how they should \u2014 with accurate colours, clean data, and zero manual effort once it&#8217;s set up.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Have you run into the same grey export issue? Let me know how you solved it, or didn&#8217;t, in the comments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In a previous post, we looked at how to set IFC material overrides for pipe fittings. But when it comes to cable tray and conduit, things get a bit trickier. Unlike pipe and duct, cable tray and conduit don\u2019t belong to a system in Revit, so there&#8217;s no MEP System parameter to piggyback off. That\u2019s why most teams colour them&#8230;<\/p>\n","protected":false},"author":1,"featured_media":2414,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"How to set IFC material overrides for cable tray and conduit using Service Type, improve your exports with consistent data and automated materials.","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":"Grey IFC exports? If you're working with cable tray and conduit, the issue is probably missing materials. Here's how to fix it using Service Type and automation. \ud83d\udc47\n#Revit #BIM #IFC #ElectricalDesign #Automation #DigitalDelivery","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[77,73],"class_list":["post-2413","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-digital","tag-automation","tag-process"],"jetpack_publicize_connections":[],"jetpack-related-posts":[{"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":2413,"position":0},"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":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":2413,"position":1},"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":[]},{"id":2686,"url":"https:\/\/digitalbbq.au\/index.php\/2026\/07\/16\/data-on-the-host-data-in-the-ifc-not-so-fast\/","url_meta":{"origin":2413,"position":2},"title":"Data on the Host, Data in the IFC? Not So Fast.","author":"Ryan Lenihan","date":"16 July 2026","format":false,"excerpt":"A few days after the last post, I got handed a model that seemed like it should have worked perfectly. The nested families were already set up as Shared. The IFC export was running. The geometry was coming through. But the asset data? Completely missing. When this happens, it\u2019s easy\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\/colorful-wooden-toy-blocks-on-wood-floor-2026-01-07-06-18-37-utc.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/colorful-wooden-toy-blocks-on-wood-floor-2026-01-07-06-18-37-utc.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/colorful-wooden-toy-blocks-on-wood-floor-2026-01-07-06-18-37-utc.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/colorful-wooden-toy-blocks-on-wood-floor-2026-01-07-06-18-37-utc.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/colorful-wooden-toy-blocks-on-wood-floor-2026-01-07-06-18-37-utc.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2026\/07\/colorful-wooden-toy-blocks-on-wood-floor-2026-01-07-06-18-37-utc.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":2005,"url":"https:\/\/digitalbbq.au\/index.php\/2024\/05\/02\/extracting-ifc-metadata-directly-in-power-bi-using-power-query\/","url_meta":{"origin":2413,"position":3},"title":"Extracting IFC Metadata Directly in Power BI Using Power Query","author":"Ryan Lenihan","date":"2 May 2024","format":false,"excerpt":"If you work with Industry Foundation Classes (IFC) files and want an easy way to access and analyze the metadata, there's a great article you should check out. \"How to extract data from IFC files\" by Matthew Osment on Medium demonstrates how to use Power Query in Power BI to\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\/2024\/04\/Shift_PowerBi_IFC.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2024\/04\/Shift_PowerBi_IFC.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2024\/04\/Shift_PowerBi_IFC.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2024\/04\/Shift_PowerBi_IFC.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2024\/04\/Shift_PowerBi_IFC.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2024\/04\/Shift_PowerBi_IFC.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":2400,"url":"https:\/\/digitalbbq.au\/index.php\/2025\/09\/04\/optimising-ifc-files-in-python\/","url_meta":{"origin":2413,"position":4},"title":"Optimising IFC Files in Python","author":"Ryan Lenihan","date":"4 September 2025","format":false,"excerpt":"I came across a Python-based IFC optimiser built on top of IfcOpenShell. It was solid, removing unused spaces, orphaned entities, and redundant metadata, but I saw room to push it further. The original script handled: Removing empty attributes Cleaning up orphaned or unused relationships Removing tiny geometry Flattening the spatial\u2026","rel":"","context":"In &quot;Digital&quot;","block_context":{"text":"Digital","link":"https:\/\/digitalbbq.au\/index.php\/category\/digital\/"},"img":{"alt_text":"Big and small yellow rubber ducks on pink background","src":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/big-and-small-yellow-rubber-ducks-on-pink-background.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/big-and-small-yellow-rubber-ducks-on-pink-background.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/big-and-small-yellow-rubber-ducks-on-pink-background.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/big-and-small-yellow-rubber-ducks-on-pink-background.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/big-and-small-yellow-rubber-ducks-on-pink-background.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/big-and-small-yellow-rubber-ducks-on-pink-background.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":2018,"url":"https:\/\/digitalbbq.au\/index.php\/2024\/05\/16\/expanding-on-ifc-metadata-extraction-in-powerbi\/","url_meta":{"origin":2413,"position":5},"title":"Expanding on IFC Metadata Extraction in PowerBI","author":"Ryan Lenihan","date":"16 May 2024","format":false,"excerpt":"In a previous post, \"Extracting IFC Metadata Directly in Power BI Using Power Query,\" we explored how to use Power Query in PowerBI to directly extract metadata from IFC files using a Power Query shared by Shift Construction. If you haven't read that post, I recommend checking it out first\u2026","rel":"","context":"In &quot;Digital&quot;","block_context":{"text":"Digital","link":"https:\/\/digitalbbq.au\/index.php\/category\/digital\/"},"img":{"alt_text":"Currency exchange data graph and charts data","src":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2024\/05\/currency-exchange-data-graph-and-charts-data.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2024\/05\/currency-exchange-data-graph-and-charts-data.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2024\/05\/currency-exchange-data-graph-and-charts-data.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2024\/05\/currency-exchange-data-graph-and-charts-data.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2024\/05\/currency-exchange-data-graph-and-charts-data.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/digitalbbq.au\/wp-content\/uploads\/2024\/05\/currency-exchange-data-graph-and-charts-data.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]}],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/digitalbbq.au\/wp-content\/uploads\/2025\/07\/low-angle-view-of-steel-network-cable-trunking-box-.jpg","_links":{"self":[{"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/posts\/2413","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=2413"}],"version-history":[{"count":2,"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/posts\/2413\/revisions"}],"predecessor-version":[{"id":2416,"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/posts\/2413\/revisions\/2416"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/media\/2414"}],"wp:attachment":[{"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/media?parent=2413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/categories?post=2413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digitalbbq.au\/index.php\/wp-json\/wp\/v2\/tags?post=2413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}