Rhino 8 Feature: Build Blocks Better using Grasshopper

Hi Andy,
Is there a way to display correct materials applied to blocks in Rhino?
I have a few nested blocks modelled in Rhino , but I can’t find a way to display materials I have assigned

It appears to be working here. See the attached example.
NestedBlocksWithMaterials.3dm (326.4 KB)
NestedBlocksWithMaterials.gh (13.1 KB)

2 Likes

Thank you Andy

Good morning,

I wanted to know why when I bake a block, it appears in the block manager but it is not baked in rhino. it doesn’t work like Elefront?

So user texts are only in geometries and not physical blocks?
I admit I don’t really understand the logic…

I can see how it’s a bit confusing. Let me see if I can break it down a bit. A block first starts with something called an instance definition. The instance definition is made up of the geometric bits that define what the block is. And while it has geometry associated with it, it doesn’t technically have a visual representation in the model. Rather, it’s stored in a table in the document (and it can be viewed in the block manager). Now, once you have an instance definition stored in the document, you can use that to create and instance reference. An instance reference is likely what you’re thinking of when you think of a block. An instance reference is nothing more than a reference to an instance definition AND a location/orientation in the 3d model.
So, if you were to bake an instance definition, then you technically wouldn’t see anything in the viewport of your 3d model. It would show up in the block manager however. If you bake an instance reference instead, you will see the actual blocks that you created (which include the instance definition and the model transform) in your viewport (as well as in the block manager). Does this make sense?
I can see how it can be confusing because when you create a block via the command line, it sorta combines the process of making an instance definition and an instance reference into one single step. But, technically speaking, you need to first have an instance definition saved in the instance definition table, and then you can make as many instance references (ie. blocks) by referencing that instance definition and specifying the transform (ie. location/orientation/scale) in the model.

5 Likes

Thank you for these explanations and especially for your reactivity !

1 Like

HI, I have downloaded your examples for the simple block and substituted my own PannelsABCD but nothing seems to happen when I get to the Bake stage. I see quantities of panels listed in block manager within rhino but no blocks are present in the drawing. My panels are arranged in the correct random manner but Baking from the Block instance component does not put anything in the rhino file.
Am I misunderstanding what this can do…I thought that I would end up with an arrangement of panels that I could save to my rhino file.


MULTI-PANEL.3dm (128.8 KB)
I have included the rhino file which seems to be empty after baking

I struggle to update BlockAttributeText using Grasshopper.
In the scene, I have 2 Block Instances of the Block Definition “SAMPLE”. Inside the Block, there is a text that should allow me to assign different values per Block Instance. The Grasshopper method of updating this value doesn’t give me the expected results.

Am I doing things correctly?

@AndyPayne I think it’s a bug, can you please take a look?

System Info

Rhino 8 SR6 2024-3-14 (Rhino 8, 8.6.24074.01001, Git hash:master @ def4e7ae5a5339578727a42cbd95e31d75b3faf0)
License type: Commercial, build 2024-03-14
License details: Cloud Zoo

Windows 11 (10.0.22631 SR0.0) or greater (Physical RAM: 64GB)
.NET 7.0.11

Computer platform: LAPTOP - Plugged in [100% battery remaining]

Non-hybrid graphics configuration.
Primary display and OpenGL: NVIDIA RTX A3000 12GB Laptop GPU (NVidia) Memory: 11GB, Driver date: 2-15-2024 (M-D-Y). OpenGL Ver: 4.6.0 NVIDIA 551.61
> Integrated accelerated graphics device with 4 adapter port(s)
- Windows Main Display is laptop’s integrated screen or built-in port
Primary OpenGL: NVIDIA RTX A3000 12GB Laptop GPU (NVidia) Memory: 11GB, Driver date: 2-15-2024 (M-D-Y). OpenGL Ver: 4.6.0 NVIDIA 551.61
> Integrated accelerated graphics device with 4 adapter port(s)
- Windows Main Display is laptop’s integrated screen or built-in port

