Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    How to get layer colour from layer dict?

    Scheduled Pinned Locked Moved PYTHON Development
    8 Posts 0 Posters 672 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      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()
        
      
      
      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        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

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          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

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            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()
            
            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              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']
              
              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

                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! 😂 Sorry. 😉
                Still missing an explanation why the iteration over the BaseContainer of the LayerObject does not work correctly.

                Cheers,

                1 Reply Last reply Reply Quote 0
                • H Offline
                  Helper
                  last edited by

                  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

                  1 Reply Last reply Reply Quote 0
                  • H Offline
                    Helper
                    last edited by

                    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.😂
                    **
                    -ScottA

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post