{"id":190,"date":"2025-12-08T16:20:24","date_gmt":"2025-12-08T16:20:24","guid":{"rendered":"https:\/\/www.mywlca.blog\/?p=190"},"modified":"2026-02-10T13:36:42","modified_gmt":"2026-02-10T13:36:42","slug":"project-floor-boundary-on-a-topography-using-dynamo","status":"publish","type":"post","link":"https:\/\/www.mywlca.blog\/?p=190","title":{"rendered":"Project Floor Boundary on a Topography using Dynamo"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"452\" src=\"https:\/\/mywlca.wasmer.app\/wp-content\/uploads\/2025\/12\/Topography-Slab_2025-12-08_01-39-01-scaled-1-1024x452.png\" alt=\"\" class=\"wp-image-201\" srcset=\"https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Topography-Slab_2025-12-08_01-39-01-scaled-1-1024x452.png 1024w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Topography-Slab_2025-12-08_01-39-01-scaled-1-300x132.png 300w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Topography-Slab_2025-12-08_01-39-01-scaled-1-768x339.png 768w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Topography-Slab_2025-12-08_01-39-01-scaled-1-1536x678.png 1536w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Topography-Slab_2025-12-08_01-39-01-scaled-1-2048x904.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Final Script<\/figcaption><\/figure>\n\n\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\n<p>If you\u2019ve ever tried to project slab boundaries onto a topography in Revit, you already know how deceptively time-consuming it can be. Drawing floors that follow the ground slope \u201cjust right\u201d often turns into hours of manual adjustments.<\/p>\n<\/div>\n\n\n\n<p>This post walks through a Dynamo workflow that automates the whole process extracting slab boundaries, generating projection points, bouncing them onto the topography and finally recreating floors that follow the terrain. The approach is based on an excellent tutorial by <a href=\"https:\/\/www.youtube.com\/watch?v=jo-fLZUnH6A\">AussieBIMGuru<\/a> (huge thanks!) and simplified wherever possible.<\/p>\n\n\n\n<p>You will need two free Dynamo packages: <strong>SpringNodes<\/strong> and <strong>Data-Shapes<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"511\" src=\"https:\/\/mywlca.wasmer.app\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-151900-1024x511.png\" alt=\"\" class=\"wp-image-202\" srcset=\"https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-151900-1024x511.png 1024w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-151900-300x150.png 300w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-151900-768x383.png 768w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-151900-1536x766.png 1536w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-151900.png 1728w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">1. Extracting the Original Slab Boundaries<\/h2>\n\n\n\n<p>We start by gathering all the slab or floor elements you want to project onto the topography. Once selected, the goal is to retrieve their boundary curves.<\/p>\n\n\n\n<p>The <strong>Collect.ElementSketch<\/strong> node from <em>SpringNodes<\/em> does exactly this. Feed your slabs into the node and flatten the resulting list, this ensures all boundaries sit in one clean and linear collection of curves.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"387\" src=\"https:\/\/mywlca.wasmer.app\/wp-content\/uploads\/2025\/12\/01-1024x387.png\" alt=\"\" class=\"wp-image-203\" srcset=\"https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/01-1024x387.png 1024w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/01-300x113.png 300w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/01-768x290.png 768w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/01.png 1112w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Fetch Floors&#8217; boundaries<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">2. Dividing the Curves into Points<\/h2>\n\n\n\n<p>With the boundaries extracted, the next step is to create a set of points that represent each curve\u2019s shape. These points will later be projected onto the topography.<\/p>\n\n\n\n<p><strong>Convert all boundary curves to nurbs curves<\/strong><br>This standardizes the geometry, resulting in a clean list of elements of the same type.<\/p>\n\n\n\n<p><strong>Determine the number of divisions<\/strong><br>Take the curve length and divide it by your desired point spacing (the \u201cdivision length\u201d parameter). Then round the result using <strong>Math.Round<\/strong>.<br>Shorter spacing = more points = higher accuracy.<\/p>\n\n\n\n<p><strong>Divide the curves<\/strong><br>Use the division count to generate the actual points.<br>After that, extract the <strong>endpoints of each divided segment<\/strong>, which will form the basis of our projection onto the terrain.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"265\" src=\"https:\/\/mywlca.wasmer.app\/wp-content\/uploads\/2025\/12\/02-1024x265.png\" alt=\"\" class=\"wp-image-205\" srcset=\"https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/02-1024x265.png 1024w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/02-300x78.png 300w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/02-768x199.png 768w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/02-1536x398.png 1536w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/02.png 1816w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">3. Projecting Points onto the Topography<\/h2>\n\n\n\n<p>Once the points are ready, we need to \u201cdrop\u201d them onto the topography surface.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"430\" src=\"https:\/\/mywlca.wasmer.app\/wp-content\/uploads\/2025\/12\/03-1024x430.png\" alt=\"\" class=\"wp-image-206\" srcset=\"https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/03-1024x430.png 1024w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/03-300x126.png 300w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/03-768x322.png 768w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/03.png 1108w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\n<p><strong>Elevate the points first<\/strong><br>To guarantee a successful projection, raise all points along the Z-axis to a safe height\u2014high enough that every point will definitely intersect the terrain when projected downward.<br>Technically, you can skip this if you always know the correct direction, but raising the points makes the workflow universal and far more reliable.<\/p>\n<\/div>\n\n\n\n<p><strong>Use the \u201cRayBounce On Link Category\u201d node<\/strong><br>From <em>Data-Shapes<\/em>, this node allows you to shoot rays from the elevated points down (or up) toward the topography.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"742\" src=\"https:\/\/mywlca.wasmer.app\/wp-content\/uploads\/2025\/12\/04-1024x742.png\" alt=\"\" class=\"wp-image-207\" srcset=\"https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/04-1024x742.png 1024w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/04-300x217.png 300w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/04-768x557.png 768w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/04-1536x1113.png 1536w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/04.png 1686w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Connect the following:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The elevated points<\/li>\n\n\n\n<li>A <strong>reversed vector<\/strong>, pointing from the raised points down toward the terrain<\/li>\n\n\n\n<li>A 3D view<\/li>\n\n\n\n<li>The topography category<\/li>\n\n\n\n<li>Your preferred <strong>BounceOnLinksOnly<\/strong> setting, depending on whether your topo lives in a linked model<\/li>\n<\/ul>\n\n\n\n<p>This node returns the reflected points, the points actually sitting on the topography.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"630\" src=\"https:\/\/mywlca.wasmer.app\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-151723-1024x630.png\" alt=\"\" class=\"wp-image-209\" srcset=\"https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-151723-1024x630.png 1024w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-151723-300x185.png 300w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-151723-768x473.png 768w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-151723-1536x945.png 1536w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-151723-2048x1260.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Projected points<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">4. Creating the New Floors<\/h2>\n\n\n\n<p>With the reflected points ready, it\u2019s time for the payoff.<\/p>\n\n\n\n<p>Use <strong>Floor.AddPoint<\/strong> (a native Dynamo node) and connect:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The reflected points (the projected geometry)<\/li>\n\n\n\n<li>The original slab elements you selected at the beginning<\/li>\n<\/ul>\n\n\n\n<p>Dynamo will generate new floors that follow the exact contour of the topography using the updated point positions.<\/p>\n\n\n\n<p>And that\u2019s it, your slabs now automatically adapt to the terrain without having to play with them for hours.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"536\" src=\"https:\/\/mywlca.wasmer.app\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-152129-1024x536.png\" alt=\"\" class=\"wp-image-208\" srcset=\"https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-152129-1024x536.png 1024w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-152129-300x157.png 300w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-152129-768x402.png 768w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-152129-1536x805.png 1536w, https:\/\/www.mywlca.blog\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-03-152129-2048x1073.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Resulting Floors<\/figcaption><\/figure>\n\n\n\n<p>Short in time or feeling lazy? Get it ready from <a href=\"https:\/\/drive.google.com\/file\/d\/11ZDPIfKv7Nvz-rY9l9OJgxIPHatJFY4z\/view?usp=sharing\">Google Drive<\/a>!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you\u2019ve ever tried to project slab boundaries onto a topography in Revit, you already know how deceptively time-consuming it can be. Drawing floors that follow the ground slope \u201cjust right\u201d often turns into hours of manual adjustments. This post walks through a Dynamo workflow that automates the whole process extracting slab boundaries, generating projection [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":209,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,3],"tags":[],"class_list":["post-190","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-computational","category-dynamo"],"_links":{"self":[{"href":"https:\/\/www.mywlca.blog\/index.php?rest_route=\/wp\/v2\/posts\/190","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mywlca.blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mywlca.blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mywlca.blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mywlca.blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=190"}],"version-history":[{"count":0,"href":"https:\/\/www.mywlca.blog\/index.php?rest_route=\/wp\/v2\/posts\/190\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mywlca.blog\/index.php?rest_route=\/wp\/v2\/media\/209"}],"wp:attachment":[{"href":"https:\/\/www.mywlca.blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=190"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mywlca.blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=190"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mywlca.blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=190"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}