How to get layer colour from layer dict?

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/01/2012 at 08:54, xxxxxxxx wrote:

I can get the layer info
but cannot access the individual elements as per the SDK

Return type:
dict{solo: bool, view: bool, render: bool, manager: bool, locked: bool, generators: bool, expressions: bool, animation: bool, color: Vector}

I get an error - dict object has no attribute 'color' ?

help appreciated

import c4d
from c4d import gui
  
def main() :
  
    doc = c4d.documents.GetActiveDocument()
    root = doc.GetLayerObjectRoot()#Gets the layer manager
    LayersList = root.GetChildren()
    for layers in LayersList:   
        print layers.GetName()
        if layers.GetBit(c4d.BIT_ACTIVE) :
            print"Selected Layer: ", layers.GetName() 
            print"Selected Layer Settings: ", layers.GetLayerData(doc)
            print"Selected Layer Colour: ", layers.GetLayerData(doc).color #this line doesnt work
  
            
if __name__=='__main__':
    main()
  

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/01/2012 at 09:55, xxxxxxxx wrote:

After some testing, I could find out that c4d.ID_LAYER_COLOR is the constant you are looking for. Unfortunately there is nothing documented about LayerObjects.

Also, either the iteration over a c4d.BaseContainer is not implemented correctly or the LayerObject uses another container than returned by GetData() internally, as doing so leads to the belive that options of a LayerObject are not accessible for us.
Can someone of Maxon please enlighten me?

import c4d  
  
def main() :  
  root   = doc.GetLayerObjectRoot()  
  layers = root.GetChildren()  
  layer  = layers[0]  
  
  # this wont yield anything to the console  
  for k, v in layer.GetData() :  
      print k, v  
  
  # but this works  
  print layer[c4d.ID_LAYER_COLOR]

Cheers,
Niklas

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/01/2012 at 10:15, xxxxxxxx wrote:

ah - should have learnt by now - if all else fails -  look in the description headers

so for my version
print"Layer Colour: ", layers[c4d.ID_LAYER_COLOR]

gives me the rgb vector

thanks for looking Niklas

it would be useful to know from Maxon how to use
layers.GetLayerData(doc) ........and get the colour that way

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/01/2012 at 10:44, xxxxxxxx wrote:

I don't think you can get the color from BaseList2D.GetLayerData().
I haven't take a look into the header-files. There's a much more convenient way to search for constants in the c4d module.

import c4d  
  
def getNamesByValue(obj, value) :  
  for k, v in obj.__dict__.iteritems() :  
      if v == value:  
          yield k

@Maxon: Why the heck is GetLayerData implemented in the BaseList2D class? Don't get it.. A LayerObject instance has ** exactly** the same methods and as a BaseObject object...

import c4d  
  
def main() :  
  layer = c4d.documents.LayerObject()  
  obj   = c4d.BaseObject(c4d.Ocube)  
  
  layer_attrs = dir(layer)  
  obj_attrs   = dir(obj)  
  
  print  
  print  
  
  for layer_attr in layer_attrs:  
      if layer_attr not in obj_attrs:  
          print layer_attr  
  
  print "- " * 20  
  
main()

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/01/2012 at 12:41, xxxxxxxx wrote:

Originally posted by xxxxxxxx

Return type:
dict{solo: bool, view: bool, render: bool, manager: bool, locked: bool, generators: bool, expressions: bool, animation: bool, color: Vector}

I get an error - dict object has no attribute 'color' ?

print"Selected Layer Colour: ", layers.GetLayerData(doc).color #this line doesnt work

As you've said, the return type of GetLayerData() is a dictionary so you should access the color of a layer by calling the [] operator:

print"Selected Layer Colour: ", layers.GetLayerData(doc)['color']

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/01/2012 at 13:00, xxxxxxxx wrote:

Ah lol, I haven't seen that there is actually the color value in the dictionary! :joy: Sorry. ;)
Still missing an explanation why the iteration over the BaseContainer of the LayerObject does not work correctly.

Cheers,

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/01/2012 at 13:04, xxxxxxxx wrote:

thanks for the syntax Yannick

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/01/2012 at 13:20, xxxxxxxx wrote:

Nux is right.
There's something not right about the GetLayerData() function.
It doesn't work using a Baselist2D type like it claims it does in the docs:

import c4d  
  
def main() :  
  
  root = doc.GetLayerObjectRoot() #Type = 110063  
  print root.GetType()  
  
  layer = root.GetDown()          #Get the first layer  
  
  lh = layer.GetListHead()        #Type = 110063  
  print lh.GetType()  
  
  lh.GetLayerData(doc, True)    #Error: BaseList2D has no attribute 'GetLayerData'  
  root.GetLayerData(doc, True)  #Error: BaseList2D has no attribute 'GetLayerData'  
  
if __name__=='__main__':  
  main()

Here's a working C++ example where GetLayerData() works properly:

//Sets the color of the first layer to white  
  
  GeListHead *llist = doc->GetLayerObjectRoot();        //Get the root and store it in the GeListHead variable called "llist"  
  if(!llist) return FALSE;  
  LayerObject *layer = (LayerObject* )llist->GetFirst(); //Get the first layer  
  
  if(layer)  
   {  
    LayerData ldata(*layer->GetLayerData(doc, TRUE));   //Get the layer's container  
    ldata.color = Vector(1.0,1.0,1.0);                  //Set the layer's color to white in memory only  
    layer->SetLayerData(doc, ldata);                    //Execute the changes made to the layer  
    layer->Message(MSG_UPDATE);  
    EventAdd();  
   }

Notice that in the C++ example. The data type used to access the GetLayerData() function is a "LayerData" type.
But in the python SDK. All we seem to have access to is the GeListHead, and LayerObject types.
Without the LayerData type. How are we supposed to use the GetLayerData() function?

***Edit-   DOH!
The reason why GetLayerData didn't work for me is because I was using R12. And it seems that this is only available in R13.
I hate when that happens.:joy:
**
-ScottA