Parametric design in MoI?
 1-19  …  300-319  320-339  340-359  360-379  380-399  …  900-912

Previous
Next
 From:  mkdm
7713.340 In reply to 7713.339 
Hi James,

i agree with you.

It would be very useful having the possibility to use a bunch of classic input controls inside nodes,
like radiobuttons and checkboxes.

In my garbage time i'm testing some javascript code that goes in that direction.

But i think that until Max will not release a new updated version of Nodeeditor, all these idea are only valid as a javascript developing practise...

Nice day,

Marco.
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  mkdm
7713.341 
Hi everyone!

here's the new code of my "PatternSelArray" and "ArrayReplicator".

The attached pictures show a simple example.

If you find bugs and errors, please, let me know...

Nice evening to all,

Marco (mkdm)

code:
// PatternSelectArray
function PatternSelArray()
{	
	this.size = [160,70];
	this.minsize = [160,70];
	
	this.addInput("In","pointarray");
	this.addInput("Start_Idx","number");
	this.addInput("Qt_Max","number");
	this.addInput("Step","number");		
	
	this.addOutput("Out","pointarray");
	this.addOutput("Elems","number");
	this.addOutput("Source","pointarray");
	
	this.properties = { mode:["Pattern + Subset", "Pattern + Subset", "Subset + Pattern"],
		pattern:"",
		start_idx:0,
		qt_max:-1,
		step:1 };
	
}

PatternSelArray.title = "PatternSelArray";
PatternSelArray.desc = "PatternSelArray";

PatternSelArray.prototype.onExecute = function()
{		
	/*
		source = the source array
		start_idx = index of the first element to pick
		numMaxElem = max number of elements that will be present in the resulting array
		step = step amount for the for..loop
	*/
	var getPointArraySection = function(source, start_idx, numMaxElem, step) {

		var result = new pointArray();
		
		if (source) {
			var sourceLength = source.getLength();
			for (i = start_idx, cont = 0; i < sourceLength && cont < numMaxElem; i += step, cont++) {
				var source_elem = source.getElement(i);
				
				result.push(source_elem.pt.x,
					source_elem.pt.y,
					source_elem.pt.z,
					source_elem.AngleX,
					source_elem.AngleY,
					source_elem.AngleZ,
					source_elem.Size);
			}
		}
		return result;
	}

	/*
		source = the source array
		pattern = string that define the selection pattern
			1 or + = pick element
			0 or - = skip element
	*/	
	var applyPatternToPointArray = function(source, pattern)
	{
		function ResultObj(pattern) {
			this.array = new pointArray();
			this.pattern = pattern;
		}

		var usePattern = false;
		var isMixedPattern = false;			
		var result = new ResultObj(pattern);
		
		if (pattern) {
			result.pattern = pattern.trim();
			
			// check the pattern
			if (result.pattern != '') {
				// check if pattern contains valid characters
				usePattern = result.pattern.match('^[+\-0-1]+$');
				
				if (usePattern) {
					// check if pattern contains only include characters (+ or 1)
					usePattern = !result.pattern.match('^[+1]+$');
					
					if (usePattern) {
						// if pattern contains both include and exclude characters, then the pattrn will be used
						// otherwise it means that contains only exclude characters (- or 0), and therefore
						// the output pointarray list will be empty
						isMixedPattern = !result.pattern.match('^[\-0]+$');
					}
				}
			}
		}

		if (usePattern) {
			if (isMixedPattern) {
				var len = source.getLength();
				var patLen = result.pattern.length;
				var cn = 0;
				
				for (i = 0; i < len ; i++) {
					if ( result.pattern[cn] === '1' || result.pattern[cn] === '+') {
								
						var source_elem = source.getElement(i);
						
						result.array.push(source_elem.pt.x,
							source_elem.pt.y,
							source_elem.pt.z,
							source_elem.AngleX,
							source_elem.AngleY,
							source_elem.AngleZ,
							source_elem.Size);
					}
					cn = (cn < (patLen - 1)) ? (cn + 1) : 0;
				}
			}
		} else {
			// elaborate the whole source pointarray
			result.pattern = '';
			result.array = source;		
		}

		return result;
	}

	// Business logic
	var source = this.getInputData(0, new pointArray());
	
	this.properties.start_idx = this.getInputData(1, this.properties.start_idx);
	this.properties.qt_max = this.getInputData(2, this.properties.qt_max);
	this.properties.step = this.getInputData(3, this.properties.step);

	if (this.properties.step <= 0) this.properties.step = 1;
	
	var patternedArray;
	var outputIntermediate;
	var outIntermLength;
	
	if (this.properties.mode[0] == "Pattern + Subset") {
		patternedArray = applyPatternToPointArray(source, this.properties.pattern);		
		outputIntermediate = patternedArray.array;		
		outIntermLength = outputIntermediate.getLength();
	} else {
		outputIntermediate = source;
		outIntermLength = source.getLength();
	}

	if ((this.properties.start_idx < 0) || (this.properties.start_idx > (outIntermLength - 1))) this.properties.start_idx = 0;
	
	if (this.properties.qt_max < 0) this.properties.qt_max = outIntermLength;
	
	outputIntermediate = getPointArraySection(outputIntermediate,
						this.properties.start_idx,
						this.properties.qt_max,
						this.properties.step);

	if (this.properties.mode[0] == "Subset + Pattern") {
		patternedArray = applyPatternToPointArray(outputIntermediate, this.properties.pattern);
		
		outputIntermediate = patternedArray.array;
		
		outIntermLength = outputIntermediate.getLength();
	}
						
	this.properties.pattern = patternedArray.pattern;
	patternedArray = null;
	
	this.outputs[0].label = "Out (" + outputIntermediate.getLength() + ")";
	this.outputs[1].label = "Elems (" + outputIntermediate.getLength() + ")";
	this.inputs[0].label = "In (" + source.getLength() + ")";
	
	this.setOutputData(0, outputIntermediate);
	this.setOutputData(1, outputIntermediate.getLength());
	this.setOutputData(2, source);
	
}

