how to insert a gradiet with step interperation?

  • hello!
    i want to insert a gradient with step interperation.
    but this code"grad.SetData(c4d.GRADIENT_INTERPOLATION, c4d.GRADIENT_INTERPOLATION_NONE)"seems don't work.
    i want to know where do i made a mistake?
    this is my code:

    import c4d
    from c4d import gui
    def main():
        newMat=c4d.BaseMaterial(c4d.Mmaterial)             #create a new material
        newShader=c4d.BaseShader(c4d.Xgradient)            #create a new gradient shader 
        newShader[c4d.SLA_GRADIENT_TYPE]=2001              #change type to 2D-v 
        grad=newShader[c4d.SLA_GRADIENT_GRADIENT]       #get the gradient gui
        grad.SetData(c4d.GRADIENT_INTERPOLATION, c4d.GRADIENT_INTERPOLATION_NONE) #Change the interpolation
        newShader[c4d.SLA_GRADIENT_GRADIENT]=grad           #reassigned the gradient
        newMat[c4d.MATERIAL_COLOR_SHADER]=newShader         #gradient to color channel
        newMat.InsertShader(newShader)                      #insert shader
        doc.InsertMaterial(newMat)                          #insert material
        newMat.Message(c4d.MSG_UPDATE )
        newMat.Update( True, True )
    if __name__=='__main__':

  • Hi, @milkliu, unfortunately, the documentation was not updated to R20 change of the Gradient class.
    But this will be done for the next release.

    With that's said, now as you may have seen, Interpolation are stored per knot and not global to the whole gradient. So after R20 Cinema4D have a GRADIENT_KNOT BaseContainer which holds all knots information.
    Here a full example to use it.

    import c4d
    def main():
        # Create a new material
        newMat = c4d.BaseMaterial(c4d.Mmaterial)
        # Create a new gradient shader 
        newShader = c4d.BaseShader(c4d.Xgradient)
        # Change type to 2D-v 
        newShader[c4d.SLA_GRADIENT_TYPE] = c4d.SLA_GRADIENT_TYPE_2D_V
        # Get the Gradient gui
        grad = newShader[c4d.SLA_GRADIENT_GRADIENT]
        # Get the BaseContainer for all Knots
        bcAllKnots = grad.GetData(c4d.GRADIENT_KNOT)
        # Iterate over the knots and define their interpolations to linear
        for k, knotBc in bcAllKnots:
        # Set the position of the second knot to 0,5
        # We use GetIndexData/SetIndexData because all knot basecontainer get 0 as Id.
        knotBc = bcAllKnots.GetIndexData(1)
        knotBc[c4d.GRADIENTKNOT_POSITION] = 0.5
        bcAllKnots.SetIndexData(1, knotBc)
        # Then we push back our modification to the basecontainer stored in the Gradient Gui
        grad.SetData(c4d.GRADIENT_KNOT, bcAllKnots)
        # Reassigned the gradient
        newShader[c4d.SLA_GRADIENT_GRADIENT] = grad
        # Gradient to color channel
        newMat[c4d.MATERIAL_COLOR_SHADER] = newShader
        # Insert shader into the mat
        # Insert material in the doc
        # Update the document
    if __name__=='__main__':

    If you have any question, please let me know.

  • yeah! I got it!
    Thank you very much!

Log in to reply