drag parameter to user data field like in console
-
On 28/03/2017 at 02:26, xxxxxxxx wrote:
I'm trying to do something cheeky here, wondering if its possible.
I want to make a python tag which performs an action on an object's parameters, but the user can define which parameter it is performed on by just dragging the parameter into a user data field;
exactly like how we can drag a parameter or object into our python scripts or console.
I thought I could do this with a string field but it doesn't let me, link field doesn't either.What makes the console input field so special, is there any way this could be done?
cheers! -
On 29/03/2017 at 05:23, xxxxxxxx wrote:
Hi,
The Console input is an edit text that processes the drag and drop events for parameters. Same for the Script Manager except it's a multi-line edit text.
You can create a String user data that uses the Multi-Line String Interface in Python mode (Check PYTHON in Details tab). The Multi-Line String GUI accepts dragged parameters.
In code, DESC_CUSTOMGUI would be set to CUSTOMGUI_STRINGMULTI and DR_MULTILINE_PYTHON to 1.Then in the Python tag you can evaluate a dynamically built expression string generated with the String user data that contains the parameter ID.
Here's some code:import c4d def main() : obj = op.GetObject() data = obj[c4d.ID_USERDATA,1] # Evaluates the parameter ID string # Returns a list of integers for the description levels paramID = eval(data) print paramID # Builds the expression obj[ID] expr = "obj" + data paramValue = eval(expr) print paramValue
-
On 30/03/2017 at 11:39, xxxxxxxx wrote:
Hey thank you that works great!
I can now get the value of the dragged in parameter.
But, if you wanted to set the evaluated parameter, how would you proceed? -
On 31/03/2017 at 07:25, xxxxxxxx wrote:
Originally posted by xxxxxxxx
But, if you wanted to set the evaluated parameter, how would you proceed?
You can set the evaluated parameter with obj ->SetParameter( id, data, flags ).
SetParameter() needs a complete DescID (with the DescLevel dtype filled) to effectively set a parameter.
To get a full DescID, the best solution is to use Description.CheckDescID() (function added in R18).Here's some code:
import c4d def main() : obj = op.GetObject() data = obj[c4d.ID_USERDATA,1] param = eval(data) desc = obj.GetDescription(c4d.DESCFLAGS_DESC_0) if desc is None: return partialID = c4d.DescID() for level in param: partialID.PushId(c4d.DescLevel(level)) completeID = desc.CheckDescID(partialID, [obj]) if completeID is None: return obj.SetParameter(completeID, 100, c4d.DESCFLAGS_SET_0)
-
On 31/03/2017 at 11:19, xxxxxxxx wrote:
This really exciting, it works perfectly.
I don't quite grasp whats happening with all this ID stuff, I need to read up on it!
Thanks again!