LiteGraph.registerNodeType("Arrays/PatternSelArray", PatternSelArray);

// ArrayReplicator
function ArrayReplicator()
{
	this.labels = "abcdef";
	this.size = [140,40];
	this.minsize = [140,40];

	this.internal = {a:1, b:1};
	
	this.addInput("In","pointarray");
	
}

ArrayReplicator.title = "Array Replicator";
ArrayReplicator.desc = "Array Replicator";

ArrayReplicator.prototype.onGetOutputs = function()
{
	var list = [];
	for ( var i = 0; i<this.labels.length; i++ )
	{
		var out = this.labels.charAt(i);
		if ( !(out in this.internal)) { list.push([this.labels.charAt(i),"pointarray", {locked:true}]); break; }
	}
	return list;
}

ArrayReplicator.prototype.onOutputAdded = function(out)
{
	this.internal[out.name] = 1;
	for ( var i in this.outputs ) this.outputs[i].locked = true;
	if (i>1) this.outputs[i].locked = false;
}

ArrayReplicator.prototype.onOutputRemoved = function(slot, name)
{
	if ( this.internal[name] ) delete this.internal[name];
	for ( var i in this.outputs ) this.outputs[i].locked = true;
	if ( this.outputs.length > 2 )this.outputs[i].locked = false;
}

ArrayReplicator.prototype.onAdded = function()
{
	for ( var i = 0; i<this.labels.length; i++ ) if ( this.internal[this.labels.charAt(i)] && this.outputs.length == i ) this.addOutput(this.labels.charAt(i), "pointarray");
	this.setDirtyCanvas(true);
}

ArrayReplicator.prototype.onExecute = function()
{
	var source = this.getInputData(0, new pointArray());

	this.inputs[0].label = "In (" + source.getLength() + ")";
	
	for ( var i = 0; i<this.outputs.length; i++)
	{
		this.setOutputData(i, source);
	}	
}

LiteGraph.registerNodeType("Arrays/ArrayReplicator", ArrayReplicator);
Image Attachments:
Size: 155.3 KB, Downloaded: 89 times, Dimensions: 1522x822px
Size: 1.1 MB, Downloaded: 113 times, Dimensions: 1918x1035px
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  Frenchy Pilou (PILOU)
7713.342 
Cool thing to have all possible nodes in one wink!
---
Pilou
Is beautiful that please without concept!
My Gallery
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  Max Smirnov (SMIRNOV)
7713.343 
Hi guys!
Sorry, I didn't write a line of code this week. I was so busy at work.
Maybe next week I'll continue developing of this project.

Marco, this ArrayReplicator looks good, but it will be better if we use a multiple output connections. ;)

EDITED: 7 Mar 2022 by SMIRNOV

  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  mkdm
7713.344 In reply to 7713.343 
Hi Max,

