Post for Flow Waterjet does not work

Post for Flow Waterjet does not work

Anonymous
Not applicable
7,290 Views
23 Replies
Message 1 of 24

Post for Flow Waterjet does not work

Anonymous
Not applicable

 Using this post https://cam.autodesk.com/posts/post.php?name=flow

 

When trying to open the resulting .ord file in FlowCut, it gives a "incorrect file format" and won't open.

I played around with the .ord file, and by editing the lineCounter and arcCounter values on the first line, I was able to get the Flow software to open it, but the path itself is not correct.  It seems the arc center coordinates are on the wrong line.

 

I pathed a circle in Fusion, and this is the file I get from the Flow post:

 

// This file was created by FlowMaster(R), which is proprietary to Flow International Corporation. 11 4
// Created by Autodesk HSM
    3.7895,    3.0000, 0,    0, 0
    3.7895,    3.0105, 0,   60, 1
    3.9895,    3.0105, 0,   60, 1
    4.0000,    3.0000, 0,   60, 1
    3.0000,    2.0000, 1,   60, 1,    3.0000,    3.0000
    2.0000,    3.0000, 1,   60, 1,    3.0000,    3.0000
    3.0000,    4.0000, 1,   60, 1,    3.0000,    3.0000
    4.0000,    3.0000, 1,   60, 1,    3.0000,    3.0000
    3.9895,    2.9895, 0,   60, 1
    3.7895,    2.9895, 0,   60, 1
    3.7895,    3.0000, 0,   60, 0
    3.7895,    3.0000, 0,    0, 0

 

Trying to open it in the Flow software gives an "Incorrect file format" warning, and won't open it.

After I edit the first line to this:

 

// This file was created by FlowMaster(R), which is proprietary to Flow International Corporation. 7 4

 

It will open in Flow, but the path is incorrect:

Capture1.PNG

 

If I move the arc center coordinates up a line, it generates the correct path:

 

// This file was created by FlowMaster(R), which is proprietary to Flow International Corporation. 7 4
// Created by Autodesk HSM
    3.7895,    3.0000, 0,    0, 0
    3.7895,    3.0105, 0,   60, 1
    3.9895,    3.0105, 0,   60, 1
    4.0000,    3.0000, 1,   60, 1,    3.0000,    3.0000
    3.0000,    2.0000, 1,   60, 1,    3.0000,    3.0000
    2.0000,    3.0000, 1,   60, 1,    3.0000,    3.0000
    3.0000,    4.0000, 1,   60, 1,    3.0000,    3.0000
    4.0000,    3.0000, 0,   60, 1
    3.9895,    2.9895, 0,   60, 1
    3.7895,    2.9895, 0,   60, 1
    3.7895,    3.0000, 0,   60, 0
    3.7895,    3.0000, 0,    0, 0

Capture2.PNG

 

It seems like a simple fix , but I don't know post processors or JavaScript well enough to fix it myself.

Can anyone help?

7,291 Views
23 Replies
Replies (23)
Message 2 of 24

dwruss01
Explorer
Explorer

@Anonymous

 

Have you found an answer for this? I have come to the same problem and am not sure how to get past it. 

I actually have 360 on my older machine and the post works perfectly! but the same file and same post processor on my new machine will not output a usable file

old machine running Windows 7 and new running Windows 10. I don't see how this could/would have any effect, but I have also tried uploading my flow post from my old pc into the cloud and using cloud post on my new machine, just to make sure I am using the exact thing, but no go. I put the post on my local library first, but neither options are working out correctly. I do notice that lines of code are not exactly the same between the two files.

 

The two files themselves are attached and a screenshot of the comparison between the two. "Old PC" file (on left of screenshot) is the usable/working file, never had any trouble with files from that machine

"New PC" file (on right of screenshot) does not work. 

 

You can see the difference between the outputs.

 

Maybe someone/anyone can shed some light for me on why I would see two different output .ORD files from the same post processor? I am using the same Fusion account across these two PC's and using the same 3d file to CAM, all I did was go to one pc and post process (after CAM work was finished) and then went to the other pc and post-processed, just got two different results, this should be apples to apples in my eyes.

Message 3 of 24

Anonymous
Not applicable

Bumping this....I'm seeing the exact same results!

 

Its not your post file, look at the toolpath list in fusion.  Fusion is missing the 1st arc command.  The simulation displays correctly, so you can't trust it.   The post file is hosed because fusion is feeding it garbage.

0 Likes
Message 4 of 24

johnswetz1982
Advisor
Advisor

