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

    (newbee) Python versus COFFEE

    Scheduled Pinned Locked Moved PYTHON Development
    3 Posts 0 Posters 341 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 16/12/2011 at 02:00, xxxxxxxx wrote:

      Hi there,
      I am new to scripting in C4D but I am fluent in Python. So I thought Python is probably the way to go.
      However, it appears to me that the SDK API is underexposed in Python, compared to COFFEE, at least looking at the documentation API : Is there anybody to confirm or to invalidate that ?

      Exemple.
      I have to create a bunch of plane objects, and of each of them, a new material (with color and alpha channel).

      At first this simple script fails (error is raised) :

      import c4d
      from c4d import *
        
      def main() :
          mat =  BaseMaterial(Mmaterial)
          mat.setChannelState(CHANNEL_ALPHA, True)
        
      if __name__=='__main__':
          main()
      

      AttributeError: 'c4d.BaseMaterial' object has no attribute 'setChannelState'. Which is quite expected since the  setChannelState method is declared only for subclass Material derived from BaseMaterial, but guess what, when I use Material it says that the Material symbol is not defined (despite the "from c4d import *").

      What's wrong ? I simply need to crearte a new material and apply it to a freshly created plane object.

      Secondly, is there any Python code snippets or samples web site where one can learn by examples ?
      I find the COFFEE API better documented that the Python one.

      Thank you for your help,
      Elie

      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 16/12/2011 at 03:28, xxxxxxxx wrote:

        Originally posted by xxxxxxxx

        I am new to scripting in C4D but I am fluent in Python. So I thought Python is probably the way to go.
        However, it appears to me that the SDK API is underexposed in Python, compared to COFFEE, at least looking at the documentation API : Is there anybody to confirm or to invalidate that ?
        Exemple.
        I have to create a bunch of plane objects, and of each of them, a new material (with color and alpha channel).
        At first this simple script fails (error is raised) :

         
        import c4d  
        from c4d import *  
        def main() :  
          mat =  BaseMaterial(Mmaterial)  
          mat.setChannelState(CHANNEL_ALPHA, True)  
            
        if __name__=='__main__':  
          main()  
        

        AttributeError: 'c4d.BaseMaterial' object has no attribute 'setChannelState'. Which is quite expected since the  setChannelState method is declared only for subclass Material derived from BaseMaterial, but guess what, when I use Material it says that the Material symbol is not defined (despite the "from c4d import *").
        What's wrong ? I simply need to crearte a new material and apply it to a freshly created plane object.

        Material class is deprecated as stated in this post. I have to put this note in the docs.
        So the code could be:

          
        import c4d  
        from c4d import *  
        def main() :  
          mat =  BaseMaterial(Mmaterial)  
          print mat[MATERIAL_USE_ALPHA]  
          mat[MATERIAL_USE_ALPHA] = True  
          print mat[MATERIAL_USE_ALPHA]  
          
        if __name__=='__main__':  
          main()  
        

        Note: Python is case-sensitive and you were calling 'setChannelState' (declared 'SetChannelState'), so anyway it won't even find the method.

        Originally posted by xxxxxxxx

        Secondly, is there any Python code snippets or samples web site where one can learn by examples ?
        I find the COFFEE API better documented that the Python one.

        Have you looked at the examples included in the docs ?
        Searching this forum is a good way to find answers.

        Python documentation is pretty young compared to the COFFEE one. I plan to greatly improve it in the future.

        Regards,

        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 16/12/2011 at 09:58, xxxxxxxx wrote:

          Hello Yannick,
          Thank you for your prompt answer that helped a lot. The python dictionnary approach to feed the parameters is really convenient.

          Yes the doc is a bit weak at least for beginners. But fortunately making massive use of google and using this forum helps a lot.
          I must say that this folder is a knowledge mine that would gained to be documented with example of use in context (constant names) : 
          /Applications/MAXON/CINEMA 4D R13/resource/res/description

          For others that may have the same need, here is the testing code I used to create a material, a plane and assign the material as a texture to the  plain.

          Cheers,
          Elie

          import c4d
          import math
          from c4d import *
            
          def creatMat(matname) :
              #create a standard material
              mat = c4d.BaseMaterial(c4d.Mmaterial) 
              #create a bitmap shader for color
              xch = c4d.BaseList2D(c4d.Xbitmap)
              #set the path of the image file to the bitmap shader
              xch[c4d.BITMAPSHADER_FILENAME] = "/Users/semiosys/Desktop/fleurbleue.tif"
              #set the shader to the color channel
              mat[c4d.MATERIAL_COLOR_SHADER] = xch
              mat.InsertShader(xch) 
              
              #create a bitmap shader for color
              axch = c4d.BaseList2D(c4d.Xbitmap)
              #set the path of the image file to the bitmap shader
              axch[c4d.BITMAPSHADER_FILENAME] = "/Users/semiosys/Desktop/fleurbleue_mask2.tif"
              #set the shader to the color channel
              mat[c4d.MATERIAL_ALPHA_SHADER] = axch
              mat.InsertShader(axch) 
              
              mat[c4d.MATERIAL_USE_ALPHA] = 1
              mat[c4d.MATERIAL_USE_SPECULAR] = 0
              
              mat[c4d.ID_BASELIST_NAME] = matname
              # UVW projection
              
              mat.Message(c4d.MSG_UPDATE)
              mat.Update(True, True)
              
              doc.InsertMaterial(mat)
              return mat
            
            
          def main() :
              
              
              
             neutre = BaseObject(Onull)
             
             mat = creatMat("PETAL");
             
             plane = BaseObject(Oplane)   
             plane.InsertUnder(neutre) 
             plane[c4d.PRIM_PLANE_WIDTH] = 1000;
             plane[c4d.PRIM_PLANE_HEIGHT] =1000;
             plane[c4d.PRIM_PLANE_SUBW] = 10;
             plane[c4d.PRIM_PLANE_SUBH] = 10;
             plane[c4d.PRIM_AXIS] = 0;
             plane[c4d.ID_BASELIST_NAME] = "planperso2";
            
             plane[c4d.ID_BASEOBJECT_REL_POSITION] = Vector(10,10,10)
             plane[c4d.ID_BASEOBJECT_REL_SCALE] = Vector(1,1,1)
            
             doc.InsertObject(plane)
              
             # Flip horizontal
             plane[c4d.ID_BASEOBJECT_REL_ROTATION]  = Vector(math.pi,0,0)
           
             tag = c4d.TextureTag()
             tag[c4d.TEXTURETAG_MATERIAL] = mat
             tag[c4d.TEXTURETAG_PROJECTION]=6
             #print tag[c4d.TEXTURETAG_MATERIAL].GetName()
             tag[c4d.ID_BASELIST_NAME] = tag[c4d.TEXTURETAG_MATERIAL].GetName()
             plane.InsertTag(tag)
            
             c4d.EventAdd()
             
          if __name__=='__main__':
              main()
            
          
          
          1 Reply Last reply Reply Quote 0
          • First post
            Last post