> Marco, this ArrayReplicator looks good, but it will be better if we use a multiple output connections. ;)

I totally agree with you!

While waiting your next NodeEditor release, i'm still playing with array nodes, and after "PatternSelArray" and "ArrayReplicator",
i'm thinking to write :
- "ArrayShuffler" : shuffle the elements inside one array
- "ArrayInspector" : it should output to a textarea, the numeric values of all array elements. Useful for debugging purposes.
- "ArrayExporter" : it should output to a file, the numeric values of all array elements.
- "RandomArray" : In should generate random points inside a 3d cube area.

These ideas are nothing more then a funny and simple javascript programming practice for me,
simple ideas that you might find interesting.

Nice night to all,

Marco.
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  Karsten (KMRQUS)
7713.345 In reply to 7713.343 
Hello Max,

the main thing , you are well . I enjoy the break:-)

Have a nice weekend
Karsten
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  bemfarmer
7713.346 
Here is a lighter color for the Canvas.
Under nodeeditor/core/imgs, save the original grid.png, and replace it with the lighter grid.png.

The colors of the original grid was inverted. This was done with Gimp2, or with Greenfish Icon Editor Pro (GFIE).
The lighter colors were swapped with GFIE. GFIE does not compress the PNG, so PNGGauntlet was used to shrink the PNG file size.

A button to select the grid colors might be nice, as well as an even lighter grid for printing.

- Brian (Grid.png removed as it is no longer used.)


EDITED: 18 Mar 2017 by BEMFARMER

  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  bemfarmer
7713.347 In reply to 7713.346 
I made an even lighter grid, but the cursor is almost invisible. :-(

The few icon/png editors I've tried have been difficult to use as well.

- Brian
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  bemfarmer
7713.348 In reply to 7713.346 
. So how do I delete a message?

- Brian
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  Michael Gibson
7713.349 In reply to 7713.348 
Hi Brian,

re:
> . So how do I delete a message?

In the bottom right corner of a message there's a "more" link and if you click it a menu will pop out with a "Delete" link on it.

If that doesn't work, just give a link to the message you want to delete and I can do it for you too.

- Michael
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  bemfarmer
7713.350 In reply to 7713.349 
Thank you Michael.
(I've been unable to delete from the edit window.)
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  Karsten (KMRQUS)
7713.351 In reply to 7713.348 
Hello Brian,
dont't delete the message. The cursor can be customized with e.g. Gimp. Take a cursor example (also png) from this thread and change form and color and share it also, please.

Have a nice day
Karsten
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  bemfarmer
7713.352 In reply to 7713.351 
To switch to an arrow cursor, locate the litegraph.css file under nodeeditor\css\, and change "crosshair" to "default", without the quote marks.
(Line 4)

https://css-tricks.com/almanac/properties/c/cursor/

Attached is a lighter grid.png replacement for the canvas. In the canvas display it still seems to be relatively dark.

The Wand selector of the Greenfish Icon editor cannot distinguish between two different tints and/or tones and/or shades, which are nearly the same .
This makes it hard to select the proper areas of the grid.png for editing.

The Wand selector of the IcoFX2 icon editor can so distinguish, but does not do Hex colors. Setting one of the two colors of Grid.png to a very different color allows the .png to be edited in the Greenfish Icon editor, which does do Hex colors.

- Brian

Grid.png removed as no longer needed.

EDITED: 18 Mar 2017 by BEMFARMER

  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  mkdm
7713.353 
Hi everyone,

While waiting the next official NodeEditor release by Max, here's my the first stable version (0.1) of some nodes i wrote :

N.B. these nodes requires the latest v.0.65b version of Max's NodeEditor.

- "PatternSelArray" : returns a PointArray, made by a patterned+subset selection of the input PointArray's element

- "ArrayShuffler" : returns a PointArray, by shuffling the elements inside the input PointArray (RMB -> Update : generate a new random shuffle)
For example, it may be useful to create objects like ball of wool.

- "ArrayFlipper" : returns a PointArray, made by flipping the elements of the input PointArray

- "ArrayLogger" : Outputs to a textarea the content of the input PointArray. It's useful for debugging.
You can copy/paste the textarea's content, to a text editor, in order to better view all the text.
Every line of text contains the full data of each point present in the input PointArray, separated by a single space :
X Y Z AngleX AngleY AngleZ Size

- "ArrayReplicator" : Replicates the input PointArray. It may be useful only in order to keep the graph cleaner.

In order to use these new nodes, follow these steps :

1) copy the "arraysExt.js" file into the "nodes" folder of NodeEditor
2) copy the "litegraphExt.js" file into the "core" folder of NodeEditor
3) add these lines of code to the "index.html" file of NodeEditor

