Editing Material Gradients in R13
-
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
-
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). -
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
-
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.
-
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
-
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
-
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 -
On 27/04/2016 at 09:04, xxxxxxxx wrote:
Thanks a lot guys !!!!!!!!!!!!!!!!!!!!!!