I am looking for a way to create blocks from layers and name the blocks with the layer name automatically for all layers. I found a Rhino script (see https://www.modelical.com/en/pack-rhino-objects-one-block-per-layer-scripting/ 3). This script does the transformation, but it gives a syntax error at a certain line (line 41, as far as I remember). How can I correct the Rhino script, so that everything works without a syntax error?
Dunno, works here on a couple of test files - can you post a file where it errors out?
Model08Joined02Cut08.3dm (2.3 MB)
Dear Helvetosaur, yes, sure. Please look also at the Error.jpg.
What is wrong in line 42?
The script doesn’t check for bad objects - you have one in there. Use SelBadObjects to find it. If you isolate that one and fix it, the script runs fine.
Model08-fixed.3dm (2.6 MB)
What’s actually happening on line 42 is that the block is not created for the bad object, so strBlock is Null and InsertBlock fails. There is no error checking in the script, so instead of exiting politely and telling you there is a problem with an object, it just errors out.
Something is still not working. I have a model (see uploaded model), that does not have any bad objects (“SelBadObjects”), and that gives again the error in line 42. The blocks are correcly created. How can I get rid of this nasty error message?Model08Joined02Cut09.3dm (2.4 MB)
It doesn’t error out here with your file…
The thing is, this is not my script. As written, it does not do any error checking at all - which is usually a bad idea if you are going to release a script to the public. So even if there are no bad objects, if something does go wrong with the process of creating a block, it will error out.
Here is a slightly cleaned up version.
Option Explicit 'Script written by Roberto Molinos @robertomolinos 'Script copylefted by Modelical // free to use, improve and share 'Script version Friday, 21 March 2014 19:58:18 'Modified by Mitch Heynick 29.11.19 - added error checking and some cleanup Call Layers2Blocks() Sub Layers2Blocks() Dim strFile Dim arrLayers, strLayer, strBlock Dim arrSelected, arrInsertPoint Dim intBadCount : intBadCount = 0 'Create insertion point at 0,0,0 arrInsertPoint = Array(0, 0, 0) ' Get names of all layers arrLayers = Rhino.LayerNames ' Disable redrawing Rhino.EnableRedraw False ' Process each layer For Each strLayer In arrLayers ' Unselect all Rhino.UnselectAllObjects ' Select all objects on layer. Rhino.ObjectsByLayer strLayer, True ' Make sure some objects were selected arrSelected = Rhino.SelectedObjects If IsArray(arrSelected) Then 'Set current layer so block is created on the same one Call Rhino.CurrentLayer(strLayer) 'Create block strBlock = Rhino.AddBlock(arrSelected, arrInsertPoint, strLayer, True) 'Check to see if a block actually got made If Not IsNull(strBlock) Then 'Delete objects as they are now in the block Call Rhino.DeleteObjects(arrSelected) 'Insert the block Call Rhino.InsertBlock(strBlock, arrInsertPoint) Else intBadCount = intBadCount + 1 End If End If ' Unselect all Rhino.UnselectAllObjects Next ' Unselect all Rhino.UnselectAllObjects ' Enable redrawing Rhino.EnableRedraw True 'reporting If intBadCount > 0 Then Dim strErrorMsg strErrorMsg = " layers unable to be converted to blocks" Call Rhino.Print("Warning: " & Cstr(intBadCount) & strErrorMsg) End If End Sub
Thank you. The scripts creates the 56 blocks, however the warning “Warning: 56 layers unable to be converted to blocks” comes anyway. Do I simply neglect it? The situation is similar to the previous: I get the blocks, however I get also an error or, with your script, a warning, which should not come.
There is definitely something different in your Rhino than mine - I get no errors. intBadCount which starts at 0 should only get incremented if the result of adding a block is Null, and the error message only prints at the end if intBadCount is not 0 (i.e. at least one operation of block creation returned Null). Looks like the block creation might actually happen, but still return Null.
Since I cannot reproduce it here, I don’t really know where/why it’s going wrong on your end.