I and others have tried generating/reproducing this but could not get the same results as @Anonymous but he would not share an example file so we never got any further in sorting it out. If you have an example file that is doing this, please share by doing File>Export>*.f3D and attaching to forum post.

0 Likes
Message 5 of 24

dwruss01
Explorer
Explorer

Hey all,

 

I did find a way to overcome this problem. 

 

I went into "open config" when I opened up "post process" (snapshot attached)

 

***BE SURE TO SAVE A NEW/DIFFERENT/TEST VERSION OF YOUR CONFIGURATION BEFORE GOING ANY FURTHER!***

 

I took the configuration from my old pc (which was "supposed" to be the same post processor from Autodesk) and copied every line. 

 

I emptied the configuration on the test version I created on my new pc and pasted the entire configuration from the version that I knew worked. 

 

Now both of my pc's spit out the same code, whilst before there were minor differences, but those differences made the code useless on our flow. 

 

Thanks,

 

-I will paste the entire configuration below this line so anyone can copy it and replace their faulty version with this.

 

 

/**
Copyright (C) 2012-2017 by Autodesk, Inc.
All rights reserved.

Flow waterjet post processor configuration.

$Revision: 41945 955f691b4c25af124fd74b25bd0e8aa067b0b95a $
$Date: 2018-04-19 14:59:07 $

FORKID {F61954EF-5A29-4B93-93E7-870BC2786880}
*/

description = "Flow Waterjet ORD";
vendor = "Flow";
vendorUrl = "http://www.flowwaterjet.com";
legal = "Copyright (C) 2012-2017 by Autodesk, Inc.";
certificationLevel = 2;
minimumRevision = 39000;

longDescription = "Post for Flow Waterjets using software Version 5. The initial head position must always match the WCS XY origin specified in the CAM Setup. The initial Z head position must always be zeroed just above the top of the stock.";

extension = "ORD";
setCodePage("ascii");

// unit = IN; // only inch mode is supported
capabilities = CAPABILITY_JET;
tolerance = spatial(0.002, MM);

minimumChordLength = spatial(0.25, MM);
minimumCircularRadius = spatial(0.01, MM);
maximumCircularRadius = spatial(1000, MM);
minimumCircularSweep = toRad(0.01);
maximumCircularSweep = toRad(90);
allowHelicalMoves = false;
allowedCircularPlanes = 1 << PLANE_XY; // allow only XY circular motion

properties = {
useHSMFeedrates: false,
maximumFeedrateIPM: 700 // specifies the rapid traverse maximum
};

// user-defined property definitions
propertyDefinitions = {
useHSMFeedrates: {title:"Use HSM Feedrates", description:"Specifies whether to output the feedrates from HSM.", type:"boolean"},
maximumFeedrateIPM: {title:"Maximum feedrate(IPM)", description:"Sets the maximum feedrate in IPM.", type:"integer"}
};

// version 6 should be user selectable, but now use version 5
// version 5 does not have z moves, so it will be safer for inexperienced users
// version 5 does not have the mysterious parameter after the cutter comp value
var useVersion6 = false;

// use fixed width instead
var xyzFormat = createFormat({decimals:4, trim:false});
var integerFormat = createFormat({decimals:0});

// fixed settings
var thickness = 0;
var arcCounter = 0;
var lineCounter = 0;

// used for delaying moves
var firstPointOnContour = true;
var xTemp = 0;
var yTemp = 0;
var zTemp = 0;
var gotMove = false;

// override radius compensation
var compensationOffset = 0; // center compensation

var etchOperation = false; // though-cut unless set to true

/**
Writes the specified block.
*/
function writeBlock() {
writeWords(arguments);
}

var FIELD = " ";

/** Make sure fields are aligned. */
function f(text) {
var length = text.length;
if (length > 10) {
return text;
}
return FIELD.substr(0, 10 - length) + text;
}

/** Make sure fields are aligned. */
function fi(text, size) {
var length = text.length;
if (length > size) {
return text;
}
return FIELD.substr(0, size - length) + text;
}

function onOpen() {
redirectToBuffer(); // buffer the entire program to be able to count the linear and circular moves
setWordSeparator("");

switch (unit) {
case IN:
// Do nothing, Flow files can only be in IN
break;
case MM:
xyzFormat = createFormat({decimals:4, trim:false, scale:1/25.4}); // convert to inches
break;
}

{ // stock - workpiece
var workpiece = getWorkpiece();
var delta = Vector.diff(workpiece.upper, workpiece.lower);
if (delta.isNonZero()) {
// thickness = (workpiece.upper.z - workpiece.lower.z);
}
}

if (getNumberOfSections() > 0) {
var firstSection = getSection(0);

var remaining = firstSection.workPlane;
if (!isSameDirection(remaining.forward, new Vector(0, 0, 1))) {
error(localize("Tool orientation is not supported."));
return;
}
setRotation(remaining);

var originZ = firstSection.getGlobalZRange().getMinimum(); // the cutting depth of the first section

for (var i = 0; i < getNumberOfSections(); ++i) {
var section = getSection(i);
var z = section.getGlobalZRange().getMinimum();
if ((z + 1e-9) < originZ) {
error(localize("You are trying to machine at multiple depths which is not allowed."));
return;
}
}
}
}

