Untitled diff

Created Diff never expires
57 removals
Lines
Total
Removed
Words
Total
Removed
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
793 lines
47 additions
Lines
Total
Added
Words
Total
Added
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
776 lines
/**
/**
Copyright (C) 2012-2014 by Autodesk, Inc.
Copyright (C) 2012-2014 by Autodesk, Inc.
All rights reserved.
All rights reserved.


Tormach Mach3Mill post processor configuration.
Tormach Path Pilot post processor configuration.


$Revision: 39140 $
$Revision: 37254 $
$Date: 2015-06-10 14:13:32 +0200 (on, 10 jun 2015) $
$Date: 2014-05-26 11:17:00 +0200 (ma, 26 maj 2014) $
FORKID {AE2102AB-B86A-4aa7-8E9B-F0B6935D4E9F}
FORKID {AE2102AB-B86A-4aa7-8E9B-F0B6935D4E9F}
*/
*/

//setWriteStack(true);
description = "Generic Tormach Mach3Mill";
description = "Generic Tormach Path Pilot";
vendor = "Autodesk, Inc.";
vendor = "Autodesk, Inc.";
vendorUrl = "http://www.autodesk.com";
vendorUrl = "http://www.autodesk.com";
legal = "Copyright (C) 2012-2014 by Autodesk, Inc.";
legal = "Copyright (C) 2012-2014 by Autodesk, Inc.";
certificationLevel = 2;
certificationLevel = 2;
minimumRevision = 24000;
minimumRevision = 24000;


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


tolerance = spatial(0.002, MM);
tolerance = spatial(0.002, MM);


minimumChordLength = spatial(0.01, MM);
minimumChordLength = spatial(0.01, MM);
minimumCircularRadius = spatial(0.01, MM);
minimumCircularRadius = spatial(0.01, MM);
maximumCircularRadius = spatial(1000, MM);
maximumCircularRadius = spatial(1000, MM);
minimumCircularSweep = toRad(0.01);
minimumCircularSweep = toRad(0.01);
maximumCircularSweep = toRad(180);
maximumCircularSweep = toRad(180);
allowHelicalMoves = true;
allowHelicalMoves = true;
allowedCircularPlanes = undefined; // allow any circular motion
allowedCircularPlanes = undefined; // allow any circular motion






// user-defined properties
// user-defined properties
properties = {
properties = {
writeMachine: true, // write machine
writeMachine: true, // write machine
writeTools: true, // writes the tools
writeTools: true, // writes the tools
useG28: true, // disable to avoid G28 output
useG28: true, // disable to avoid G28 output
useM6: true, // disable to avoid M6 output - preload is also disabled when M6 is disabled
useM6: true, // disable to avoid M6 output - preload is also disabled when M6 is disabled
preloadTool: false, // preloads next tool on tool change if any
preloadTool: false, // preloads next tool on tool change if any
showSequenceNumbers: true, // show sequence numbers
showSequenceNumbers: true, // show sequence numbers
sequenceNumberStart: 10, // first sequence number
sequenceNumberStart: 10, // first sequence number
sequenceNumberIncrement: 10, // increment for sequence numbers
sequenceNumberIncrement: 10, // increment for sequence numbers
optionalStop: true, // optional stop
optionalStop: true, // optional stop
separateWordsWithSpace: true, // specifies that the words should be separated with a white space
separateWordsWithSpace: true, // specifies that the words should be separated with a white space
useRadius: true, // specifies that arcs should be output using the radius (R word) instead of the I, J, and K words.
useRadius: true, // specifies that arcs should be output using the radius (R word) instead of the I, J, and K words.
dwellInSeconds: true // specifies the unit for dwelling: true:seconds and false:milliseconds.
dwellInSeconds: true // specifies the unit for dwelling: true:seconds and false:milliseconds.
};
};






var permittedCommentChars = " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,=_-";
var permittedCommentChars = " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,=_-";


var mapCoolantTable = new Table(
var mapCoolantTable = new Table(
[9, 8, 7],
[9, 8, 7],
{initial:COOLANT_OFF, force:true},
{initial:COOLANT_OFF, force:true},
"Invalid coolant mode"
"Invalid coolant mode"
);
);


var nFormat = createFormat({prefix:"N", decimals:0});
var nFormat = createFormat({prefix:"N", decimals:0});
var gFormat = createFormat({prefix:"G", decimals:1});
var gFormat = createFormat({prefix:"G", decimals:1});
var mFormat = createFormat({prefix:"M", decimals:0});
var mFormat = createFormat({prefix:"M", decimals:0});
var hFormat = createFormat({prefix:"H", decimals:0});
var hFormat = createFormat({prefix:"H", decimals:0});
var dFormat = createFormat({prefix:"D", decimals:0});
var dFormat = createFormat({prefix:"D", decimals:0});
var xyzFormat = createFormat({decimals:(unit == MM ? 3 : 4), forceDecimal:true});
var xyzFormat = createFormat({decimals:(unit == MM ? 3 : 4), forceDecimal:true});
var rFormat = xyzFormat; // radius
var rFormat = xyzFormat; // radius
var abcFormat = createFormat({decimals:3, forceDecimal:true, scale:DEG});
var abcFormat = createFormat({decimals:3, forceDecimal:true, scale:DEG});
var feedFormat = createFormat({decimals:(unit == MM ? 0 : 1), forceDecimal:true});
var feedFormat = createFormat({decimals:(unit == MM ? 0 : 1), forceDecimal:true});
var toolFormat = createFormat({decimals:0});
var toolFormat = createFormat({decimals:0});
var rpmFormat = createFormat({decimals:0});
var rpmFormat = createFormat({decimals:0});
var secFormat = createFormat({decimals:3, forceDecimal:true}); // seconds - range 0.001-99999.999
var secFormat = createFormat({decimals:3, forceDecimal:true}); // seconds - range 0.001-99999.999
var milliFormat = createFormat({decimals:0}); // milliseconds // range 1-9999
var milliFormat = createFormat({decimals:0}); // milliseconds // range 1-9999
var taperFormat = createFormat({decimals:1, scale:DEG});
var taperFormat = createFormat({decimals:1, scale:DEG});


