{"id":1973,"date":"2026-08-05T10:54:43","date_gmt":"2026-08-05T10:54:43","guid":{"rendered":"https:\/\/inventorics.com\/?p=1973"},"modified":"2026-08-05T10:55:07","modified_gmt":"2026-08-05T10:55:07","slug":"cluster-2-manual-aggregations-with-blocks","status":"publish","type":"post","link":"https:\/\/inventorics.com\/?p=1973","title":{"rendered":"CLUSTER 2: Manual Aggregations with Blocks"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"376\" src=\"https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/cover-1024x376.png\" alt=\"\" class=\"wp-image-2063\" srcset=\"https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/cover-1024x376.png 1024w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/cover-300x110.png 300w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/cover-768x282.png 768w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/cover-1536x564.png 1536w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/cover-2048x751.png 2048w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/cover-1092x400.png 1092w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In order to simplify rules definition for Wasp Parts with a high number of connections, we implemented a new method which allows to manually aggregate Parts in Rhino, and automatically detect rules from this manual Aggregation structure.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">A New Way to Define Aggregation Rules<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">During the exploration of <a href=\"https:\/\/inventorics.com\/?p=971\" data-type=\"link\" data-id=\"https:\/\/inventorics.com\/?p=971\">possible designs for a new detergent bottle<\/a>, able to become a reusable building block, we encountered a challenge: in order to have maximum flexibility in the assembly, each bottle has a high number of possible connecting faces to other blocks, resulting in a very large search space. This becomes an issue particularly when using Wasp, as the large number of combinations results in a very large Rules set, which makes it difficult to control the Aggregation, and often results in longer compute time for generation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">While we tried several approaches, like arbitrarly choosing a limited subset of Connections, or stochastically removing a given number of Rules, all approaches resulted in a very limited control on the overall Aggregation, as well as in limited flexibilty and increased complexity.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To tackle this issue, we implemented a novel approach which does not require to explicitcly define Aggregation Rules in Grasshopper, but which is able to automatically detect Rules from a combination of 3d geometries in Rhino. To do this, we implemented a process which allows to &#8220;bake&#8221; a Wasp Part definition as block in Rhino, track its duplicates and their relative transformations, and then load them back into Grasshopper and replace the loaded blocks with the initial Part definitions.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"314\" src=\"https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/BlockBake_combined-1024x314.png\" alt=\"\" class=\"wp-image-2057\" srcset=\"https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/BlockBake_combined-1024x314.png 1024w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/BlockBake_combined-300x92.png 300w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/BlockBake_combined-768x236.png 768w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/BlockBake_combined-1536x471.png 1536w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/BlockBake_combined-2048x628.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><em><sup>Fig. 01: Bottle Block part baked as Rhino Block and manual assembly of blocks. Connection axes are also baked to allow for easier manual assembly.<\/sup><\/em><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Once loaded back in Grasshopper, the manually aggregated Parts can be evaluted to detect which Connections are currently overlapping between each pair of Parts. These are assessed against set tolerance values for both position and rotation, which enable to account for accuracy issues during manual modelling. If two Connections between a given pair of Parts overlap within the tolerance values, they are considered connected, and hence a Rule is automatically defined between them, allowing to replicate the exact relative position as an Aggregation step.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"498\" src=\"https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/GH_Workflow-1024x498.png\" alt=\"\" class=\"wp-image-2055\" srcset=\"https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/GH_Workflow-1024x498.png 1024w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/GH_Workflow-300x146.png 300w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/GH_Workflow-768x374.png 768w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/GH_Workflow-1536x748.png 1536w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/GH_Workflow-2048x997.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><em><sup>Fig. 02: Overview of the new Grasshopper components to bake and reload Parts, and to extract the Rules from the &#8220;manual&#8221; Aggregations.<\/sup><\/em><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">However, a second challenge which is specific to the space-filling patterns used for the proposed bottle designs, is the fact that several rules result in the same exact relative configuration between two connected parts. This is due to the fact that, in the same configuration, several Connection pairs are actually overlapping, causing a very large list of Rules, which however do not result in geometric differences. For this reason, a filter was implemented which was able to detect all Rules resulting in an identical geometric configuration, and remove them, leaving only one valid rule for each configuration.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"314\" src=\"https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/filtered_rules_combined-1024x314.png\" alt=\"\" class=\"wp-image-2059\" srcset=\"https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/filtered_rules_combined-1024x314.png 1024w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/filtered_rules_combined-300x92.png 300w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/filtered_rules_combined-768x236.png 768w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/filtered_rules_combined-1536x471.png 1536w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/filtered_rules_combined-2048x628.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><em><sup>Fig.03: Left, all rules detected from four manually aggregated Parts; right, the rules after filtering for duplicates and rules creating the same configuration.<\/sup><\/em><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"314\" src=\"https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/aggregation_combined-1024x314.png\" alt=\"\" class=\"wp-image-2061\" srcset=\"https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/aggregation_combined-1024x314.png 1024w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/aggregation_combined-300x92.png 300w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/aggregation_combined-768x236.png 768w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/aggregation_combined-1536x471.png 1536w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/aggregation_combined-2048x628.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><em><sup>Fig. 04: Different aggregations generated with the same filtered rules set.<\/sup><\/em><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Currently this design process is implemented as a set of custom IronPython nodes in Grasshopper. However, it will be soon integrated as part of one of future Wasp releases as a standard component.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Beyond Rules Definition<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">While the key advantage of this method is to provide a tool to quickly define Aggregation rules in 3D space without need for manual typing, the tool also provides other possible applications. One example is the possibility of using this tool to manually place starting points for an aggregation, removing the need to use the <em>TransformPart<\/em> component in Wasp, which often requires a good understanding of how transformations work in Grasshopper<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"404\" src=\"https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/manual-1024x404.png\" alt=\"\" class=\"wp-image-2069\" srcset=\"https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/manual-1024x404.png 1024w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/manual-300x118.png 300w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/manual-768x303.png 768w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/manual-1536x606.png 1536w, https:\/\/inventorics.com\/wp-content\/uploads\/2026\/07\/manual-2048x808.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><em><sup>Fig. 05: Manually placed parts in Rhino (left) and resulting aggregation using these parts as starting point.<\/sup><\/em><\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Another opportunity provided by baking and reloading parts is the possibility of not only learning individual rules, but also entire rule sequences, which could then be executed to generate entire Aggregation chunks at once. This requires changes in the internal Wasp algorithms, which are being developed within the project and will be explored in future posts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In order to simplify rules definition for Wasp Parts with a high number of connections, we implemented a new method which allows to manually aggregate Parts in Rhino, and automatically detect rules from this manual Aggregation structure.<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_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_post_was_ever_published":false},"categories":[7],"tags":[44,45,4,35,6],"class_list":["post-1973","post","type-post","status-publish","format-standard","hentry","category-digital-studies","tag-cluster-2","tag-detergent-bottle","tag-discrete","tag-programming","tag-wasp"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/inventorics.com\/index.php?rest_route=\/wp\/v2\/posts\/1973","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/inventorics.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/inventorics.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/inventorics.com\/index.php?rest_route=\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/inventorics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1973"}],"version-history":[{"count":6,"href":"https:\/\/inventorics.com\/index.php?rest_route=\/wp\/v2\/posts\/1973\/revisions"}],"predecessor-version":[{"id":2071,"href":"https:\/\/inventorics.com\/index.php?rest_route=\/wp\/v2\/posts\/1973\/revisions\/2071"}],"wp:attachment":[{"href":"https:\/\/inventorics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/inventorics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/inventorics.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}