function onSection() {
var remaining = currentSection.workPlane;
if (!isSameDirection(remaining.forward, new Vector(0, 0, 1))) {
error(localize("Tool orientation is not supported."));
return;
}
setRotation(remaining);

etchOperation = false;
if (currentSection.getType() == TYPE_JET) {
switch (tool.type) {
case TOOL_WATER_JET:
break;
default:
error(localize("The CNC does not support the required tool."));
return;
}
switch (currentSection.jetMode) {
case JET_MODE_THROUGH:
break;
case JET_MODE_ETCHING:
etchOperation = true;
break;
case JET_MODE_VAPORIZE:
error(localize("Vaporize is not supported by the CNC."));
return;
default:
error(localize("Unsupported cutting mode."));
return;
}
} else if (currentSection.getType() == TYPE_MILLING) {
warning(localize("Milling toolpath will be used as waterjet through-cutting toolpath."));
} else {
error(localize("CNC doesn't support the toolpath."));
return;
}
}

function onParameter(name, value) {
}

function onRapid(x, y, z) {
// last point
if (!firstPointOnContour) {
// end of shape
if (useVersion6) {
writeBlock(
f(xyzFormat.format(xTemp)), ",",
f(xyzFormat.format(yTemp)), ",",
f(xyzFormat.format(zTemp)), ",",
fi(integerFormat.format(0), 2), ",",
fi(integerFormat.format(0), 5), ",",
fi(integerFormat.format(0), 2), ",",
fi(integerFormat.format(0), 2)
);
} else {
writeBlock(
f(xyzFormat.format(xTemp)), ",",
f(xyzFormat.format(yTemp)), ",",
fi(integerFormat.format(0), 2), ",",
fi(integerFormat.format(0), 5), ",",
fi(integerFormat.format(0), 2)
);
}
++lineCounter;
}

if (useVersion6) {
writeBlock(
f(xyzFormat.format(x)), ",",
f(xyzFormat.format(y)), ",",
f(xyzFormat.format(z)), ",",
fi(integerFormat.format(0), 2), ",",
fi(integerFormat.format(99), 5), ",",
fi(integerFormat.format(0), 2), ",",
fi(integerFormat.format(2), 2)
);
} else {
writeBlock(
f(xyzFormat.format(x)), ",",
f(xyzFormat.format(y)), ",",
fi(integerFormat.format(0), 2), ",",
fi(integerFormat.format(99), 5), ",",
fi(integerFormat.format(0), 2)
);
}

xTemp = x;
yTemp = y;
zTemp = z;
gotMove = true;
++lineCounter;
}

function onLinear(x, y, z, feed) {

if (useVersion6) {
writeBlock(
f(xyzFormat.format(xTemp)), ",",
f(xyzFormat.format(yTemp)), ",",
f(xyzFormat.format(zTemp)), ",",
fi(integerFormat.format(0), 2), ",",
fi(integerFormat.format(power ? getFeedInPercent(feed) : 0), 5), ",",
fi(integerFormat.format(power ? compensationOffset : 0), 2), ",",
fi(integerFormat.format(2), 2)
);
} else {
writeBlock(
f(xyzFormat.format(xTemp)), ",",
f(xyzFormat.format(yTemp)), ",",
fi(integerFormat.format(0), 2), ",",
fi(integerFormat.format(power ? getFeedInPercent(feed) : 0), 5), ",",
fi(integerFormat.format(power ? compensationOffset : 0), 2)
);
}

xTemp = x;
yTemp = y;
zTemp = z;
gotMove = true;
firstPointOnContour = false;
++lineCounter;
}

function onPower(power) {
}