var xOutput = createVariable({prefix:"X"}, xyzFormat);
var xOutput = createVariable({prefix:"X"}, xyzFormat);
var yOutput = createVariable({prefix:"Y"}, xyzFormat);
var yOutput = createVariable({prefix:"Y"}, xyzFormat);
var zOutput = createVariable({prefix:"Z"}, xyzFormat);
var zOutput = createVariable({prefix:"Z"}, xyzFormat);
var aOutput = createVariable({prefix:"A"}, abcFormat);
var aOutput = createVariable({prefix:"A"}, abcFormat);
var bOutput = createVariable({prefix:"B"}, abcFormat);
var bOutput = createVariable({prefix:"B"}, abcFormat);
var cOutput = createVariable({prefix:"C"}, abcFormat);
var cOutput = createVariable({prefix:"C"}, abcFormat);
var feedOutput = createVariable({prefix:"F"}, feedFormat);
var feedOutput = createVariable({prefix:"F"}, feedFormat);
var sOutput = createVariable({prefix:"S", force:true}, rpmFormat);
var sOutput = createVariable({prefix:"S", force:true}, rpmFormat);
var dOutput = createVariable({}, dFormat);
var dOutput = createVariable({}, dFormat);


// circular output
// circular output
var iOutput = createReferenceVariable({prefix:"I", force:true}, xyzFormat);
var iOutput = createReferenceVariable({prefix:"I", force:true}, xyzFormat);
var jOutput = createReferenceVariable({prefix:"J", force:true}, xyzFormat);
var jOutput = createReferenceVariable({prefix:"J", force:true}, xyzFormat);
var kOutput = createReferenceVariable({prefix:"K", force:true}, xyzFormat);
var kOutput = createReferenceVariable({prefix:"K", force:true}, xyzFormat);


var gMotionModal = createModal({force:true}, gFormat); // modal group 1 // G0-G3, ...
var gMotionModal = createModal({force:true}, gFormat); // modal group 1 // G0-G3, ...
var gPlaneModal = createModal({onchange:function () {gMotionModal.reset();}}, gFormat); // modal group 2 // G17-19
var gPlaneModal = createModal({onchange:function () {gMotionModal.reset();}}, gFormat); // modal group 2 // G17-19
var gAbsIncModal = createModal({}, gFormat); // modal group 3 // G90-91
var gAbsIncModal = createModal({}, gFormat); // modal group 3 // G90-91
var gFeedModeModal = createModal({}, gFormat); // modal group 5 // G93-94
var gFeedModeModal = createModal({}, gFormat); // modal group 5 // G93-94
var gUnitModal = createModal({}, gFormat); // modal group 6 // G20-21
var gUnitModal = createModal({}, gFormat); // modal group 6 // G20-21
var gCycleModal = createModal({}, gFormat); // modal group 9 // G81, ...
var gCycleModal = createModal({force:false}, gFormat); // modal group 9 // G81, ...
var gRetractModal = createModal({}, gFormat); // modal group 10 // G98-99
var gRetractModal = createModal({force:true}, gFormat); // modal group 10 // G98-99


var WARNING_WORK_OFFSET = 0;
var WARNING_WORK_OFFSET = 0;


// collected state
// collected state
var sequenceNumber;
var sequenceNumber;
var currentWorkOffset;
var currentWorkOffset;
var previousCoolantMode;


/**
/**
Writes the specified block.
Writes the specified block.
*/
*/
function writeBlock() {
function writeBlock() {
if (properties.showSequenceNumbers) {
if (properties.showSequenceNumbers) {
writeWords2(nFormat.format(sequenceNumber % 100000), arguments);
writeWords2(nFormat.format(sequenceNumber % 100000), arguments);
sequenceNumber += properties.sequenceNumberIncrement;
sequenceNumber += properties.sequenceNumberIncrement;
} else {
} else {
writeWords(arguments);
writeWords(arguments);
}
}
}
}


/**
/**
Output a comment.
Output a comment.
*/
*/
function writeComment(text) {
function writeComment(text) {
writeln("(" + filterText(String(text).toUpperCase(), permittedCommentChars) + ")");
writeln("(" + filterText(String(text).toUpperCase(), permittedCommentChars) + ")");
}
}


