Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware 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

    Editing Material Gradients in R13

    PYTHON Development
    0
    8
    924
    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
      Helper
      last edited by

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

      On 21/02/2012 at 11:55, xxxxxxxx wrote:

      I've managed to convert most of my materials C++ code to python. But I'm having trouble with two things.
      1.- I can't figure out how to write the SetData() function in python
      2.- I can't figure out how to change the gradient's interpolation mode

      #2000 = 2D-U  
      #2001 = 2D-V  
      #2002 = 2D-Diagonal  
      #2003 = 2D-Radial  
      #2004 = 2D-Circular  
      #2005 = 2D-Box  
      #2006 = 2D-Star  
      #2007 = 2D-FourCorner  
      #2008 = 3D-Linear  
      #2009 = 3D-Cylindrical  
      #2010 = 3D-Spherical  
        
      import c4d  
      from c4d import gui  
      from c4d.modules import render  
        
      def main() :  
        mat = doc.GetFirstMaterial()  
        color = c4d.DescLevel(c4d.MATERIAL_COLOR_COLOR, c4d.DTYPE_COLOR)#The material's color channel  
        shdr = mat[c4d.MATERIAL_COLOR_SHADER]  #The shader inside the "texture" option  
        shdr[c4d.SLA_GRADIENT_TYPE]= 2000      #The "Type" option  
        shdr[c4d.SLA_GRADIENT_CYCLE] = True    #The "Cycle" option  
        shdr[c4d.SLA_GRADIENT_TURBULENCE]=0    #The "Turbulence" option  
        shdr[c4d.SLA_GRADIENT_SPACE]= 2021     #The "Space" option  
        
        
        grad = shdr[c4d.SLA_GRADIENT_GRADIENT] #The gradient GUI  
        count = grad.GetKnotCount()            #The number of gradient knots  
          
        k1 = grad.GetKnot(0)                   #Gets the first knot  
        k2 = grad.GetKnot(1)                   #Gets the second knot  
          
        k1['pos'] = 0.1                        #Changes the first knot's position in memory only  
        k2['pos'] = 0.8                        #Changes the second knot's position in memory only  
        k1['col'] = c4d.Vector(0.5, 0.1, 0.0)  #Changes the first knot's color in memory only  
        k2['col'] = c4d.Vector(1.0 , 1.0, 1.0) #Changes the second knot's color in memory only      
        
        #grad.SetKnot(0,k1)<-------Crashes!!!  
        
        #grad[c4d.GRADIENT_INTERPOLATION]<----Wrong!!...How do you change this option?  
        
        mat.Message(c4d.MSG_UPDATE )  
        mat.Update( True, True )        
        
        c4d.EventAdd()  
        
      if __name__=='__main__':  
        main()
      

      Can anyone shed a light on these two things?

      -ScottA

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

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

        On 22/02/2012 at 01:27, xxxxxxxx wrote:

        It's only possible to get / set the gradient data with GetData() and SetData(). So to retrieve the gradient interpolation we have to call:

        gradient.GetData(c4d.GRADIENT_INTERPOLATION)
        

        Which is c4d.GRADIENT_INTERPOLATION_SMOOTHKNOT by default (see customgui_gradient.h).
        Also SLA_GRADIENT_TYPE and SLA_GRADIENT_SPACE enums are defined in xs**gradient.res (** is la, don't know why this is replaced).

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

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

          On 22/02/2012 at 08:22, xxxxxxxx wrote:

          Hi Yannick,

          Something strange is going on.
          I cannot change the interpolation option using your code either:

          import c4d  
          from c4d import gui  
          def main() :  
            mat = doc.GetFirstMaterial()  
            color = c4d.DescLevel(c4d.MATERIAL_COLOR_COLOR, c4d.DTYPE_COLOR)#The material's color channel  
            shdr = mat[c4d.MATERIAL_COLOR_SHADER]  #The shader inside the "texture" option  
            shdr[c4d.SLA_GRADIENT_TYPE]= 2000      #The "Type" option  
            shdr[c4d.SLA_GRADIENT_CYCLE] = True    #The "Cycle" option  
            shdr[c4d.SLA_GRADIENT_TURBULENCE]=0    #The "Turbulence" option  
            shdr[c4d.SLA_GRADIENT_SPACE]= 2021     #The "Space" option  
            
            
            grad = shdr[c4d.SLA_GRADIENT_GRADIENT] #The gradient GUI  
            count = grad.GetKnotCount()            #The number of gradient knots  
              
            k1 = grad.GetKnot(0)                   #Gets the first knot  
            k2 = grad.GetKnot(1)                   #Gets the second knot  
              
            k1['pos'] = 0.1                        #Changes the first knot's position in memory only  
            k2['pos'] = 0.8                        #Changes the second knot's position in memory only  
            k1['col'] = c4d.Vector(0.5, 0.1, 0.0)  #Changes the first knot's color in memory only  
            k2['col'] = c4d.Vector(1.0 , 1.0, 1.0) #Changes the second knot's color in memory only      
            
            #grad.SetKnot(0,k1)<-------Crashes!!!  
            
            grad.SetData(c4d.GRADIENT_INTERPOLATION, c4d.GRADIENT_INTERPOLATION_SMOOTHKNOT)#<---Does Not work!!!  
            print grad.GetData(c4d.GRADIENT_INTERPOLATION) #<---Always results in 2..It never changes!!!  
            
            mat.Message(c4d.MSG_UPDATE )  
            mat.Update( True, True )        
            
            c4d.EventAdd()  
            
          if __name__=='__main__':  
            main()
          

          I even tried the C++ way too:
          grad.SetData(c4d.GRADIENT_INTERPOLATION, c4d.GRADIENTSUBCHANNEL_INTERPOLATION_SMOOTHKNOT)

          And what about SetKnot()?
          I cannot get that function to work. Even when I use it in it's most basic form:
          -grad.SetKnot(0,['pos'] = 1.5)
          -grad.SetKnot(0,pos = 1.5)
          -etc...
          I've tried a bunch of different things. But I cannot figure out the proper way to write this function either.

          -ScottA

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

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

            On 22/02/2012 at 12:52, xxxxxxxx wrote:

            Originally posted by xxxxxxxx

             
            grad.SetData(c4d.GRADIENT_INTERPOLATION, c4d.GRADIENT_INTERPOLATION_SMOOTHKNOT)#<---Does Not work!!!  
            print grad.GetData(c4d.GRADIENT_INTERPOLATION) #<---Always results in 2..It never changes!!!  
            

            GRADIENT_INTERPOLATION data value is GRADIENT_INTERPOLATION_SMOOTHKNOT by default which value is 2 so this is normal 🙂.
            Try to set the gradient interpolation to GRADIENT_INTERPOLATION_LINEARKNOT which value is 3 and you'll see that it changes.

            Originally posted by xxxxxxxx

            And what about SetKnot()?
            I cannot get that function to work. Even when I use it in it's most basic form:
            -grad.SetKnot(0,['pos'] = 1.5)
            -grad.SetKnot(0,pos = 1.5)
            -etc...
            I've tried a bunch of different things. But I cannot figure out the proper way to write this function either.

            I contacted the developers on this issue.

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

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

              On 22/02/2012 at 13:47, xxxxxxxx wrote:

              Yes.This will change it..... But in memory only:
              grad.SetData(c4d.GRADIENT_INTERPOLATION, c4d.GRADIENT_INTERPOLATION_SMOOTHKNOT)
              If I change that attribute by hand to something else. The attribute itself does not change. And I'm already using C4D.Event() and c4d.MSG_UPDATE in my code. Making this useless until I know how to actually execute the changes that are stored in memory.

              Being able to use the SetKnots() is actually a lot more important to me.
              Thank you for taking it to the developers. And as always...Thanks for your efforts.

              -ScottA

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

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

                On 23/02/2012 at 02:09, xxxxxxxx wrote:

                To edit a Gradient data (knots, interpolation, mode etc.) it needs to be reassigned. So your code would be:

                grad = shdr[c4d.SLA_GRADIENT_GRADIENT] # Get the existing gradient data
                  
                grad.FlushKnots()
                grad.InsertKnot(col=c4d.Vector(0.5, 0.1, 0.0), pos=0.1)
                grad.InsertKnot(col=c4d.Vector(1.0 , 1.0, 1.0), pos=0.8)
                  
                shdr[c4d.SLA_GRADIENT_GRADIENT] = grad # Assign the edited gradient data so it's updated by C4D
                
                1 Reply Last reply Reply Quote 0
                • H
                  Helper
                  last edited by

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

                  On 23/02/2012 at 09:02, xxxxxxxx wrote:

                  Ahhaaaa!!!
                  shdr[c4d.SLA_GRADIENT_GRADIENT] = grad <--That's the sucker I was looking for. 👍

                  Now I can get everything to update properly.
                  Here is a full working example in case anyone needs it:

                  import c4d  
                    
                  def main() :  
                    
                    # First we get the material we want to work with  
                    
                    mat = doc.GetFirstMaterial()           #Gets the first material in the materials manager  
                    color = c4d.DescLevel(c4d.MATERIAL_COLOR_COLOR, c4d.DTYPE_COLOR)#The material's color channel  
                    
                    
                    # Now lets grab the gradient(also known as "Xlsagradient") that is already there in the color channel  
                    # We are not creating that gradient with code in this example..So it needs to be there already  
                    
                    shdr = mat[c4d.MATERIAL_COLOR_SHADER]  #The shader inside the "texture" option  
                    shdr[c4d.SLA_GRADIENT_TYPE]= 2000      #The "Type" option...ID's are found in the xlsagradient.h file  
                    shdr[c4d.SLA_GRADIENT_CYCLE] = True    #The "Cycle" option  
                    shdr[c4d.SLA_GRADIENT_TURBULENCE]=0    #The "Turbulence" option  
                    shdr[c4d.SLA_GRADIENT_SPACE]= 2021     #The "Space" option...ID's are found in the xlsagradient.h file  
                    
                    
                    # Now lets drill into the gradient shader to control the knots, interpolation, and color bar  
                    
                    grad = shdr[c4d.SLA_GRADIENT_GRADIENT] #Get the gradient GUI and assign it to a variable   
                    grad.FlushKnots()                      #Delete all existing knots  
                    k1 = grad.InsertKnot(col=c4d.Vector(0.5, 0.1, 0.0), pos=0.0,index = 0)  #Creates the first knot  
                    k2 = grad.InsertKnot(col=c4d.Vector(1.0 , 1.0, 1.0), pos=1.0,index= 1)  #Creates the second knot  
                    
                    k1 = grad.GetKnot(k1)  #Get the first knot so we can read it's dictionary values  
                    k1pos = k1['pos']      #The position of the knot from the dict value 'pos'  
                    k1col = k1['col']      #The color of the knot from the dict value 'col'  
                          
                    k2 = grad.GetKnot(k2)  #Get the second knot so we can read it's dictionary values  
                    k2pos = k2['pos']      #The position of the knot from the dict value 'pos'  
                    k2col = k2['col']      #The color of the knot from the dict value 'col'  
                      
                    k3 = grad.InsertKnot(col=k1col+k2col/2, pos=k1pos+k2pos/2) #Create a new knot using the other knot's values  
                    
                    
                    
                  # Now lets change the position of the first knot's handle(diamond shape attribute) to this new value  
                    
                    k1pos = 0.3              
                    grad.SetKnot(index=0,pos=k1pos)        #Set the handle to this new value  
                    
                    grad.SetData(c4d.GRADIENT_INTERPOLATION, c4d.GRADIENT_INTERPOLATION_CUBICKNOT) #Change the interpolation  
                    
                    shdr[c4d.SLA_GRADIENT_GRADIENT] = grad #Update the gradient data we changed  
                    mat.Message(c4d.MSG_UPDATE )           #Update the material changes  
                    mat.Update( True, True )               #Update the material's icon image        
                    
                    c4d.EventAdd()                         #Update C4D so things update quickly  
                    
                  if __name__=='__main__':  
                    main()
                  

                  Thanks so much Yannick.🍺
                  ScottA

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

                    On 27/04/2016 at 09:04, xxxxxxxx wrote:

                    Thanks a lot guys !!!!!!!!!!!!!!!!!!!!!!

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