function onCircular(clockwise, cx, cy, cz, x, y, z, feed) {
// spirals are not allowed - arcs must be < 360deg
// fail if radius compensation is changed for circular move
validate(gotMove, "Move expected before circular move.");
circularICode = (clockwise ? 1 : -1);

if ((getCircularPlane() != PLANE_XY) || isHelical()) {
linearize(tolerance);
}
if (useVersion6) {
writeBlock(
f(xyzFormat.format(x)), ",",
f(xyzFormat.format(y)), ",",
f(xyzFormat.format(z)), ",",
fi(integerFormat.format(circularICode), 2), ",",
fi(integerFormat.format(power ? getFeedInPercent(feed) : 0), 5), ",",
fi(integerFormat.format(power ? compensationOffset : 0), 2), ",",
fi(integerFormat.format(2), 2), ",",
f(xyzFormat.format(cx)), ",",
f(xyzFormat.format(cy)), ",",
f(xyzFormat.format(0)) // PLANE_XY only
);
} else {
writeBlock(
f(xyzFormat.format(xTemp)), ",",
f(xyzFormat.format(yTemp)), ",",
fi(integerFormat.format(circularICode), 2), ",",
fi(integerFormat.format(power ? getFeedInPercent(feed) : 0), 5), ",",
fi(integerFormat.format(power ? compensationOffset : 0), 2), ",",
f(xyzFormat.format(cx)), ",",
f(xyzFormat.format(cy))
);
}

xTemp = x;
yTemp = y;
zTemp = z;
gotMove = true;
firstPointOnContour = false;
++arcCounter;
}

function getFeedInPercent(feed) {
var feedPercent;
if (properties.maximumFeedrateIPM > 0 && properties.useHSMFeedrates) {
// use HSM feedrates
switch (unit) {
case MM:
feed = feed * 1/ 25.4; // convert to in/min
break;
}
// 1 - 99 %
feedPercent = Math.min(Math.ceil(Math.min(properties.maximumFeedrateIPM, feed) / properties.maximumFeedrateIPM * 100), 99);
} else {
// use fixed feedrates per quality selection
switch (currentSection.quality) {
case 1:
// high quality
feedPercent = 20; // very slow, cut surface excellent
break;
case 2:
feedPercent = 40; // slow, cut surface good
break;
case 3:
feedPercent = 80; // fast, cut surface slightly rough
break;
default:
// medium quality
feedPercent = 60; // moderate, cut surface moderate
}
}
return feedPercent;
}

function onRadiusCompensation() {
switch (radiusCompensation) {
case RADIUS_COMPENSATION_LEFT:
compensationOffset = -1;
break;
case RADIUS_COMPENSATION_RIGHT:
compensationOffset = 1;
break;
default:
compensationOffset = 0; // center compensation
}
}

function onCycle() {
error(localize("Canned cycles are not supported."));
}

function onSectionEnd() {
compensationOffset = 0; // center compensation

if (useVersion6) {
writeBlock(
f(xyzFormat.format(xTemp)), ",",
f(xyzFormat.format(yTemp)), ",",
f(xyzFormat.format(zTemp)), ",",
fi(integerFormat.format(0), 2), ",",
fi(integerFormat.format(0), 5), ",",
fi(integerFormat.format(0), 2), ",",
fi(integerFormat.format(0), 2));
} else {
writeBlock(
f(xyzFormat.format(xTemp)), ",",
f(xyzFormat.format(yTemp)), ",",
fi(integerFormat.format(0), 2), ",",
fi(integerFormat.format(0), 5), ",",
fi(integerFormat.format(0), 2));
}
++lineCounter;

if (!gotMove) {
var p = getCurrentPosition();
xTemp = p.x;
yTemp = p.y;
zTemp = p.z;
gotMove = true;
}

firstPointOnContour = true;
validate(gotMove, "Move expected at end of operation to turn off waterjet.");
}

function onClose() {
if (isRedirecting()) {
var mainProgram = getRedirectionBuffer();
closeRedirection();
writeln("// This file was created by FlowMaster(R), which is proprietary to Flow International Corporation. " + (lineCounter - 1) + " " + arcCounter);
if (useVersion6) {
writeln("VER 6.00");
}
writeln("// Created by Autodesk HSM");
if (programComment) {
writeln("// " + programComment);
}
write(mainProgram);
}
}

 

0 Likes
Message 6 of 24

Anonymous
Not applicable

The behavior changed w the update.

0 Likes
Message 7 of 24

Anonymous
Not applicable

That post isn't working for me, error on large files.

This is the post i've been working on the last few days.  Its still dirty w/ testing notes.

Attached and pasted.

 

/**
Copyright (C) 2012-2018 by Autodesk, Inc.
All rights reserved.

Flow waterjet post processor configuration.

$Revision: 42473 905303e8374380273c82d214b32b7e80091ba92e $
$Date: 2019-09-04 07:46:02 $

FORKID {F61954EF-5A29-4B93-93E7-870BC2786880}
*/

