MoI discussion forum
MoI discussion forum

Full Version: Getting all points of a curve using a script

Show messages:  1-6  7-26  27-42

From: Michael Gibson
6 Nov 2013   [#7] In reply to [#6]
Hi Martin, you should probably be able to find some CAM program that would take in curves and generate toolpath data like you're looking for... Maybe someone with CAM experience will be able to point you towards an already existing solution for this.

> I thought REBUILD generates new points on a freeform curve or arc but now I see that it only generates more control points.

Rebuild generates points on the curve, and then creates a new curve that interpolates those points. It's basically like doing Curve > Freeform > "Through points" and drawing a new curve with the points to interpolate snapped onto the existing curve.

But yes it does generate a smooth curve as the result and not a polyline curve as the result like I think you're looking for?


> The points on the right are not control points but "real" points drawn by hand using the multi line tool. Is this possible?

If you want to generate a bunch of equally spaced points along a curve, you can get that by drawing in one point object at the start of the curve and then using Transform > Array > Curve to replicate that point along the curve.

There is an older and different version of Rebuild that is made with a script that internally uses this array point technique to generate the points, and it may have an option to generate a polyline for the points, check that out here:
http://kyticka.webzdarma.cz/3d/moi/#ReconstructCurve

- Michael
From: blowlamp
6 Nov 2013   [#8]
I'm with Michael here. If you want to generate toolpath data for your router such as G-code, then all you need is a CAM program.

My main workhorse and what I recommend is CamBam, both for its ease of use and general capability for 2d and 3d work - cost is £93 or $149. Other free CAM programs are available too, if that is what you want.

I can send you some sample G-code if you tell me what you're after.


Martin.
From: Frenchy Pilou (PILOU)
6 Nov 2013   [#9]
You can also export your polyline for Sketchup and then use some plugins for save your points on an excel's file for example or STL for CAM... :)
From: Martin (MARTIN3D)
6 Nov 2013   [#10] In reply to [#7]
Hi Michael,

>If you want to generate a bunch of equally spaced points along a curve, you can get that by drawing in one point object at the start of the curve and then using Transform > Array > Curve to replicate that point along the curve.

thank you, that's great and does exactly what I need. Getting point object coordinates by script is even easier to do . I'll also take a look at the reconstruct command.


@all
Thanks for the help with CAM software but I'm somewhat peculiar using my own very simple CNC controller based on an Arduino UNO. So no G-Code spoken here just up(); down() and go(x,y); :-) I don't need more to cut simple shapes with the router. Currently I'm using Illustrator and a script to get "tool path" data it works well but I like MoI better and it looks like I'm able to use it now for that.

Update: Just tried reconstructCurve with it's polyline option. It does exactly what I need!
From: bemfarmer
6 Nov 2013   [#11] In reply to [#10]
Grbl is free G-code interpreter software to use with an Arduino,
for CNC milling control.
A low cost "shield" is also available, which is a stepper driver...

http://makezine.com/2010/06/14/grbl-an-arduino-based-g-code-interp/

http://dank.bengler.no/-/page/show/5470_grbl?ref=checkpoint

http://makezine.com/arduino/grbl/

(I've never used it. I use Mach3)


- Brian
From: Martin (MARTIN3D)
6 Nov 2013   [#12] In reply to [#11]
Thanks Brian,

I came across Grbl previously but still decided to "reinvent the wheel" to have a lean and easy to understand solution.

-Martin
From: Max Smirnov (SMIRNOV)
11 Nov 2013   [#13]
I've found solution of this problem several months ago.
This method is stupid, but it's works. :)

en code:
function GetCurveControlPoints(curve)
{
	var gd = moi.geometryDatabase;
	var obj = gd.getObjects();
	obj.setProperty( 'showPoints', false); 
	curve.showPoints = true; 
	gd.selectAll();
	obj.setProperty( 'selected', false);
	
	var objectpicker = moi.ui.createObjectPicker();
	objectpicker.allowEditPoints();
	objectpicker.done();
	gd.copyToClipboardCommand( objectpicker.objects );
	gd.pasteFromClipboard();	
	var points = gd.getSelectedObjects();

	gd.removeObjects(points);	
	curve.showPoints = false; 
	return points;
}

/* example */
var curves = moi.geometryDatabase.getSelectedObjects().getCurves();	
if (curves.length === 1)
{
	pts = GetCurveControlPoints(curves.item(0));
	/* let's build polyline through control points */
	var factory = moi.command.createFactory( 'curve' );
	for ( var p = 0; p < pts.length; ++p)
	{
		factory.createInput('point');	
		factory.setInput(factory.numInputs - 1, pts.item(p).pt); // point
		factory.createInput('bool');	
		factory.setInput(factory.numInputs - 1, true);  // corner
	}
	if  (curves.item(0).isClosed)
	{
		factory.createInput('point');	
		factory.setInput(factory.numInputs - 1, pts.item(0).pt);
		factory.createInput('bool');	
		factory.setInput(factory.numInputs - 1, true);
	}
	factory.commit();
}

From: Martin (MARTIN3D)
11 Nov 2013   [#14] In reply to [#13]
Hi Max,

although it doesn't do what I need (I don't care about control points and need in between points ON the curve. The next Beta will allow this.) your script is very interesting. Thanks.
From: BurrMan
11 Nov 2013   [#15] In reply to [#14]
Hey Martin,
After you get your points by array on curve or whatever method, you can get the xyz coords for your router in a file by using "savePointFile".

You can then use a spreadsheet program like excel to add any particular command values to the xyz coords listed.
From: Martin (MARTIN3D)
11 Nov 2013   [#16] In reply to [#15]
Thanks BurrMan.

Message 6257.17 was deleted


From: Max Smirnov (SMIRNOV)
11 Nov 2013   [#18]
Martin, this is exactly what you want :))
code:
function GetCurveControlPoints(curve)
{
	var gd = moi.geometryDatabase;
	var obj = gd.getObjects();
	obj.setProperty( 'showPoints', false); 
	curve.showPoints = true; 
	gd.selectAll();
	obj.setProperty( 'selected', false);
	
	var objectpicker = moi.ui.createObjectPicker();
	objectpicker.allowEditPoints();
	objectpicker.done();
	gd.copyToClipboardCommand( objectpicker.objects );
	gd.pasteFromClipboard();	
	var points = gd.getSelectedObjects();
	gd.removeObjects(points);			
	
	curve.showPoints = false; 
	return points;
}

var curves = moi.geometryDatabase.getObjects().getCurves();	
for ( var f = 0; f < curves.length; ++f)
{
	pts = GetCurveControlPoints(curves.item(f));
	for ( var p = 0; p < pts.length; ++p)
	{
		var factory = moi.command.createFactory( 'text' );
		factory.setInput(0, moi.VectorMath.createFrame ( pts.item(p).pt) );
		factory.setInput(1, ' xyz('+ Math.round(pts.item(p).pt.x*10)/10 + ', ' + Math.round(pts.item(p).pt.y*10)/10 + ', ' + Math.round(pts.item(p).pt.z*10)/10+ ')');
		factory.setInput(2, 'Arial');
		factory.setInput(5, 'curves' );
		factory.setInput(6, 0.5);
		factory.setInput(7, 1);
		factory.commit();
	}
}

From: BurrMan
11 Nov 2013   [#19] In reply to [#18]
Max,
He wants the points "on the curve", not the weighted control points. Thats a great script.

Image Attachments:
on_the_curve.jpg 


From: Max Smirnov (SMIRNOV)
11 Nov 2013   [#20] In reply to [#19]
Ops, sorry.. Now I see.
Anyway, no problem :) I know how to get it. ;)
From: BurrMan
11 Nov 2013   [#21] In reply to [#20]
""""""" I know how to get it.""""""""

I would be happy to get that. It would be a very cool script.

Maybe a way to set the tolerance of the "samples" would be very cool too, so it's adjustable. May need a gui for that.

Message 6257.22 was deleted


From: Frenchy Pilou (PILOU)
11 Nov 2013   [#23]
Excellent!


From: BurrMan
11 Nov 2013   [#24] In reply to [#22]
Those are the points Max.

Do you think you could make a checkbox to add/leave the point data labels(Like in the previous script)? That would make it ultimate for me....

Thanks again for sharing your scripts.
From: Lordfox
12 Nov 2013   [#25]
Waht is the correct shortcut for this script?!;)

thanks
From: BurrMan
12 Nov 2013   [#26] In reply to [#25]
You can put that script in a text file with an extension of .js and give it any name you want, like "anyname.js", then place that in the commands folder, then in the shortcut editor, you add your shortcut with a command of anyname. (leave the js part out of the command)

Show messages:  1-6  7-26  27-42