ArcCAM
 1-9  10-29  30-49  50-69  70-81

Previous
Next
 From:  Michael Gibson
11543.50 In reply to 11543.49 
Hi Len,

re:
> Next question... can I do a similar calculation for clockwise/counterclockwise on a whole
> closed curve by picking 3 points along the curve, or will complex curves be problematic?

Unlike an arc, a general spline curve can have inflections in it so just 3 points isn't enough.

But if you evaluate a bunch of points along the curve so you have a closed polygon you can calculate the signed area of a 2D closed polygon like this:

code:
var area = 0;
var array_of_points = [];

// Get points to make a closed 2D polygon.

var numpoints = array_of_points.length;

for ( var i = 0; i < numpoints-1; i++ )
{
	var this_pt = array_of_points[i];
	var next_pt = array_of_points[i+1];

	area += this_pt.x * next_pt.y;
	area -= this_pt.y * next_pt.x;
}

// One more span to close it off, it is ok if the first and last point are coincident.

var this_pt = array_of_points[numpoints-1];
var next_pt = array_of_points[0];

area += this_pt.x * next_pt.y;
area -= this_pt.y * next_pt.x;

if area < 0 it's clockwise

if area > 0 it's counter-clockwise


- 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:  probotix
11543.51 In reply to 11543.50 
Thanks to Michael's help, I have been able to add a script that will create a lead-in and lead-out for profiles that will use tool diameter compensation. I also added a couple of helper scripts to the repository. It presently only works on closed curves with arcs and lines, which is how I like to design my machined parts anyhow.

You can use OrderCurves to set the direction of the curve. CreateLeadInOut will set the start of the curve to a point on the curve of your choosing (using crv.changeClosedCurveSeam) after you set the lead-in radius and the overlap.

https://github.com/probotix/ArcCAM


>Len

EDITED: 7 Oct 2024 by PROBOTIX

Image Attachments:
Size: 168.5 KB, Downloaded: 62 times, Dimensions: 1600x883px
  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:  blowlamp
11543.52 In reply to 11543.51 
Hi Len.

I'd like to try this out, but I don't know how to install it properly.
The icons are missing and I get an error at startup.
Could you let me know where the various files should be located to get it running, please?

Many thanks.
Martin.
  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:  probotix
11543.53 In reply to 11543.52 
Martin,

Let me finish moving some files around before you try. I recently found out I could link icons from the AppData folder.

>Len
  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:  probotix
11543.54 In reply to 11543.50 
Michael,

Is there a way to pass data to the UI. As an example, I want to be able to populate input fields with defaults.

EDIT: I did discover moi.command.setOption and moi.command.getOption and that works. But in my testing, it fails if toIni is true.

>Len

EDITED: 13 Oct 2024 by PROBOTIX

  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
11543.55 In reply to 11543.54 
Hi Len,

re:
> Is there a way to pass data to the UI. As an example, I want to be able to populate input fields
> with defaults.

Is it the UI for a command? There is usually a default="" attribute you can set on the control, like:
code:
    <moi:NumericInput id="Angle" default="360.0"/>


You'll need the control to have a unique id="" value on it. When the command starts, it will initialize controls, setting them to their last used value (unless style="persist:false" is set) or to the default="" value if it's the first run of that command.

The last used value is stored using the id="" value as a lookup key, so a unique id value should be set for each control for that to work.

- 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:  probotix
11543.56 In reply to 11543.55 
Michael,

My previous post edit may have crossed your response.

I did discover moi.command.setOption and moi.command.getOption and that works. But in my testing, it fails if toIni is true. I dont wanna store any of my stuff in the main ini, but I did test to see if it would work, and it doesnt appear to.

I'm setting up my own ini file with defaults and last used value storage. From what I observe, Moi doesn't save last used values on restart.

>Len
  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
11543.57 In reply to 11543.56 
Hi Len, yes the normal behavior is that UI controls save and restore their last used values within the same program run but not between program runs.

The reason for that is to avoid the problem where someone who is learning MOI experiments with changing some options and then gets confused when their UI has different behavior than what is shown when they are following a tutorial.

If you want them to persist between program runs then you would need to do that with your own script code calling moi.command.getOption() / setOption() with the "to ini" parameter set to true. That will store the value in the [Commands] section of the moi.ini file.


> but I did test to see if it would work, and it doesnt appear to.

Can you post the code you tried that did not work? If the option hasn't been stored there yet it will throw an exception from getOption() so you need to have it set in a try {} catch {} block.

- 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:  probotix
11543.58 In reply to 11543.57 
I would test by toggling these two lines on and off. If I remove true, it works. And BTW it just quietly dies without throwing an error.

code:
//alert( moi.command.getOption( 'ArcCAM.htm_test' ) );
	
//moi.command.setOption( 'ArcCAM.htm_test', '1234567', true );


And yes I did discover that it will throw an error is setOption is not called first.

>Len
  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
11543.59 In reply to 11543.58 
Hi Len, both getOption and setOption need to have the "use ini" parameter added.

If you call moi.command.getOption( 'ArcCAM.htm_test' ) that will get it from the runtime storage.