description = "Flow Waterjet ORD";
vendor = "Flow";
vendorUrl = "http://www.flowwaterjet.com";
legal = "Copyright (C) 2012-2018 by Autodesk, Inc.";
certificationLevel = 2;
minimumRevision = 39000;

longDescription = "Post for Flow Waterjets using software Version 5 or 6. The initial head position must always match the WCS XY origin specified in the CAM Setup. The initial Z head position must always be zeroed just above the top of the stock.";

extension = "ORD";
setCodePage("ascii");

// unit = IN; // only inch mode is supported
capabilities = CAPABILITY_JET;
tolerance = spatial(0.002, MM);

minimumChordLength = spatial(0.25, MM);
minimumCircularRadius = spatial(0.01, MM);
maximumCircularRadius = spatial(1000, MM);
minimumCircularSweep = toRad(0.01);
maximumCircularSweep = toRad(270);
allowHelicalMoves = false;
allowedCircularPlanes = 1 << PLANE_XY; // allow only XY circular motion

// formatVersion:
// version 6 should be user selectable, but now use version 5
// version 5 does not have z moves, so it will be safer for inexperienced users
// version 5 does not have the mysterious parameter after the cutter comp value

properties = {
useHSMFeedrates: false,
maximumFeedrateIPM: 700, // specifies the rapid traverse maximum
formatVersion: 5 // format version 5 or 6
};

// user-defined property definitions
propertyDefinitions = {
useHSMFeedrates: {title:"Use HSM feedrates", description:"Specifies whether to output the feedrates from HSM.", type:"boolean"},
maximumFeedrateIPM: {title: "Maximum feedrate (IPM)", description: "Sets the maximum feedrate in IPM.", type: "integer"},
formatVersion: {title: "Format version", description: "Specified the version of the Flow format which can be either 5 or 6.", type: "integer", range:[5, 6]}
};

var useVersion6 = false;

// use fixed width instead
var xyzFormat = createFormat({decimals:4, trim:false});
var integerFormat = createFormat({decimals:0});

// fixed settings
var thickness = 0;
var arcCounter = 0;
var lineCounter = 0;
var blakeCounter = -1;

// override radius compensation
var compensationOffset = 0; // center compensation

var etchOperation = false; // though-cut unless set to true

var previousBlock;

/**
Writes the specified block.
*/
function writeBlock() {
var block = formatWords(arguments);
if (block != previousBlock) { // avoid the same block twice
writeln(block);
++blakeCounter;
previousBlock = block;
}
}

var FIELD = " ";

/** Make sure fields are aligned. */
function f(text) {
var length = text.length;
if (length > 10) {
return text;
}
return FIELD.substr(0, 10 - length) + text;
}

/** Make sure fields are aligned. */
function fi(text, size) {
var length = text.length;
if (length > size) {
return text;
}
return FIELD.substr(0, size - length) + text;
}

function onOpen() {
useVersion6 = properties.formatVersion >= 6;

redirectToBuffer(); // buffer the entire program to be able to count the linear and circular moves
setWordSeparator("");

switch (unit) {
case IN:
// Do nothing, Flow files can only be in IN
break;
case MM:
xyzFormat = createFormat({decimals:4, trim:false, scale:1 / 25.4}); // convert to inches
break;
}

{ // stock - workpiece
var workpiece = getWorkpiece();
var delta = Vector.diff(workpiece.upper, workpiece.lower);
if (delta.isNonZero()) {
// thickness = (workpiece.upper.z - workpiece.lower.z);
}
}

if (getNumberOfSections() > 0) {
var firstSection = getSection(0);

var remaining = firstSection.workPlane;
if (!isSameDirection(remaining.forward, new Vector(0, 0, 1))) {
error(localize("Tool orientation is not supported."));
return;
}
setRotation(remaining);

var originZ = firstSection.getGlobalZRange().getMinimum(); // the cutting depth of the first section

for (var i = 0; i < getNumberOfSections(); ++i) {
var section = getSection(i);
var z = section.getGlobalZRange().getMinimum();
if ((z + 1e-9) < originZ) {
error(localize("You are trying to machine at multiple depths which is not allowed."));
return;
}
}
}
}

