1083 lines
43 KiB
Plaintext
1083 lines
43 KiB
Plaintext
/**
|
|
Copyright (C) 2012-2025 by Autodesk, Inc.
|
|
All rights reserved.
|
|
|
|
MultiCam HPGL post processor configuration.
|
|
|
|
$Revision: 45608 b291a8a39e704678228667016237559bb9f87f7c $
|
|
$Date: 2025-09-16 08:34:14 $
|
|
|
|
FORKID {07A5CBE6-B093-419b-8CAB-3EF48FF73927}
|
|
*/
|
|
|
|
description = "MultiCam HPGL";
|
|
vendor = "MultiCam";
|
|
vendorUrl = "http://www.multicam.com";
|
|
legal = "Copyright (C) 2012-2025 by Autodesk, Inc.";
|
|
certificationLevel = 2;
|
|
minimumRevision = 45917;
|
|
|
|
longDescription = "Generic milling post for MultiCam HPGL.";
|
|
|
|
extension = "plt";
|
|
setCodePage("ascii");
|
|
|
|
capabilities = CAPABILITY_MILLING | CAPABILITY_MACHINE_SIMULATION;
|
|
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(180);
|
|
allowHelicalMoves = true;
|
|
allowedCircularPlanes = undefined; // allow any circular motion
|
|
|
|
// user-defined properties
|
|
properties = {
|
|
separateWordsWithSpace: {
|
|
title : "Separate words with space",
|
|
description: "Adds spaces between words if 'yes' is selected.",
|
|
group : "formats",
|
|
type : "boolean",
|
|
value : false,
|
|
scope : "post"
|
|
},
|
|
rapidFeed: {
|
|
title : "Rapid feed",
|
|
description: "Specifies the rapid traversal feed.",
|
|
group : "configuration",
|
|
type : "number",
|
|
value : 3810,
|
|
scope : "post"
|
|
},
|
|
safeZHeight: {
|
|
title : "Safe Z",
|
|
description: "Specifies the safety distance above the stock",
|
|
group : "homePositions",
|
|
type : "number",
|
|
value : 10,
|
|
scope : "post"
|
|
}
|
|
};
|
|
|
|
// wcs definiton
|
|
wcsDefinitions = {
|
|
useZeroOffset: false,
|
|
wcs : [
|
|
{name:"Standard", format:"#", range:[1, 1]}
|
|
]
|
|
};
|
|
|
|
var WARNING_COOLANT = 1;
|
|
|
|
var gFormat = createFormat({prefix:"G", decimals:0});
|
|
var mFormat = createFormat({prefix:"M", decimals:0});
|
|
|
|
var xyzFormat = createFormat({decimals:0, scale:40});
|
|
var zFormat = createFormat({decimals:0, scale:-40});
|
|
var angleFormat = createFormat({decimals:3, scale:DEG});
|
|
var feedFormat = createFormat({decimals:0});
|
|
var toolFormat = createFormat({decimals:0});
|
|
var rpmFormat = createFormat({decimals:0});
|
|
var secFormat = createFormat({decimals:3, type:FORMAT_REAL}); // seconds - range 0.001-1000
|
|
var taperFormat = createFormat({decimals:1, scale:DEG});
|
|
|
|
var xOutput = createOutputVariable({onchange:function() {state.retractedX = false;}, control:CONTROL_FORCE}, xyzFormat);
|
|
var yOutput = createOutputVariable({onchange:function() {state.retractedY = false;}, control:CONTROL_FORCE}, xyzFormat);
|
|
var zOutput = createOutputVariable({onchange:function() {state.retractedZ = false;}, control:CONTROL_FORCE}, zFormat);
|
|
var feedOutput = createOutputVariable({}, feedFormat);
|
|
var sOutput = createOutputVariable({control:CONTROL_FORCE}, rpmFormat);
|
|
|
|
var settings = {
|
|
retract: {
|
|
cancelRotationOnRetracting: false, // specifies that rotations (G68) need to be canceled prior to retracting
|
|
methodXY : undefined, // special condition, overwrite retract behavior per axis
|
|
methodZ : undefined, // special condition, overwrite retract behavior per axis
|
|
useZeroValues : [], // enter property value id(s) for using "0" value instead of machineConfiguration axes home position values (ie G30 Z0)
|
|
homeXY : {onIndexing:false, onToolChange:false, onProgramEnd:false} // Specifies when the machine should be homed in X/Y. Sample: onIndexing:{axes:[X, Y], singleLine:false}
|
|
},
|
|
comments: {
|
|
permittedCommentChars: " abcdefghijklmnopqrstuvwxyz0123456789.,=_-", // letters are not case sensitive, use option 'outputFormat' below. Set to 'undefined' to allow any character
|
|
prefix : "//", // specifies the prefix for the comment
|
|
suffix : "", // specifies the suffix for the comment
|
|
outputFormat : "ignoreCase", // can be set to "upperCase", "lowerCase" and "ignoreCase". Set to "ignoreCase" to write comments without upper/lower case formattinge". Set to "none" to output comments without additional formatting
|
|
maximumLineLength : 0 // the maximum number of characters allowed in a line, set to 0 to disable comment output
|
|
},
|
|
maximumSequenceNumber : undefined, // the maximum sequence number (Nxxx), use 'undefined' for unlimited
|
|
supportsOptionalBlocks : false, // specifies if optional block output is supported
|
|
outputToolLengthCompensation: false, // specifies if tool length compensation code should be output (G43)
|
|
outputToolLengthOffset : false, // specifies if tool length offset code should be output (Hxx)
|
|
writeBlockSuffix : ";", // specifies the suffix to output for the writeBlock function at the end of each line
|
|
// fixed settings below, do not modify
|
|
supportsTCP : false, // default: true, this postprocessor does not support TCP
|
|
supportsInverseTimeFeed : false, // default: true, this postprocessor does not support inverse time feedrates
|
|
supportsRadiusCompensation : false // default: true, this postprocessor does not support tool radius compensation
|
|
};
|
|
|
|
function onOpen() {
|
|
if (!getProperty("separateWordsWithSpace")) {
|
|
setWordSeparator(",");
|
|
}
|
|
writeBlock(";IN");
|
|
writeBlock("ZZ1"); // 3D mode
|
|
writeBlock("PA"); // absolute coordinate mode
|
|
writeComment(programName);
|
|
writeComment(programComment);
|
|
writeProgramHeader();
|
|
validateCommonParameters();
|
|
}
|
|
|
|
function onSection() {
|
|
var insertToolCall = isToolChangeNeeded();
|
|
if (isFirstSection() || insertToolCall) {
|
|
writeRetract(Z); // retract
|
|
}
|
|
|
|
// tool change
|
|
writeToolCall(tool, insertToolCall);
|
|
startSpindle(tool, insertToolCall);
|
|
|
|
// wcs
|
|
// writeBlock(currentSection.wcs);
|
|
|
|
forceXYZ();
|
|
forceFeed();
|
|
|
|
if (tool.coolant != COOLANT_OFF) {
|
|
warningOnce(localize("Coolant not supported."), WARNING_COOLANT);
|
|
}
|
|
|
|
{
|
|
var remaining = currentSection.workPlane;
|
|
if (!isSameDirection(remaining.forward, new Vector(0, 0, 1))) {
|
|
error(localize("Tool orientation is not supported."));
|
|
}
|
|
setRotation(remaining);
|
|
}
|
|
|
|
var initialPosition = getFramePosition(currentSection.getInitialPosition());
|
|
var isRequired = insertToolCall || state.retractedZ || !state.lengthCompensationActive || (!isFirstSection() && getPreviousSection().isMultiAxis());
|
|
writeInitialPositioning(initialPosition, isRequired);
|
|
}
|
|
|
|
function writeInitialPositioning(position, isRequired) {
|
|
forceXYZ();
|
|
if (!isRequired) { // simple positioning
|
|
if (!state.retractedZ && xyzFormat.getResultingValue(getCurrentPosition().z) < xyzFormat.getResultingValue(position.z)) {
|
|
writeBlock("PD" + xOutput.format(getCurrentPosition().x), yOutput.format(getCurrentPosition().y), zOutput.format(position.z));
|
|
machineSimulation({z:position.z});
|
|
}
|
|
forceXYZ();
|
|
} else {
|
|
writeBlock("PD" + xOutput.format(position.x), yOutput.format(position.y), zOutput.format(getProperty("safeZHeight")));
|
|
machineSimulation({x:position.x, y:position.y, z:zOutput.getCurrent()});
|
|
writeBlock("PD" + xOutput.format(position.x), yOutput.format(position.y), zOutput.format(position.z));
|
|
machineSimulation({x:position.x, y:position.y, z:position.z});
|
|
}
|
|
}
|
|
|
|
function onSpindleSpeed(spindleSpeed) {
|
|
writeBlock("ZO100", sOutput.format(spindleSpeed));
|
|
}
|
|
|
|
function onRapid(_x, _y, _z) {
|
|
var f = feedOutput.format(getProperty("rapidFeed") / 60.0);
|
|
if (f) {
|
|
writeBlock("SF" + f);
|
|
}
|
|
var x = xOutput.format(_x);
|
|
var y = yOutput.format(_y);
|
|
var z = zOutput.format(_z);
|
|
if (x || y || z) {
|
|
writeBlock("PD" + x, y, z);
|
|
}
|
|
feedOutput.reset();
|
|
}
|
|
|
|
function onLinear(_x, _y, _z, feed) {
|
|
var f = feedOutput.format(feed / 60.0);
|
|
if (f) {
|
|
writeBlock("SF" + f);
|
|
}
|
|
var x = xOutput.format(_x);
|
|
var y = yOutput.format(_y);
|
|
var z = zOutput.format(_z);
|
|
if (x || y || z) {
|
|
writeBlock("PD" + x, y, z);
|
|
}
|
|
}
|
|
|
|
function onCircular(clockwise, cx, cy, cz, x, y, z, feed) {
|
|
var f = feedOutput.format(feed / 60.0);
|
|
if (f) {
|
|
writeBlock("SF" + f);
|
|
}
|
|
|
|
if (isHelical() || (getCircularPlane() != PLANE_XY)) {
|
|
var t = getParameter("operation:tolerance", tolerance);
|
|
linearize(t);
|
|
return;
|
|
}
|
|
writeBlock("AA" + xOutput.format(cx), yOutput.format(cy), angleFormat.format((clockwise ? -1 : 1) * getCircularSweep()));
|
|
}
|
|
|
|
function onCommand(command) {
|
|
switch (command) {
|
|
case COMMAND_COOLANT_OFF:
|
|
return;
|
|
case COMMAND_COOLANT_ON:
|
|
return;
|
|
case COMMAND_STOP:
|
|
forceSpindleSpeed = true;
|
|
return;
|
|
case COMMAND_OPTIONAL_STOP:
|
|
forceSpindleSpeed = true;
|
|
return;
|
|
case COMMAND_START_SPINDLE:
|
|
forceSpindleSpeed = false;
|
|
writeBlock("ZO100", sOutput.format(spindleSpeed));
|
|
if (!tool.clockwise) {
|
|
error(localize("Spindle direction not supported."));
|
|
}
|
|
return;
|
|
case COMMAND_LOAD_TOOL:
|
|
writeBlock("SP" + toolFormat.format(tool.number));
|
|
writeComment(tool.comment);
|
|
return;
|
|
default:
|
|
onUnsupportedCommand(command);
|
|
return;
|
|
}
|
|
}
|
|
|
|
function onSectionEnd() {
|
|
forceXYZ();
|
|
forceFeed();
|
|
}
|
|
|
|
function writeRetract() {
|
|
var retract = getRetractParameters.apply(this, arguments);
|
|
if (retract && retract.words.length > 0) {
|
|
if (typeof cancelWCSRotation == "function" && getSetting("retract.cancelRotationOnRetracting", false)) { // cancel rotation before retracting
|
|
cancelWCSRotation();
|
|
}
|
|
for (var i in retract.words) {
|
|
var words = retract.singleLine ? retract.words : retract.words[i];
|
|
if (retract.retractAxes[2]) {
|
|
writeBlock("PU");
|
|
machineSimulation({z:retract.positions.z, coordinates:MACHINE});
|
|
} else {
|
|
writeBlock("PD" + words.join(","));
|
|
machineSimulation({x:retract.positions.x, y:retract.positions.y, coordinates:MACHINE});
|
|
}
|
|
if (retract.singleLine) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function onClose() {
|
|
onCommand(COMMAND_COOLANT_OFF);
|
|
writeRetract(Z);
|
|
if (getSetting("retract.homeXY.onProgramEnd", false)) {
|
|
writeRetract(settings.retract.homeXY.onProgramEnd);
|
|
}
|
|
writeBlock("SP0"); // spindle stop
|
|
}
|
|
|
|
// >>>>> INCLUDED FROM include_files/commonFunctions.cpi
|
|
// internal variables, do not change
|
|
var receivedMachineConfiguration;
|
|
var tcp = {isSupportedByControl:getSetting("supportsTCP", true), isSupportedByMachine:false, isSupportedByOperation:false};
|
|
var state = {
|
|
retractedX : false, // specifies that the machine has been retracted in X
|
|
retractedY : false, // specifies that the machine has been retracted in Y
|
|
retractedZ : false, // specifies that the machine has been retracted in Z
|
|
tcpIsActive : false, // specifies that TCP is currently active
|
|
twpIsActive : false, // specifies that TWP is currently active
|
|
lengthCompensationActive: !getSetting("outputToolLengthCompensation", true), // specifies that tool length compensation is active
|
|
mainState : true // specifies the current context of the state (true = main, false = optional)
|
|
};
|
|
var validateLengthCompensation = getSetting("outputToolLengthCompensation", true); // disable validation when outputToolLengthCompensation is disabled
|
|
var multiAxisFeedrate;
|
|
var sequenceNumber;
|
|
var optionalSection = false;
|
|
var currentWorkOffset;
|
|
var forceSpindleSpeed = false;
|
|
var operationNeedsSafeStart = false; // used to convert blocks to optional for safeStartAllOperations
|
|
|
|
function activateMachine() {
|
|
// disable unsupported rotary axes output
|
|
if (!machineConfiguration.isMachineCoordinate(0) && (typeof aOutput != "undefined")) {
|
|
aOutput.disable();
|
|
}
|
|
if (!machineConfiguration.isMachineCoordinate(1) && (typeof bOutput != "undefined")) {
|
|
bOutput.disable();
|
|
}
|
|
if (!machineConfiguration.isMachineCoordinate(2) && (typeof cOutput != "undefined")) {
|
|
cOutput.disable();
|
|
}
|
|
|
|
// setup usage of useTiltedWorkplane
|
|
settings.workPlaneMethod.useTiltedWorkplane = getProperty("useTiltedWorkplane") != undefined ? getProperty("useTiltedWorkplane") :
|
|
getSetting("workPlaneMethod.useTiltedWorkplane", false);
|
|
settings.workPlaneMethod.useABCPrepositioning = getSetting("workPlaneMethod.useABCPrepositioning", true);
|
|
|
|
if (!machineConfiguration.isMultiAxisConfiguration()) {
|
|
return; // don't need to modify any settings for 3-axis machines
|
|
}
|
|
|
|
// identify if any of the rotary axes has TCP enabled
|
|
var axes = [machineConfiguration.getAxisU(), machineConfiguration.getAxisV(), machineConfiguration.getAxisW()];
|
|
tcp.isSupportedByMachine = axes.some(function(axis) {return axis.isEnabled() && axis.isTCPEnabled();}); // true if TCP is enabled on any rotary axis
|
|
|
|
// save multi-axis feedrate settings from machine configuration
|
|
var mode = machineConfiguration.getMultiAxisFeedrateMode();
|
|
var type = mode == FEED_INVERSE_TIME ? machineConfiguration.getMultiAxisFeedrateInverseTimeUnits() :
|
|
(mode == FEED_DPM ? machineConfiguration.getMultiAxisFeedrateDPMType() : DPM_STANDARD);
|
|
multiAxisFeedrate = {
|
|
mode : mode,
|
|
maximum : machineConfiguration.getMultiAxisFeedrateMaximum(),
|
|
type : type,
|
|
tolerance: mode == FEED_DPM ? machineConfiguration.getMultiAxisFeedrateOutputTolerance() : 0,
|
|
bpwRatio : mode == FEED_DPM ? machineConfiguration.getMultiAxisFeedrateBpwRatio() : 1
|
|
};
|
|
|
|
// setup of retract/reconfigure TAG: Only needed until post kernel supports these machine config settings
|
|
if (receivedMachineConfiguration && machineConfiguration.performRewinds()) {
|
|
safeRetractDistance = machineConfiguration.getSafeRetractDistance();
|
|
safePlungeFeed = machineConfiguration.getSafePlungeFeedrate();
|
|
safeRetractFeed = machineConfiguration.getSafeRetractFeedrate();
|
|
}
|
|
if (typeof safeRetractDistance == "number" && getProperty("safeRetractDistance") != undefined && getProperty("safeRetractDistance") != 0) {
|
|
safeRetractDistance = getProperty("safeRetractDistance");
|
|
}
|
|
|
|
if (revision >= 50294) {
|
|
activateAutoPolarMode({tolerance:tolerance / 2, optimizeType:OPTIMIZE_AXIS, expandCycles:getSetting("polarCycleExpandMode", EXPAND_ALL)});
|
|
}
|
|
|
|
if (machineConfiguration.isHeadConfiguration() && getSetting("workPlaneMethod.compensateToolLength", false)) {
|
|
for (var i = 0; i < getNumberOfSections(); ++i) {
|
|
var section = getSection(i);
|
|
if (section.isMultiAxis()) {
|
|
machineConfiguration.setToolLength(getBodyLength(section.getTool())); // define the tool length for head adjustments
|
|
section.optimizeMachineAnglesByMachine(machineConfiguration, OPTIMIZE_AXIS);
|
|
}
|
|
}
|
|
} else {
|
|
optimizeMachineAngles2(OPTIMIZE_AXIS);
|
|
}
|
|
}
|
|
|
|
function getBodyLength(tool) {
|
|
for (var i = 0; i < getNumberOfSections(); ++i) {
|
|
var section = getSection(i);
|
|
if (tool.number == section.getTool().number) {
|
|
if (section.hasParameter("operation:tool_assemblyGaugeLength")) { // For Fusion
|
|
return section.getParameter("operation:tool_assemblyGaugeLength", tool.bodyLength + tool.holderLength);
|
|
} else { // Legacy products
|
|
return section.getParameter("operation:tool_overallLength", tool.bodyLength + tool.holderLength);
|
|
}
|
|
}
|
|
}
|
|
return tool.bodyLength + tool.holderLength;
|
|
}
|
|
|
|
function getFeed(f) {
|
|
if (getProperty("useG95")) {
|
|
return feedOutput.format(f / spindleSpeed); // use feed value
|
|
}
|
|
if (typeof activeMovements != "undefined" && activeMovements) {
|
|
var feedContext = activeMovements[movement];
|
|
if (feedContext != undefined) {
|
|
if (!feedFormat.areDifferent(feedContext.feed, f)) {
|
|
if (feedContext.id == currentFeedId) {
|
|
return ""; // nothing has changed
|
|
}
|
|
forceFeed();
|
|
currentFeedId = feedContext.id;
|
|
return settings.parametricFeeds.feedOutputVariable + (settings.parametricFeeds.firstFeedParameter + feedContext.id);
|
|
}
|
|
}
|
|
currentFeedId = undefined; // force parametric feed next time
|
|
}
|
|
return feedOutput.format(f); // use feed value
|
|
}
|
|
|
|
function validateCommonParameters() {
|
|
validateToolData();
|
|
for (var i = 0; i < getNumberOfSections(); ++i) {
|
|
var section = getSection(i);
|
|
if (getSection(0).workOffset == 0 && section.workOffset > 0) {
|
|
if (!(typeof wcsDefinitions != "undefined" && wcsDefinitions.useZeroOffset)) {
|
|
error(localize("Using multiple work offsets is not possible if the initial work offset is 0."));
|
|
}
|
|
}
|
|
if (section.isMultiAxis()) {
|
|
if (!section.isOptimizedForMachine() &&
|
|
(!getSetting("workPlaneMethod.useTiltedWorkplane", false) || !getSetting("supportsToolVectorOutput", false))) {
|
|
error(localize("This postprocessor requires a machine configuration for 5-axis simultaneous toolpath."));
|
|
}
|
|
if (machineConfiguration.getMultiAxisFeedrateMode() == FEED_INVERSE_TIME && !getSetting("supportsInverseTimeFeed", true)) {
|
|
error(localize("This postprocessor does not support inverse time feedrates."));
|
|
}
|
|
if (getSetting("supportsToolVectorOutput", false) && !tcp.isSupportedByControl) {
|
|
error(localize("Incompatible postprocessor settings detected." + EOL +
|
|
"Setting 'supportsToolVectorOutput' requires setting 'supportsTCP' to be enabled as well."));
|
|
}
|
|
}
|
|
}
|
|
if (!tcp.isSupportedByControl && tcp.isSupportedByMachine) {
|
|
error(localize("The machine configuration has TCP enabled which is not supported by this postprocessor."));
|
|
}
|
|
if (getProperty("safePositionMethod") == "clearanceHeight") {
|
|
var msg = "-Attention- Property 'Safe Retracts' is set to 'Clearance Height'." + EOL +
|
|
"Ensure the clearance height will clear the part and or fixtures." + EOL +
|
|
"Raise the Z-axis to a safe height before starting the program.";
|
|
warning(msg);
|
|
writeComment(msg);
|
|
}
|
|
}
|
|
|
|
function validateToolData() {
|
|
var _default = 99999;
|
|
var _maximumSpindleRPM = machineConfiguration.getMaximumSpindleSpeed() > 0 ? machineConfiguration.getMaximumSpindleSpeed() :
|
|
settings.maximumSpindleRPM == undefined ? _default : settings.maximumSpindleRPM;
|
|
var _maximumToolNumber = machineConfiguration.isReceived() && machineConfiguration.getNumberOfTools() > 0 ? machineConfiguration.getNumberOfTools() :
|
|
settings.maximumToolNumber == undefined ? _default : settings.maximumToolNumber;
|
|
var _maximumToolLengthOffset = settings.maximumToolLengthOffset == undefined ? _default : settings.maximumToolLengthOffset;
|
|
var _maximumToolDiameterOffset = settings.maximumToolDiameterOffset == undefined ? _default : settings.maximumToolDiameterOffset;
|
|
|
|
var header = ["Detected maximum values are out of range.", "Maximum values:"];
|
|
var warnings = {
|
|
toolNumber : {msg:"Tool number value exceeds the maximum value for tool: " + EOL, max:" Tool number: " + _maximumToolNumber, values:[]},
|
|
lengthOffset : {msg:"Tool length offset value exceeds the maximum value for tool: " + EOL, max:" Tool length offset: " + _maximumToolLengthOffset, values:[]},
|
|
diameterOffset: {msg:"Tool diameter offset value exceeds the maximum value for tool: " + EOL, max:" Tool diameter offset: " + _maximumToolDiameterOffset, values:[]},
|
|
spindleSpeed : {msg:"Spindle speed exceeds the maximum value for operation: " + EOL, max:" Spindle speed: " + _maximumSpindleRPM, values:[]}
|
|
};
|
|
|
|
var toolIds = [];
|
|
for (var i = 0; i < getNumberOfSections(); ++i) {
|
|
var section = getSection(i);
|
|
if (toolIds.indexOf(section.getTool().getToolId()) === -1) { // loops only through sections which have a different tool ID
|
|
var toolNumber = section.getTool().number;
|
|
var lengthOffset = section.getTool().lengthOffset;
|
|
var diameterOffset = section.getTool().diameterOffset;
|
|
var comment = section.getParameter("operation-comment", "");
|
|
|
|
if (toolNumber > _maximumToolNumber && !getProperty("toolAsName")) {
|
|
warnings.toolNumber.values.push(SP + toolNumber + EOL);
|
|
}
|
|
if (lengthOffset > _maximumToolLengthOffset) {
|
|
warnings.lengthOffset.values.push(SP + "Tool " + toolNumber + " (" + comment + "," + " Length offset: " + lengthOffset + ")" + EOL);
|
|
}
|
|
if (diameterOffset > _maximumToolDiameterOffset) {
|
|
warnings.diameterOffset.values.push(SP + "Tool " + toolNumber + " (" + comment + "," + " Diameter offset: " + diameterOffset + ")" + EOL);
|
|
}
|
|
toolIds.push(section.getTool().getToolId());
|
|
}
|
|
// loop through all sections regardless of tool id for idenitfying spindle speeds
|
|
|
|
// identify if movement ramp is used in current toolpath, use ramp spindle speed for comparisons
|
|
var ramp = section.getMovements() & ((1 << MOVEMENT_RAMP) | (1 << MOVEMENT_RAMP_ZIG_ZAG) | (1 << MOVEMENT_RAMP_PROFILE) | (1 << MOVEMENT_RAMP_HELIX));
|
|
var _sectionSpindleSpeed = Math.max(section.getTool().spindleRPM, ramp ? section.getTool().rampingSpindleRPM : 0, 0);
|
|
if (_sectionSpindleSpeed > _maximumSpindleRPM) {
|
|
warnings.spindleSpeed.values.push(SP + section.getParameter("operation-comment", "") + " (" + _sectionSpindleSpeed + " RPM" + ")" + EOL);
|
|
}
|
|
}
|
|
|
|
// sort lists by tool number
|
|
warnings.toolNumber.values.sort(function(a, b) {return a - b;});
|
|
warnings.lengthOffset.values.sort(function(a, b) {return a.localeCompare(b);});
|
|
warnings.diameterOffset.values.sort(function(a, b) {return a.localeCompare(b);});
|
|
|
|
var warningMessages = [];
|
|
for (var key in warnings) {
|
|
if (warnings[key].values != "") {
|
|
header.push(warnings[key].max); // add affected max values to the header
|
|
warningMessages.push(warnings[key].msg + warnings[key].values.join(""));
|
|
}
|
|
}
|
|
if (warningMessages.length != 0) {
|
|
warningMessages.unshift(header.join(EOL) + EOL);
|
|
warning(warningMessages.join(EOL));
|
|
}
|
|
}
|
|
|
|
function forceFeed() {
|
|
currentFeedId = undefined;
|
|
feedOutput.reset();
|
|
}
|
|
|
|
/** Force output of X, Y, and Z. */
|
|
function forceXYZ() {
|
|
xOutput.reset();
|
|
yOutput.reset();
|
|
zOutput.reset();
|
|
}
|
|
|
|
/** Force output of A, B, and C. */
|
|
function forceABC() {
|
|
aOutput.reset();
|
|
bOutput.reset();
|
|
cOutput.reset();
|
|
}
|
|
|
|
/** Force output of X, Y, Z, A, B, C, and F on next output. */
|
|
function forceAny() {
|
|
forceXYZ();
|
|
forceABC();
|
|
forceFeed();
|
|
}
|
|
|
|
/**
|
|
Writes the specified block.
|
|
*/
|
|
function writeBlock() {
|
|
var text = formatWords(arguments);
|
|
if (!text) {
|
|
return;
|
|
}
|
|
var prefix = getSetting("sequenceNumberPrefix", "N");
|
|
var suffix = getSetting("writeBlockSuffix", "");
|
|
if ((optionalSection || skipBlocks) && !getSetting("supportsOptionalBlocks", true)) {
|
|
error(localize("Optional blocks are not supported by this post."));
|
|
}
|
|
if (getProperty("showSequenceNumbers") == "true") {
|
|
if (sequenceNumber == undefined || sequenceNumber >= settings.maximumSequenceNumber) {
|
|
sequenceNumber = getProperty("sequenceNumberStart");
|
|
}
|
|
if (optionalSection || skipBlocks) {
|
|
writeWords2("/", prefix + sequenceNumber, text + suffix);
|
|
} else {
|
|
writeWords2(prefix + sequenceNumber, text + suffix);
|
|
}
|
|
sequenceNumber += getProperty("sequenceNumberIncrement");
|
|
} else {
|
|
if (optionalSection || skipBlocks) {
|
|
writeWords2("/", text + suffix);
|
|
} else {
|
|
writeWords(text + suffix);
|
|
}
|
|
}
|
|
}
|
|
|
|
validate(settings.comments, "Setting 'comments' is required but not defined.");
|
|
function formatComment(text) {
|
|
var prefix = settings.comments.prefix;
|
|
var suffix = settings.comments.suffix;
|
|
var _permittedCommentChars = settings.comments.permittedCommentChars == undefined ? "" : settings.comments.permittedCommentChars;
|
|
switch (settings.comments.outputFormat) {
|
|
case "upperCase":
|
|
text = text.toUpperCase();
|
|
_permittedCommentChars = _permittedCommentChars.toUpperCase();
|
|
break;
|
|
case "lowerCase":
|
|
text = text.toLowerCase();
|
|
_permittedCommentChars = _permittedCommentChars.toLowerCase();
|
|
break;
|
|
case "ignoreCase":
|
|
_permittedCommentChars = _permittedCommentChars.toUpperCase() + _permittedCommentChars.toLowerCase();
|
|
break;
|
|
default:
|
|
error(localize("Unsupported option specified for setting 'comments.outputFormat'."));
|
|
}
|
|
if (_permittedCommentChars != "") {
|
|
text = filterText(String(text), _permittedCommentChars);
|
|
}
|
|
text = String(text).substring(0, settings.comments.maximumLineLength - prefix.length - suffix.length);
|
|
return text != "" ? prefix + text + suffix : "";
|
|
}
|
|
|
|
/**
|
|
Output a comment.
|
|
*/
|
|
function writeComment(text) {
|
|
if (!text) {
|
|
return;
|
|
}
|
|
var comments = String(text).split(EOL);
|
|
for (comment in comments) {
|
|
var _comment = formatComment(comments[comment]);
|
|
if (_comment) {
|
|
if (getSetting("comments.showSequenceNumbers", false)) {
|
|
writeBlock(_comment);
|
|
} else {
|
|
writeln(_comment);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function onComment(text) {
|
|
writeComment(text);
|
|
}
|
|
|
|
/**
|
|
Writes the specified block - used for tool changes only.
|
|
*/
|
|
function writeToolBlock() {
|
|
var show = getProperty("showSequenceNumbers");
|
|
setProperty("showSequenceNumbers", (show == "true" || show == "toolChange") ? "true" : "false");
|
|
writeBlock(arguments);
|
|
setProperty("showSequenceNumbers", show);
|
|
machineSimulation({/*x:toPreciseUnit(200, MM), y:toPreciseUnit(200, MM), coordinates:MACHINE,*/ mode:TOOLCHANGE}); // move machineSimulation to a tool change position
|
|
}
|
|
|
|
var skipBlocks = false;
|
|
var initialState = JSON.parse(JSON.stringify(state)); // save initial state
|
|
var optionalState = JSON.parse(JSON.stringify(state));
|
|
var saveCurrentSectionId = undefined;
|
|
function writeStartBlocks(isRequired, code) {
|
|
var saveSkipBlocks = skipBlocks;
|
|
var saveMainState = state; // save main state
|
|
|
|
if (!isRequired) {
|
|
if (!getProperty("safeStartAllOperations", false)) {
|
|
return; // when safeStartAllOperations is disabled, dont output code and return
|
|
}
|
|
if (saveCurrentSectionId != getCurrentSectionId()) {
|
|
saveCurrentSectionId = getCurrentSectionId();
|
|
forceModals(); // force all modal variables when entering a new section
|
|
optionalState = Object.create(initialState); // reset optionalState to initialState when entering a new section
|
|
}
|
|
skipBlocks = true; // if values are not required, but safeStartAllOperations is enabled - write following blocks as optional
|
|
state = optionalState; // set state to optionalState if skipBlocks is true
|
|
state.mainState = false;
|
|
}
|
|
code(); // writes out the code which is passed to this function as an argument
|
|
|
|
state = saveMainState; // restore main state
|
|
skipBlocks = saveSkipBlocks; // restore skipBlocks value
|
|
}
|
|
|
|
var pendingRadiusCompensation = -1;
|
|
function onRadiusCompensation() {
|
|
pendingRadiusCompensation = radiusCompensation;
|
|
if (pendingRadiusCompensation >= 0 && !getSetting("supportsRadiusCompensation", true)) {
|
|
error(localize("Radius compensation mode is not supported."));
|
|
return;
|
|
}
|
|
}
|
|
|
|
function onPassThrough(text) {
|
|
var commands = String(text).split(",");
|
|
for (text in commands) {
|
|
writeBlock(commands[text]);
|
|
}
|
|
}
|
|
|
|
function forceModals() {
|
|
if (arguments.length == 0) { // reset all modal variables listed below
|
|
var modals = [
|
|
"gMotionModal",
|
|
"gPlaneModal",
|
|
"gAbsIncModal",
|
|
"gFeedModeModal",
|
|
"feedOutput"
|
|
];
|
|
if (operationNeedsSafeStart && (typeof currentSection != "undefined" && currentSection.isMultiAxis())) {
|
|
modals.push("fourthAxisClamp", "fifthAxisClamp", "sixthAxisClamp");
|
|
}
|
|
for (var i = 0; i < modals.length; ++i) {
|
|
if (typeof this[modals[i]] != "undefined") {
|
|
this[modals[i]].reset();
|
|
}
|
|
}
|
|
} else {
|
|
for (var i in arguments) {
|
|
arguments[i].reset(); // only reset the modal variable passed to this function
|
|
}
|
|
}
|
|
}
|
|
|
|
/** Helper function to be able to use a default value for settings which do not exist. */
|
|
function getSetting(setting, defaultValue) {
|
|
var result = defaultValue;
|
|
var keys = setting.split(".");
|
|
var obj = settings;
|
|
for (var i in keys) {
|
|
if (obj[keys[i]] != undefined) { // setting does exist
|
|
result = obj[keys[i]];
|
|
if (typeof [keys[i]] === "object") {
|
|
obj = obj[keys[i]];
|
|
continue;
|
|
}
|
|
} else { // setting does not exist, use default value
|
|
if (defaultValue != undefined) {
|
|
result = defaultValue;
|
|
} else {
|
|
error("Setting '" + keys[i] + "' has no default value and/or does not exist.");
|
|
return undefined;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function getForwardDirection(_section) {
|
|
var forward = undefined;
|
|
var _optimizeType = settings.workPlaneMethod && settings.workPlaneMethod.optimizeType;
|
|
if (_section.isMultiAxis()) {
|
|
forward = _section.workPlane.forward;
|
|
} else if (!getSetting("workPlaneMethod.useTiltedWorkplane", false) && machineConfiguration.isMultiAxisConfiguration()) {
|
|
if (_optimizeType == undefined) {
|
|
var saveRotation = getRotation();
|
|
getWorkPlaneMachineABC(_section, true);
|
|
forward = getRotation().forward;
|
|
setRotation(saveRotation); // reset rotation
|
|
} else {
|
|
var abc = getWorkPlaneMachineABC(_section, false);
|
|
var forceAdjustment = settings.workPlaneMethod.optimizeType == OPTIMIZE_TABLES || settings.workPlaneMethod.optimizeType == OPTIMIZE_BOTH;
|
|
forward = machineConfiguration.getOptimizedDirection(_section.workPlane.forward, abc, false, forceAdjustment);
|
|
}
|
|
} else {
|
|
forward = getRotation().forward;
|
|
}
|
|
return forward;
|
|
}
|
|
|
|
function getRetractParameters() {
|
|
var _arguments = typeof arguments[0] === "object" ? arguments[0].axes : arguments;
|
|
var singleLine = arguments[0].singleLine == undefined ? true : arguments[0].singleLine;
|
|
var words = []; // store all retracted axes in an array
|
|
var retractAxes = new Array(false, false, false);
|
|
var method = getProperty("safePositionMethod", "undefined");
|
|
if (method == "clearanceHeight") {
|
|
if (!is3D()) {
|
|
error(localize("Safe retract option 'Clearance Height' is only supported when all operations are along the setup Z-axis."));
|
|
}
|
|
return undefined;
|
|
}
|
|
validate(settings.retract, "Setting 'retract' is required but not defined.");
|
|
validate(_arguments.length != 0, "No axis specified for getRetractParameters().");
|
|
for (i in _arguments) {
|
|
retractAxes[_arguments[i]] = true;
|
|
}
|
|
if ((retractAxes[0] || retractAxes[1]) && !state.retractedZ) { // retract Z first before moving to X/Y home
|
|
error(localize("Retracting in X/Y is not possible without being retracted in Z."));
|
|
return undefined;
|
|
}
|
|
// special conditions
|
|
if (retractAxes[0] || retractAxes[1]) {
|
|
method = getSetting("retract.methodXY", method);
|
|
}
|
|
if (retractAxes[2]) {
|
|
method = getSetting("retract.methodZ", method);
|
|
}
|
|
// define home positions
|
|
var useZeroValues = (settings.retract.useZeroValues && settings.retract.useZeroValues.indexOf(method) != -1);
|
|
var _xHome = machineConfiguration.hasHomePositionX() && !useZeroValues ? machineConfiguration.getHomePositionX() : toPreciseUnit(0, MM);
|
|
var _yHome = machineConfiguration.hasHomePositionY() && !useZeroValues ? machineConfiguration.getHomePositionY() : toPreciseUnit(0, MM);
|
|
var _zHome = machineConfiguration.getRetractPlane() != 0 && !useZeroValues ? machineConfiguration.getRetractPlane() : toPreciseUnit(0, MM);
|
|
for (var i = 0; i < _arguments.length; ++i) {
|
|
switch (_arguments[i]) {
|
|
case X:
|
|
if (!state.retractedX) {
|
|
words.push("X" + xyzFormat.format(_xHome));
|
|
xOutput.reset();
|
|
state.retractedX = true;
|
|
}
|
|
break;
|
|
case Y:
|
|
if (!state.retractedY) {
|
|
words.push("Y" + xyzFormat.format(_yHome));
|
|
yOutput.reset();
|
|
state.retractedY = true;
|
|
}
|
|
break;
|
|
case Z:
|
|
if (!state.retractedZ) {
|
|
words.push("Z" + xyzFormat.format(_zHome));
|
|
zOutput.reset();
|
|
state.retractedZ = true;
|
|
}
|
|
break;
|
|
default:
|
|
error(localize("Unsupported axis specified for getRetractParameters()."));
|
|
return undefined;
|
|
}
|
|
}
|
|
return {
|
|
method : method,
|
|
retractAxes: retractAxes,
|
|
words : words,
|
|
positions : {
|
|
x: retractAxes[0] ? _xHome : undefined,
|
|
y: retractAxes[1] ? _yHome : undefined,
|
|
z: retractAxes[2] ? _zHome : undefined},
|
|
singleLine: singleLine};
|
|
}
|
|
|
|
/** Returns true when subprogram logic does exist into the post. */
|
|
function subprogramsAreSupported() {
|
|
return typeof subprogramState != "undefined";
|
|
}
|
|
|
|
// Start of machine simulation connection move support
|
|
var debugSimulation = false; // enable to output debug information for connection move support in the NC program
|
|
var TCPON = "TCP ON";
|
|
var TCPOFF = "TCP OFF";
|
|
var TWPON = "TWP ON";
|
|
var TWPOFF = "TWP OFF";
|
|
var TOOLCHANGE = "TOOL CHANGE";
|
|
var RETRACTTOOLAXIS = "RETRACT TOOLAXIS";
|
|
var WORK = "WORK CS";
|
|
var MACHINE = "MACHINE CS";
|
|
var MIN = "MIN";
|
|
var MAX = "MAX";
|
|
var WARNING_NON_RANGE = [0, 1, 2];
|
|
var isTwpOn;
|
|
var isTcpOn;
|
|
/**
|
|
* Helper function for connection moves in machine simulation.
|
|
* @param {Object} parameters An object containing the desired options for machine simulation.
|
|
* @note Available properties are:
|
|
* @param {Number} x X axis position, alternatively use MIN or MAX to move to the axis limit
|
|
* @param {Number} y Y axis position, alternatively use MIN or MAX to move to the axis limit
|
|
* @param {Number} z Z axis position, alternatively use MIN or MAX to move to the axis limit
|
|
* @param {Number} a A axis position (in radians)
|
|
* @param {Number} b B axis position (in radians)
|
|
* @param {Number} c C axis position (in radians)
|
|
* @param {Number} feed desired feedrate, automatically set to high/current feedrate if not specified
|
|
* @param {String} mode mode TCPON | TCPOFF | TWPON | TWPOFF | TOOLCHANGE | RETRACTTOOLAXIS
|
|
* @param {String} coordinates WORK | MACHINE - if undefined, work coordinates will be used by default
|
|
* @param {Number} eulerAngles the calculated Euler angles for the workplane
|
|
* @example
|
|
machineSimulation({a:abc.x, b:abc.y, c:abc.z, coordinates:MACHINE});
|
|
machineSimulation({x:toPreciseUnit(200, MM), y:toPreciseUnit(200, MM), coordinates:MACHINE, mode:TOOLCHANGE});
|
|
*/
|
|
function machineSimulation(parameters) {
|
|
if (revision < 50198 || skipBlocks) {
|
|
return; // return when post kernel revision is lower than 50198 or when skipBlocks is enabled
|
|
}
|
|
getAxisLimit = function(axis, limit) {
|
|
validate(limit == MIN || limit == MAX, subst(localize("Invalid argument \"%1\" passed to the machineSimulation function."), limit));
|
|
var range = axis.getRange();
|
|
if (range.isNonRange()) {
|
|
var axisLetters = ["X", "Y", "Z"];
|
|
var warningMessage = subst(localize("An attempt was made to move the \"%1\" axis to its MIN/MAX limits during machine simulation, but its range is set to \"unlimited\"." + EOL +
|
|
"A limited range must be set for the \"%1\" axis in the machine definition, or these motions will not be shown in machine simulation."), axisLetters[axis.getCoordinate()]);
|
|
warningOnce(warningMessage, WARNING_NON_RANGE[axis.getCoordinate()]);
|
|
return undefined;
|
|
}
|
|
return limit == MIN ? range.minimum : range.maximum;
|
|
};
|
|
var x = (isNaN(parameters.x) && parameters.x) ? getAxisLimit(machineConfiguration.getAxisX(), parameters.x) : parameters.x;
|
|
var y = (isNaN(parameters.y) && parameters.y) ? getAxisLimit(machineConfiguration.getAxisY(), parameters.y) : parameters.y;
|
|
var z = (isNaN(parameters.z) && parameters.z) ? getAxisLimit(machineConfiguration.getAxisZ(), parameters.z) : parameters.z;
|
|
var rotaryAxesErrorMessage = localize("Invalid argument for rotary axes passed to the machineSimulation function. Only numerical values are supported.");
|
|
var a = (isNaN(parameters.a) && parameters.a) ? error(rotaryAxesErrorMessage) : parameters.a;
|
|
var b = (isNaN(parameters.b) && parameters.b) ? error(rotaryAxesErrorMessage) : parameters.b;
|
|
var c = (isNaN(parameters.c) && parameters.c) ? error(rotaryAxesErrorMessage) : parameters.c;
|
|
var coordinates = parameters.coordinates;
|
|
var eulerAngles = parameters.eulerAngles;
|
|
var feed = parameters.feed;
|
|
if (feed === undefined && typeof gMotionModal !== "undefined") {
|
|
feed = gMotionModal.getCurrent() !== 0;
|
|
}
|
|
var mode = parameters.mode;
|
|
var performToolChange = mode == TOOLCHANGE;
|
|
if (mode !== undefined && ![TCPON, TCPOFF, TWPON, TWPOFF, TOOLCHANGE, RETRACTTOOLAXIS].includes(mode)) {
|
|
error(subst("Mode '%1' is not supported.", mode));
|
|
}
|
|
|
|
// mode takes precedence over TCP/TWP states
|
|
var enableTCP = isTcpOn;
|
|
var enableTWP = isTwpOn;
|
|
if (mode === TCPON || mode === TCPOFF) {
|
|
enableTCP = mode === TCPON;
|
|
} else if (mode === TWPON || mode === TWPOFF) {
|
|
enableTWP = mode === TWPON;
|
|
} else {
|
|
enableTCP = typeof state !== "undefined" && state.tcpIsActive;
|
|
enableTWP = typeof state !== "undefined" && state.twpIsActive;
|
|
}
|
|
var disableTCP = !enableTCP;
|
|
var disableTWP = !enableTWP;
|
|
if (disableTWP) {
|
|
simulation.setTWPModeOff();
|
|
isTwpOn = false;
|
|
}
|
|
if (disableTCP) {
|
|
simulation.setTCPModeOff();
|
|
isTcpOn = false;
|
|
}
|
|
if (enableTCP) {
|
|
simulation.setTCPModeOn();
|
|
isTcpOn = true;
|
|
}
|
|
if (enableTWP) {
|
|
if (settings.workPlaneMethod.eulerConvention == undefined) {
|
|
simulation.setTWPModeAlignToCurrentPose();
|
|
} else if (eulerAngles) {
|
|
simulation.setTWPModeByEulerAngles(settings.workPlaneMethod.eulerConvention, eulerAngles.x, eulerAngles.y, eulerAngles.z);
|
|
}
|
|
isTwpOn = true;
|
|
}
|
|
if (mode == RETRACTTOOLAXIS) {
|
|
simulation.retractAlongToolAxisToLimit();
|
|
}
|
|
|
|
if (debugSimulation) {
|
|
writeln(" DEBUG" + JSON.stringify(parameters));
|
|
writeln(" DEBUG" + JSON.stringify({isTwpOn:isTwpOn, isTcpOn:isTcpOn, feed:feed}));
|
|
}
|
|
|
|
if (x !== undefined || y !== undefined || z !== undefined || a !== undefined || b !== undefined || c !== undefined) {
|
|
if (x !== undefined) {simulation.setTargetX(x);}
|
|
if (y !== undefined) {simulation.setTargetY(y);}
|
|
if (z !== undefined) {simulation.setTargetZ(z);}
|
|
if (a !== undefined) {simulation.setTargetA(a);}
|
|
if (b !== undefined) {simulation.setTargetB(b);}
|
|
if (c !== undefined) {simulation.setTargetC(c);}
|
|
|
|
if (feed != undefined && feed) {
|
|
simulation.setMotionToLinear();
|
|
simulation.setFeedrate(typeof feed == "number" ? feed : feedOutput.getCurrent() == 0 ? highFeedrate : feedOutput.getCurrent());
|
|
} else {
|
|
simulation.setMotionToRapid();
|
|
}
|
|
|
|
if (coordinates != undefined && coordinates == MACHINE) {
|
|
simulation.moveToTargetInMachineCoords();
|
|
} else {
|
|
simulation.moveToTargetInWorkCoords();
|
|
}
|
|
}
|
|
if (performToolChange) {
|
|
simulation.performToolChangeCycle();
|
|
simulation.moveToTargetInMachineCoords();
|
|
}
|
|
}
|
|
// <<<<< INCLUDED FROM include_files/commonFunctions.cpi
|
|
// >>>>> INCLUDED FROM include_files/writeToolCall.cpi
|
|
function writeToolCall(tool, insertToolCall) {
|
|
if (!isFirstSection()) {
|
|
writeStartBlocks(!getProperty("safeStartAllOperations") && insertToolCall, function () {
|
|
writeRetract(Z); // write optional Z retract before tool change if safeStartAllOperations is enabled
|
|
});
|
|
}
|
|
writeStartBlocks(insertToolCall, function () {
|
|
writeRetract(Z);
|
|
if (getSetting("retract.homeXY.onToolChange", false)) {
|
|
writeRetract(settings.retract.homeXY.onToolChange);
|
|
}
|
|
if (!isFirstSection() && insertToolCall) {
|
|
if (typeof forceWorkPlane == "function") {
|
|
forceWorkPlane();
|
|
}
|
|
onCommand(COMMAND_COOLANT_OFF); // turn off coolant on tool change
|
|
if (typeof disableLengthCompensation == "function") {
|
|
disableLengthCompensation(false);
|
|
}
|
|
}
|
|
|
|
if (tool.manualToolChange) {
|
|
onCommand(COMMAND_STOP);
|
|
writeComment("MANUAL TOOL CHANGE TO T" + toolFormat.format(tool.number));
|
|
} else {
|
|
if (!isFirstSection() && getProperty("optionalStop") && insertToolCall) {
|
|
onCommand(COMMAND_OPTIONAL_STOP);
|
|
}
|
|
onCommand(COMMAND_LOAD_TOOL);
|
|
}
|
|
});
|
|
if (typeof forceModals == "function" && (insertToolCall || getProperty("safeStartAllOperations"))) {
|
|
forceModals();
|
|
}
|
|
}
|
|
// <<<<< INCLUDED FROM include_files/writeToolCall.cpi
|
|
// >>>>> INCLUDED FROM include_files/startSpindle.cpi
|
|
function startSpindle(tool, insertToolCall) {
|
|
if (tool.type != TOOL_PROBE) {
|
|
var spindleSpeedIsRequired = insertToolCall || forceSpindleSpeed || isFirstSection() ||
|
|
rpmFormat.areDifferent(spindleSpeed, sOutput.getCurrent()) ||
|
|
(tool.clockwise != getPreviousSection().getTool().clockwise);
|
|
|
|
writeStartBlocks(spindleSpeedIsRequired, function () {
|
|
if (spindleSpeedIsRequired || operationNeedsSafeStart) {
|
|
onCommand(COMMAND_START_SPINDLE);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
// <<<<< INCLUDED FROM include_files/startSpindle.cpi
|
|
// >>>>> INCLUDED FROM include_files/writeProgramHeader.cpi
|
|
properties.writeMachine = {
|
|
title : "Write machine",
|
|
description: "Output the machine settings in the header of the program.",
|
|
group : "formats",
|
|
type : "boolean",
|
|
value : true,
|
|
scope : "post"
|
|
};
|
|
properties.writeTools = {
|
|
title : "Write tool list",
|
|
description: "Output a tool list in the header of the program.",
|
|
group : "formats",
|
|
type : "boolean",
|
|
value : true,
|
|
scope : "post"
|
|
};
|
|
function writeProgramHeader() {
|
|
// dump machine configuration
|
|
var vendor = machineConfiguration.getVendor();
|
|
var model = machineConfiguration.getModel();
|
|
var mDescription = machineConfiguration.getDescription();
|
|
if (getProperty("writeMachine") && (vendor || model || mDescription)) {
|
|
writeComment(localize("Machine"));
|
|
if (vendor) {
|
|
writeComment(" " + localize("vendor") + ": " + vendor);
|
|
}
|
|
if (model) {
|
|
writeComment(" " + localize("model") + ": " + model);
|
|
}
|
|
if (mDescription) {
|
|
writeComment(" " + localize("description") + ": " + mDescription);
|
|
}
|
|
}
|
|
|
|
// dump tool information
|
|
if (getProperty("writeTools")) {
|
|
if (false) { // set to true to use the post kernel version of the tool list
|
|
writeToolTable(TOOL_NUMBER_COL);
|
|
} else {
|
|
var zRanges = {};
|
|
if (is3D()) {
|
|
var numberOfSections = getNumberOfSections();
|
|
for (var i = 0; i < numberOfSections; ++i) {
|
|
var section = getSection(i);
|
|
var zRange = section.getGlobalZRange();
|
|
var tool = section.getTool();
|
|
if (zRanges[tool.number]) {
|
|
zRanges[tool.number].expandToRange(zRange);
|
|
} else {
|
|
zRanges[tool.number] = zRange;
|
|
}
|
|
}
|
|
}
|
|
var tools = getToolTable();
|
|
if (tools.getNumberOfTools() > 0) {
|
|
for (var i = 0; i < tools.getNumberOfTools(); ++i) {
|
|
var tool = tools.getTool(i);
|
|
var comment = (getProperty("toolAsName") ? "\"" + tool.description.toUpperCase() + "\"" : "T" + toolFormat.format(tool.number)) + " " +
|
|
"D=" + xyzFormat.format(tool.diameter) + " " +
|
|
localize("CR") + "=" + xyzFormat.format(tool.cornerRadius);
|
|
if ((tool.taperAngle > 0) && (tool.taperAngle < Math.PI)) {
|
|
comment += " " + localize("TAPER") + "=" + taperFormat.format(tool.taperAngle) + localize("deg");
|
|
}
|
|
if (zRanges[tool.number]) {
|
|
comment += " - " + localize("ZMIN") + "=" + xyzFormat.format(zRanges[tool.number].getMinimum());
|
|
}
|
|
comment += " - " + getToolTypeName(tool.type);
|
|
writeComment(comment);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// <<<<< INCLUDED FROM include_files/writeProgramHeader.cpi
|