function onOpen() {
function onOpen() {


if (false) {
if (false) {
var aAxis = createAxis({coordinate:0, table:true, axis:[-1, 0, 0], cyclic:true, preference:1});
var aAxis = createAxis({coordinate:0, table:true, axis:[-1, 0, 0], cyclic:true, preference:1});
machineConfiguration = new MachineConfiguration(aAxis);
machineConfiguration = new MachineConfiguration(aAxis);


setMachineConfiguration(machineConfiguration);
setMachineConfiguration(machineConfiguration);
optimizeMachineAngles2(1); // map tip mode
optimizeMachineAngles2(1); // map tip mode
}
}


if (!machineConfiguration.isMachineCoordinate(0)) {
if (!machineConfiguration.isMachineCoordinate(0)) {
aOutput.disable();
aOutput.disable();
}
}
if (!machineConfiguration.isMachineCoordinate(1)) {
if (!machineConfiguration.isMachineCoordinate(1)) {
bOutput.disable();
bOutput.disable();
}
}
if (!machineConfiguration.isMachineCoordinate(2)) {
if (!machineConfiguration.isMachineCoordinate(2)) {
cOutput.disable();
cOutput.disable();
}
}
if (!properties.separateWordsWithSpace) {
if (!properties.separateWordsWithSpace) {
setWordSeparator("");
setWordSeparator("");
}
}


sequenceNumber = properties.sequenceNumberStart;
sequenceNumber = properties.sequenceNumberStart;


writeln("%");
writeln("%");
writeln("(*********************************************************)");
writeln("(* Tormach Path Pilot Post Processsor Version 0.4 Debug *)");
writeln("(*********************************************************)");
if (programName) {
if (programName) {
writeComment(programName);
writeComment(programName);
}
}
if (programComment) {
if (programComment) {
writeComment(programComment);
writeComment(programComment);
}
}


// dump machine configuration
// dump machine configuration
var vendor = machineConfiguration.getVendor();
var vendor = machineConfiguration.getVendor();
var model = machineConfiguration.getModel();
var model = machineConfiguration.getModel();
var description = machineConfiguration.getDescription();
var description = machineConfiguration.getDescription();


if (properties.writeMachine && (vendor || model || description)) {
if (properties.writeMachine && (vendor || model || description)) {
writeComment(localize("Machine"));
writeComment(localize("Machine"));
if (vendor) {
if (vendor) {
writeComment(" " + localize("vendor") + ": " + vendor);
writeComment(" " + localize("vendor") + ": " + vendor);
}
}
if (model) {
if (model) {
writeComment(" " + localize("model") + ": " + model);
writeComment(" " + localize("model") + ": " + model);
}
}
if (description) {
if (description) {
writeComment(" " + localize("description") + ": " + description);
writeComment(" " + localize("description") + ": " + description);
}
}
}
}


// dump tool information
// dump tool information
if (properties.writeTools) {
if (properties.writeTools) {
var zRanges = {};
var zRanges = {};
if (is3D()) {
if (is3D()) {
var numberOfSections = getNumberOfSections();
var numberOfSections = getNumberOfSections();
for (var i = 0; i < numberOfSections; ++i) {
for (var i = 0; i < numberOfSections; ++i) {
var section = getSection(i);
var section = getSection(i);
var zRange = section.getGlobalZRange();
var zRange = section.getGlobalZRange();
var tool = section.getTool();
var tool = section.getTool();
if (zRanges[tool.number]) {
if (zRanges[tool.number]) {
zRanges[tool.number].expandToRange(zRange);
zRanges[tool.number].expandToRange(zRange);
} else {
} else {
zRanges[tool.number] = zRange;
zRanges[tool.number] = zRange;
}
}
}
}
}
}


var tools = getToolTable();
var tools = getToolTable();
if (tools.getNumberOfTools() > 0) {
if (tools.getNumberOfTools() > 0) {
for (var i = 0; i < tools.getNumberOfTools(); ++i) {
for (var i = 0; i < tools.getNumberOfTools(); ++i) {
var tool = tools.getTool(i);
var tool = tools.getTool(i);
var comment = "T" + toolFormat.format(tool.number) + " " +
var comment = "T" + toolFormat.format(tool.number) + " " +
"D=" + xyzFormat.format(tool.diameter) + " " +
"D=" + xyzFormat.format(tool.diameter) + " " +
localize("CR") + "=" + xyzFormat.format(tool.cornerRadius);
localize("CR") + "=" + xyzFormat.format(tool.cornerRadius);
if ((tool.taperAngle > 0) && (tool.taperAngle < Math.PI)) {
if ((tool.taperAngle > 0) && (tool.taperAngle < Math.PI)) {
comment += " " + localize("TAPER") + "=" + taperFormat.format(tool.taperAngle) + localize("deg");
comment += " " + localize("TAPER") + "=" + taperFormat.format(tool.taperAngle) + localize("deg");
}
}
if (zRanges[tool.number]) {
if (zRanges[tool.number]) {
comment += " - " + localize("ZMIN") + "=" + xyzFormat.format(zRanges[tool.number].getMinimum());
comment += " - " + localize("ZMIN") + "=" + xyzFormat.format(zRanges[tool.number].getMinimum());
}
}
comment += " - " + getToolTypeName(tool.type);
comment += " - " + getToolTypeName(tool.type);
writeComment(comment);
writeComment(comment);
}
}
}
}
}
}
if (false) {
if (false) {
// check for duplicate tool number
// check for duplicate tool number
for (var i = 0; i < getNumberOfSections(); ++i) {
for (var i = 0; i < getNumberOfSections(); ++i) {
var sectioni = getSection(i);
var sectioni = getSection(i);
var tooli = sectioni.getTool();
var tooli = sectioni.getTool();
for (var j = i + 1; j < getNumberOfSections(); ++j) {
for (var j = i + 1; j < getNumberOfSections(); ++j) {
var sectionj = getSection(j);
var sectionj = getSection(j);
var toolj = sectionj.getTool();
var toolj = sectionj.getTool();
if (tooli.number == toolj.number) {
if (tooli.number == toolj.number) {
if (xyzFormat.areDifferent(tooli.diameter, toolj.diameter) ||
if (xyzFormat.areDifferent(tooli.diameter, toolj.diameter) ||
xyzFormat.areDifferent(tooli.cornerRadius, toolj.cornerRadius) ||
xyzFormat.areDifferent(tooli.cornerRadius, toolj.cornerRadius) ||
abcFormat.areDifferent(tooli.taperAngle, toolj.taperAngle) ||
abcFormat.areDifferent(tooli.taperAngle, toolj.taperAngle) ||
(tooli.numberOfFlutes != toolj.numberOfFlutes)) {
(tooli.numberOfFlutes != toolj.numberOfFlutes)) {
error(
error(
subst(
subst(
localize("Using the same tool number for different cutter geometry for operation '%1' and '%2'."),
localize("Using the same tool number for different cutter geometry for operation '%1' and '%2'."),
sectioni.hasParameter("operation-comment") ? sectioni.getParameter("operation-comment") : ("#" + (i + 1)),
sectioni.hasParameter("operation-comment") ? sectioni.getParameter("operation-comment") : ("#" + (i + 1)),
sectionj.hasParameter("operation-comment") ? sectionj.getParameter("operation-comment") : ("#" + (j + 1))
sectionj.hasParameter("operation-comment") ? sectionj.getParameter("operation-comment") : ("#" + (j + 1))
)
)
);
);
return;
return;
}
}
}
}
}
}
}
}
}
}


// absolute coordinates and feed per min
// absolute coordinates and feed per min
writeBlock(gAbsIncModal.format(90), gFormat.format(54), gFormat.format(64), gFormat.format(50), gPlaneModal.format(17), gFormat.format(40), gFormat.format(80), gFeedModeModal.format(94), gFormat.format(91.1), gFormat.format(49));
writeBlock(gAbsIncModal.format(90), gFormat.format(54), gFormat.format(64), gFormat.format(50), gPlaneModal.format(17), gFormat.format(40), gFormat.format(80), gFeedModeModal.format(94), gFormat.format(91.1), gFormat.format(49));


switch (unit) {
switch (unit) {
case IN:
case IN:
writeBlock(gUnitModal.format(20));
writeBlock(gUnitModal.format(20), "(Inch)" );
break;
break;
case MM:
case MM:
writeBlock(gUnitModal.format(21));
writeBlock(gUnitModal.format(21), "(Metric)");
break;
break;
}
}
}
}


