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 ) c4d.EventAdd() if __name__=='__main__': 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: knotBc[c4d.GRADIENTKNOT_INTERPOLATION] = c4d.GRADIENT_INTERPOLATION_NONE # 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 newMat.InsertShader(newShader) # Insert material in the doc doc.InsertMaterial(newMat) # Update the document c4d.EventAdd() if __name__=='__main__': main()
If you have any question, please let me know.
Cheers,
Maxime. -
yeah! I got it!
Thank you very much!