code:
<script type="text/javascript" src="core/litegraphExt.js"></script>
<script type="text/javascript" src="nodes/arraysExt.js"></script>


I hope that you will find these nodes useful.

Please, let me know if you will find bugs.

Nice day to all!

Marco (mkdm)

EDITED: 30 May 2016 by MKDM


Image Attachments:
Size: 75.3 KB, Downloaded: 49 times, Dimensions: 968x704px
Size: 176 KB, Downloaded: 96 times, Dimensions: 1721x971px
Size: 2.1 MB, Downloaded: 87 times, Dimensions: 1920x1034px
Size: 155.6 KB, Downloaded: 58 times, Dimensions: 1720x967px
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  Karsten (KMRQUS)
7713.354 In reply to 7713.353 
Hello Marco,

Thank You very much for sharing. I have tested some nodes and for now, everything works fine. Especially the ArrayLogger will help to debug while programming and also while using the nodeeditor. I'm very curious what's comming next.

Have a nice day
Karsten
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  mkdm
7713.355 In reply to 7713.354 
Hi Karsten,

I'm glad to know that you appreciated my little contribution and also that you haven't found some strange bugs...

Currently i'm working on a node that will be called "ArraySketcher".
It will process a PointArray and, following some criteria, it will use the array elements to draw some basic geometry objects :

"Triangles", "Quads", "Curve", "Interpcurve", "Arc3pt", "Circle3pt", "Rect3pts", "EllipseDiam","EllipseCen" and some others...

I also wrote "PatternSelObjects" node, that does the same things of "PatternSelArray", but with it,
it's possible to operate on a ObjectList rather than a PointArray.

I hope to post soon these new nodes.

Thank you for your reply and have a nice day!

Marco (mkdm).

EDITED: 31 May 2016 by MKDM

  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  Frenchy Pilou (PILOU)
7713.356 
I believe that must be easy but I am a little stucked in the nodal world! :)
http://moiscript.weebly.com/uploads/3/9/3/8/3938813/nodal_problemo.zip
(no nodal file inside) Curve can be any flat curve like a Sinusoïde etc...Hllow object can be any thing like a bowl etc...



I make a "Flat Extrude" +"Vertical Extrude" because "Shell" is not yet implemented (Vertical Extrude Line + Shell)

All that for simulate this function! :)
Minute 25.00 - 25.54

EDITED: 6 Jun 2016 by PILOU

  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  bemfarmer
7713.357 
After much study learning how the Motor2.nod works, I did a documentation PDF.

Also, there were 3 miscellaneous observations of very minor concern:

1. The first rotate node has input label "In" instead of "Objects." (This is apparently an old version leftover?)

2. Regarding arcsin (asin), the order of mathematical operation appears to be
nonstandard. (An additional set of () was added around the asin opperands.)

3. The Rotate nodes Z angle inputs are obeying the "Left Hand Rule," rather than the "Right Hand Rule." (OK I guess)

4. Increasing positive angle results in Clockwise rotation. (OK)

- Brian

The Word to PDF conversion makes the SnagIt MoI PNG blurry :-(
So I need a different way to make the PNG?
Edit: Updated PDF with new Figure 1 PNG from CustomUI Snapshot Right Click, and added a couple of sentences.

EDITED: 8 Jun 2016 by BEMFARMER

Attachments:

  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  Frenchy Pilou (PILOU)
7713.358 In reply to 7713.357 
Enlighting!


<<So I need a different way to make the PNG?
You have no choice to make different level of rendering image at the begining of the PDF process?
Seems remember that ...but a long time that i don't made a PDF! (i have not more this program)

Blurry for me only when you make a big zom!

French translation of your Tutorial in a few days! :)
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged

Previous
Next
 From:  bemfarmer
7713.359 In reply to 7713.358 
Thanks PILOU,

I updated the PDF a little bit.

- Brian
  Reply Reply More Options
Post Options
Reply as PM Reply as PM
Print Print
Mark as unread Mark as unread
Relationship Relationship
IP Logged
 

Reply to All Reply to All

 

 
Show messages:  1-19  …  280-299  300-319  320-339  340-359  360-379  380-399  400-419  …  900-912