Wish For Rhino 6: BOM Generator

SetUserTexts, Export to CSV, Build a Table as needed from said CSV. An interface that allowed selection and formatting of the output table (layouts or model space) would be helpful and a nice base feature to have.


there is a way now. create your categories and attributes via grasshopper use elefront plugin and then just use save as csv export which will give you database of objects in the model with assigned attributes

Not working with RhinoMAC.

I need to generate accurate technical drawings not to feed external databases.

Something like this: Solidworks tutorial | insert Bill of Materials (BOM) into a Drawing in Solidworks, or like this Parts List: AutoCAD Mechanical 2013 seven years old tutorial, or like FUSION 360 Drawing - Exploded Drawing & BOM

Any major CAD program have support for BOM generation. Rhino is the only exception I do know not having this feature.

1 Like

Wikipedia about Bill Of Materials

1 Like

I wrote script that you can use if you want.
Unfortunatly there is no way to view grasshopper objects in layout view.
I tried to create a detail view with the same size like the BOM bounding box and zoom to it so that a preview of the BOM in the layout is possible but all that is very buggy and my interest to optimise all faides away.
Anyway maybe you can use it.

DataGrid_test.gh (12.2 KB)

1 Like

i generate similar BOM’s, the input is via a grasshopper query of attributes.

Thank you. I will test tomorrow and report back.


Is there a video demo on this somewhere? Thanks

Just had some time to test this definition. It is working great, however will be better to have some space between the text and the lines of the cells. Maybe the Python script can be customised to add an extra “padding” option?

Also, I just discovered this useful Python scripts: Page Layout Tools

They can generate a BOM straight on the Layouts. Very useful.

Hi, you might be interested in our plugin Marine Weight Schedule, which generates a Bill-Of-Masses and a Bill-Of-Materials.
It considers points, curves, surfaces, volumes, and blocks, with settings embedded in the layers’ names.
Video: https://discourse.mcneel.com/t/marine-weight-schedule-plugin-walkthough/120936
User Doc: https://wiki.tomkod.com/marineweightschedule
Webpage: Marine Weight Schedule – TomKod

We also have a plugin to insert tables/Spreadsheets in a Rhino document.

It doesn’t have to be in layout view if we make a detail view of it and keep it in model space

This will work in Layouts too but you’ll need to scroll through the layouts or do a for loop and have specific Annotation Style settings.

Note the Dimension Settings.

Quick Bom Generation from CSV.gh (8.7 KB)


Hey @Japhy, any chance you could do an example of iterating through layouts to bake out information like this?

Its a common problem I have, and while its easy enough creating unique layouts for each piece of geometry, I haven’t managed to figure out with my novice programming skills how to bake out unique information to each layout (and I haven’t found anything similar in the samples from what I could find…)

Would be super helpful!

Sure thing, That was a while ago so probably quicker to just figure it out than try and find the script.

I’ll post it here when I do (not today) If i recall it wasn’t too difficult, just need to have your data managed correctly.

So in that example above there are 38 Boms which would correspond with 38 layouts in the same order.

1 Like

Combined with these layout tools it’s pretty slick

Thanks @Japhy ~ I have FabTools but never noticed the ability to add variable text to the layout on the LayoutFromTemplate component, it might be what I’m looking for…

I’m still curious as to how to code this in Python or C# myself, so if you get an chance to write an example I’d really appreciate it! Sometimes is handy knowing how it works under hood, especially when you get asked to do something more complex than :sweat_smile:

Its going to be something along these lines.

Probably page through manually first, then try to incorporate the csv as well

import scriptcontext as sc
import rhinoscriptsyntax as rs

pgs = sc.doc.Views.GetPageViews()
for pg in pgs:
    print (pg.PageName)
doc.Views.ActiveView = pageview;

This being critical as well.

import Rhino as rc
import scriptcontext as sc
import rhinoscriptsyntax as rs

# Set context to Rhino document and disable redraw
sc.doc = rc.RhinoDoc.ActiveDoc

#Do something with the Rhino document

# Set context back to Grasshopper
sc.doc = ghdoc
1 Like