Secondary graphics devices.
Intel(R) UHD Graphics (Intel) Memory: 1GB, Driver date: 6-15-2023 (M-D-Y).
> Integrated graphics device with 4 adapter port(s)
- Secondary monitor is laptop’s integrated screen or built-in port

OpenGL Settings
Safe mode: Off
Use accelerated hardware modes: On
Redraw scene when viewports are exposed: On
Graphics level being used: OpenGL 4.6 (primary GPU’s maximum)

Anti-alias mode: 8x
Mip Map Filtering: Linear
Anisotropic Filtering Mode: High

Vendor Name: NVIDIA Corporation
Render version: 4.6
Shading Language: 4.60 NVIDIA
Driver Date: 2-15-2024
Driver Version: 31.0.15.5161
Maximum Texture size: 32768 x 32768
Z-Buffer depth: 24 bits
Maximum Viewport size: 32768 x 32768
Total Video Memory: 11520 MB

Rhino plugins that do not ship with Rhino
C:\ProgramData\McNeel\Rhinoceros\7.0\Plug-ins\Datasmith Rhino Exporter (d1fdc795-b334-4933-b680-088119cdc6bb)\DatasmithRhino7.rhp “Datasmith Exporter” 5.3.2.0
C:\Program Files\Rhino 8\Plug-ins\Tibidabo\VisualARQ.rhp “VisualARQ”
C:\Users\Czaja\AppData\Roaming\McNeel\Rhinoceros\8.0\Plug-ins\Bella (813de3fb-18eb-405f-bfcd-b0b4d3da91fb)\24.2.0.0\bella_rhino.rhp “Bella” 24.2.0.0
C:\Users\Czaja\Desktop\Rhino_7_Win_2023.0417\HDRLightStudioTexture.rhp “HDRLightStudioTexture”
C:\Program Files\Rhino 8\Plug-ins\Tibidabo\Tibidabo.rhp “Tibidabo”
C:\Program Files\Common Files\McNeel\Rhinoceros\8.0\Plug-ins\Crayon (39629248-4fa6-47b8-83c7-745a7efea259)\1.2.0.0\Crayon\Crayon.rhp “Crayon” 1.0.0.0
C:\Users\Czaja\AppData\Roaming\McNeel\Rhinoceros\BlockEditNew\BlockEditNew.rhp “BlockEdit” 1.0.0.0

Rhino plugins that ship with Rhino
C:\Program Files\Rhino 8\Plug-ins\Commands.rhp “Commands” 8.6.24074.1001
C:\Program Files\Rhino 8\Plug-ins\WebBrowser.rhp “WebBrowser”
C:\Program Files\Rhino 8\Plug-ins\rdk.rhp “Renderer Development Kit”
C:\Program Files\Rhino 8\Plug-ins\RhinoScript.rhp “RhinoScript”
C:\Program Files\Rhino 8\Plug-ins\IdleProcessor.rhp “IdleProcessor”
C:\Program Files\Rhino 8\Plug-ins\RhinoRenderCycles.rhp “Rhino Render” 8.6.24074.1001
C:\Program Files\Rhino 8\Plug-ins\RhinoRender.rhp “Legacy Rhino Render”
C:\Program Files\Rhino 8\Plug-ins\rdk_etoui.rhp “RDK_EtoUI” 8.6.24074.1001
C:\Program Files\Rhino 8\Plug-ins\NamedSnapshots.rhp “Snapshots”
C:\Program Files\Rhino 8\Plug-ins\MeshCommands.rhp “MeshCommands” 8.6.24074.1001
C:\Program Files\Rhino 8\Plug-ins\IronPython\RhinoDLR_Python.rhp “IronPython” 8.6.24074.1001
C:\Program Files\Rhino 8\Plug-ins\RhinoCycles.rhp “RhinoCycles” 8.6.24074.1001
C:\Program Files\Rhino 8\Plug-ins\Grasshopper\GrasshopperPlugin.rhp “Grasshopper” 8.6.24074.1001
C:\Program Files\Rhino 8\Plug-ins\export_PDF.rhp “PDF Export” 8.6.24074.1001
C:\Program Files\Rhino 8\Plug-ins\Toolbars\Toolbars.rhp “Toolbars” 8.6.24074.1001
C:\Program Files\Rhino 8\Plug-ins\3dxrhino.rhp “3Dconnexion 3D Mouse”
C:\Program Files\Rhino 8\Plug-ins\Displacement.rhp “Displacement”
C:\Program Files\Rhino 8\Plug-ins\SectionTools.rhp “SectionTools”