function onSection() {
var remaining = currentSection.workPlane;
if (!isSameDirection(remaining.forward, new Vector(0, 0, 1))) {
error(localize("Tool orientation is not supported."));
return;
}
setRotation(remaining);

etchOperation = false;
if (currentSection.getType() == TYPE_JET) {
switch (tool.type) {
case TOOL_WATER_JET:
break;
default:
error(localize("The CNC does not support the required tool."));
return;
}
switch (currentSection.jetMode) {
case JET_MODE_THROUGH:
break;
case JET_MODE_ETCHING:
etchOperation = true;
break;
case JET_MODE_VAPORIZE:
error(localize("Vaporize is not supported by the CNC."));
return;
default:
error(localize("Unsupported cutting mode."));
return;
}
} else if (currentSection.getType() == TYPE_MILLING) {
warning(localize("Milling toolpath will be used as waterjet through-cutting toolpath."));
} else {
error(localize("CNC doesn't support the toolpath."));
return;
}

var initialPosition = getFramePosition(currentSection.getInitialPosition());
onExpandedRapid(initialPosition.x, initialPosition.y, initialPosition.z);
}

function onParameter(name, value) {
}

function writeLinear(x, y, z, feed) {
// TAG: how do we turn off power and run at rapid
if (useVersion6) {
var p3 = getCurrentPosition();
writeBlock(
f(xyzFormat.format(p3.x)), ",",
f(xyzFormat.format(p3.y)), ",",
f(xyzFormat.format(p3.z)), ",",
fi(integerFormat.format(0), 2), ",", // linear
fi(integerFormat.format(feed), 5), ",",
fi(integerFormat.format(compensationOffset), 2), ",", // left, center, right
fi(integerFormat.format(2), 2) // TAG: WTF is this? seen -2..2 - unknown
);
} else {
var p3 = getCurrentPosition();
++lineCounter;
writeBlock(
f(xyzFormat.format(p3.x)), ",",
f(xyzFormat.format(p3.y)), ",",
fi(integerFormat.format(0), 2), ",", // linear
fi(integerFormat.format(feed), 5), ",",
fi(integerFormat.format(compensationOffset), 2) // left, center, right
);
}
}

function onRapid(x, y, z) {
// TAG: 99 has some special meaning
writeLinear(x, y, z, 0); // non-cutting
}

function onLinear(x, y, z, feed) {
writeLinear(x, y, z, power ? getFeedInPercent(feed) : 0); // 0 for non-cutting but slow
}

function onPower(power) {
}

function onCircular(clockwise, cx, cy, cz, x, y, z, feed) {
// spirals are not allowed - arcs must be < 360deg
// fail if radius compensation is changed for circular move
circularICode = (clockwise ? 1 : -1);

if ((getCircularPlane() != PLANE_XY) || isHelical()) {
linearize(tolerance);
}
if (useVersion6) {
var p2 = getCurrentPosition();
++arcCounter;
writeBlock(
f(xyzFormat.format(p2.x)), ",",
f(xyzFormat.format(p2.y)), ",",
f(xyzFormat.format(p2.z)), ",",
fi(integerFormat.format(circularICode), 2), ",", // arc cw/ccw
fi(integerFormat.format(power ? getFeedInPercent(feed) : 0), 5), ",",
fi(integerFormat.format(compensationOffset), 2), ",", // left, center, right
fi(integerFormat.format(2), 2), ",", // TAG: seen -2..2 - unknown
f(xyzFormat.format(cx)), ",",
f(xyzFormat.format(cy)), ",",
f(xyzFormat.format(0)) // PLANE_XY only
);
} else {
var p2 = getCurrentPosition();
++arcCounter;
writeBlock(
f(xyzFormat.format(p2.x)), ",",
f(xyzFormat.format(p2.y)), ",",
fi(integerFormat.format(circularICode), 2), ",", // arc cw/ccw
fi(integerFormat.format(power ? getFeedInPercent(feed) : 0), 5), ",",
fi(integerFormat.format(compensationOffset), 2), ",", // left, center, right
f(xyzFormat.format(cx)), ",",
f(xyzFormat.format(cy))
);

}


}

function getFeedInPercent(feed) {
var feedPercent;
if ((properties.maximumFeedrateIPM > 0) && properties.useHSMFeedrates) {
// use HSM feedrates
switch (unit) {
case MM:
feed = feed * 1 / 25.4; // convert to in/min
break;
}
// 1 - 99 %
feedPercent = Math.min(Math.ceil(Math.min(properties.maximumFeedrateIPM, feed) / properties.maximumFeedrateIPM * 100), 99);
} else {
// use fixed feedrates per quality selection
switch (currentSection.quality) {
case 1:
// high quality
feedPercent = 20; // very slow, cut surface excellent
break;
case 2:
feedPercent = 40; // slow, cut surface good
break;
case 3:
feedPercent = 80; // fast, cut surface slightly rough
break;
default:
// medium quality
feedPercent = 60; // moderate, cut surface moderate
}
}
return feedPercent;
}

