Parametric design in MoI?

 From:  Max Smirnov (SMIRNOV)
7713.395 
Just finished my supper :) Now I'm ready to explain how to write nodes for the last version of nodeeditor.

this is an example. check the comments
code:
function Star() // let's make a new node
{
	this.addInput("Center","pointarray");		// input 0, type: pointarray
	this.addInput("Radius","numarray");		// input 1, type: numarray. In fact it's just a common numeric array like [1,2,3,4,5]
	this.addInput("Ratio","numarray");		// input 2, type: numarray
	this.addInput("Sides","numarray");		// input 3, type: numarray
	this.addOutput("Out","objectlist");		// output 0, type: objectlist
	this.properties = { mode:["Long","Long","Short"], radius:[1], ratio:[0.4], sides:[5] };
	// each node has two types of properties. both of them will stored when you save a .nod file, or clone a node
	// there  are only one difference: .properties is shown in nodeinfo panel and .internal is hidden
	// string arrays like mode:["Long","Long","Short"] will be processed as a droplist. First value "Long" points to selected value. Other ones is available values: "Long", "Short".
	// numeric arrays will be processed as numarrays
}

Star.title = "Star";	// default title
Star.desc = "Star";	// legacy litegraph parameter. At the moment I don't use it.

Star.prototype.onExecute = function()	// this function will run on node execution command
{
	var data = this.processInOut(this.properties.mode[0], this.multiProcess, null, this.properties.radius, this.properties.ratio, this.properties.sides);
	// .processInOut function processes input arrays and creates output arrays
	// first parameter: (string) array processing mode. 
	// modes supported:
	// Short, Long as described above in my post
	// Short+, Long+ same as  Short, Long, but objectarray will be processed as one element
	// Long# same as Long, but pointarray will be processed as one element
	// second parameter: callback function which will be called for processing of each value set (important!)
	// other parameters is optional. it's a default values for each input, which will be used if the input is not connected
	// you may skip it or set it to null. in this case processInOut function will generate default value automatically.
	// autovalue for numarray: [0]
	// autovalue for pointarray: (0,0,0)
	// autovalue for objectlist: empty objectlist
	// if you want to use another values, you need to set them directly like in this example:
	// null - autovalue(0,0,0),  this.properties.radius - [1],  this.properties.ratio - [0.4],  this.properties.sides - [5]
	
	// this function returns structure { inputs:[ input0, input1, ... input n], outputs:[output0, output1, ... output n]}
	// input0, input1, ... input n  - if the input connected, it wil return connected node data
	// output0, output1, ... output n  - returns concated output data generated by callback function for each output
	
	this.properties.radius = data.inputs[1];  // you can update properties values if input data is changed
	this.properties.ratio = data.inputs[2];
	this.properties.sides = data.inputs[3];
	this.setOutputData(0, data.outputs[0]); // set node output data
}

Star.prototype.multiProcess = function(center, r, rt, s) // callback function which will be called for processing of each value set (center = input0, r = input1, rt = input2, s = input3)
{
	// object array data will be sent as objectarray with one object (except Long+ Short+ modes)
	// point array data will be sent as pointarray with one object (except Long# mode)
	// numarray data will be sent as number
	
	var frame = center.getFrame();  // center.getFrame() = center.getFrame(0);
	return [factory( 'polygonstar', frame, frame.evaluate( 0, r, 0 ), s, frame.evaluate( 0, r*rt, 0 ))];
	// this function should return array [ output0, output1, ... output n ]
	// return [factory( 'polygonstar', frame, frame.evaluate( 0, r, 0 ), s, frame.evaluate( 0, r*rt, 0 ))] 
	// is the same as
	// var outputs = [];
	// outputs[0] = factory( 'polygonstar', frame, frame.evaluate( 0, r, 0 ), s, frame.evaluate( 0, r*rt, 0 ));
	// return outputs;
	// if node has more than one output you nned to set outputs[1], outputs[2] .. etc
	// correct output[n] data is objectlist / pointarray / number
}

LiteGraph.registerNodeType("Curves/Star", Star);