function onComment(message) {
function onComment(message) {
var comments = String(message).split(";");
var comments = String(message).split(";");
for (comment in comments) {
for (comment in comments) {
writeComment(comments[comment]);
writeComment(comments[comment]);
}
}
}
}


/** Force output of X, Y, and Z. */
/** Force output of X, Y, and Z. */
function forceXYZ() {
function forceXYZ() {
xOutput.reset();
xOutput.reset();
yOutput.reset();
yOutput.reset();
zOutput.reset();
zOutput.reset();
}
}


/** Force output of A, B, and C. */
/** Force output of A, B, and C. */
function forceABC() {
function forceABC() {
aOutput.reset();
aOutput.reset();
bOutput.reset();
bOutput.reset();
cOutput.reset();
cOutput.reset();
}
}


/** Force output of X, Y, Z, A, B, C, and F on next output. */
/** Force output of X, Y, Z, A, B, C, and F on next output. */
function forceAny() {
function forceAny() {
forceXYZ();
forceXYZ();
forceABC();
forceABC();
feedOutput.reset();
feedOutput.reset();
}
}


var currentWorkPlaneABC = undefined;
var currentWorkPlaneABC = undefined;


function forceWorkPlane() {
function forceWorkPlane() {
currentWorkPlaneABC = undefined;
currentWorkPlaneABC = undefined;
}
}


function setWorkPlane(abc) {
function setWorkPlane(abc) {
if (!machineConfiguration.isMultiAxisConfiguration()) {
if (!machineConfiguration.isMultiAxisConfiguration()) {
return; // ignore
return; // ignore
}
}


if (!((currentWorkPlaneABC == undefined) ||
if (!((currentWorkPlaneABC == undefined) ||
abcFormat.areDifferent(abc.x, currentWorkPlaneABC.x) ||
abcFormat.areDifferent(abc.x, currentWorkPlaneABC.x) ||
abcFormat.areDifferent(abc.y, currentWorkPlaneABC.y) ||
abcFormat.areDifferent(abc.y, currentWorkPlaneABC.y) ||
abcFormat.areDifferent(abc.z, currentWorkPlaneABC.z))) {
abcFormat.areDifferent(abc.z, currentWorkPlaneABC.z))) {
return; // no change
return; // no change
}
}


onCommand(COMMAND_UNLOCK_MULTI_AXIS);
onCommand(COMMAND_UNLOCK_MULTI_AXIS);


// NOTE: add retract here
// NOTE: add retract here


writeBlock(
writeBlock(
gMotionModal.format(0),
gMotionModal.format(0),
conditional(machineConfiguration.isMachineCoordinate(0), "A" + abcFormat.format(abc.x)),
conditional(machineConfiguration.isMachineCoordinate(0), "A" + abcFormat.format(abc.x)),
conditional(machineConfiguration.isMachineCoordinate(1), "B" + abcFormat.format(abc.y)),
conditional(machineConfiguration.isMachineCoordinate(1), "B" + abcFormat.format(abc.y)),
conditional(machineConfiguration.isMachineCoordinate(2), "C" + abcFormat.format(abc.z))
conditional(machineConfiguration.isMachineCoordinate(2), "C" + abcFormat.format(abc.z))
);
);
onCommand(COMMAND_LOCK_MULTI_AXIS);
onCommand(COMMAND_LOCK_MULTI_AXIS);


currentWorkPlaneABC = abc;
currentWorkPlaneABC = abc;
}
}


var closestABC = false; // choose closest machine angles
var closestABC = false; // choose closest machine angles
var currentMachineABC;
var currentMachineABC;


function getWorkPlaneMachineABC(workPlane) {
function getWorkPlaneMachineABC(workPlane) {
var W = workPlane; // map to global frame
var W = workPlane; // map to global frame


var abc = machineConfiguration.getABC(W);
var abc = machineConfiguration.getABC(W);
if (closestABC) {
if (closestABC) {
if (currentMachineABC) {
if (currentMachineABC) {
abc = machineConfiguration.remapToABC(abc, currentMachineABC);
abc = machineConfiguration.remapToABC(abc, currentMachineABC);
} else {
} else {
abc = machineConfiguration.getPreferredABC(abc);
abc = machineConfiguration.getPreferredABC(abc);
}
}
} else {
} else {
abc = machineConfiguration.getPreferredABC(abc);
abc = machineConfiguration.getPreferredABC(abc);
}
}
try {
try {
abc = machineConfiguration.remapABC(abc);
abc = machineConfiguration.remapABC(abc);
currentMachineABC = abc;
currentMachineABC = abc;
} catch (e) {
} catch (e) {
error(
error(
localize("Machine angles not supported") + ":"
localize("Machine angles not supported") + ":"
+ conditional(machineConfiguration.isMachineCoordinate(0), " A" + abcFormat.format(abc.x))
+ conditional(machineConfiguration.isMachineCoordinate(0), " A" + abcFormat.format(abc.x))
+ conditional(machineConfiguration.isMachineCoordinate(1), " B" + abcFormat.format(abc.y))
+ conditional(machineConfiguration.isMachineCoordinate(1), " B" + abcFormat.format(abc.y))
+ conditional(machineConfiguration.isMachineCoordinate(2), " C" + abcFormat.format(abc.z))
+ conditional(machineConfiguration.isMachineCoordinate(2), " C" + abcFormat.format(abc.z))
);
);
}
}
var direction = machineConfiguration.getDirection(abc);
var direction = machineConfiguration.getDirection(abc);
if (!isSameDirection(direction, W.forward)) {
if (!isSameDirection(direction, W.forward)) {
error(localize("Orientation not supported."));
error(localize("Orientation not supported."));
}
}
if (!machineConfiguration.isABCSupported(abc)) {
if (!machineConfiguration.isABCSupported(abc)) {
error(
error(
localize("Work plane is not supported") + ":"
localize("Work plane is not supported") + ":"
+ conditional(machineConfiguration.isMachineCoordinate(0), " A" + abcFormat.format(abc.x))
+ conditional(machineConfiguration.isMachineCoordinate(0), " A" + abcFormat.format(abc.x))
+ conditional(machineConfiguration.isMachineCoordinate(1), " B" + abcFormat.format(abc.y))
+ conditional(machineConfiguration.isMachineCoordinate(1), " B" + abcFormat.format(abc.y))
+ conditional(machineConfiguration.isMachineCoordinate(2), " C" + abcFormat.format(abc.z))
+ conditional(machineConfiguration.isMachineCoordinate(2), " C" + abcFormat.format(abc.z))
);
);
}
}


var tcp = true;
var tcp = true;
if (tcp) {
if (tcp) {
setRotation(W); // TCP mode
setRotation(W); // TCP mode
} else {
} else {
var O = machineConfiguration.getOrientation(abc);
var O = machineConfiguration.getOrientation(abc);
var R = machineConfiguration.getRemainingOrientation(abc, W);
var R = machineConfiguration.getRemainingOrientation(abc, W);
setRotation(R);
setRotation(R);
}
}
return abc;
return abc;
}
}