function onRadiusCompensation() {
switch (radiusCompensation) {
case RADIUS_COMPENSATION_LEFT:
compensationOffset = -1;
break;
case RADIUS_COMPENSATION_RIGHT:
compensationOffset = 1;
break;
default:
compensationOffset = 0; // center compensation
}
}

function onCycle() {
error(localize("Canned cycles are not supported."));
}

function onSectionEnd() {
compensationOffset = 0; // center compensation

var p = getCurrentPosition();
writeLinear(p.x, p.y, p.z, 0); // 0 for non-cutting but slow
//++lineCounter;
}

function onClose() {
if (isRedirecting()) {
var mainProgram = getRedirectionBuffer(); // TAG: no need for redirection
closeRedirection();
writeln("// This file was created by FlowMaster(R), which is proprietary to Flow International Corporation. " + (blakeCounter - arcCounter) + " " + arcCounter);
if (useVersion6) {
writeln("VER 6.00");
}
writeln("// Created by Autodesk HSM");
if (programComment) {
writeln("// " + programComment);
}
write(mainProgram);
}
}

0 Likes
Message 8 of 24

dwruss01
Explorer
Explorer

Just to confirm, I used the post I had put up a few days ago.

 

You will find the .ord file attached along with the .f3d so everyone can see what was going on. 

 

The .ord file that was output from Fusion worked without any problem on our Flow Mach 2

 

@Anonymous, I am not sure how big a file was used that gave you problems. If I come across a file that this post-processor gives me an error on, I will post back on this thread to let everyone know what I have come across. 

 

Thanks,

 

P.S.

 

I changed the .ord file to a .txt because I could not get the file to load on this post after several attempts. You should be able to see it as a .txt or just change it back to a .ord and use it. 

 

Thanks,

0 Likes
Message 9 of 24

routerHJBMX
Community Visitor
Community Visitor

This one mostly works for our flow mach500 machine. With version 5, it works perfectly, but we use z moves quite often. If set to version 6, it seems to drop arcs completely out of the program but the z moves are finally coming through as traverse lines instead of cutting lines. 

This happens both in fusion360 and inventorCAM

0 Likes
Message 10 of 24

kyle.kershaw
Alumni
Alumni

Hi Guys

I'm working on the Flow post and am looking for a little information/education.

Using @dwruss01's Wheel Spacer.f3d (Setup1) and his post from above, I see code like this:

11.8253, 20.7375, 0, 60,-1
11.9975, 20.6381, 0, 60, 0
11.9995, 20.6416, 0, 0, 0 <= rapid
11.9995, 20.6416, 0, 99, 0 <= 99% feed
11.9995, 20.6416, 0, 0, 0 <= rapid
10.9377, 20.9442, 0, 99, 0
10.9377, 20.9442, 0, 0, 0
10.9377, 20.9442, 0, 99, 0
10.9377, 20.9442, 0, 60,-1

 

The code rapids, then 99% feeds, then rapids again, all to the same XY. 

Can anyone tell me how this machine thinks and why the gymnastics?????

 

Does the water turn off on a rapid (0)?

What does the 99% feed sandwiched between the rapids (0) do?

@Anonymous, I see a bunch of stuff from you? Can you enlighten me?

 

Thanks

Kyle K

 

 

 



Kyle Kershaw

Technical Consultant
0 Likes
Message 11 of 24

kyle.kershaw
Alumni
Alumni

Hi guys

 

I was hoping for a little feedback ... but I think I'll throw this out there and see if it tickles anyone.

Do you think this code would fly on the flow......

    ......

    5.8419,    2.0883, 0,   60,-1 < comp on, feed move
    5.8450,    2.0845, 0,   60, 0 < comp off, feed move
    5.8450,    2.0845, 0,    0, 0 < water/jet off before the rapid (at current location)
    6.0628,    2.0188, 0,    0, 0 < rapid to the start of the next path
    6.0628,    2.0188, 0,   99, 0 < water/jet on after the rapid (at current location)
   6.0670,    2.0212, 0,   60,-1 < comp on, feed move
    ........
The gist being to explicitly turn off the water (0) before the rapid move and turn it back on (99) after the rapid move.
 
Make sense or is the water off/on stuff not needed at all?
 
Thoughts?


Kyle Kershaw

Technical Consultant
0 Likes
Message 12 of 24

Anonymous
Not applicable

If you want to test my updated/optimized code, I've attached it.   Rename txt to cps.   

 

Component pattern cutting works correctly with this last update I did.  Removes a ton of duplicate lines too.

 

 

Message 13 of 24

kyle.kershaw
Alumni
Alumni

Thanks @Anonymous 

 