You need to call moi.command.getOption( 'ArcCAM.htm_test', true ) to get it from ini storage.

You don't want to have a mismatch with the get coming from runtime storage and the set going to ini storage.

It's good to have the get wrapped in a try / catch block to handle the exception that will be triggered if there isn't any value present.

var value = false;

try {
    value = moi.command.getOption( 'ArcCAM.htm_test', true );
} catch(e) {}

It would probably have been better for this to return undefined if no value had ever been set rather than throwing an exception but it's difficult to change things that are in use.

- 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:  probotix
11543.60 In reply to 11543.59 
I was watching the ini file to see if it changed and it did not. Is the ini file only written on close?

>Len
  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:  probotix
11543.61 In reply to 11543.60 
Is there a way to run a command from a directory other than moi://AppData/commands? I have tried a few different ways, but nothing seems to work.

code:
<moi:CommandButton icon="moi://appdata/icons/ArcCAMIcon.png" command="moi://appdata/ArcCAM/ArcCAM.js">


>Len
  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
11543.62 In reply to 11543.60 
Hi Len,

re:
> I was watching the ini file to see if it changed and it did not. Is the ini file only written on close?

Yes, the moi.ini file is read from disk when the program starts, and written to disk when the program ends.

Any changes to it during run time happen to an in-memory version.

You can trigger it to be written by calling moi.settings.writeIniFile();

- 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:  Michael Gibson
11543.63 In reply to 11543.61 
Hi Len,

re:
> Is there a way to run a command from a directory other than moi://AppData/commands? I
> have tried a few different ways, but nothing seems to work.

It will look first in the install commands directory, then in the appdata commands directory and then through any directories listed in moi.ini under
[Commands]
AdditionalCommandsDirs=

There can be multiple directories listed there separated by semi-colons.

- 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:  probotix
11543.64 In reply to 11543.63 
Michael,

Can I use moi://appdata/ or %appdata% as part of the path to AdditionalCommandsDirs?

>Len
  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:  pressure (PEER)
11543.65 In reply to 11543.64 
Hi Len,

Re:
> Can I use moi://appdata/ or %appdata% as part of the path to AdditionalCommandsDirs?

Have you looked at the example function called instantScript() in the API? I'm wondering if maybe running your code as a script rather than a command might give you more flexibility. Another thing to look at is shellExecute in the Filesystem section.

- Peer
  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:  probotix
11543.66 In reply to 11543.65 
I'll look into instantScript() closer. I have already tested shellExecute and may use that for some python or database connectivity. But it still doesn't solve the ease of installation issue.

Its easier to tell someone to put this exactly in your ini file:

"moi://appdata/ArcCam"

Than to tell them:

"C:\users\YOUR WINDOWS USERNAME HERE\AppData\Roaming\Moi"

A lot of them wouldn't even know what their Windows username is. Windows is frustrating compared to how easy I can do this stuff in Linux.

>Len
  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:  pressure (PEER)
11543.67 In reply to 11543.66 
Hi Len,

For seamless installation I guess you'd need a standalone installer script that asks MoI for the location of the appData directory, copies your files there, and maybe writes the path to moi.ini if the files are put in their own folder. I can't think of a way to add a command just by typing something in moi.ini

The closest thing I've done is a startup script that replaces a native file with my own by copying my html file from the startup scripts folder. That still requires manually navigating to the startup scripts folder to put the script and html there though.

code:
doReplacePromptSaveChanges();

function doReplacePromptSaveChanges() {

    var existingName = moi.filesystem.getUiDir() + 'PromptSaveChanges.htm';
    var backupName = existingName + '.bak';
    var backupExists = moi.filesystem.fileExists( backupName );

    if (backupExists === false) {

        // backup PromptSaveChanges.htm
        moi.filesystem.copyFile(existingName, backupName );

        // overwrite PromptSaveChanges.htm
        var replacerName = moi.filesystem.getAppDataDir() + 'startup/' + 'PromptSaveChanges.htm';
        moi.filesystem.copyFile(replacerName, existingName );
    }
}


- Peer
  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
11543.68 In reply to 11543.64 
Hi Len,

re:
> Can I use moi://appdata/ or %appdata% as part of the path to AdditionalCommandsDirs?

Unfortunately no, it can only take a regular file system path there, not a moi:// URL or environment variable.

How about a new mechanism that would scan through any folders under say appdata/plugins and look for a commands folder inside of there.

So then the install would be to put your stuff inside appdata/plugins/ArcCAM and your commands would be under appdata/plugins/ArcCAM/commands and I could also look for startup scripts inside appdata/plugins/ArcCAM/startup ?

And you could put images inside appdata/plugins/ArcCAM/icons and those would work already using moi://appdata/plugins/ArcCAM/icons/file.png .

- 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:  probotix
11543.69 In reply to 11543.68 
Michael,

I like it!

I've been messing around with NSIS today, and it is able to fiddle with moi.ini, but I don't feel comfortable with that. Having a plug-in container seems much safer.

>Len

EDITED: 14 Oct 2024 by PROBOTIX

  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-9  10-29  30-49  50-69  70-81