Layers in Rhino.FileIO.File3dm

Hi,
I’m trying to save (i.e. some geometry created with a python scipt) to different new Rhino-files, each with a different layer structure and file settings.
I started off with FileIO.File3dm class, and found it difficult to navigate around the layers.
FileIO.File3dm.Layer returns something of type Rhino.FileIO.File3dmLayerTable (no documentation http://4.rhino3d.com/5/rhinocommon/ ?) which seems to be different from Rhino.DocObjects.Tables.LayerTable.
How does one retrieve Layers in this File3dmLayerTable?
Is there a smarter way to achieve the goal maybe?

It might be a unvalid point, but are you writing this in python?

Edit : have you looked here : http://4.rhino3d.com/5/rhinocommon/html/P_Rhino_FileIO_File3dm_Layers.htm

Yes, it’s in python. Is there a way of transforming a IList into a (python) list?

Is this what you want?


import rhinoscriptsyntax as rs

layers = rs.LayerNames()
if layers:
    for layer in layers: print layer

Nope. The File3dm object is not the ActiveDoc.
I’m intending to manipulate it “in background”, without opening it.
If it was, I could have used RhinoDoc.Layers (I guess).

oh i see. let me see what i can do! =)

guessing i can just create a 3dm file and use it since you only want layernames right?

See if this works, save script with the 3dm file you want to read.


import Rhino

def main():
    path = "layer.3dm"
    f3dm = Rhino.FileIO.File3dm.Read(path)
    layerlist = f3dm.Layers
    if layerlist:
        for layer in layerlist: print layer

main()
1 Like

This works! Thanks!
Why is the same thing (addressing Layers as a list) not working below?
The idea is to create the layers “on the go”, depending on what elements will be written to which file, instead of reading a layer structure from a template file upfront.

def main():

    #create a 3dm file:
    f3dm=Rhino.FileIO.File3dm()

    #add objects to f3dm to a specified layer (first check if layer already exists, if not, create a new one).....

    #create new layers:
    newlayer=Rhino.DocObjects.Layer()
    newlayer.Name="abc"
    newlayer.Color=System.Drawing.Color.FromArgb(1,180,203,63)

    f3dm.Layers.Add(newlayer)

    layerlist = f3dm.Layers
    if layerlist:
        for layer in layerlist: print layer #<< I get an error here, the rest works.

    #save file:
    path=r"Z:\test\test.3dm"
    f3dm.Write(path,5)

no layers are added, so layerlist is empty.

i have limited experience with this kind of manipulation, i will look into it later :wink:

-Eivind

try adding this

    f3dm=Rhino.FileIO.File3dm()
    f3dm.Polish()

f3dm.Polish() does the job. Many thanks!

No problem!