I'm working on what will be the Flow post on the hsmposts page. I'll use your's for testing and look through and see what tidbits I can incorporate in mine .

 

Is there anything missing in the post output (your's or ours)? This will be the web page post and I'd like to make it do the right stuff.



Kyle Kershaw

Technical Consultant
0 Likes
Message 14 of 24

kyle.kershaw
Alumni
Alumni

@Anonymous 

Back again.

I've been looking into the post and going Geez....Delayed moves?  99/0 feed gymnastics for turning the water on/off? Whaaaaaat?

 

Baby steps (and questions).

Question 1. What does a feed of "99" do? This guy has some special meaning that I haven't grasped. 

 

Moving between 2 cuts looks like this (using the flow 20191125 post)

5.8519, 2.0817, 0, 60,-1
5.8519, 1.9636, 0, 60, 0
5.8568, 1.9636, 0, 0, 0 <      rapid to where you already are. Does this turn off the water?
5.8568, 1.9636, 0, 99, 0 <    "99" at the same spot. What does the "99" do?
5.8568, 1.9636, 0, 0, 0 <     rapid , to the same point . What does switching back to 0 do? 
2.6341, 1.7667, 0, 99, 0 <     move to the new destination (with 99?)
2.6341, 1.7667, 0, 0, 0 <      rapid to the same point
2.6341, 1.7667, 0, 99, 0 <    99 at the same point
2.6341, 1.7667, 0, 60,-1 <    same point with a feed. Does the water come back on here?

 

Will you tell me about the "99" feed rate? When and where should it be used? 

 

Question 2. Turning the water on and off looks torturous.

Turns on with 3 lines with 99, 0,and 99 as each feed (all at the same location). Turns off with 3 lines. This time with 0, 99, and 0 as feeds (again at the same location). I'm sure related to question 1 but what actually turns the water on and off?



Kyle Kershaw

Technical Consultant
0 Likes
Message 15 of 24

kyle.kershaw
Alumni
Alumni

Hi @Anonymous and others.

 

Another detail I noticed from the 20191125 post is the syntax (or order) of the parameters in an arc motion line.

It looks to me that takes two lines/blocks to describe the arc move

line 1. start X, start y, arc direction, feed, comp, cx, cy (6.0192, 2.0817,-1, 60,-1, 5.9355, 2.0817)
line 2. end x, end y, linear, feed, comp                             (5.9355, 2.1654, 0, 60,-1)
Two lines, one motion.
 
Does this ring true (to anyone)?


Kyle Kershaw

Technical Consultant
0 Likes
Message 16 of 24

kyle.kershaw
Alumni
Alumni

If anyone is interested in testing, I have a potential replacement for the Flow post that needs some eyeballs and exercise. Private message me if you're interested.

It addresses some of the issues I've gleaned from the forum pages. Counters, duplicate lines, arc moves.



Kyle Kershaw

Technical Consultant
0 Likes
Message 17 of 24

Anonymous
Not applicable

Not sure how to private message but I have a flow jet and I could test out the new post processor  if you would  like. The one posted on here does not work for me. 

Message 18 of 24

kyle.kershaw
Alumni
Alumni

Thank you joshuarhoads for the testing offer.

 

I have replied to Joshua via Private Message and am taking that conversation private. I'll report back with success (or failure)  when I know more......

 

The offer to to test is still open. If anyone else want to play (or can help), let me know!



Kyle Kershaw

Technical Consultant
0 Likes
Message 19 of 24

Anonymous
Not applicable

The field following the coordinates cycles the water on/off.  

 

The Field after that defines your cut quality/travel speed in relation to the flow cutting software.   20,40,60,80.   20 is highest quality.  99 is non-cutting travel moves.   These are not actual speeds....those are determined in the flow software after selecting material and thickness.

 

0 Likes
Message 20 of 24

Anonymous
Not applicable

Tried some basic circle cuts w/ your post....didn't work.   You can compare all the data  

 

Basic test file-

https://myhub.autodesk360.com/ue2ba6873/shares/public/SH56a43QTfd62c1cd9684ad5647e178ee5d5

 

Attachments.

flow from forums.txt  - your post file you sent me.

flow 20191125 count correction1.txt - My current post

forumtestbasic.txt - output from your post

forumtestbasicme.txt - output from my post

 

You're generating an extra 10% more lines of code also.  Its coming from your arc section.  You don't need coordinate positions between each segment of arc when creating a circle.   Just starting and finishing.

 

Once you get that working.... the next test would be using a component pattern like this-

https://myhub.autodesk360.com/ue2ba6873/shares/public/SH56a43QTfd62c1cd9680a68b1b4eb0d8109

 

0 Likes