block attribute text.gh (4.5 KB)
rhino block attribute text.3dm (63.0 KB)

Instead of “DIFFERENT TEXT” text in Block changes to the default value “001”

see above

I think I have isolated the problem but am not sure of the answer…it seems to be in thenature of the elements in the panels that are being referenced…your examples only have surfaces whereas my panels contain lines and polysurfaces…I can turn those into blocks in rhino but for some reason they are not being processesd in your grasshopper script in a way that can be baked…not sure why…

Ok…I realise I am having this conversation with myself…it seems that sending any fresh block definitions to rhino accumulates a whole lot of extra layers and sublayers as well as hierarchies in block manager so I have solved a lot of problems by deleting all references before adding new ones…when I don’t do this I get a lot of crashes…there is somethingb about blocks that makes ver8 very jumpy.
Anyway…if someone reads this I would be grateful if they could recommend GH components that would replace the C# script for distributing the panels around the point grid…I realize that I can use Orient but I don’t know how to apply that to a number of panels so that they are randomly distributed in the way the script works and in a way that two panels don’t get put in the same place.
I have managed to use Andy’s method with 4 panels but I would like to use a variable number, up to 12 panels if that is possible.
Any help would be much appreciated
Giusseppe

This is the best I have managed but I cannot see how to apply the split list to more than two objects…


array to points on grid.gh (24.4 KB)

Hi Giusseppe. Sorry for the delay. I was out of town. The reason you’re seeing extra layers, etc. getting created is because you are not assigning any layers/attributes to your objects before they’re used in the block definition creation. You may want to refresh about what those attributes are and how to assign them to objects by reviewing this post. When you bake objects and you don’t assign a layer and/or attributes then Grasshopper has to make a decision as to where certain objects are supposed to go in the document (they can’t just float around without a layer designation… that’s against the rules). So, in this case, it’s using the layer name from the imported .3dm file which is used to create the block definition. So, the block definition for Panel A is baked to the Panel A layer in the document. Hopefully this makes sense.
It seems like what you want is to make blocks that can be modified easily and with easier grid points. I’ll see if I can come up with a modified demo for you. Hold tight.

1 Like

@giusseppe Ok, let’s try this one. In this example, it will create a new block based on whatever objects you put on each layer. So, if you create a new layer and add a curve or surface or whatever, then those objects will become a new block in this definition. I’ve added notes to the definition to explain what’s happening in each step. Please review and let me know if you have any questions.


Block_Demo_ByLayer.gh (17.9 KB)
Block_Demo_ByLayer.3dm (162.8 KB)

1 Like

Blocks & GH is a very much needed connection, sometimes I still have bit of problems understanding some of the concepts when dealing with them. Did you found solution to this problem?

To this one not yet.
It takes a while to get used to the new workflows and possibilities, but the potential for sure is here. Together with Attribute User Text, it’s even possible to make Quasi Parametric Blocks.

Thank you so much Andy…I really appreciate the time you took to make things clear…Using layers as the defining panels gives me lots of scope because I wanted to build panels from several elements…textured frames and forged parts…so this makes it much easier to keep things organised.
Giusseppe

It would be preferable to export the blocks to another document , otherwise there are suddenly a whole bunch of new entities for the Query to include, preventing me from baking a second variation. Which is the most reliable component to do this please ?

You could use a filter in the Query Model Objects component so that only objects on certain layers are returned. For example, if you were to type Panel* into the Layer input… this would only return objects on layers which start with the word “Panel”. The asterisk (*) is a wildcard so it allows any characters to come after it. So, as long as you only put things on layers that start with that word, then you could bake the blocks like normal and it wouldn’t return those objects on the Query.