function onSection() {
function onSection() {
var insertToolCall = isFirstSection() ||
var insertToolCall = isFirstSection() ||
currentSection.getForceToolChange && currentSection.getForceToolChange() ||
currentSection.getForceToolChange && currentSection.getForceToolChange() ||
(tool.number != getPreviousSection().getTool().number);
(tool.number != getPreviousSection().getTool().number);
var retracted = false; // specifies that the tool has been retracted to the safe plane
var retracted = false; // specifies that the tool has been retracted to the safe plane
var newWorkOffset = isFirstSection() ||
var newWorkOffset = isFirstSection() ||
(getPreviousSection().workOffset != currentSection.workOffset); // work offset changes
(getPreviousSection().workOffset != currentSection.workOffset); // work offset changes
var newWorkPlane = isFirstSection() ||
var newWorkPlane = isFirstSection() ||
!isSameDirection(getPreviousSection().getGlobalFinalToolAxis(), currentSection.getGlobalInitialToolAxis());
!isSameDirection(getPreviousSection().getGlobalFinalToolAxis(), currentSection.getGlobalInitialToolAxis());
if (insertToolCall || newWorkOffset || newWorkPlane) {
if (insertToolCall || newWorkOffset || newWorkPlane) {
if (properties.useG28) {
if (properties.useG28) {
// retract to safe plane
// retract to safe plane
retracted = true;
retracted = true;
writeBlock(gFormat.format(28), gAbsIncModal.format(91), "Z" + xyzFormat.format(0)); // retract
//writeBlock(gFormat.format(28), gAbsIncModal.format(91), "Z" + xyzFormat.format(0)); // retract
writeBlock(gFormat.format(30)); // use G30 instead of G28 above
writeBlock(gAbsIncModal.format(90));
writeBlock(gAbsIncModal.format(90));
zOutput.reset();
zOutput.reset();
}
}
}
}


writeln("");
writeln("");


if (hasParameter("operation-comment")) {
if (hasParameter("operation-comment")) {
var comment = getParameter("operation-comment");
var comment = getParameter("operation-comment");
if (comment) {
if (comment) {
writeComment(comment);
writeComment(comment);
}
}
}
}


if (insertToolCall) {
if (insertToolCall) {
forceWorkPlane();
forceWorkPlane();
// onCommand(COMMAND_STOP_SPINDLE);
// onCommand(COMMAND_STOP_SPINDLE);
// onCommand(COMMAND_COOLANT_OFF);
// onCommand(COMMAND_COOLANT_OFF);
if (!isFirstSection() && properties.optionalStop) {
if (!isFirstSection() && properties.optionalStop) {
onCommand(COMMAND_OPTIONAL_STOP);
onCommand(COMMAND_OPTIONAL_STOP);
}
}


if (tool.number > 256) {
if (tool.number > 256) {
warning(localize("Tool number exceeds maximum value."));
warning(localize("Tool number exceeds maximum value."));
}
}
var lengthOffset = tool.lengthOffset;
var lengthOffset = tool.lengthOffset;
if (lengthOffset > 256) {
if (lengthOffset > 256) {
error(localize("Length offset out of range."));
error(localize("Length offset out of range."));
return;
return;
}
}


writeBlock(mFormat.format(998));
// writeBlock(mFormat.format(998));
writeBlock(gFormat.format(30));
if (properties.useM6) {
if (properties.useM6) {
writeBlock("T" + toolFormat.format(tool.number),
writeBlock("T" + toolFormat.format(tool.number),
gFormat.format(43),
gFormat.format(43),
hFormat.format(lengthOffset),
hFormat.format(lengthOffset),
mFormat.format(6));
mFormat.format(6));
} else {
} else {
writeBlock("T" + toolFormat.format(tool.number), gFormat.format(43), hFormat.format(lengthOffset));
writeBlock("T" + toolFormat.format(tool.number), gFormat.format(43), hFormat.format(lengthOffset));
}
}
if (tool.comment) {
if (tool.comment) {
writeComment(tool.comment);
writeComment(tool.comment);
}
}
var showToolZMin = false;
var showToolZMin = false;
if (showToolZMin) {
if (showToolZMin) {
if (is3D()) {
if (is3D()) {
var numberOfSections = getNumberOfSections();
var numberOfSections = getNumberOfSections();
var zRange = currentSection.getGlobalZRange();
var zRange = currentSection.getGlobalZRange();
var number = tool.number;
var number = tool.number;
for (var i = currentSection.getId() + 1; i < numberOfSections; ++i) {
for (var i = currentSection.getId() + 1; i < numberOfSections; ++i) {
var section = getSection(i);
var section = getSection(i);
if (section.getTool().number != number) {
if (section.getTool().number != number) {
break;
break;
}
}
zRange.expandToRange(section.getGlobalZRange());
zRange.expandToRange(section.getGlobalZRange());
}
}
writeComment(localize("ZMIN") + "=" + zRange.getMinimum());
writeComment(localize("ZMIN") + "=" + zRange.getMinimum());
}
}
}
}


if (properties.preloadTool && properties.useM6) {
if (properties.preloadTool && properties.useM6) {
var nextTool = getNextTool(tool.number);
var nextTool = getNextTool(tool.number);
if (nextTool) {
if (nextTool) {
writeBlock("T" + toolFormat.format(nextTool.number));
writeBlock("T" + toolFormat.format(nextTool.number));
} else {
} else {
// preload first tool
// preload first tool
var section = getSection(0);
var section = getSection(0);
var firstToolNumber = section.getTool().number;
var firstToolNumber = section.getTool().number;
if (tool.number != firstToolNumber) {
if (tool.number != firstToolNumber) {
writeBlock("T" + toolFormat.format(firstToolNumber));
writeBlock("T" + toolFormat.format(firstToolNumber));
}
}
}
}
}
}
}
}
if (insertToolCall ||
// set coolant after we have positioned at Z
var c = mapCoolantTable.lookup(tool.coolant);
/* {
var c = mapCoolantTable.lookup(tool.coolant);
if (c) {
writeBlock(mFormat.format(c));
} else {
warning(localize("Coolant not supported."));
}
} */
/* if (insertToolCall ||
isFirstSection() ||
isFirstSection() ||
(rpmFormat.areDifferent(tool.spindleRPM, sOutput.getCurrent())) ||
(rpmFormat.areDifferent(tool.spindleRPM, sOutput.getCurrent())) ||
(tool.clockwise != getPreviousSection().getTool().clockwise)) {
(tool.clockwise != getPreviousSection().getTool().clockwise) || previousCoolantMode != c) { */
if (tool.spindleRPM < 1) {
if (tool.spindleRPM < 1) {
error(localize("Spindle speed out of range."));
error(localize("Spindle speed out of range."));
return;
return;
}
}
if (tool.spindleRPM > 99999) {
if (tool.spindleRPM > 99999) {
warning(localize("Spindle speed exceeds maximum value."));
warning(localize("Spindle speed exceeds maximum value."));
}
}
writeBlock(
writeBlock(
sOutput.format(tool.spindleRPM), mFormat.format(tool.clockwise ? 3 : 4)
sOutput.format(tool.spindleRPM), mFormat.format(tool.clockwise ? 3 : 4),
conditional(c, mFormat.format(c))
);
);
}
previousCoolantMode = c;
// }


// wcs
// wcs
var workOffset = currentSection.workOffset;
var workOffset = currentSection.workOffset;
if (workOffset == 0) {
if (workOffset == 0) {
warningOnce(localize("Work offset has not been specified. Using G54 as WCS."), WARNING_WORK_OFFSET);
warningOnce(localize("Work offset has not been specified. Using G54 as WCS."), WARNING_WORK_OFFSET);
workOffset = 1;
workOffset = 1;
}
}
if (workOffset > 0) {
if (workOffset > 0) {
if (workOffset > 6) {
if (workOffset > 6) {
var p = workOffset; // 1->... // G59 P1 is the same as G54 and so on
var p = workOffset; // 1->... // G59 P1 is the same as G54 and so on
if (p > 254) {
if (p > 254) {
error(localize("Work offset out of range."));
error(localize("Work offset out of range."));
} else {
} else {
if (workOffset != currentWorkOffset) {
if (workOffset != currentWorkOffset) {
writeBlock(gFormat.format(59), "P" + p); // G59 P
writeBlock(gFormat.format(59), "P" + p); // G59 P
currentWorkOffset = workOffset;
currentWorkOffset = workOffset;
}
}
}
}
} else {
} else {
if (workOffset != currentWorkOffset) {
if (workOffset != currentWorkOffset) {
writeBlock(gFormat.format(53 + workOffset)); // G54->G59
writeBlock(gFormat.format(53 + workOffset)); // G54->G59
currentWorkOffset = workOffset;
currentWorkOffset = workOffset;
}
}
}
}
}
}


forceXYZ();
forceXYZ();


if (machineConfiguration.isMultiAxisConfiguration()) { // use 5-axis indexing for multi-axis mode
if (machineConfiguration.isMultiAxisConfiguration()) { // use 5-axis indexing for multi-axis mode
// set working plane after datum shift
// set working plane after datum shift


var abc = new Vector(0, 0, 0);
var abc = new Vector(0, 0, 0);
if (currentSection.isMultiAxis()) {
if (currentSection.isMultiAxis()) {
forceWorkPlane();
forceWorkPlane();
cancelTransformation();
cancelTransformation();
} else {
} else {
abc = getWorkPlaneMachineABC(currentSection.workPlane);
abc = getWorkPlaneMachineABC(currentSection.workPlane);
}
}
setWorkPlane(abc);
setWorkPlane(abc);
} else { // pure 3D
} else { // pure 3D
var remaining = currentSection.workPlane;
var remaining = currentSection.workPlane;
if (!isSameDirection(remaining.forward, new Vector(0, 0, 1))) {
if (!isSameDirection(remaining.forward, new Vector(0, 0, 1))) {
error(localize("Tool orientation is not supported."));
error(localize("Tool orientation is not supported."));
return;
return;
}
}
setRotation(remaining);
setRotation(remaining);
}
}




forceAny();
forceAny();
gMotionModal.reset();
gMotionModal.reset();


var initialPosition = getFramePosition(currentSection.getInitialPosition());
var initialPosition = getFramePosition(currentSection.getInitialPosition());
if (!retracted) {
if (!retracted) {
if (getCurrentPosition().z < initialPosition.z) {
if (getCurrentPosition().z < initialPosition.z) {
writeBlock(gMotionModal.format(0), zOutput.format(initialPosition.z));
writeBlock(gMotionModal.format(0), zOutput.format(initialPosition.z));
}
}
}
}


if (!insertToolCall && retracted) { // G43 already called above on tool change
if (!insertToolCall && retracted) { // G43 already called above on tool change
var lengthOffset = tool.lengthOffset;
var lengthOffset = tool.lengthOffset;
if (lengthOffset > 256) {
if (lengthOffset > 256) {
error(localize("Length offset out of range."));
error(localize("Length offset out of range."));
return;
return;
}
}


gMotionModal.reset();
gMotionModal.reset();
writeBlock(gPlaneModal.format(17));
writeBlock(gPlaneModal.format(17));
if (!machineConfiguration.isHeadConfiguration()) {
if (!machineConfiguration.isHeadConfiguration()) {
writeBlock(
writeBlock(
gAbsIncModal.format(90),
gAbsIncModal.format(90),
gMotionModal.format(0), xOutput.format(initialPosition.x), yOutput.format(initialPosition.y)
gMotionModal.format(0), xOutput.format(initialPosition.x), yOutput.format(initialPosition.y)
);
);
writeBlock(gMotionModal.format(0), gFormat.format(43), zOutput.format(initialPosition.z), hFormat.format(lengthOffset));
writeBlock(gMotionModal.format(0), gFormat.format(43), zOutput.format(initialPosition.z), hFormat.format(lengthOffset));
} else {
} else {
writeBlock(
writeBlock(
gAbsIncModal.format(90),
gAbsIncModal.format(90),
gMotionModal.format(0),
gMotionModal.format(0),
gFormat.format(43), xOutput.format(initialPosition.x),
gFormat.format(43), xOutput.format(initialPosition.x),
yOutput.format(initialPosition.y),
yOutput.format(initialPosition.y),
zOutput.format(initialPosition.z), hFormat.format(lengthOffset)
zOutput.format(initialPosition.z), hFormat.format(lengthOffset)
);
);
}
}
} else {
} else {
writeBlock(
writeBlock(
gAbsIncModal.format(90),
gAbsIncModal.format(90),
gMotionModal.format(0),
gMotionModal.format(0),
xOutput.format(initialPosition.x),
xOutput.format(initialPosition.x),
yOutput.format(initialPosition.y)
yOutput.format(initialPosition.y)
);
);
}
}


// set coolant after we have positioned at Z
// set coolant after we have positioned at Z
{
/* {
var c = mapCoolantTable.lookup(tool.coolant);
var c = mapCoolantTable.lookup(tool.coolant);
if (c) {
if (c) {
writeBlock(mFormat.format(c));
writeBlock(mFormat.format(c));
} else {
} else {
warning(localize("Coolant not supported."));
warning(localize("Coolant not supported."));
}
}
}
} */
}
}


function onDwell(seconds) {
function onDwell(seconds) {
if (seconds > 99999.999) {
if (seconds > 99999.999) {
warning(localize("Dwelling time is out of range."));
warning(localize("Dwelling time is out of range."));
}
}
if (properties.dwellInSeconds) {
if (properties.dwellInSeconds) {
writeBlock(gFormat.format(4), "P" + secFormat.format(seconds));
writeBlock(gFormat.format(4), "P" + secFormat.format(seconds));
} else {
} else {
milliseconds = clamp(1, seconds * 1000, 99999999);
milliseconds = clamp(1, seconds * 1000, 99999999);
writeBlock(gFormat.format(4), "P" + milliFormat.format(milliseconds));
writeBlock(gFormat.format(4), "P" + milliFormat.format(milliseconds));
}
}
}
}


function onSpindleSpeed(spindleSpeed) {
function onSpindleSpeed(spindleSpeed) {
writeBlock(sOutput.format(spindleSpeed));
writeBlock(sOutput.format(spindleSpeed));
}
}


function onCycle() {
function onCycle() {
writeBlock(gPlaneModal.format(17));
writeBlock(gPlaneModal.format(17));
}
}


function getCommonCycle(x, y, z, r) {
function getCommonCycle(x, y, z, r) {
forceXYZ();
forceXYZ();
return [xOutput.format(x), yOutput.format(y),
return [xOutput.format(x), yOutput.format(y),
zOutput.format(z),
zOutput.format(z),
"R" + xyzFormat.format(r)];
"R" + xyzFormat.format(r)];
}
}


function onCyclePoint(x, y, z) {
function onCyclePoint(x, y, z) {
if (isFirstCyclePoint()) {
if (isFirstCyclePoint()) {
repositionToCycleClearance(cycle, x, y, z);
repositionToCycleClearance(cycle, x, y, z);
// return to initial Z which is clearance plane and set absolute mode
// return to initial Z which is clearance plane and set absolute mode


var F = cycle.feedrate;
var F = cycle.feedrate;
var P = (cycle.dwell == 0) ? 0 : cycle.dwell; // in seconds
var P = (cycle.dwell == 0) ? 0 : cycle.dwell; // in seconds


switch (cycleType) {
switch (cycleType) {
case "drilling":
case "drilling":
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(81),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(81),
getCommonCycle(x, y, z, cycle.retract),
getCommonCycle(x, y, z, cycle.retract),
feedOutput.format(F)
feedOutput.format(F)
);
);
break;
break;
case "counter-boring":
case "counter-boring":
if (P > 0) {
if (P > 0) {
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(82),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(82),
getCommonCycle(x, y, z, cycle.retract),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
"P" + secFormat.format(P),
feedOutput.format(F)
feedOutput.format(F)
);
);
} else {
} else {
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(81),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(81),
getCommonCycle(x, y, z, cycle.retract),
getCommonCycle(x, y, z, cycle.retract),
feedOutput.format(F)
feedOutput.format(F)
);
);
}
}
break;
break;
case "chip-breaking":
case "chip-breaking":
// cycle.accumulatedDepth is ignored
// cycle.accumulatedDepth is ignored
if (P > 0) {
if (P > 0) {
expandCyclePoint(x, y, z);
expandCyclePoint(x, y, z);
} else {
} else {
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(73),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(73),
getCommonCycle(x, y, z, cycle.retract),
getCommonCycle(x, y, z, cycle.retract),
"Q" + xyzFormat.format(cycle.incrementalDepth),
"Q" + xyzFormat.format(cycle.incrementalDepth),
feedOutput.format(F)
feedOutput.format(F)
);
);
}
}
break;
break;
case "deep-drilling":
case "deep-drilling":
if (P > 0) {
if (P > 0) {
expandCyclePoint(x, y, z);
expandCyclePoint(x, y, z);
} else {
} else {
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(83),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(83),
getCommonCycle(x, y, z, cycle.retract),
getCommonCycle(x, y, z, cycle.retract),
"Q" + xyzFormat.format(cycle.incrementalDepth),
"Q" + xyzFormat.format(cycle.incrementalDepth),
// conditional(P > 0, "P" + secFormat.format(P)),
// conditional(P > 0, "P" + secFormat.format(P)),
feedOutput.format(F)
feedOutput.format(F)
);
);
}
}
break;
break;
case "tapping":
case "tapping":
if (tool.type == TOOL_TAP_LEFT_HAND) {
if (tool.type == TOOL_TAP_LEFT_HAND) {
expandCyclePoint(x, y, z);
expandCyclePoint(x, y, z);
} else {
} else {
if (!F) {
if (!F) {
F = tool.getTappingFeedrate();
F = tool.getTappingFeedrate();
}
}
writeBlock(mFormat.format(29), sOutput.format(tool.spindleRPM));
writeBlock(sOutput.format(tool.spindleRPM));
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(84),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(84),
getCommonCycle(x, y, z, cycle.retract),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
feedOutput.format(F)
feedOutput.format(F)
);
);
}
}
break;
break;
case "left-tapping":
case "left-tapping":
expandCyclePoint(x, y, z);
expandCyclePoint(x, y, z);
break;
break;
case "right-tapping":
case "right-tapping":
if (!F) {
if (!F) {
F = tool.getTappingFeedrate();
F = tool.getTappingFeedrate();
}
}
writeBlock(mFormat.format(29), sOutput.format(tool.spindleRPM));
writeBlock(mFormat.format(29), sOutput.format(tool.spindleRPM));
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(84),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(84),
getCommonCycle(x, y, z, cycle.retract),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
feedOutput.format(F)
feedOutput.format(F)
);
);
break;
break;
case "fine-boring":
case "fine-boring":
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(76),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(76),
getCommonCycle(x, y, z, cycle.retract),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
"P" + secFormat.format(P),
"Q" + xyzFormat.format(cycle.shift),
"Q" + xyzFormat.format(cycle.shift),
feedOutput.format(F)
feedOutput.format(F)
);
);
break;
break;
case "back-boring":
case "back-boring":
var dx = (gPlaneModal.getCurrent() == 19) ? cycle.backBoreDistance : 0;
var dx = (gPlaneModal.getCurrent() == 19) ? cycle.backBoreDistance : 0;
var dy = (gPlaneModal.getCurrent() == 18) ? cycle.backBoreDistance : 0;
var dy = (gPlaneModal.getCurrent() == 18) ? cycle.backBoreDistance : 0;
var dz = (gPlaneModal.getCurrent() == 17) ? cycle.backBoreDistance : 0;
var dz = (gPlaneModal.getCurrent() == 17) ? cycle.backBoreDistance : 0;
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(87),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(87),
getCommonCycle(x - dx, y - dy, z - dz, cycle.bottom),
getCommonCycle(x - dx, y - dy, z - dz, cycle.bottom),
"I" + xyzFormat.format(cycle.shift),
"I" + xyzFormat.format(cycle.shift),
"J" + xyzFormat.format(0),
"J" + xyzFormat.format(0),
"P" + secFormat.format(P),
"P" + secFormat.format(P),
feedOutput.format(F)
feedOutput.format(F)
);
);
break;
break;
case "reaming":
case "reaming":
if (P > 0) {
if (P > 0) {
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(89),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(89),
getCommonCycle(x, y, z, cycle.retract),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
"P" + secFormat.format(P),
feedOutput.format(F)
feedOutput.format(F)
);
);
} else {
} else {
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(85),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(85),
getCommonCycle(x, y, z, cycle.retract),
getCommonCycle(x, y, z, cycle.retract),
feedOutput.format(F)
feedOutput.format(F)
);
);
}
}
break;
break;
case "stop-boring":
case "stop-boring":
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(86),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(86),
getCommonCycle(x, y, z, cycle.retract),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
"P" + secFormat.format(P),
feedOutput.format(F)
feedOutput.format(F)
);
);
break;
break;
case "manual-boring":
case "manual-boring":
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(88),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(88),
getCommonCycle(x, y, z, cycle.retract),
getCommonCycle(x, y, z, cycle.retract),
"P" + secFormat.format(P),
"P" + secFormat.format(P),
feedOutput.format(F)
feedOutput.format(F)
);
);
break;
break;
case "boring":
case "boring":
if (P > 0) {
if (P > 0) {
writeBlock(
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(89),
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(89),
getCommonCycle(x, y, z, cycle.retract),
getCo
"P" + secFormat.format(P),
feedOutput.format(F)
);
} else {
writeBlock(
gRetractModal.format(98), gAbsIncModal.format(90), gCycleModal.format(85),
getCommonCycle(x, y, z, cycle.retract),
feedOutput.format(F)
);
}
break;
default:
expandCyclePoint(x, y, z);
}
} else {
if (cycleExpanded) {
expandCyclePoint(x, y, z);
} else {
writeBlock(xOutput.format(x), yOutput.format(y));
}
}
}

function onCycleEnd() {
if (!cycleExpanded) {
writeBlock(gCycleModal.format(80));
zOutput.reset();
}
}

var pendingRadiusCompensation = -1;

function onRadiusCompensation() {
pendingRadiusCompensation = radiusCompensation;
}

function onRapid(_x, _y, _z) {
var x = xOutput.format