/** Copyright (C) 2012-2023 by Autodesk, Inc. All rights reserved. Brother Speedio post processor configuration. $Revision: 44093 5afed19dc47d472ae5e33114f06fb8010607587f $ $Date: 2023-10-23 08:54:40 $ FORKID {C09133CD-6F13-4DFC-9EB8-41260FBB5B08} NOTES: It's essential that you change: - "User Param Switch 1": 0053 (Multiple M codes in one block) to true. This allows the G100 tool change to start spindle + start coolant */ description = "Brother Speedio"; vendor = "Brother"; vendorUrl = "http://www.brother.com"; legal = "Copyright (C) 2012-2023 by Autodesk, Inc."; certificationLevel = 2; minimumRevision = 45917; longDescription = "Generic milling post for Brother Speedio S300X1, S500X1 and S700X1 machines."; extension = "NC"; programNameIsInteger = false; setCodePage("ascii"); capabilities = CAPABILITY_MILLING | CAPABILITY_MACHINE_SIMULATION; tolerance = spatial(0.002, MM); // Throw an error if duplicate tools are used errorOnDuplicateTool = false; // Turn on optimisations for production, trade speed for safety, etc productionMode = false; // Probe related measureToolMaxDiameter = toPreciseUnit(20, MM); measureAllFlutes = true; measureProbe = false; minimumChordLength = spatial(0.25, MM); minimumCircularRadius = spatial(0.01, MM); maximumCircularRadius = spatial(1000, MM); minimumCircularSweep = toRad(0.01); maximumCircularSweep = toRad(360); allowHelicalMoves = true; allowedCircularPlanes = undefined; // allow any circular motion highFeedrate = (unit == IN) ? 780 : 20000; probeMultipleFeatures = true; // Prepend / on probe lines to allow skip with B.SKP probeOutputAsOptional = false; // user-defined properties properties = { preloadTool: { title : "Preload tool", description: "Preloads the next tool at a tool change (if any).", group : "preferences", type : "boolean", value : false, scope : "post" }, showSequenceNumbers: { title : "Use sequence numbers", description: "'Yes' outputs sequence numbers on each block, 'Only on tool change' outputs sequence numbers on tool change blocks only, and 'No' disables the output of sequence numbers.", group : "formats", type : "enum", values : [ {title:"Yes", id:"true"}, {title:"No", id:"false"}, {title:"Only on tool change", id:"toolChange"} ], value: "toolChange", scope: "post" }, sequenceNumberStart: { title : "Start sequence number", description: "The number at which to start the sequence numbers.", group : "formats", type : "integer", value : 10, scope : "post" }, sequenceNumberIncrement: { title : "Sequence number increment", description: "The amount by which the sequence number is incremented by in each block.", group : "formats", type : "integer", value : 5, scope : "post" }, optionalStop: { title : "Optional stop", description: "Outputs optional stop code during when necessary in the code.", group : "preferences", type : "boolean", value : true, scope : "post" }, separateWordsWithSpace: { title : "Separate words with space", description: "Adds spaces between words if 'yes' is selected.", group : "formats", type : "boolean", value : true, scope : "post" }, useRadius: { title : "Radius arcs", description: "If yes is selected, arcs are outputted using radius values rather than IJK.", group : "preferences", type : "boolean", value : false, scope : "post" }, showNotes: { title : "Show notes", description: "Writes operation notes as comments in the outputted code.", group : "formats", type : "boolean", value : true, scope : "post" }, partsCounter211: { title : "Activate M211 parts counter", description: "Output M211 to activate parts counter", group : "configuration", type : "boolean", value : true, scope : "post", }, partsCounter212: { title : "Activate M212 parts counter", description: "Output M212 to activate parts counter", group : "configuration", type : "boolean", value : false, scope : "post", }, partsCounter213: { title : "Activate M213 parts counter", description: "Output M213 to activate parts counter", group : "configuration", type : "boolean", value : false, scope : "post", }, partsCounter214: { title : "Activate M214 parts counter", description: "Output M214 to activate parts counter", group : "configuration", type : "boolean", value : false, scope : "post", }, hasAAxis: { title : "Use A-axis", description: "Specifies whether to use the A axis.", group : "configuration", type : "boolean", value : false, scope : "post" }, useTrunnion: { title : "Use AC-trunnion", description: "Enables a trunnion table with an A and C-axis.", group : "configuration", type : "boolean", value : false, scope : "post" }, probingType: { title : "Probing type", description: "Specified what probing cycles are used on the machine.", group : "probing", type : "enum", values : [ {title:"Renishaw", id:"Renishaw"}, {title:"Blum", id:"Blum"} ], value: "Renishaw", scope: "post" }, washdownCoolant: { title : "Washdown coolant", description: "Specifies whether washdown coolant should be used and where it is output.", group : "preferences", type : "enum", values : [ {title:"Off", id:"off"}, {title:"Always on", id:"always"}, {title:"End of operation", id:"operationEnd"}, {title:"Program end", id:"programEnd"} ], value: "programEnd", scope: "post" }, usePitchForTapping: { title : "Use Pitch/TPI for tapping", description: "Enables the use of pitch and threads per inch instead of feed for tapping cycles. Using G77/78 instead of G84/74.", group : "preferences", type : "boolean", value : true, scope : "post" }, doubleTapWithdrawSpeed: { title : "Double the tap withdraw speed", description: "If enabled, an L value containing double the spindle speed (up to 6000) will be output in the G77 tapping cycle.", group : "preferences", type : "boolean", value : true, scope : "post" }, tapAccel: { title : "Override tap accelerations", description: "If the machine throws <>, then decrease tap accelerations.", group : "preferences", type : "enum", values : [ {title:"No Change", id:"-1"}, {title:"High", id:"252"}, {title:"Medium", id:"253"}, {title:"Slow", id:"254"} ], value : "-1", scope : "post" }, smoothingMode: { title : "High accuracy mode", description: "Select the high accuracy mode supported by the control.", group : "preferences", type : "enum", values : [ {title:"A", id:"A"}, {title:"B", id:"B"}, {title:"M298", id:"M298"} ], value : "M298", scope : "post" }, useSmoothing: { title : "High accuracy level", description: "Select the high accuracy level to use for machining.", group : "preferences", type : "enum", values : [ {title:"Off", id:"-1"}, {title:"Automatic", id:"9999"}, {title:"Standard", id:"1"}, // 0 {title:"Roughing", id:"2"}, // 5 {title:"Medium rough", id:"3"}, // 3 {title:"Medium rough (S)", id:"4"}, // 4 {title:"Finishing", id:"5"}, // 1 {title:"Finishing (S)", id:"6"} // 2 ], value : "9999", scope : "post" }, accuracyOverride: { title: "Accuracy mode", group: 0, description: "Override high accuracy mode for current operation", type: "enum", values: [ {title:"No Change", id:"-9999"}, {title:"Accuracy Off", id:"-1"}, {title:"Automatic", id:"9999"}, {title:"Standard", id:"1"}, {title:"Roughing", id:"2"}, {title:"Medium rough", id:"3"}, {title:"Medium rough (S)", id:"4"}, {title:"Finishing", id:"5"}, {title:"Finishing (S)", id:"6"}, {title:"Accuracy spec A", id:"21"}, {title:"Accuracy spec B", id:"22"}, {title:"Accuracy spec C", id:"23"} ], value: "-9999", scope : "operation", enabled : "milling", }, smoothingCriteria: { title : "Smoothing Criteria", description: "Select whether Stock to Leave or Tolerance is used for determining the automatic smoothing mode. Only used when High accuracy level is set to Automatic.", group : "preferences", type : "enum", values : [ {title:"Stock to Leave", id:"stock"}, {title:"Tolerance", id:"tolerance"}, ], value : "stock", scope : "post" }, rapidTransitions: { title : "Disable smoothing during transitions", description: "Turn off accuracy modes during leads in/out and non cutting moves. Generally faster, but beware moves may deviate from simulation. ONLY useable with M298. Currently only affects Adaptive & 2D Pocket", group : "preferences", type : "boolean", value : false, scope : "post" }, toolBreakageTolerance: { title : "Tool breakage tolerance", description: "Specifies the tolerance for which tool break detection will raise an alarm.", group : "preferences", type : "spatial", value : 0.05, scope : "post" }, useInverseTime: { title : "Use inverse time feedrates", description: "'Yes' enables inverse time feedrates, 'No' outputs DPM feedrates.", group : "multiAxis", type : "boolean", value : false, scope : "post" }, safePositionMethod: { title : "Safe Retracts", description: "Select your desired retract option. 'Clearance Height' retracts to the operation clearance height.", group : "homePositions", type : "enum", values : [ {title:"G28", id: "G28"}, {title:"G53", id:"G53"}, {title:"Clearance Height", id:"clearanceHeight"} ], value: "G53", scope: "post" }, useTiltedWorkplane: { title : "Use G68.2", description: "Enable to use G68.2 for 3+2 operations.", group : "multiAxis", type : "boolean", value : false, scope : "post" }, positionAtEnd: { title : "Part position at cycle end", description: "'Center At Door' Moves the part in X in center under spindle at end of program. 'Home' Moves the table to the home position defined in the machine setup", group : "homePositions", type : "enum", values : [ {title:"Home", id:"home"}, {title:"No Move", id:"noMove"}, {title:"Center at Door", id:"centerAtDoor"} ], value : "home", scope : "post" }, separateZOnToolChange: { title : "Tool change G100 moves in XY, then Z", description: "Non Speedio devices with a fixed tool change position will travel in a straight line if false. When true, they make a dog leg across XY first, then Z", group : "homePositions", type : "boolean", value : false, scope : "post" }, measureTools: { title : "Optionally measure tools at start", description: "Measure each tool used at the beginning of the program when block delete is turned off.", group : "probing", type : "boolean", value : false, scope : "post" }, confirmToolLengths: { title : "Confirm tool lengths", description: "Ensure that the actual tool lengths are equal or longer to that specified in CAM.", group : "probing", type : "boolean", value : false, scope : "post" }, singleResultsFile: { title : "Create single results file", description: "Set to false if you want to store the measurement results for each probe / inspection toolpath in a separate file", group : "probing", type : "boolean", value : true, scope : "post" } }; // wcs definiton wcsDefinitions = { useZeroOffset: false, wcs : [ {name:"Standard", format:"G", range:[54, 59]}, {name:"Extended", format:"G54.1 P", range:[1, 300]}, {name:"G54 G54.2Pn Rotary", format:"G54 G54.2 P", range:[1, 8]}, {name:"G55 G54.2Pn Rotary", format:"G55 G54.2 P", range:[1, 8]}, {name:"G56 G54.2Pn Rotary", format:"G56 G54.2 P", range:[1, 8]}, {name:"G57 G54.2Pn Rotary", format:"G57 G54.2 P", range:[1, 8]}, {name:"G58 G54.2Pn Rotary", format:"G58 G54.2 P", range:[1, 8]}, {name:"G59 G54.2Pn Rotary", format:"G59 G54.2 P", range:[1, 8]} ] }; var gFormat = createFormat({prefix:"G", width:1, zeropad:true, decimals:1}); var mFormat = createFormat({prefix:"M", width:1, zeropad:true, decimals:1}); var hFormat = createFormat({prefix:"H", width:2, zeropad:true, decimals:1}); var diameterOffsetFormat = createFormat({prefix:"D", width:2, zeropad:true, decimals:1}); var probeWCSFormat = createFormat({decimals:0, forceDecimal:true}); var xyzFormat = createFormat({decimals:(unit == MM ? 3 : 4), forceDecimal:false}); var rFormat = xyzFormat; // radius var abcFormat = createFormat({decimals:3, forceDecimal:true, scale:DEG}); var feedFormat = createFormat({decimals:(unit == MM ? 0 : 1), forceDecimal:false}); var inverseTimeFormat = createFormat({decimals:3, forceDecimal:true}); var toolFormat = createFormat({width:2, zeropad:true, decimals:1}); var rpmFormat = createFormat({decimals:0}); var secFormat = createFormat({decimals:3, forceDecimal:true}); // seconds - range 0.001-99999.999 var taperFormat = createFormat({decimals:1, scale:DEG}); var xOutput = createOutputVariable({prefix:"X"}, xyzFormat); var yOutput = createOutputVariable({prefix:"Y"}, xyzFormat); var zOutput = createOutputVariable({onchange:function() {retracted = false;}, prefix:"Z"}, xyzFormat); var aOutput = createOutputVariable({prefix:"A"}, abcFormat); var bOutput = createOutputVariable({prefix:"B"}, abcFormat); var cOutput = createOutputVariable({prefix:"C"}, abcFormat); var feedOutput = createOutputVariable({prefix:"F"}, feedFormat); var inverseTimeOutput = createOutputVariable({prefix:"F", control:CONTROL_FORCE}, inverseTimeFormat); var cyclefeedOutput = createOutputVariable({prefix:"F", control:CONTROL_FORCE}, feedFormat); var sOutput = createOutputVariable({prefix:"S", control:CONTROL_FORCE}, rpmFormat); // circular output var iOutput = createOutputVariable({prefix:"I", control:CONTROL_NONZERO}, xyzFormat); var jOutput = createOutputVariable({prefix:"J", control:CONTROL_NONZERO}, xyzFormat); var kOutput = createOutputVariable({prefix:"K", control:CONTROL_NONZERO}, xyzFormat); var gMotionModal = createOutputVariable({control:CONTROL_FORCE}, gFormat); // modal group 1 // G0-G3, ... var gPlaneModal = createOutputVariable({onchange:function () {gMotionModal.reset();}}, gFormat); // modal group 2 // G17-19 var gAbsIncModal = createOutputVariable({}, gFormat); // modal group 3 // G90-91 var gFeedModeModal = createOutputVariable({}, gFormat); // modal group 5 // G94-95 var gUnitModal = createOutputVariable({}, gFormat); // modal group 6 // G20-21 var gCycleModal = createOutputVariable({control:CONTROL_FORCE}, gFormat); // modal group 9 // G81, ... var gRetractModal = createOutputVariable({}, gFormat); // modal group 10 // G98-99 var gRotationModal = createOutputVariable({ onchange: function () { if (settings.probing.probeAngleMethod == "G68") { probeVariables.outputRotationCodes = true; } } }, gFormat); // modal group 16 // G68-G69 var settings = { coolant: { // samples: // {id: COOLANT_THROUGH_TOOL, on: 88, off: 89} // {id: COOLANT_THROUGH_TOOL, on: [8, 88], off: [9, 89]} // {id: COOLANT_THROUGH_TOOL, on: "M88 P3 (myComment)", off: "M89"} coolants: [ {id:COOLANT_FLOOD, on:8}, {id:COOLANT_MIST}, {id:COOLANT_THROUGH_TOOL, on:494, off:495}, {id:COOLANT_AIR, on: 402, off: 403}, {id:COOLANT_AIR_THROUGH_TOOL}, {id:COOLANT_SUCTION}, {id:COOLANT_FLOOD_MIST}, {id:COOLANT_FLOOD_THROUGH_TOOL, on:[8, 494], off:[9, 495]}, {id:COOLANT_OFF, off:9} ], singleLineCoolant: false, // specifies to output multiple coolant codes in one line rather than in separate lines }, smoothing: { off : -1, // disabled normal : 1, // general purpose, optimised settings roughing : 2, // roughing level for smoothing in automatic mode semi : 4, // semi-roughing level for smoothing in automatic mode semifinishing : 1, // semi-finishing level for smoothing in automatic mode finishing : 5, // finishing level for smoothing in automatic mode finishingS : 6, // finishing with smoothing thresholdRoughing : toPreciseUnit(0.5, MM), // operations with stock/tolerance at/above that threshold will use roughing level in automatic mode thresholdFinishing : toPreciseUnit(0.05, MM), // operations with stock/tolerance at/below that threshold will use finishing level in automatic mode thresholdSemiFinishing: toPreciseUnit(0.1, MM), // operations with stock/tolerance at/below that threshold (and above threshold finishing) will use semi finishing level in automatic mode differenceCriteria: "level", // options: "level", "tolerance", "both". Specifies criteria when output smoothing codes autoLevelCriteria : "stock", // use "stock" or "tolerance" to determine levels in automatic mode cancelCompensation: false // tool length compensation must be canceled prior to changing the smoothing level }, retract: { cancelRotationOnRetracting: false, // specifies that rotations (G68) need to be canceled prior to retracting methodXY : "G53", // special condition, overwrite retract behavior per axis methodZ : getProperty("safePositionMethod"), // special condition, overwrite retract behavior per axis useZeroValues : ["G28", "G30"] // enter property value id(s) for using "0" value instead of machineConfiguration axes home position values (ie G30 Z0) }, parametricFeeds: { firstFeedParameter : 500, // specifies the initial parameter number to be used for parametric feedrate output feedAssignmentVariable: "#", // specifies the syntax to define a parameter feedOutputVariable : "F#" // specifies the syntax to output the feedrate as parameter }, machineAngles: { // refer to https://cam.autodesk.com/posts/reference/classMachineConfiguration.html#a14bcc7550639c482492b4ad05b1580c8 controllingAxis: ABC, type : PREFER_PREFERENCE, options : ENABLE_ALL }, workPlaneMethod: { useTiltedWorkplane : false, // specifies that tilted workplanes should be used (ie. G68.2, G254, PLANE SPATIAL, CYCLE800), can be overwritten by property eulerConvention : EULER_ZXZ_R, // specifies the euler convention (ie EULER_XYZ_R), set to undefined to use machine angles for TWP commands ('undefined' requires machine configuration) eulerCalculationMethod: "standard", // ('standard' / 'machine') 'machine' adjusts euler angles to match the machines ABC orientation, machine configuration required cancelTiltFirst : true, // cancel tilted workplane prior to WCS (G54-G59) blocks useABCPrepositioning : false, // position ABC axes prior to tilted workplane blocks forceMultiAxisIndexing: false, // force multi-axis indexing for 3D programs optimizeType : undefined // can be set to OPTIMIZE_NONE, OPTIMIZE_BOTH, OPTIMIZE_TABLES, OPTIMIZE_HEADS, OPTIMIZE_AXIS. 'undefined' uses legacy rotations }, 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 : "upperCase", // can be set to "upperCase", "lowerCase" and "ignoreCase". Set to "ignoreCase" to write comments without upper/lower case formatting maximumLineLength : 80 // the maximum number of characters allowed in a line, set to 0 to disable comment output }, probing: { macroCall : gFormat.format(65), // specifies the command to call a macro probeAngleMethod : "OFF", // supported options are: OFF, AXIS_ROT, G68, G54.4 allowIndexingWCSProbing: false, // specifies that probe WCS with tool orientation is supported probeOn : false // whether the probe is activated for probing }, maximumSequenceNumber : undefined, // the maximum sequence number (Nxxx), use 'undefined' for unlimited supportsTCP : false, // specifies if the postprocessor does support TCP outputToolLengthCompensation: false, // specifies if tool length compensation code should be output (G43) outputToolLengthOffset : false // specifies if tool length offset code should be output (Hxx) }; var washdownCoolant = {on:400, off:401}; var probeVariables = { outputRotationCodes: false, // determines if it is required to output rotation codes compensationXY : undefined }; var compensateToolLength = false; // add the tool length to the pivot distance for nonTCP rotary heads var toolChecked = false; // specifies that the tool has been checked with the probe var measureTool = false; var jobDescription = ""; var firstNote = true; // handles output of notes from multiple setups function defineMachine() { var useTCP = false; // Some defaults if no machine config provided if (!receivedMachineConfiguration) { machineConfiguration.setHomePositionZ(toUnit(480, MM)); } if (getProperty("useTrunnion")) { var aAxis = createAxis({coordinate:0, table:true, axis:[1, 0, 0], range:[-30, 120], preference:1, tcp:useTCP}); var cAxis = createAxis({coordinate:2, table:true, axis:[0, 0, 1], cyclic:true, tcp:useTCP}); machineConfiguration = new MachineConfiguration(aAxis, cAxis); setMachineConfiguration(machineConfiguration); if (receivedMachineConfiguration) { warning(localize("The provided CAM machine configuration is overwritten by the postprocessor.")); receivedMachineConfiguration = false; // CAM provided machine configuration is overwritten } } else if (getProperty("hasAAxis")) { // note: setup your machine here var aAxis = createAxis({coordinate:0, table:true, axis:[1, 0, 0], range:[-360, 360], preference:1, tcp:useTCP}); machineConfiguration = new MachineConfiguration(aAxis); setMachineConfiguration(machineConfiguration); if (receivedMachineConfiguration) { warning(localize("The provided CAM machine configuration is overwritten by the postprocessor.")); receivedMachineConfiguration = false; // CAM provided machine configuration is overwritten } } if (!receivedMachineConfiguration) { // multiaxis settings if (machineConfiguration.isHeadConfiguration()) { machineConfiguration.setVirtualTooltip(false); // translate the pivot point to the virtual tool tip for nonTCP rotary heads } // retract / reconfigure var performRewinds = false; // set to true to enable the rewind/reconfigure logic if (performRewinds) { machineConfiguration.enableMachineRewinds(); // enables the retract/reconfigure logic safeRetractDistance = (unit == IN) ? 1 : 25; // additional distance to retract out of stock, can be overridden with a property safeRetractFeed = (unit == IN) ? 20 : 500; // retract feed rate safePlungeFeed = (unit == IN) ? 10 : 250; // plunge feed rate machineConfiguration.setSafeRetractDistance(safeRetractDistance); machineConfiguration.setSafeRetractFeedrate(safeRetractFeed); machineConfiguration.setSafePlungeFeedrate(safePlungeFeed); var stockExpansion = new Vector(toPreciseUnit(0.1, IN), toPreciseUnit(0.1, IN), toPreciseUnit(0.1, IN)); // expand stock XYZ values machineConfiguration.setRewindStockExpansion(stockExpansion); } // multi-axis feedrates if (machineConfiguration.isMultiAxisConfiguration()) { machineConfiguration.setMultiAxisFeedrate( useTCP ? FEED_FPM : getProperty("useInverseTime") ? FEED_INVERSE_TIME : FEED_DPM, 9999.999, // maximum output value for inverse time feed rates getProperty("useInverseTime") ? INVERSE_MINUTES : DPM_COMBINATION, // INVERSE_MINUTES/INVERSE_SECONDS or DPM_COMBINATION/DPM_STANDARD 0.5, // tolerance to determine when the DPM feed has changed 0.1 // ratio of rotary accuracy to linear accuracy for DPM calculations ); setMachineConfiguration(machineConfiguration); } /* home positions */ // machineConfiguration.setHomePositionX(toPreciseUnit(0, IN)); // machineConfiguration.setHomePositionY(toPreciseUnit(0, IN)); // machineConfiguration.setRetractPlane(toPreciseUnit(0, IN)); } } // Convert angles from <0 degrees to positive function ensurePositiveAngle(angle) { if (angle < 0) { return angle + 360.0; } else { return angle; } } function noSpindle() { // Do not output D, S, M3/4 during G100 for Tap/Probe operations var noSpindle = isTappingCycle(currentSection) || tool.type == TOOL_PROBE; return noSpindle; } function onOpen() { // define and enable machine configuration receivedMachineConfiguration = machineConfiguration.isReceived(); if (typeof defineMachine == "function") { defineMachine(); // hardcoded machine configuration } activateMachine(); // enable the machine optimizations and settings if (!getProperty("separateWordsWithSpace")) { setWordSeparator(""); } if (getProperty("useRadius")) { maximumCircularSweep = toRad(90); // avoid potential center calculation errors for CNC } gRotationModal.format(69); // Default to G69 Rotation Off // setup for proper smoothing mode switch (getProperty("smoothingMode")) { case "A": case "B": settings.smoothing.roughing = 5; settings.smoothing.semi = 3; settings.smoothing.semifinishing = 1; settings.smoothing.finishing = 2; break; } settings.smoothing.autoLevelCriteria = getProperty("smoothingCriteria"); if (programName) { writeComment(programName + conditional(programComment, SP + formatComment(programComment))); } else { error(localize("Program name has not been specified.")); } sequenceNumber = getProperty("sequenceNumberStart"); writeProgramHeader(); writeMeasureTools(); // absolute coordinates and feed per min writeBlock(gMotionModal.format(0), gAbsIncModal.format(90), gFormat.format(40), gFormat.format(80)); writeBlock(gFeedModeModal.format(94), gFormat.format(49), "Z[#5003]"); // Convenient to emit the WCS code for the first section if (getNumberOfSections() > 0) { writeBlock(getSection(0).wcs); } // Tap accel var tapAccel = parseInt(getProperty("tapAccel", "-1"), 10); if (!isNaN(tapAccel) && (tapAccel > 0)) { writeBlock(mFormat.format(tapAccel)) } writeComment("File output in " + (unit == 1 ? "MM" : "inches") + ". Please ensure the unit is set correctly on the control"); validateCommonParameters(); } function setSmoothing(mode) { if (mode == smoothing.isActive && (!mode || !smoothing.isDifferent) && !smoothing.force) { return; // return if smoothing is already active or is not different } if (typeof lengthCompensationActive != "undefined" && settings.smoothing.cancelCompensation) { validate(!lengthCompensationActive, "Length compensation is active while trying to update smoothing."); } switch (getProperty("smoothingMode")) { case "A": writeBlock(mFormat.format(mode ? 260 + smoothing.level : 269)); break; case "B": writeBlock(mFormat.format(mode ? 280 + smoothing.level : 289)); break; default: writeBlock(mFormat.format(298), mode ? "L" + smoothing.level : "L0"); break; } smoothing.isActive = mode; smoothing.force = false; smoothing.isDifferent = false; } function printProbeResults() { return ((currentSection.getParameter("printResults", 0) == 1) && (getProperty("probingType") == "Renishaw")); } function onSection() { var forceSectionRestart = optionalSection && !currentSection.isOptional(); optionalSection = currentSection.isOptional() || (isProbeOperation() && probeOutputAsOptional); var insertToolCall = isToolChangeNeeded("number") || forceSectionRestart; var newWorkOffset = isNewWorkOffset() || forceSectionRestart; var newWorkPlane = isNewWorkPlane() || forceSectionRestart; writeln(""); writeComment(getParameter("operation-comment", "")); if (getProperty("showNotes")) { writeSectionNotes(); } initializeSmoothing(); // initialize smoothing mode if (insertToolCall || newWorkOffset || newWorkPlane || smoothing.cancel) { if (!insertToolCall && (newWorkOffset || newWorkPlane)) { writeRetract(Z); // retract forceXYZ(); } if ((insertToolCall && !isFirstSection()) || smoothing.cancel) { setSmoothing(false); } } if (toolChecked) { forceSpindleSpeed = true; // spindle must be restarted if tool is checked without a tool change toolChecked = false; // state of tool is not known at the beginning of a section since it could be broken for the previous section } // set wcs var wcsIsRequired = true; if (insertToolCall) { currentWorkOffset = undefined; // force work offset when changing tool wcsIsRequired = newWorkOffset || insertToolCall; writeBlock(gRotationModal.format(69)); // cancel frame } writeWCS(currentSection, wcsIsRequired); if (insertToolCall) { if (tool.manualToolChange) { error(localize("Manual tool change is not supported by this postprocessor.")); } if (settings.workPlaneMethod.useTiltedWorkplane) { defineWorkPlane(currentSection, true); } // G100 tool call macro does handle retract, initial positioning XYZABC and starts the spindle retracted = true; writeToolCall(tool, insertToolCall); } else { defineWorkPlane(currentSection, true); startSpindle(tool, insertToolCall); } onCommand(COMMAND_START_CHIP_TRANSPORT); forceXYZ(); if (!isProbeOperation()) { setProbeAngle(); // output probe angle rotations if required } setCoolant(tool.coolant); // writes the required coolant codes // add dwell for through coolant if needed var lastCoolant = isFirstSection() ? COOLANT_OFF : getPreviousSection().getTool().coolant; if (tool.coolant == COOLANT_FLOOD) { if (lastCoolant == COOLANT_FLOOD_THROUGH_TOOL || lastCoolant == COOLANT_FLOOD) { onDwell(0.1); } else { onDwell(0.6); } } setSmoothing(smoothing.isAllowed); if (tool.type != TOOL_PROBE && isFirstSection() && (getProperty("washdownCoolant") == "always")) { writeBlock(mFormat.format(washdownCoolant.on)); } // write parametric feedrate table if (typeof initializeParametricFeeds == "function") { initializeParametricFeeds(insertToolCall); } if (isProbeOperation()) { // validate(settings.probing.probeAngleMethod != "G68", "You cannot probe while G68 Rotation is in effect."); validate(settings.probing.probeAngleMethod != "G54.4", "You cannot probe while workpiece setting error compensation G54.4 is enabled."); if (! settings.probing.probeOn) { if (getProperty("probingType") == "Renishaw") { writeBlock(gFormat.format(65), "P" + 8832); // spin the probe on } else { writeBlock(gFormat.format(65), "P" + 8703, "A1", "M1", "X" + "[#5001]"); // Zero move to turn on probe } settings.probing.probeOn = true; } inspectionCreateResultsFileHeader(); } // prepositioning var initialPosition = getFramePosition(currentSection.getInitialPosition()); var isRequired = insertToolCall || retracted || !lengthCompensationActive || (!isFirstSection() && getPreviousSection().isMultiAxis()); writeInitialPositioning(initialPosition, isRequired); } function onDwell(seconds) { if (seconds > 99999.999) { warning(localize("Dwelling time is out of range.")); } seconds = clamp(0, seconds, 99999999); writeBlock(gFeedModeModal.format(94), gFormat.format(4), "P" + secFormat.format(seconds)); } function onSpindleSpeed(spindleSpeed) { writeBlock(sOutput.format(spindleSpeed)); } function onCycle() { writeBlock(gPlaneModal.format(17)); } function getCommonCycle(x, y, z, r) { forceXYZ(); // force xyz on first drill hole of any cycle return [xOutput.format(x), yOutput.format(y), zOutput.format(z), "R" + xyzFormat.format(r)]; } /** Convert approach to sign. */ function approach(value) { validate((value == "positive") || (value == "negative"), "Invalid approach."); return (value == "positive") ? 1 : -1; } function protectedProbeMove(cycle, x, y, z) { var _x = xOutput.format(x); var _y = yOutput.format(y); var _z = zOutput.format(z); var cycleFeedrate = cycle ? cycle.feedrate : highFeedrate; var _code = getProperty("probingType") == "Renishaw" ? 8810 : 8703; var _probeParams = getProperty("probingType") == "Renishaw" ? "" : "A1 M3"; if (_z && z >= getCurrentPosition().z) { writeBlock(gFormat.format(65), "P" + _code, _probeParams, _z, getFeed(highFeedrate)); // protected positioning move } if (_x || _y) { writeBlock(gFormat.format(65), "P" + _code, _probeParams, _x, _y, getFeed(cycleFeedrate)); // protected positioning move } if (_z && z < getCurrentPosition().z) { writeBlock(gFormat.format(65), "P" + _code, _probeParams, _z, getFeed(cycleFeedrate)); // protected positioning move } } function onCyclePoint(x, y, z) { if (isInspectionOperation()) { if (typeof inspectionCycleInspect == "function") { inspectionCycleInspect(cycle, x, y, z); return; } else { cycleNotSupported(); } } else if (isProbeOperation()) { writeProbeCycle(cycle, x, y, z); } else { writeDrillCycle(cycle, x, y, z); } } function writeDrillCycle(cycle, x, y, z) { if (!isSameDirection(machineConfiguration.getSpindleAxis(), getForwardDirection(currentSection))) { expandCyclePoint(x, y, z); return; } if (isFirstCyclePoint() || isProbeOperation()) { if (!isProbeOperation()) { // return to initial Z which is clearance plane and set absolute mode repositionToCycleClearance(cycle, x, y, z); } var F = cycle.feedrate; var P = !cycle.dwell ? 0 : cycle.dwell; // in seconds // tapping variables var tapUnit = unit; if (hasParameter("operation:tool_unit")) { if (getParameter("operation:tool_unit") == "inches") { tapUnit = IN; } else { tapUnit = MM; } } var threadPitchMM = (unit == IN) ? 25.4 * tool.threadPitch : tool.threadPitch; var threadsPerInch = toPreciseUnit(1.0, IN) / tool.threadPitch; switch (cycleType) { case "drilling": writeBlock( gRetractModal.format(98), gCycleModal.format(81), getCommonCycle(x, y, z, cycle.retract), cyclefeedOutput.format(F) ); break; case "counter-boring": if (P > 0) { writeBlock( gRetractModal.format(98), gCycleModal.format(82), getCommonCycle(x, y, z, cycle.retract), "P" + secFormat.format(P), cyclefeedOutput.format(F) ); } else { writeBlock( gRetractModal.format(98), gCycleModal.format(81), getCommonCycle(x, y, cycle.bottom, cycle.retract), cyclefeedOutput.format(F) ); } break; case "chip-breaking": if ((cycle.accumulatedDepth < cycle.depth) || (P > 0)) { expandCyclePoint(x, y, z); } else { writeBlock( gRetractModal.format(98), gCycleModal.format(73), getCommonCycle(x, y, cycle.bottom, cycle.retract), "Q" + xyzFormat.format(cycle.incrementalDepth), cyclefeedOutput.format(F) ); } break; case "deep-drilling": if (P > 0) { expandCyclePoint(x, y, z); } else { writeBlock( gRetractModal.format(98), gCycleModal.format(83), getCommonCycle(x, y, cycle.bottom, cycle.retract), "Q" + xyzFormat.format(cycle.incrementalDepth), // conditional(P > 0, "P" + secFormat.format(P)), cyclefeedOutput.format(F) ); } break; case "tapping": if (!F) { F = tool.getTappingFeedrate(); } if (getProperty("usePitchForTapping")) { writeBlock( gRetractModal.format(98), gCycleModal.format((tool.type == TOOL_TAP_LEFT_HAND) ? 78 : 77), getCommonCycle(x, y, cycle.bottom, cycle.retract), conditional((tapUnit == IN), "J" + xyzFormat.format(threadsPerInch)), conditional((tapUnit == MM), "I" + xyzFormat.format(threadPitchMM)), sOutput.format(spindleSpeed), conditional(getProperty("doubleTapWithdrawSpeed"), "L" + rpmFormat.format(spindleSpeed * 2 > 6000 ? 6000 : spindleSpeed * 2)) ); } else { writeBlock( gRetractModal.format(98), gCycleModal.format((tool.type == TOOL_TAP_LEFT_HAND) ? 74 : 84), getCommonCycle(x, y, cycle.bottom, cycle.retract), "P" + secFormat.format(P), sOutput.format(spindleSpeed), cyclefeedOutput.format(F) ); } break; case "left-tapping": if (!F) { F = tool.getTappingFeedrate(); } if (getProperty("usePitchForTapping")) { writeBlock( gRetractModal.format(98), gCycleModal.format(78), getCommonCycle(x, y, cycle.bottom, cycle.retract), conditional((tapUnit == IN), "J" + xyzFormat.format(threadsPerInch)), conditional((tapUnit == MM), "I" + xyzFormat.format(threadPitchMM)), sOutput.format(spindleSpeed), conditional(getProperty("doubleTapWithdrawSpeed"), "L" + rpmFormat.format(spindleSpeed * 2 > 6000 ? 6000 : spindleSpeed * 2)) ); } else { writeBlock( gRetractModal.format(98), gCycleModal.format(74), getCommonCycle(x, y, z, cycle.retract), "P" + secFormat.format(P), sOutput.format(spindleSpeed), cyclefeedOutput.format(F) ); } break; case "right-tapping": if (!F) { F = tool.getTappingFeedrate(); } if (getProperty("usePitchForTapping")) { writeBlock( gRetractModal.format(98), gCycleModal.format(77), getCommonCycle(x, y, cycle.bottom, cycle.retract), conditional((tapUnit == IN), "J" + xyzFormat.format(threadsPerInch)), conditional((tapUnit == MM), "I" + xyzFormat.format(threadPitchMM)), sOutput.format(spindleSpeed), conditional(getProperty("doubleTapWithdrawSpeed"), "L" + rpmFormat.format(spindleSpeed * 2 > 6000 ? 6000 : spindleSpeed * 2)) ); } else { writeBlock( gRetractModal.format(98), gCycleModal.format(84), getCommonCycle(x, y, z, cycle.retract), "P" + secFormat.format(P), sOutput.format(spindleSpeed), cyclefeedOutput.format(F) ); } break; case "tapping-with-chip-breaking": case "left-tapping-with-chip-breaking": case "right-tapping-with-chip-breaking": if (cycle.accumulatedDepth < cycle.depth) { error(localize("Accumulated pecking depth is not supported for tapping cycles with chip breaking.")); return; } else { if (!F) { F = tool.getTappingFeedrate(); } if (getProperty("usePitchForTapping")) { writeBlock( gRetractModal.format(98), gCycleModal.format((tool.type == TOOL_TAP_LEFT_HAND) ? 78 : 77), getCommonCycle(x, y, cycle.bottom, cycle.retract), "Q" + xyzFormat.format(cycle.incrementalDepth), conditional((tapUnit == IN), "J" + xyzFormat.format(threadsPerInch)), conditional((tapUnit == MM), "I" + xyzFormat.format(threadPitchMM)), sOutput.format(spindleSpeed), conditional(getProperty("doubleTapWithdrawSpeed"), "L" + rpmFormat.format(spindleSpeed * 2 > 6000 ? 6000 : spindleSpeed * 2)) ); } else { // G84/G74 does not support chip breaking error(localize("Tapping with chip breaking is not supported by the G74/G84 cycle.")); } } break; case "fine-boring": writeBlock( gRetractModal.format(98), gCycleModal.format(76), getCommonCycle(x, y, z, cycle.retract), "P" + secFormat.format(P), // not optional "Q" + xyzFormat.format(cycle.shift), feedOutput.format(F) ); break; case "back-boring": var dx = (gPlaneModal.getCurrent() == 19) ? cycle.backBoreDistance : 0; var dy = (gPlaneModal.getCurrent() == 18) ? cycle.backBoreDistance : 0; var dz = (gPlaneModal.getCurrent() == 17) ? cycle.backBoreDistance : 0; writeBlock( gRetractModal.format(98), gCycleModal.format(87), getCommonCycle(x, y, cycle.bottom - cycle.backBoreDistance, cycle.bottom), "Q" + xyzFormat.format(cycle.shift), "P" + secFormat.format(P), // not optional cyclefeedOutput.format(F) ); break; case "reaming": if (feedFormat.getResultingValue(cycle.feedrate) != feedFormat.getResultingValue(cycle.retractFeedrate)) { expandCyclePoint(x, y, z); break; } if (P > 0) { writeBlock( gRetractModal.format(98), gCycleModal.format(89), getCommonCycle(x, y, z, cycle.retract), "P" + secFormat.format(P), cyclefeedOutput.format(F) ); } else { writeBlock( gRetractModal.format(98), gCycleModal.format(85), getCommonCycle(x, y, z, cycle.retract), cyclefeedOutput.format(F) ); } break; case "stop-boring": if (P > 0) { expandCyclePoint(x, y, z); } else { writeBlock( gRetractModal.format(98), gCycleModal.format(86), getCommonCycle(x, y, z, cycle.retract), cyclefeedOutput.format(F) ); } break; case "manual-boring": writeBlock( gRetractModal.format(98), gCycleModal.format(88), getCommonCycle(x, y, z, cycle.retract), "P" + secFormat.format(P), // not optional cyclefeedOutput.format(F) ); break; case "boring": if (feedFormat.getResultingValue(cycle.feedrate) != feedFormat.getResultingValue(cycle.retractFeedrate)) { expandCyclePoint(x, y, z); break; } if (P > 0) { writeBlock( gRetractModal.format(98), gCycleModal.format(89), getCommonCycle(x, y, z, cycle.retract), "P" + secFormat.format(P), // not optional cyclefeedOutput.format(F) ); } else { writeBlock( gRetractModal.format(98), gCycleModal.format(85), getCommonCycle(x, y, z, cycle.retract), cyclefeedOutput.format(F) ); } break; default: expandCyclePoint(x, y, z); } } else { if (cycleExpanded) { expandCyclePoint(x, y, z); } else { writeBlock(xOutput.format(x), yOutput.format(y)); } } } function writeProbeCycle(cycle, x, y, z) { if (!settings.workPlaneMethod.useTiltedWorkplane && !isSameDirection(currentSection.workPlane.forward, new Vector(0, 0, 1))) { if (!settings.probing.allowIndexingWCSProbing && currentSection.strategy == "probe") { error(localize("Updating WCS / work offset using probing is only supported by the CNC in the WCS frame.")); return; } } if (printProbeResults()) { writeProbingToolpathInformation(z - cycle.depth + tool.diameter / 2); inspectionWriteCADTransform(); inspectionWriteWorkplaneTransform(); if (typeof inspectionWriteVariables == "function") { inspectionVariables.pointNumber += 1; } } protectedProbeMove(cycle, x, y, z); switch (cycleType) { case "probing-x": var edgeCoord = x + approach(cycle.approach1) * (cycle.probeClearance + tool.diameter / 2); protectedProbeMove(cycle, x, y, z - cycle.depth); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8811, "X" + xyzFormat.format(x + approach(cycle.approach1) * (cycle.probeClearance + tool.diameter / 2)), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "I" + xyzFormat.format(edgeCoord), "X" + xyzFormat.format(edgeCoord), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-y": var edgeCoord = y + approach(cycle.approach1) * (cycle.probeClearance + tool.diameter / 2); protectedProbeMove(cycle, x, y, z - cycle.depth); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8811, "Y" + xyzFormat.format(y + approach(cycle.approach1) * (cycle.probeClearance + tool.diameter / 2)), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "J" + xyzFormat.format(edgeCoord), "Y" + xyzFormat.format(edgeCoord), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-z": protectedProbeMove(cycle, x, y, Math.min(z - cycle.depth + cycle.probeClearance, cycle.retract)); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8811, "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "K" + xyzFormat.format(z - cycle.depth), "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-x-wall": protectedProbeMove(cycle, x, y, z); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8812, "X" + xyzFormat.format(cycle.width1), "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "I" + xyzFormat.format(x), "S" + xyzFormat.format(cycle.width1), "X1", "Z" + xyzFormat.format(z - cycle.depth + (tool.diameter /2)), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-y-wall": protectedProbeMove(cycle, x, y, z); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8812, "Y" + xyzFormat.format(cycle.width1), "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "J" + xyzFormat.format(y), "S" + xyzFormat.format(cycle.width1), "Z" + xyzFormat.format(z - cycle.depth + (tool.diameter /2)), "Y1", "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-x-channel": protectedProbeMove(cycle, x, y, z - cycle.depth); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8812, "X" + xyzFormat.format(cycle.width1), "Q" + xyzFormat.format(cycle.probeOvertravel), // not required "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "I" + xyzFormat.format(x), "S" + xyzFormat.format(cycle.width1), "X1", "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-x-channel-with-island": protectedProbeMove(cycle, x, y, z); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8812, "X" + xyzFormat.format(cycle.width1), "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(-cycle.probeClearance), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "I" + xyzFormat.format(x), "R" + xyzFormat.format(-cycle.probeClearance), "S" + xyzFormat.format(cycle.width1), "Z" + xyzFormat.format(z - cycle.depth + (tool.diameter /2)), "X1", "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-y-channel": protectedProbeMove(cycle, x, y, z - cycle.depth); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8812, "Y" + xyzFormat.format(cycle.width1), "Q" + xyzFormat.format(cycle.probeOvertravel), // not required "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "J" + xyzFormat.format(y), "S" + xyzFormat.format(cycle.width1), "Y1", "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-y-channel-with-island": protectedProbeMove(cycle, x, y, z); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8812, "Y" + xyzFormat.format(cycle.width1), "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(-cycle.probeClearance), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "J" + xyzFormat.format(y), "R" + xyzFormat.format(-cycle.probeClearance), "S" + xyzFormat.format(cycle.width1), "Z" + xyzFormat.format(z - cycle.depth), "Y1", "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-xy-circular-boss": protectedProbeMove(cycle, x, y, z); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8814, "D" + xyzFormat.format(cycle.width1), "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "I" + xyzFormat.format(x), "J" + xyzFormat.format(y), "S" + xyzFormat.format(cycle.width1), "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-xy-circular-partial-boss": protectedProbeMove(cycle, x, y, z); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8823, "A" + xyzFormat.format(cycle.partialCircleAngleA), "B" + xyzFormat.format(cycle.partialCircleAngleB), "C" + xyzFormat.format(cycle.partialCircleAngleC), "D" + xyzFormat.format(cycle.width1), "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "H" + xyzFormat.format(ensurePositiveAngle(cycle.partialCircleAngleA)), "U" + xyzFormat.format(ensurePositiveAngle(cycle.partialCircleAngleB)), "V" + xyzFormat.format(ensurePositiveAngle(cycle.partialCircleAngleC)), "I" + xyzFormat.format(x), "J" + xyzFormat.format(y), "S" + xyzFormat.format(cycle.width1), "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-xy-circular-hole": protectedProbeMove(cycle, x, y, z - cycle.depth); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8814, "D" + xyzFormat.format(cycle.width1), "Q" + xyzFormat.format(cycle.probeOvertravel), // not required "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "I" + xyzFormat.format(x), "J" + xyzFormat.format(y), "S" + xyzFormat.format(cycle.width1), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-xy-circular-partial-hole": protectedProbeMove(cycle, x, y, z - cycle.depth); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8823, "A" + xyzFormat.format(cycle.partialCircleAngleA), "B" + xyzFormat.format(cycle.partialCircleAngleB), "C" + xyzFormat.format(cycle.partialCircleAngleC), "D" + xyzFormat.format(cycle.width1), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "H" + xyzFormat.format(ensurePositiveAngle(cycle.partialCircleAngleA)), "U" + xyzFormat.format(ensurePositiveAngle(cycle.partialCircleAngleB)), "V" + xyzFormat.format(ensurePositiveAngle(cycle.partialCircleAngleC)), "I" + xyzFormat.format(x), "J" + xyzFormat.format(y), "S" + xyzFormat.format(cycle.width1), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-xy-circular-hole-with-island": protectedProbeMove(cycle, x, y, z); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8814, "Z" + xyzFormat.format(z - cycle.depth), "D" + xyzFormat.format(cycle.width1), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(-cycle.probeClearance), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "I" + xyzFormat.format(x), "J" + xyzFormat.format(y), "R" + xyzFormat.format(-cycle.probeClearance), "S" + xyzFormat.format(cycle.width1), "Q" + xyzFormat.format(cycle.probeOvertravel), "Z" + xyzFormat.format(z - cycle.depth + (tool.diameter /2)), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-xy-circular-partial-hole-with-island": protectedProbeMove(cycle, x, y, z); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8823, "Z" + xyzFormat.format(z - cycle.depth), "A" + xyzFormat.format(cycle.partialCircleAngleA), "B" + xyzFormat.format(cycle.partialCircleAngleB), "C" + xyzFormat.format(cycle.partialCircleAngleC), "D" + xyzFormat.format(cycle.width1), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(-cycle.probeClearance), getProbingArguments(cycle, true) ); } else { writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "H" + xyzFormat.format(ensurePositiveAngle(cycle.partialCircleAngleA)), "U" + xyzFormat.format(ensurePositiveAngle(cycle.partialCircleAngleB)), "V" + xyzFormat.format(ensurePositiveAngle(cycle.partialCircleAngleC)), "I" + xyzFormat.format(x), "J" + xyzFormat.format(y), "R" + xyzFormat.format(-cycle.probeClearance), "S" + xyzFormat.format(cycle.width1), "Q" + xyzFormat.format(cycle.probeOvertravel), "Z" + xyzFormat.format(z - cycle.depth + (tool.diameter /2)), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-xy-rectangular-hole": protectedProbeMove(cycle, x, y, z - cycle.depth); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8812, "X" + xyzFormat.format(cycle.width1), "Q" + xyzFormat.format(cycle.probeOvertravel), // not required "R" + xyzFormat.format(-cycle.probeClearance), getProbingArguments(cycle, true) ); writeBlock( gFormat.format(65), "P" + 8812, "Y" + xyzFormat.format(cycle.width2), "Q" + xyzFormat.format(cycle.probeOvertravel), // not required "R" + xyzFormat.format(-cycle.probeClearance), getProbingArguments(cycle, true) ); } else { zOutput.reset(); writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "I" + xyzFormat.format(x), "S" + xyzFormat.format(cycle.width1), "X1", "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); zOutput.reset(); writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "J" + xyzFormat.format(y), "S" + xyzFormat.format(cycle.width2), "Y1", "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-xy-rectangular-boss": protectedProbeMove(cycle, x, y, z); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8812, "Z" + xyzFormat.format(z - cycle.depth), "X" + xyzFormat.format(cycle.width1), "R" + xyzFormat.format(cycle.probeClearance), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeBlock( gFormat.format(65), "P" + 8812, "Z" + xyzFormat.format(z - cycle.depth), "Y" + xyzFormat.format(cycle.width2), "R" + xyzFormat.format(cycle.probeClearance), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); } else { zOutput.reset(); writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "I" + xyzFormat.format(x), "S" + xyzFormat.format(cycle.width1), "X1", "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); zOutput.reset(); writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "J" + xyzFormat.format(y), "S" + xyzFormat.format(cycle.width2), "Y1", "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-xy-rectangular-hole-with-island": protectedProbeMove(cycle, x, y, z); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8812, "Z" + xyzFormat.format(z - cycle.depth), "X" + xyzFormat.format(cycle.width1), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(-cycle.probeClearance), getProbingArguments(cycle, true) ); writeBlock( gFormat.format(65), "P" + 8812, "Z" + xyzFormat.format(z - cycle.depth), "Y" + xyzFormat.format(cycle.width2), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(-cycle.probeClearance), getProbingArguments(cycle, true) ); } else { zOutput.reset(); writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "I" + xyzFormat.format(x), "S" + xyzFormat.format(cycle.width1), "X1", "Z" + xyzFormat.format(z - cycle.depth + (tool.diameter /2)), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(-cycle.probeClearance), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); zOutput.reset(); writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "J" + xyzFormat.format(y), "S" + xyzFormat.format(cycle.width2), "Y1", "Z" + xyzFormat.format(z - cycle.depth + (tool.diameter /2)), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(-cycle.probeClearance), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-xy-inner-corner": var cornerX = x + approach(cycle.approach1) * (cycle.probeClearance + tool.diameter / 2); var cornerY = y + approach(cycle.approach2) * (cycle.probeClearance + tool.diameter / 2); var cornerI = 0; var cornerJ = 0; if (cycle.probeSpacing !== undefined) { cornerI = cycle.probeSpacing; cornerJ = cycle.probeSpacing; } if (getProperty("probingType") == "Renishaw") { if ((cornerI != 0) && (cornerJ != 0)) { if (currentSection.strategy == "probe") { setProbeAngleMethod(); probeVariables.compensationXY = "X[#135] Y[#136]"; } } protectedProbeMove(cycle, x, y, z - cycle.depth); writeBlock( gFormat.format(65), "P" + 8815, xOutput.format(cornerX), yOutput.format(cornerY), conditional(cornerI != 0, "I" + xyzFormat.format(cornerI)), conditional(cornerJ != 0, "J" + xyzFormat.format(cornerJ)), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); } else { if ((cornerI != 0) && (cornerJ != 0)) { error("Angled inner corner probing not implemented"); if (currentSection.strategy == "probe") { setProbeAngleMethod(); probeVariables.compensationXY = "X[#100] Y[#101]"; } } protectedProbeMove(cycle, x, y, z - cycle.depth); // Need to use 2x probing ops writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "I" + xyzFormat.format(cornerX), "X" + xyzFormat.format(cornerX), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "J" + xyzFormat.format(cornerY), "Y" + xyzFormat.format(cornerY), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-xy-outer-corner": var cornerX = approach(cycle.approach1) * (cycle.probeClearance + tool.diameter / 2); var cornerY = approach(cycle.approach2) * (cycle.probeClearance + tool.diameter / 2); var cornerI = 0; var cornerJ = 0; if (cycle.probeSpacing !== undefined) { cornerI = cycle.probeSpacing; cornerJ = cycle.probeSpacing; } if (getProperty("probingType") == "Renishaw") { if ((cornerI != 0) && (cornerJ != 0)) { if (currentSection.strategy == "probe") { setProbeAngleMethod(); probeVariables.compensationXY = "X[#135] Y[#136]"; } } protectedProbeMove(cycle, x, y, z - cycle.depth); writeBlock( gFormat.format(65), "P" + 8816, xOutput.format(x + cornerX), yOutput.format(y + cornerY), conditional(cornerI != 0, "I" + xyzFormat.format(cornerI)), conditional(cornerJ != 0, "J" + xyzFormat.format(cornerJ)), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); } else { if ((cornerI != 0) && (cornerJ != 0)) { error("Angled outer corner probing not implemented"); if (currentSection.strategy == "probe") { setProbeAngleMethod(); probeVariables.compensationXY = "X[#100] Y[#101]"; } } protectedProbeMove(cycle, x, y, z - cycle.depth); writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "I" + xyzFormat.format(x + cornerX), "J" + xyzFormat.format(y + cornerY), "X" + xyzFormat.format(x + (2 * cornerX)), "Y" + xyzFormat.format(y + (2 * cornerY)), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, true) ); writeExtraBlumProbing(cycle); } break; case "probing-x-plane-angle": var edgeCoord = x + approach(cycle.approach1) * (cycle.probeClearance + tool.diameter / 2); protectedProbeMove(cycle, x, y, z - cycle.depth); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8843, "X" + xyzFormat.format(x + approach(cycle.approach1) * (cycle.probeClearance + tool.diameter / 2)), "D" + xyzFormat.format(cycle.probeSpacing), "Q" + xyzFormat.format(cycle.probeOvertravel), "A" + xyzFormat.format(cycle.nominalAngle != undefined ? cycle.nominalAngle : 90), getProbingArguments(cycle, false) ); } else { protectedProbeMove(cycle, x, y - 0.5*cycle.probeSpacing, z - cycle.depth); nominalAngle = (cycle.nominalAngle > 90 ? 90.0-cycle.nominalAngle : -(360.0 + cycle.nominalAngle - 90.0)); protectedProbeMove(cycle, x, y - 0.5*cycle.probeSpacing, z - cycle.depth); writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "X" + xyzFormat.format(edgeCoord), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, false) ); protectedProbeMove(cycle, x, y + 0.5*cycle.probeSpacing, z - cycle.depth); writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "D" + xyzFormat.format(nominalAngle), "X" + xyzFormat.format(edgeCoord), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, false) ); protectedProbeMove(cycle, x, y, z - cycle.depth); writeExtraBlumProbing(cycle); } if (currentSection.strategy == "probe") { setProbeAngleMethod(); probeVariables.compensationXY = "X" + xyzFormat.format(0) + " Y" + xyzFormat.format(0); } break; case "probing-y-plane-angle": var edgeCoord = y + approach(cycle.approach1) * (cycle.probeClearance + tool.diameter / 2); protectedProbeMove(cycle, x, y, z - cycle.depth); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8843, "Y" + xyzFormat.format(y + approach(cycle.approach1) * (cycle.probeClearance + tool.diameter / 2)), "D" + xyzFormat.format(cycle.probeSpacing), "Q" + xyzFormat.format(cycle.probeOvertravel), "A" + xyzFormat.format(cycle.nominalAngle != undefined ? cycle.nominalAngle : 0), getProbingArguments(cycle, false) ); } else { nominalAngle = (cycle.nominalAngle > 0 ? -cycle.nominalAngle : -(360.0 + cycle.nominalAngle)); protectedProbeMove(cycle, x - 0.5*cycle.probeSpacing, y, z - cycle.depth); writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "Y" + xyzFormat.format(edgeCoord), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, false) ); protectedProbeMove(cycle, x + 0.5*cycle.probeSpacing, y, z - cycle.depth); writeBlock( gFormat.format(65), "P" + 8700, "A1", "M3", "D" + xyzFormat.format(nominalAngle), "Y" + xyzFormat.format(edgeCoord), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, false) ); protectedProbeMove(cycle, x, y, z - cycle.depth); writeExtraBlumProbing(cycle); } if (currentSection.strategy == "probe") { setProbeAngleMethod(); probeVariables.compensationXY = "X" + xyzFormat.format(0) + " Y" + xyzFormat.format(0); } break; case "probing-xy-pcd-hole": protectedProbeMove(cycle, x, y, z); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8819, "A" + xyzFormat.format(cycle.pcdStartingAngle), "B" + xyzFormat.format(cycle.numberOfSubfeatures), "C" + xyzFormat.format(cycle.widthPCD), "D" + xyzFormat.format(cycle.widthFeature), "K" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), getProbingArguments(cycle, false) ); if (cycle.updateToolWear) { error(localize("Action -Update Tool Wear- is not supported with this cycle.")); return; } } else { error(localize("XY PCD hole probing is not supported.")); } break; case "probing-xy-pcd-boss": protectedProbeMove(cycle, x, y, z); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8819, "A" + xyzFormat.format(cycle.pcdStartingAngle), "B" + xyzFormat.format(cycle.numberOfSubfeatures), "C" + xyzFormat.format(cycle.widthPCD), "D" + xyzFormat.format(cycle.widthFeature), "Z" + xyzFormat.format(z - cycle.depth), "Q" + xyzFormat.format(cycle.probeOvertravel), "R" + xyzFormat.format(cycle.probeClearance), getProbingArguments(cycle, false) ); if (cycle.updateToolWear) { error(localize("Action -Update Tool Wear- is not supported with this cycle.")); return; } } else { error(localize("XY PCD boss probing is not supported.")); } break; } } function writeExtraBlumProbing(cycle) { var toleranceArgs = [ ]; if (cycle.wrongSizeAction && cycle.wrongSizeAction == "stop-message" && cycle.toleranceSize) { toleranceArgs.push(["T" + xyzFormat.format(cycle.toleranceSize), "U" + xyzFormat.format(-cycle.toleranceSize)]); } if (cycle.outOfPositionAction && cycle.outOfPositionAction == "stop-message" && cycle.tolerancePosition) { toleranceArgs.push(["I" + xyzFormat.format(cycle.tolerancePosition), "J" + xyzFormat.format(-cycle.tolerancePosition)]); } if (toleranceArgs.length > 0) { writeBlock(gFormat.format(65), "P" + 8707, toleranceArgs); } if (cycle.updateToolWear) { var wearArgs = [ conditional(cycle.toolWearErrorCorrection < 100, "K" + xyzFormat.format(cycle.toolWearErrorCorrection)), "E" + ((cycleType == "probing-z") ? xyzFormat.format(cycle.toolLengthOffset) : xyzFormat.format(cycle.toolDiameterOffset)), conditional(cycle.updateToolWear, "I" + xyzFormat.format(cycle.toolWearUpdateThreshold)) ]; writeBlock(gFormat.format(65), "P" + 8706, wearArgs); } } function getProbingArguments(cycle, updateWCS) { var outputWCSCode = updateWCS && currentSection.strategy == "probe"; var probeOutputWorkOffset = currentSection.probeWorkOffset; if (outputWCSCode) { validate(probeOutputWorkOffset > 0 && probeOutputWorkOffset <= 306+(6*8), "Work offset is out of range."); var nextWorkOffset = hasNextSection() ? getNextSection().workOffset == 0 ? 1 : getNextSection().workOffset : -1; if (probeOutputWorkOffset == nextWorkOffset) { currentWorkOffset = undefined; } } if (getProperty("probingType") == "Renishaw") { return [ (cycle.angleAskewAction == "stop-message" ? "B" + xyzFormat.format(cycle.toleranceAngle ? cycle.toleranceAngle : 0) : undefined), ((cycle.updateToolWear && cycle.toolWearErrorCorrection < 100) ? "F" + xyzFormat.format(cycle.toolWearErrorCorrection ? cycle.toolWearErrorCorrection / 100 : 100) : undefined), (cycle.wrongSizeAction == "stop-message" ? "H" + xyzFormat.format(cycle.toleranceSize ? cycle.toleranceSize : 0) : undefined), ((cycle.outOfPositionAction && cycle.outOfPositionAction == "stop-message") ? "M" + xyzFormat.format(cycle.tolerancePosition ? cycle.tolerancePosition : 0) : undefined), ((cycle.updateToolWear && cycleType == "probing-z") ? "T" + xyzFormat.format(cycle.toolLengthOffset) : undefined), ((cycle.updateToolWear && cycleType !== "probing-z") ? "T" + xyzFormat.format(cycle.toolDiameterOffset) : undefined), (cycle.updateToolWear ? "V" + xyzFormat.format(cycle.toolWearUpdateThreshold ? cycle.toolWearUpdateThreshold : 0) : undefined), (cycle.printResults ? "W" + xyzFormat.format(1 + cycle.incrementComponent) : undefined), // 1 for advance feature, 2 for reset feature count and advance component number. first reported result in a program should use W2. conditional(outputWCSCode, "S" + probeWCSFormat.format(probeOutputWorkOffset > 6 ? (probeOutputWorkOffset - 6 + 100) : probeOutputWorkOffset)) ]; } else { return [ conditional(outputWCSCode, "W" + probeWCSFormat.format(decodeProbeWCSBlum(probeOutputWorkOffset))) ]; } } // Probe maintains its own WCS which is a bit odd // 0 = G54 // 1-6 = G54-59 // 7-306 = 1-48 = G54.1 P1-300 // 307-314 = G54 G54.2 P1-8 // 315-327 = G55 G54.2 P1-8 ... etc function decodeProbeWCSBlum(probeOutputWorkOffset) { if (probeOutputWorkOffset >= 0) { if (probeOutputWorkOffset == 0) { return 54; } else if (probeOutputWorkOffset <= 6) { return probeOutputWorkOffset + 53; } else if (probeOutputWorkOffset <= 306) { return -1 * (probeOutputWorkOffset - 6); } else { return ((probeOutputWorkOffset - 307) % 8) +1; } } error(localize("Unknown probeOutputWorkOffset value:" + probeOutputWorkOffset)); return 0; } function writeMeasureTools() { // Save showSequenceNumbers setting and then disable it var show = getProperty("showSequenceNumbers"); setProperty("showSequenceNumbers", "false"); // optionally measure tools if (getProperty("measureTools")) { var tools = getToolTable(); optionalSection = true; if (tools.getNumberOfTools() > 0) { writeBlock(mFormat.format(0), formatComment(localize("Read note"))); // wait for operator writeComment(localize("With B SKIP turned off each tool be automatically measured")); writeComment(localize("Once the tools are verified turn B SKIP on to skip verification")); for (var i = 0; i < tools.getNumberOfTools(); ++i) { var tool = tools.getTool(i); if ((tool.type == TOOL_PROBE) && !measureProbe) { continue; } var comment = "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"); } comment += " - " + getToolTypeName(tool.type); writeComment(comment); writeToolMeasureBlock(tool, true); } // Reload initial tool (side effect to cancel tool length offset) writeComment("Reload initial tool") writeBlock("T" + toolFormat.format(getSection(0).getTool().number), mFormat.format(6)); // get tool } optionalSection = false; writeln(""); } // optionally confirm tool lengths if (getProperty("confirmToolLengths")) { var toolLenBase = 11000; var tools = getToolTable(); optionalSection = true; if (tools.getNumberOfTools() > 0) { for (var i = 0; i < tools.getNumberOfTools(); ++i) { var tool = tools.getTool(i); if (tool.type == TOOL_PROBE) { continue; } // Compare tool table len with CAM len and stop if shorter var camLen = xyzFormat.format(tool.bodyLength + tool.holderLength); var tooltableLen = "#" + (toolLenBase + tool.number); var seq = sequenceNumber; sequenceNumber += getProperty("sequenceNumberIncrement"); writeComment("Checking lengths of tool: " + tool.number); writeBlock("N" + seq + " IF [" + tooltableLen + " GE " + camLen + "] GOTO " + sequenceNumber); writeBlock("#3006=(TOOL " + tool.number + " TOO SHORT)") } writeBlock("N" + sequenceNumber) sequenceNumber += getProperty("sequenceNumberIncrement"); } optionalSection = false; writeln(""); } // Pause for operator if we did a tool measure if (getProperty("measureTools") && (tools.getNumberOfTools() > 0)) { optionalSection = true; writeBlock(mFormat.format(0), formatComment(localize("Ready to run"))); optionalSection = false; writeln(""); } // Restore setting setProperty("showSequenceNumbers", show); } function writeToolMeasureBlock(tool, preMeasure) { var comment = measureTool ? formatComment("MEASURE TOOL") : ""; if (!preMeasure) { prepareForToolCheck(); } var offsetTool = (tool.type == TOOL_MILLING_SLOT || tool.type == TOOL_MILLING_FACE) && (tool.diameter > measureToolMaxDiameter); if (getProperty("probingType") == "Renishaw") { // Renishaw untested writeBlock( gFormat.format(65), "P9921", "M" + 22 + ".", "T" + toolFormat.format(tool.number), "D" + xyzFormat.format(tool.diameter) + ".", comment ); } else { // Blum writeBlock("T" + toolFormat.format(tool.number), mFormat.format(6)); // get tool writeBlock(mFormat.format(19)); // orientate spindle writeBlock( gFormat.format(65), "P8915", "B0.", "H" + toolFormat.format(tool.number), // Offset (larger) face/slot-mills by tool radius conditional(offsetTool, "R" + xyzFormat.format(tool.diameter / 2)), // Measure all flutes conditional(tool.type == TOOL_MILLING_FACE && measureAllFlutes && offsetTool, "D" + tool.numberOfFlutes), comment ); // probe tool } measureTool = false; } function onCycleEnd() { if (isProbeOperation()) { zOutput.reset(); gMotionModal.reset(); var feed = getFeed(highFeedrate); if (getProperty("probingType") == "Renishaw") { writeBlock(gFormat.format(65), "P" + 8810, zOutput.format(cycle.retract), feed); // protected retract move } else { writeBlock(gFormat.format(65), "P" + 8703, "A1", "M3", zOutput.format(cycle.retract), feed); // protected retract move } } else if (!cycleExpanded) { writeBlock(gCycleModal.format(80)); zOutput.reset(); } } // Start of onRewindMachine logic /** Allow user to override the onRewind logic. */ function onRewindMachineEntry(_a, _b, _c) { return false; } /** Retract to safe position before indexing rotaries. */ function onMoveToSafeRetractPosition() { writeRetract(Z); // cancel TCP so that tool doesn't follow rotaries if (currentSection.isMultiAxis() && tcp.isSupportedByOperation) { disableLengthCompensation(false, "TCPC OFF"); } } /** Rotate axes to new position above reentry position */ function onRotateAxes(_x, _y, _z, _a, _b, _c) { // position rotary axes xOutput.disable(); yOutput.disable(); zOutput.disable(); invokeOnRapid5D(_x, _y, _z, _a, _b, _c); setCurrentABC(new Vector(_a, _b, _c)); xOutput.enable(); yOutput.enable(); zOutput.enable(); } /** Return from safe position after indexing rotaries. */ function onReturnFromSafeRetractPosition(_x, _y, _z) { // reinstate TCP / tool length compensation if (!lengthCompensationActive) { writeBlock(gFormat.format(getOffsetCode()), hFormat.format(tool.lengthOffset)); lengthCompensationActive = true; } // position in XY forceXYZ(); xOutput.reset(); yOutput.reset(); zOutput.disable(); invokeOnRapid(_x, _y, _z); // position in Z zOutput.enable(); invokeOnRapid(_x, _y, _z); } // End of onRewindMachine logic var mapCommand = { COMMAND_STOP_SPINDLE : 5, COMMAND_ORIENTATE_SPINDLE: 19 }; function onCommand(command) { switch (command) { case COMMAND_CLEAN: writeBlock(mFormat.format(washdownCoolant.on)); writeBlock(mFormat.format(washdownCoolant.off)); return; case COMMAND_COOLANT_OFF: setCoolant(COOLANT_OFF); return; case COMMAND_COOLANT_ON: setCoolant(tool.coolant); return; case COMMAND_STOP: writeBlock(mFormat.format(0)); forceSpindleSpeed = true; forceCoolant = true; return; case COMMAND_OPTIONAL_STOP: writeBlock(mFormat.format(1)); forceSpindleSpeed = true; forceCoolant = true; return; case COMMAND_START_SPINDLE: forceSpindleSpeed = false; writeBlock(sOutput.format(spindleSpeed), mFormat.format(tool.clockwise ? 3 : 4)); return; case COMMAND_LOAD_TOOL: // Output modal commands here writeBlock(gPlaneModal.format(17), gAbsIncModal.format(90), gFeedModeModal.format(94)); // Let G100 handle coolant change forceCoolant = true; var coolantCodes = getCoolantCodes(tool.coolant); if (Array.isArray(coolantCodes)) { coolantCodes = coolantCodes.join(getWordSeparator()); } else{ coolantCodes = ""; } var rotateSpindle = !noSpindle(); var abc = settings.workPlaneMethod.useTiltedWorkplane ? undefined : defineWorkPlane(currentSection, false); var start = getFramePosition(currentSection.getInitialPosition()); var preloadTool = getNextTool(tool.number != getFirstTool().number); var separateZOnToolChange = getProperty("separateZOnToolChange"); writeToolBlock(gFormat.format(100), "T" + toolFormat.format(tool.number), xOutput.format(start.x), yOutput.format(start.y), gFormat.format(getOffsetCode()), !separateZOnToolChange ? zOutput.format(start.z) : undefined, abc ? aOutput.format(abc.x) : undefined, abc ? bOutput.format(abc.y) : undefined, abc ? cOutput.format(abc.z) : undefined, (getProperty("preloadTool") && preloadTool) ? "L" + toolFormat.format(preloadTool.number) : undefined, !separateZOnToolChange ? hFormat.format(tool.lengthOffset) : undefined, conditional(rotateSpindle, diameterOffsetFormat.format(tool.diameterOffset)), conditional(rotateSpindle, sOutput.format(spindleSpeed)), conditional(rotateSpindle, mFormat.format(tool.clockwise ? 3 : 4)), coolantCodes ); if (separateZOnToolChange) { writeBlock(gFormat.format(43), zOutput.format(start.z), hFormat.format(tool.lengthOffset) ); } currentWorkPlaneABC = abc ? abc : currentWorkPlaneABC; // workplane is set with the G100 command if (abc != undefined) { setCurrentABC(abc); // required for machine simulation } writeComment(tool.comment); if (measureTool) { writeToolMeasureBlock(tool, false); setCoolant(tool.coolant); startSpindle(tool, true); } forceSpindleSpeed = false; return; case COMMAND_LOCK_MULTI_AXIS: return; case COMMAND_UNLOCK_MULTI_AXIS: return; case COMMAND_START_CHIP_TRANSPORT: return; case COMMAND_STOP_CHIP_TRANSPORT: return; case COMMAND_BREAK_CONTROL: if (!toolChecked) { // avoid duplicate COMMAND_BREAK_CONTROL writeln(""); writeComment("Performing tool break detection"); prepareForToolCheck(); var offsetTool = tool.type == (TOOL_MILLING_SLOT || tool.type == TOOL_MILLING_FACE) && (tool.diameter > measureToolMaxDiameter); if (getProperty("probingType") == "Renishaw") { writeBlock( gFormat.format(65), "P" + 8858, "B1", // B1=length only, B2=diam only, B3=length and diameter "H" + xyzFormat.format(getProperty("toolBreakageTolerance")), "T" + toolFormat.format(tool.number) ); } else { writeBlock( gFormat.format(65), "P" + 8915, "B2", "Q" + xyzFormat.format(getProperty("toolBreakageTolerance")), // Offset (larger) face/slot-mills by tool radius conditional(offsetTool, "R" + xyzFormat.format(tool.diameter / 2)), // Measure all flutes conditional(tool.type == TOOL_MILLING_FACE && measureAllFlutes && offsetTool, "D" + tool.numberOfFlutes) ); } toolChecked = true; lengthCompensationActive = false; // Tool check macros cancel tool length compensation } return; case COMMAND_TOOL_MEASURE: measureTool = true; return; case COMMAND_VERIFY: writeln(""); writeComment("Stop for verification"); optionalSection = true; forceSpindleSpeed = true; forceCoolant = true; if (!retracted) { writeRetract(Z); } if (getProperty("positionAtEnd") != "noMove") { writeRetract(X, Y); } writeBlock(mFormat.format(0)); optionalSection = false; return; } var stringId = getCommandStringId(command); var mcode = mapCommand[stringId]; if (mcode != undefined) { writeBlock(mFormat.format(mcode)); } else { onUnsupportedCommand(command); } } function onSectionEnd() { if (currentSection.isMultiAxis()) { writeBlock(gFeedModeModal.format(94)); // inverse time feed off } if (currentSection.isMultiAxis() && !currentSection.isOptimizedForMachine()) { writeBlock(gFormat.format(49), "Z[#5003]"); } writeBlock(gPlaneModal.format(17)); if (currentSection.wcs.substring(4,11) == "G54.2 P") { writeBlock(gFormat.format(54.2), "P" + 0); // cancel G54.2 } if ((((getCurrentSectionId() + 1) >= getNumberOfSections()) || (tool.number != getNextSection().getTool().number)) && tool.breakControl) { onCommand(COMMAND_BREAK_CONTROL); } else { toolChecked = false; } if (tool.type != TOOL_PROBE && getProperty("washdownCoolant") == "operationEnd") { writeBlock(mFormat.format(washdownCoolant.on)); writeBlock(mFormat.format(washdownCoolant.off)); } if (!isLastSection() && (getNextSection().getTool().coolant != tool.coolant)) { setCoolant(COOLANT_OFF); } if (isProbeOperation()) { if (!hasNextSection() || !(isProbeOperation(getNextSection()) && (getNextSection().getTool().number == tool.number))) { // Turn off probe UNLESS next op is another probe with the same tool if (getProperty("probingType") == "Renishaw") { writeBlock(gFormat.format(65), "P" + 8833); // spin the probe off } else { writeBlock(gFormat.format(65), "P" + 8703, "A1", "M2", "X" + "[#5001]"); // Zero move to turn off probe } settings.probing.probeOn = false; if (settings.probing.probeAngleMethod != "G68") { setProbeAngle(); // output probe angle rotations if required } } } forceAny(); } function onClose() { optionalSection = false; if (isDPRNTopen) { writeln("DPRNT[END]"); writeBlock("PCLOS"); isDPRNTopen = false; if (typeof inspectionProcessSectionEnd == "function") { inspectionProcessSectionEnd(); } } if (settings.probing.probeAngleMethod == "G68") { cancelWorkPlane(); } writeln(""); if (getNumberOfSections() > 0) { setCoolant(COOLANT_OFF); if (tool.type != TOOL_PROBE && (getProperty("washdownCoolant") == "always" || getProperty("washdownCoolant") == "programEnd")) { if (getProperty("washdownCoolant") == "programEnd") { writeBlock(mFormat.format(washdownCoolant.on)); } writeBlock(mFormat.format(washdownCoolant.off)); } setCoolant(COOLANT_OFF); if (getProperty("partsCounter211")) { writeComment("ACTIVATE PARTS COUNTER"); writeBlock("M211"); } if (getProperty("partsCounter212")) { writeComment("ACTIVATE PARTS COUNTER 2"); writeBlock("M212"); } if (getProperty("partsCounter213")) { writeComment("ACTIVATE PARTS COUNTER 3"); writeBlock("M213"); } if (getProperty("partsCounter214")) { writeComment("ACTIVATE PARTS COUNTER 4"); writeBlock("M214"); } writeBlock(mFormat.format(159)); // Block look-ahead // Move table to final position retracted = true; // tool call does a full retract along the z-axis var retract_words; if (getProperty("positionAtEnd") != "noMove") { var retract = getRetractParameters(X, Y); if (retract && retract.words.length > 0) { retract_words = retract.words; } } var firstToolNumber = getSection(0).getTool().number; writeBlock(gFormat.format(100), "T" + toolFormat.format(firstToolNumber), gAbsIncModal.format(90), gFormat.format(53), retract_words); } setSmoothing(false); setWorkPlane(new Vector(0, 0, 0)); // reset working plane writeBlock(mFormat.format(30)); // stop program, spindle stop, coolant off } function onMovement(movement) { if ((currentSection.strategy == "adaptive" || currentSection.strategy == "adaptive2d" || currentSection.strategy == "pocket2d") && getProperty("rapidTransitions")) { if (getProperty("smoothingMode") != "M298") { error(localize("Rapid transitions can only be used in M298 accuracy mode")); } // During non engaged moves, including leads, we turn off accuracy modes, leading to generally faster movements. Restore after if (movement == MOVEMENT_LEAD_IN || movement == MOVEMENT_LEAD_OUT || movement == MOVEMENT_LINK_DIRECT || movement == MOVEMENT_LINK_DIRECT) { if (smoothing.isActive) { writeComment("Force smoothing off"); } setSmoothing(false); } else { setSmoothing(smoothing.isAllowed); } } } function onParameter(name, value) { switch (name) { case "job-description": // Record updated param so that we can print it in the section break jobDescription = value break; case "job-notes": // Don't output on the very first section, handled by onStart() if (!firstNote && getProperty("showNotes") ) { // FIXME: This assumes that job-description gets set before job-notes writeln(""); writeNotes("Setup. " + jobDescription); writeNotes(value); } firstNote = false; break; case "action": onAction(value); break; default: break; } } // Assumes all actions are of the form "action:param" function onAction(action) { var invalid = false; var sText1 = String(action).toUpperCase(); var sText2 = new Array(); sText2 = sText1.split(":"); if (sText2.length != 2) { error(localize("Invalid action command: ") + action); return; } var param = sText2[1]; writeln(""); switch (sText2[0]) { case "ROTATE_WCS": param = parseChoice(param, "YES", "NO", "TRUE", "FALSE"); if (param == undefined) { error(localize("Invalid ROTATE_WCS param. Use TRUE/FALSE")); return; } else if (param) { // Enable WCS rotation. writeComment("ENABLE WCS ROTATION. ENSURE ROTATION PARAM UPDATED BEFORE THIS LINE") setProbeAngleMethod(); if (probeVariables.compensationXY == undefined) { probeVariables.compensationXY = "X" + xyzFormat.format(0) + " Y" + xyzFormat.format(0); } } else { writeComment("DISABLE WCS ROTATION") probeVariables.outputRotationCodes = false; cancelWorkPlane(); }; break; default: error(localize("Invalid action parameter: ") + sText2[0] + ":" + param); return; } } /* returns the choice specified in a text string compared to a list of choices */ function parseChoice() { var stat = undefined; for (i = 1; i < arguments.length; i++) { if (String(arguments[0]).toUpperCase() == String(arguments[i]).toUpperCase()) { if ((String(arguments[i]).toUpperCase() == "YES") || (String(arguments[i]).toUpperCase() == "TRUE")) { stat = true; } else if ((String(arguments[i]).toUpperCase() == "NO") || (String(arguments[i]).toUpperCase() == "FALSE")) { stat = false; } else { stat = i - 1; break; } } } return stat; } function writeStock() { if (hasGlobalParameter("stock")) { var stock = getGlobalParameter("stock"); var x = xyzFormat.format(getGlobalParameter("stock-upper-x") - getGlobalParameter("stock-lower-x")); var y = xyzFormat.format(getGlobalParameter("stock-upper-y") - getGlobalParameter("stock-lower-y")); var z = xyzFormat.format(getGlobalParameter("stock-upper-z") - getGlobalParameter("stock-lower-z")); writeComment("Stock Size") writeComment("X" + x + " Y" + y + " Z" + z); writeln(""); writeComment("WCS Location") writeComment("X Min " + xyzFormat.format(getGlobalParameter("stock-lower-x")) + " Max " + xyzFormat.format(getGlobalParameter("stock-upper-x"))); writeComment("Y Min " + xyzFormat.format(getGlobalParameter("stock-lower-y")) + " Max " + xyzFormat.format(getGlobalParameter("stock-upper-y"))); writeComment("Z Min " + xyzFormat.format(getGlobalParameter("stock-lower-z")) + " Max " + xyzFormat.format(getGlobalParameter("stock-upper-z"))); writeln(""); } } // Format and write a multiline text string as a comment function writeNotes(text) { if (text) { var lines = String(text).split("\n"); var r1 = new RegExp("^[\\s]+", "g"); var r2 = new RegExp("[\\s]+$", "g"); for (line in lines) { var comment = lines[line].replace(r1, "").replace(r2, ""); if (comment) { writeComment(comment); } } } } // >>>>> INCLUDED FROM include_files/commonFunctions.cpi // internal variables, do not change var receivedMachineConfiguration; var tcp = {isSupportedByControl:getSetting("supportsTCP", true), isSupportedByMachine:false, isSupportedByOperation:false}; var multiAxisFeedrate; var sequenceNumber; var optionalSection = false; var currentWorkOffset; var forceSpindleSpeed = false; var retracted = false; // specifies that the tool has been retracted to the safe plane 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 = getProperty("useABCPrepositioning") != undefined ? getProperty("useABCPrepositioning") : getSetting("workPlaneMethod.useABCPrepositioning", false); 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 (machineConfiguration.isHeadConfiguration()) { compensateToolLength = typeof compensateToolLength == "undefined" ? false : compensateToolLength; } if (machineConfiguration.isHeadConfiguration() && compensateToolLength) { 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) { 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) { error(localize("Using multiple work offsets is not possible if the initial work offset is 0.")); } if (section.isMultiAxis()) { if (!section.isOptimizedForMachine() && !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 (!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(); } function prepareForToolCheck() { setCoolant(COOLANT_OFF); onCommand(COMMAND_STOP_SPINDLE); } /** Writes the specified block. */ function writeBlock() { var text = formatWords(arguments); if (!text) { return; } 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) { if (text) { writeWords("/", "N" + sequenceNumber, text); } } else { writeWords2("N" + sequenceNumber, arguments); } sequenceNumber += getProperty("sequenceNumberIncrement"); } else { if (optionalSection || skipBlocks) { writeWords2("/", arguments); } else { writeWords(arguments); } } } validate(settings.comments, "Setting 'comments' is required but not defined."); function formatComment(text) { if (!text) { return ""; } 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) { 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); } var skipBlocks = false; function writeStartBlocks(isRequired, code) { var safeSkipBlocks = skipBlocks; if (!isRequired) { if (!getProperty("safeStartAllOperations", false)) { return; // when safeStartAllOperations is disabled, dont output code and return } // if values are not required, but safe start is enabled - write following blocks as optional skipBlocks = true; } code(); // writes out the code which is passed to this function as an argument skipBlocks = safeSkipBlocks; // 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) { writeln(""); writeComment("Manual NC Passthrough"); var commands = String(text).split(","); for (text in commands) { writeBlock(commands[text]); } } function forceModals() { if (arguments.length == 0) { // reset all modal variables listed below if (typeof gMotionModal != "undefined") { gMotionModal.reset(); } if (typeof gPlaneModal != "undefined") { gPlaneModal.reset(); } if (typeof gAbsIncModal != "undefined") { gAbsIncModal.reset(); } if (typeof gFeedModeModal != "undefined") { gFeedModeModal.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 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]) && !retracted) { // 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 _xHomeRel = false; if (getProperty("positionAtEnd") == "home") { _xHome = machineConfiguration.hasHomePositionX() && !useZeroValues ? machineConfiguration.getHomePositionX() : toPreciseUnit(0, MM); _xHome = xyzFormat.format(_xHome); } else if (getProperty("positionAtEnd") == "centerAtDoor" && hasParameter("part-upper-x") && hasParameter("part-lower-x")) { _xHomeRel = true; _xHome = "[#5021-#5041+" + xyzFormat.format((getParameter("part-upper-x") + getParameter("part-lower-x"))/2) + "]"; } else { _xHome = xyzFormat.format(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: // special conditions words.push("X" + _xHome); xOutput.reset(); break; case Y: words.push("Y" + xyzFormat.format(_yHome)); yOutput.reset(); break; case Z: words.push("Z" + xyzFormat.format(_zHome)); zOutput.reset(); retracted = (typeof skipBlocks == "undefined") ? true : !skipBlocks; break; default: error(localize("Unsupported axis specified for getRetractParameters().")); return undefined; } } return {method:method, retractAxes:retractAxes, words:words}; } /** Returns true when subprogram logic does exist into the post. */ function subprogramsAreSupported() { return typeof subprogramState != "undefined"; } // <<<<< INCLUDED FROM include_files/commonFunctions.cpi // >>>>> INCLUDED FROM include_files/defineWorkPlane.cpi validate(settings.workPlaneMethod, "Setting 'workPlaneMethod' is required but not defined."); function defineWorkPlane(_section, _setWorkPlane) { var abc = new Vector(0, 0, 0); if (settings.workPlaneMethod.forceMultiAxisIndexing || !is3D() || machineConfiguration.isMultiAxisConfiguration()) { if (isPolarModeActive()) { abc = getCurrentDirection(); } else if (_section.isMultiAxis()) { forceWorkPlane(); cancelTransformation(); abc = _section.isOptimizedForMachine() ? _section.getInitialToolAxisABC() : _section.getGlobalInitialToolAxis(); } else if (settings.workPlaneMethod.useTiltedWorkplane && settings.workPlaneMethod.eulerConvention != undefined) { if (settings.workPlaneMethod.eulerCalculationMethod == "machine" && machineConfiguration.isMultiAxisConfiguration()) { abc = machineConfiguration.getOrientation(getWorkPlaneMachineABC(_section, true)).getEuler2(settings.workPlaneMethod.eulerConvention); } else { abc = _section.workPlane.getEuler2(settings.workPlaneMethod.eulerConvention); } } else { abc = getWorkPlaneMachineABC(_section, true); } if (_setWorkPlane) { if (_section.isMultiAxis() || isPolarModeActive()) { // 4-5x simultaneous operations cancelWorkPlane(); positionABC(abc, true); } else { // 3x and/or 3+2x operations setWorkPlane(abc); } } } else { var remaining = _section.workPlane; if (!isSameDirection(remaining.forward, new Vector(0, 0, 1))) { error(localize("Tool orientation is not supported.")); return abc; } setRotation(remaining); } tcp.isSupportedByOperation = isTCPSupportedByOperation(_section); return abc; } function isTCPSupportedByOperation(_section) { var _tcp = _section.getOptimizedTCPMode() == OPTIMIZE_NONE; if (!_section.isMultiAxis() && (settings.workPlaneMethod.useTiltedWorkplane || isSameDirection(machineConfiguration.getSpindleAxis(), getForwardDirection(_section)) || settings.workPlaneMethod.optimizeType == OPTIMIZE_HEADS || settings.workPlaneMethod.optimizeType == OPTIMIZE_TABLES || settings.workPlaneMethod.optimizeType == OPTIMIZE_BOTH)) { _tcp = false; } return _tcp; } // <<<<< INCLUDED FROM include_files/defineWorkPlane.cpi // >>>>> INCLUDED FROM include_files/getWorkPlaneMachineABC.cpi validate(settings.machineAngles, "Setting 'machineAngles' is required but not defined."); function getWorkPlaneMachineABC(_section, rotate) { var currentABC = isFirstSection() ? new Vector(0, 0, 0) : getCurrentABC(); var abc = machineConfiguration.getABCByPreference(_section.workPlane, currentABC, settings.machineAngles.controllingAxis, settings.machineAngles.type, settings.machineAngles.options); if (!isSameDirection(machineConfiguration.getDirection(abc), _section.workPlane.forward)) { error(localize("Orientation not supported.")); } if (rotate) { if (settings.workPlaneMethod.optimizeType == undefined || settings.workPlaneMethod.useTiltedWorkplane) { // legacy var useTCP = false; var R = machineConfiguration.getRemainingOrientation(abc, _section.workPlane); setRotation(useTCP ? _section.workPlane : R); } else { if (!_section.isOptimizedForMachine()) { machineConfiguration.setToolLength(compensateToolLength ? _section.getTool().overallLength : 0); // define the tool length for head adjustments _section.optimize3DPositionsByMachine(machineConfiguration, abc, settings.workPlaneMethod.optimizeType); } } } return abc; } // <<<<< INCLUDED FROM include_files/getWorkPlaneMachineABC.cpi // >>>>> INCLUDED FROM include_files/positionABC.cpi function positionABC(abc, force) { if (typeof unwindABC == "function") { unwindABC(abc); } if (force) { forceABC(); } var a = machineConfiguration.isMultiAxisConfiguration() ? aOutput.format(abc.x) : toolVectorOutputI.format(abc.x); var b = machineConfiguration.isMultiAxisConfiguration() ? bOutput.format(abc.y) : toolVectorOutputJ.format(abc.y); var c = machineConfiguration.isMultiAxisConfiguration() ? cOutput.format(abc.z) : toolVectorOutputK.format(abc.z); if (a || b || c) { if (!retracted) { if (typeof moveToSafeRetractPosition == "function") { moveToSafeRetractPosition(); } else { writeRetract(Z); } } onCommand(COMMAND_UNLOCK_MULTI_AXIS); gMotionModal.reset(); writeBlock(gMotionModal.format(0), a, b, c); if (getCurrentSectionId() != -1) { setCurrentABC(abc); // required for machine simulation } } } // <<<<< INCLUDED FROM include_files/positionABC.cpi // >>>>> INCLUDED FROM include_files/writeWCS.cpi function writeWCS(section, wcsIsRequired) { if (section.workOffset != currentWorkOffset) { if (getSetting("workPlaneMethod.cancelTiltFirst", false) && wcsIsRequired) { cancelWorkPlane(); } if (typeof forceWorkPlane == "function" && wcsIsRequired) { forceWorkPlane(); } writeStartBlocks(wcsIsRequired, function () { writeBlock(section.wcs); }); currentWorkOffset = section.workOffset; } } // <<<<< INCLUDED FROM include_files/writeWCS.cpi // >>>>> INCLUDED FROM include_files/writeToolCall.cpi function writeToolCall(tool, insertToolCall) { if (typeof forceModals == "function" && (insertToolCall || getProperty("safeStartAllOperations"))) { forceModals(); } writeStartBlocks(insertToolCall, function () { if (!isFirstSection() && insertToolCall) { if (typeof forceWorkPlane == "function") { forceWorkPlane(); } 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); } }); } // <<<<< INCLUDED FROM include_files/writeToolCall.cpi // >>>>> INCLUDED FROM include_files/startSpindle.cpi function startSpindle(tool, insertToolCall) { if (!noSpindle()) { 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/parametricFeeds.cpi properties.useParametricFeed = { title : "Parametric feed", description: "Specifies that the feedrates should be output using parameters.", group : "preferences", type : "boolean", value : false, scope : "post" }; var activeMovements; var currentFeedId; validate(settings.parametricFeeds, "Setting 'parametricFeeds' is required but not defined."); function initializeParametricFeeds(insertToolCall) { if (getProperty("useParametricFeed") && getParameter("operation-strategy") != "drill" && !currentSection.hasAnyCycle()) { if (!insertToolCall && activeMovements && (getCurrentSectionId() > 0) && ((getPreviousSection().getPatternId() == currentSection.getPatternId()) && (currentSection.getPatternId() != 0))) { return; // use the current feeds } } else { activeMovements = undefined; return; } activeMovements = new Array(); var movements = currentSection.getMovements(); var id = 0; var activeFeeds = new Array(); if (hasParameter("operation:tool_feedCutting")) { if (movements & ((1 << MOVEMENT_CUTTING) | (1 << MOVEMENT_LINK_TRANSITION) | (1 << MOVEMENT_EXTENDED))) { var feedContext = new FeedContext(id, localize("Cutting"), getParameter("operation:tool_feedCutting")); activeFeeds.push(feedContext); activeMovements[MOVEMENT_CUTTING] = feedContext; if (!hasParameter("operation:tool_feedTransition")) { activeMovements[MOVEMENT_LINK_TRANSITION] = feedContext; } activeMovements[MOVEMENT_EXTENDED] = feedContext; } ++id; if (movements & (1 << MOVEMENT_PREDRILL)) { feedContext = new FeedContext(id, localize("Predrilling"), getParameter("operation:tool_feedCutting")); activeMovements[MOVEMENT_PREDRILL] = feedContext; activeFeeds.push(feedContext); } ++id; } if (hasParameter("operation:finishFeedrate")) { if (movements & (1 << MOVEMENT_FINISH_CUTTING)) { var feedContext = new FeedContext(id, localize("Finish"), getParameter("operation:finishFeedrate")); activeFeeds.push(feedContext); activeMovements[MOVEMENT_FINISH_CUTTING] = feedContext; } ++id; } else if (hasParameter("operation:tool_feedCutting")) { if (movements & (1 << MOVEMENT_FINISH_CUTTING)) { var feedContext = new FeedContext(id, localize("Finish"), getParameter("operation:tool_feedCutting")); activeFeeds.push(feedContext); activeMovements[MOVEMENT_FINISH_CUTTING] = feedContext; } ++id; } if (hasParameter("operation:tool_feedEntry")) { if (movements & (1 << MOVEMENT_LEAD_IN)) { var feedContext = new FeedContext(id, localize("Entry"), getParameter("operation:tool_feedEntry")); activeFeeds.push(feedContext); activeMovements[MOVEMENT_LEAD_IN] = feedContext; } ++id; } if (hasParameter("operation:tool_feedExit")) { if (movements & (1 << MOVEMENT_LEAD_OUT)) { var feedContext = new FeedContext(id, localize("Exit"), getParameter("operation:tool_feedExit")); activeFeeds.push(feedContext); activeMovements[MOVEMENT_LEAD_OUT] = feedContext; } ++id; } if (hasParameter("operation:noEngagementFeedrate")) { if (movements & (1 << MOVEMENT_LINK_DIRECT)) { var feedContext = new FeedContext(id, localize("Direct"), getParameter("operation:noEngagementFeedrate")); activeFeeds.push(feedContext); activeMovements[MOVEMENT_LINK_DIRECT] = feedContext; } ++id; } else if (hasParameter("operation:tool_feedCutting") && hasParameter("operation:tool_feedEntry") && hasParameter("operation:tool_feedExit")) { if (movements & (1 << MOVEMENT_LINK_DIRECT)) { var feedContext = new FeedContext(id, localize("Direct"), Math.max(getParameter("operation:tool_feedCutting"), getParameter("operation:tool_feedEntry"), getParameter("operation:tool_feedExit"))); activeFeeds.push(feedContext); activeMovements[MOVEMENT_LINK_DIRECT] = feedContext; } ++id; } if (hasParameter("operation:reducedFeedrate")) { if (movements & (1 << MOVEMENT_REDUCED)) { var feedContext = new FeedContext(id, localize("Reduced"), getParameter("operation:reducedFeedrate")); activeFeeds.push(feedContext); activeMovements[MOVEMENT_REDUCED] = feedContext; } ++id; } if (hasParameter("operation:tool_feedRamp")) { if (movements & ((1 << MOVEMENT_RAMP) | (1 << MOVEMENT_RAMP_HELIX) | (1 << MOVEMENT_RAMP_PROFILE) | (1 << MOVEMENT_RAMP_ZIG_ZAG))) { var feedContext = new FeedContext(id, localize("Ramping"), getParameter("operation:tool_feedRamp")); activeFeeds.push(feedContext); activeMovements[MOVEMENT_RAMP] = feedContext; activeMovements[MOVEMENT_RAMP_HELIX] = feedContext; activeMovements[MOVEMENT_RAMP_PROFILE] = feedContext; activeMovements[MOVEMENT_RAMP_ZIG_ZAG] = feedContext; } ++id; } if (hasParameter("operation:tool_feedPlunge")) { if (movements & (1 << MOVEMENT_PLUNGE)) { var feedContext = new FeedContext(id, localize("Plunge"), getParameter("operation:tool_feedPlunge")); activeFeeds.push(feedContext); activeMovements[MOVEMENT_PLUNGE] = feedContext; } ++id; } if (true) { // high feed if ((movements & (1 << MOVEMENT_HIGH_FEED)) || (highFeedMapping != HIGH_FEED_NO_MAPPING)) { var feed; if (hasParameter("operation:highFeedrateMode") && getParameter("operation:highFeedrateMode") != "disabled") { feed = getParameter("operation:highFeedrate"); } else { feed = this.highFeedrate; } var feedContext = new FeedContext(id, localize("High Feed"), feed); activeFeeds.push(feedContext); activeMovements[MOVEMENT_HIGH_FEED] = feedContext; activeMovements[MOVEMENT_RAPID] = feedContext; } ++id; } if (hasParameter("operation:tool_feedTransition")) { if (movements & (1 << MOVEMENT_LINK_TRANSITION)) { var feedContext = new FeedContext(id, localize("Transition"), getParameter("operation:tool_feedTransition")); activeFeeds.push(feedContext); activeMovements[MOVEMENT_LINK_TRANSITION] = feedContext; } ++id; } for (var i = 0; i < activeFeeds.length; ++i) { var feedContext = activeFeeds[i]; var feedDescription = typeof formatComment == "function" ? formatComment(feedContext.description) : feedContext.description; writeBlock(settings.parametricFeeds.feedAssignmentVariable + (settings.parametricFeeds.firstFeedParameter + feedContext.id) + "=" + feedFormat.format(feedContext.feed) + SP + feedDescription); } } function FeedContext(id, description, feed) { this.id = id; this.description = description; this.feed = feed; } // <<<<< INCLUDED FROM include_files/parametricFeeds.cpi // >>>>> INCLUDED FROM include_files/coolant.cpi var currentCoolantMode = COOLANT_OFF; var coolantOff = undefined; var isOptionalCoolant = false; var forceCoolant = false; function setCoolant(coolant) { var coolantCodes = getCoolantCodes(coolant); if (Array.isArray(coolantCodes)) { writeStartBlocks(!isOptionalCoolant, function () { if (settings.coolant.singleLineCoolant) { writeBlock(coolantCodes.join(getWordSeparator())); } else { for (var c in coolantCodes) { writeBlock(coolantCodes[c]); } } }); return undefined; } return coolantCodes; } function getCoolantCodes(coolant, format) { if (!getProperty("useCoolant", true)) { return undefined; // coolant output is disabled by property if it exists } isOptionalCoolant = false; if (typeof operationNeedsSafeStart == "undefined") { operationNeedsSafeStart = false; } var multipleCoolantBlocks = new Array(); // create a formatted array to be passed into the outputted line var coolants = settings.coolant.coolants; if (!coolants) { error(localize("Coolants have not been defined.")); } if (tool.type && tool.type == TOOL_PROBE) { // avoid coolant output for probing coolant = COOLANT_OFF; } if (coolant == currentCoolantMode) { if (operationNeedsSafeStart && coolant != COOLANT_OFF) { isOptionalCoolant = true; } else if (!forceCoolant || coolant == COOLANT_OFF) { return undefined; // coolant is already active } } if ((coolant != COOLANT_OFF) && (currentCoolantMode != COOLANT_OFF) && (coolantOff != undefined) && !forceCoolant && !isOptionalCoolant) { if (Array.isArray(coolantOff)) { for (var i in coolantOff) { multipleCoolantBlocks.push(coolantOff[i]); } } else { multipleCoolantBlocks.push(coolantOff); } } forceCoolant = false; var m; var coolantCodes = {}; for (var c in coolants) { // find required coolant codes into the coolants array if (coolants[c].id == coolant) { coolantCodes.on = coolants[c].on; if (coolants[c].off != undefined) { coolantCodes.off = coolants[c].off; break; } else { for (var i in coolants) { if (coolants[i].id == COOLANT_OFF) { coolantCodes.off = coolants[i].off; break; } } } } } if (coolant == COOLANT_OFF) { m = !coolantOff ? coolantCodes.off : coolantOff; // use the default coolant off command when an 'off' value is not specified } else { coolantOff = coolantCodes.off; m = coolantCodes.on; } if (!m) { onUnsupportedCoolant(coolant); m = 9; } else { if (Array.isArray(m)) { for (var i in m) { multipleCoolantBlocks.push(m[i]); } } else { multipleCoolantBlocks.push(m); } currentCoolantMode = coolant; for (var i in multipleCoolantBlocks) { if (typeof multipleCoolantBlocks[i] == "number") { multipleCoolantBlocks[i] = mFormat.format(multipleCoolantBlocks[i]); } } if (format == undefined || format) { return multipleCoolantBlocks; // return the single formatted coolant value } else { return m; // return unformatted coolant value } } return undefined; } // <<<<< INCLUDED FROM include_files/coolant.cpi // >>>>> INCLUDED FROM include_files/smoothing.cpi // collected state below, do not edit validate(settings.smoothing, "Setting 'smoothing' is required but not defined."); var smoothing = { cancel : false, // cancel tool length prior to update smoothing for this operation isActive : false, // the current state of smoothing isAllowed : false, // smoothing is allowed for this operation isDifferent: false, // tells if smoothing levels/tolerances/both are different between operations level : -1, // the active level of smoothing tolerance : -1, // the current operation tolerance force : false // smoothing needs to be forced out in this operation }; function initializeSmoothing() { var smoothingSettings = settings.smoothing; var previousLevel = smoothing.level; var previousTolerance = xyzFormat.getResultingValue(smoothing.tolerance); // format threshold parameters var thresholdRoughing = xyzFormat.getResultingValue(smoothingSettings.thresholdRoughing); var thresholdSemiFinishing = xyzFormat.getResultingValue(smoothingSettings.thresholdSemiFinishing); var thresholdFinishing = xyzFormat.getResultingValue(smoothingSettings.thresholdFinishing); // determine new smoothing levels and tolerances smoothing.level = parseInt(getProperty("accuracyOverride", "-9999"), 10); if ((smoothing.level == -9999) || isNaN(smoothing.level)) { // Fall back to the 'post' level property smoothing.level = parseInt(getProperty("useSmoothing", "-1"), 10); } smoothing.level = isNaN(smoothing.level) ? -1 : smoothing.level; smoothing.tolerance = xyzFormat.getResultingValue(Math.max(getParameter("operation:tolerance", thresholdFinishing), 0)); // setup for proper smoothing mode switch (getProperty("smoothingMode")) { case "A": case "B": smoothingSettings.roughing = 5; smoothingSettings.semi = 3; smoothingSettings.semifinishing = 1; smoothingSettings.finishing = 2; if (smoothing.level >= 1 && smoothing.level <= 6) { smoothing.level = [0, 5, 3, 4, 1, 2][smoothing.level-1]; } else if (smoothing.level != 9999 && smoothing.level != -1) { error(localize("Invalid smoothing level for mode A/B:" + smoothing.level)); } break; case "M298": if (! ( (smoothing.level >= 1 && smoothing.level <= 6) || (smoothing.level >= 21 && smoothing.level <= 23) || (smoothing.level == 9999) || (smoothing.level == -1) ) ) { error(localize("Invalid smoothing level for mode M298:" + smoothing.level)); } break; } var isFinishing = radiusCompensation || (currentSection.strategy == "contour2d" || currentSection.strategy == "chamfer2d" || currentSection.strategy == "slot" || currentSection.strategy == "path3d" || currentSection.strategy == "bore" || currentSection.strategy == "thread"); // automatically determine smoothing level if (smoothing.level == 9999) { if (currentSection.strategy == "face") { smoothing.level = smoothingSettings.off; // set roughing level } else if (isFinishing) { smoothing.level = smoothingSettings.finishing; // set finishing level } else if (smoothingSettings.autoLevelCriteria == "stock") { // determine auto smoothing level based on stockToLeave var stockToLeave = xyzFormat.getResultingValue(getParameter("operation:stockToLeave", 0)); var verticalStockToLeave = xyzFormat.getResultingValue(getParameter("operation:verticalStockToLeave", 0)); if ((stockToLeave >= thresholdRoughing) || ((stockToLeave != 0) && (verticalStockToLeave >= thresholdRoughing))) { smoothing.level = smoothingSettings.roughing; // set roughing level } else if ((stockToLeave > thresholdSemiFinishing) || ((stockToLeave > 0) && (verticalStockToLeave > thresholdSemiFinishing))) { smoothing.level = smoothingSettings.semi; // set semi level } else if ((stockToLeave > thresholdFinishing) || (verticalStockToLeave > thresholdFinishing)) { smoothing.level = smoothingSettings.semifinishing; // set semi-finishing level } else { smoothing.level = smoothingSettings.finishing; // set finishing level } } else { // detemine auto smoothing level based on operation tolerance instead of stockToLeave if (smoothing.tolerance >= thresholdRoughing) { smoothing.level = smoothingSettings.roughing; // set roughing level } else if (smoothing.tolerance > thresholdSemiFinishing) { smoothing.level = smoothingSettings.semi; // set semi level } else if (smoothing.tolerance > thresholdFinishing) { smoothing.level = smoothingSettings.semifinishing; // set semi-finishing level } else { smoothing.level = smoothingSettings.finishing; // set finishing level } } } if (smoothing.level == -1) { // useSmoothing is disabled smoothing.isAllowed = false; } else { // do not output smoothing for the following operations smoothing.isAllowed = !(currentSection.getTool().type == TOOL_PROBE || isDrillingCycle()); } if (!smoothing.isAllowed) { smoothing.level = -1; smoothing.tolerance = -1; } switch (smoothingSettings.differenceCriteria) { case "level": smoothing.isDifferent = smoothing.level != previousLevel; break; case "tolerance": smoothing.isDifferent = smoothing.tolerance != previousTolerance; break; case "both": smoothing.isDifferent = smoothing.level != previousLevel || smoothing.tolerance != previousTolerance; break; default: error(localize("Unsupported smoothing criteria.")); return; } // tool length compensation needs to be canceled when smoothing state/level changes if (smoothingSettings.cancelCompensation) { smoothing.cancel = !isFirstSection() && smoothing.isDifferent; } } // <<<<< INCLUDED FROM include_files/smoothing.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() { writeComment("File: " + getGlobalParameter("document-path")); writeComment("Date: " + getGlobalParameter("generated-at")); // Any job notes if (getProperty("showNotes")) { writeSetupNotes(); // Write sub section notes var hasNotes=false; for (var i = 0; i < getNumberOfSections(); ++i) { var section = getSection(i); var notes = section.getParameter("notes") if (notes) { writeln(""); writeComment(section.getParameter("operation-comment"), ""); writeNotes(notes); } } } writeln(""); // 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 = "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); comment += " - L=" + xyzFormat.format(tool.bodyLength) + "/" + xyzFormat.format(tool.bodyLength + tool.holderLength); writeComment(comment); } writeln(""); } } } if (errorOnDuplicateTool) { // check for duplicate tool number for (var i = 0; i < getNumberOfSections(); ++i) { var sectioni = getSection(i); var tooli = sectioni.getTool(); for (var j = i + 1; j < getNumberOfSections(); ++j) { var sectionj = getSection(j); var toolj = sectionj.getTool(); if (tooli.number == toolj.number) { if (xyzFormat.areDifferent(tooli.diameter, toolj.diameter) || xyzFormat.areDifferent(tooli.cornerRadius, toolj.cornerRadius) || abcFormat.areDifferent(tooli.taperAngle, toolj.taperAngle) || (tooli.numberOfFlutes != toolj.numberOfFlutes)) { error( subst( 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)), sectionj.hasParameter("operation-comment") ? sectionj.getParameter("operation-comment") : ("#" + (j + 1)) ) ); return; } } } } } // Write stock writeStock(); } // <<<<< INCLUDED FROM include_files/writeProgramHeader.cpi // >>>>> INCLUDED FROM include_files/onRapid_fanuc.cpi function onRapid(_x, _y, _z) { var x = xOutput.format(_x); var y = yOutput.format(_y); var z = zOutput.format(_z); if (x || y || z) { if (pendingRadiusCompensation >= 0) { error(localize("Radius compensation mode cannot be changed at rapid traversal.")); return; } if(settings.probing.probeOn && !productionMode) { protectedProbeMove(undefined, _x, _y, _z); } else { writeBlock(gMotionModal.format(0), x, y, z); } forceFeed(); } } // <<<<< INCLUDED FROM include_files/onRapid_fanuc.cpi // >>>>> INCLUDED FROM include_files/onLinear_fanuc.cpi function onLinear(_x, _y, _z, feed) { if (pendingRadiusCompensation >= 0) { xOutput.reset(); yOutput.reset(); } var x = xOutput.format(_x); var y = yOutput.format(_y); var z = zOutput.format(_z); var f = getFeed(feed); if (x || y || z) { if (pendingRadiusCompensation >= 0) { pendingRadiusCompensation = -1; var d = getSetting("outputToolDiameterOffset", true) ? diameterOffsetFormat.format(tool.diameterOffset) : ""; writeBlock(gPlaneModal.format(17)); switch (radiusCompensation) { case RADIUS_COMPENSATION_LEFT: writeBlock(gMotionModal.format(1), gFormat.format(41), x, y, z, d, f); break; case RADIUS_COMPENSATION_RIGHT: writeBlock(gMotionModal.format(1), gFormat.format(42), x, y, z, d, f); break; default: writeBlock(gMotionModal.format(1), gFormat.format(40), x, y, z, f); } } else { writeBlock(gMotionModal.format(1), x, y, z, f); } } else if (f) { if (getNextRecord().isMotion()) { // try not to output feed without motion forceFeed(); // force feed on next line } else { writeBlock(gMotionModal.format(1), f); } } } // <<<<< INCLUDED FROM include_files/onLinear_fanuc.cpi // >>>>> INCLUDED FROM include_files/onRapid5D_fanuc.cpi function onRapid5D(_x, _y, _z, _a, _b, _c) { if (pendingRadiusCompensation >= 0) { error(localize("Radius compensation mode cannot be changed at rapid traversal.")); return; } if (!currentSection.isOptimizedForMachine()) { forceXYZ(); } var x = xOutput.format(_x); var y = yOutput.format(_y); var z = zOutput.format(_z); var a = currentSection.isOptimizedForMachine() ? aOutput.format(_a) : toolVectorOutputI.format(_a); var b = currentSection.isOptimizedForMachine() ? bOutput.format(_b) : toolVectorOutputJ.format(_b); var c = currentSection.isOptimizedForMachine() ? cOutput.format(_c) : toolVectorOutputK.format(_c); if (x || y || z || a || b || c) { writeBlock(gMotionModal.format(0), x, y, z, a, b, c); forceFeed(); } } // <<<<< INCLUDED FROM include_files/onRapid5D_fanuc.cpi // >>>>> INCLUDED FROM include_files/onLinear5D_fanuc.cpi function onLinear5D(_x, _y, _z, _a, _b, _c, feed, feedMode) { if (pendingRadiusCompensation >= 0) { error(localize("Radius compensation cannot be activated/deactivated for 5-axis move.")); return; } if (!currentSection.isOptimizedForMachine()) { forceXYZ(); } var x = xOutput.format(_x); var y = yOutput.format(_y); var z = zOutput.format(_z); var a = currentSection.isOptimizedForMachine() ? aOutput.format(_a) : toolVectorOutputI.format(_a); var b = currentSection.isOptimizedForMachine() ? bOutput.format(_b) : toolVectorOutputJ.format(_b); var c = currentSection.isOptimizedForMachine() ? cOutput.format(_c) : toolVectorOutputK.format(_c); if (feedMode == FEED_INVERSE_TIME) { forceFeed(); } var f = feedMode == FEED_INVERSE_TIME ? inverseTimeOutput.format(feed) : getFeed(feed); var fMode = feedMode == FEED_INVERSE_TIME ? 93 : getProperty("useG95") ? 95 : 94; if (x || y || z || a || b || c) { writeBlock(gFeedModeModal.format(fMode), gMotionModal.format(1), x, y, z, a, b, c, f); } else if (f) { if (getNextRecord().isMotion()) { // try not to output feed without motion forceFeed(); // force feed on next line } else { writeBlock(gFeedModeModal.format(fMode), gMotionModal.format(1), f); } } } // <<<<< INCLUDED FROM include_files/onLinear5D_fanuc.cpi // >>>>> INCLUDED FROM include_files/onCircular_fanuc.cpi function onCircular(clockwise, cx, cy, cz, x, y, z, feed) { if (pendingRadiusCompensation >= 0) { error(localize("Radius compensation cannot be activated/deactivated for a circular move.")); return; } if ((gRotationModal.getCurrent() == 68) && (getCircularPlane() != PLANE_XY)) { // Can't switch planes while rotation active writeComment("Linearising due to active G68 rotation"); linearize(tolerance); return; } var start = getCurrentPosition(); if (isFullCircle()) { if (getProperty("useRadius") || isHelical()) { // radius mode does not support full arcs linearize(tolerance); return; } switch (getCircularPlane()) { case PLANE_XY: writeBlock(gPlaneModal.format(17), gMotionModal.format(clockwise ? 2 : 3), iOutput.format(cx - start.x), jOutput.format(cy - start.y), getFeed(feed)); break; case PLANE_ZX: writeBlock(gPlaneModal.format(18), gMotionModal.format(clockwise ? 2 : 3), iOutput.format(cx - start.x), kOutput.format(cz - start.z), getFeed(feed)); break; case PLANE_YZ: writeBlock(gPlaneModal.format(19), gMotionModal.format(clockwise ? 2 : 3), jOutput.format(cy - start.y), kOutput.format(cz - start.z), getFeed(feed)); break; default: linearize(tolerance); } } else if (!getProperty("useRadius")) { switch (getCircularPlane()) { case PLANE_XY: writeBlock(gPlaneModal.format(17), gMotionModal.format(clockwise ? 2 : 3), xOutput.format(x), yOutput.format(y), zOutput.format(z), iOutput.format(cx - start.x), jOutput.format(cy - start.y), getFeed(feed)); break; case PLANE_ZX: writeBlock(gPlaneModal.format(18), gMotionModal.format(clockwise ? 2 : 3), xOutput.format(x), yOutput.format(y), zOutput.format(z), iOutput.format(cx - start.x), kOutput.format(cz - start.z), getFeed(feed)); break; case PLANE_YZ: writeBlock(gPlaneModal.format(19), gMotionModal.format(clockwise ? 2 : 3), xOutput.format(x), yOutput.format(y), zOutput.format(z), jOutput.format(cy - start.y), kOutput.format(cz - start.z), getFeed(feed)); break; default: if (getProperty("allow3DArcs")) { // make sure maximumCircularSweep is well below 360deg // we could use G02.4 or G03.4 - direction is calculated var ip = getPositionU(0.5); writeBlock(gMotionModal.format(clockwise ? 2.4 : 3.4), xOutput.format(ip.x), yOutput.format(ip.y), zOutput.format(ip.z), getFeed(feed)); writeBlock(xOutput.format(x), yOutput.format(y), zOutput.format(z)); } else { linearize(tolerance); } } } else { // use radius mode var r = getCircularRadius(); if (toDeg(getCircularSweep()) > (180 + 1e-9)) { r = -r; // allow up to <360 deg arcs } switch (getCircularPlane()) { case PLANE_XY: writeBlock(gPlaneModal.format(17), gMotionModal.format(clockwise ? 2 : 3), xOutput.format(x), yOutput.format(y), zOutput.format(z), "R" + rFormat.format(r), getFeed(feed)); break; case PLANE_ZX: writeBlock(gPlaneModal.format(18), gMotionModal.format(clockwise ? 2 : 3), xOutput.format(x), yOutput.format(y), zOutput.format(z), "R" + rFormat.format(r), getFeed(feed)); break; case PLANE_YZ: writeBlock(gPlaneModal.format(19), gMotionModal.format(clockwise ? 2 : 3), xOutput.format(x), yOutput.format(y), zOutput.format(z), "R" + rFormat.format(r), getFeed(feed)); break; default: if (getProperty("allow3DArcs")) { // make sure maximumCircularSweep is well below 360deg // we could use G02.4 or G03.4 - direction is calculated var ip = getPositionU(0.5); writeBlock(gMotionModal.format(clockwise ? 2.4 : 3.4), xOutput.format(ip.x), yOutput.format(ip.y), zOutput.format(ip.z), getFeed(feed)); writeBlock(xOutput.format(x), yOutput.format(y), zOutput.format(z)); } else { linearize(tolerance); } } } } // <<<<< INCLUDED FROM include_files/onCircular_fanuc.cpi // >>>>> INCLUDED FROM include_files/workPlaneFunctions_fanuc.cpi var currentWorkPlaneABC = undefined; function forceWorkPlane() { currentWorkPlaneABC = undefined; } function cancelWorkPlane(force) { if (typeof gRotationModal != "undefined") { if (force) { gRotationModal.reset(); } writeBlock(gRotationModal.format(69)); // cancel frame } forceWorkPlane(); } function setWorkPlane(abc) { if (!settings.workPlaneMethod.forceMultiAxisIndexing && is3D() && !machineConfiguration.isMultiAxisConfiguration()) { return; // ignore } var workplaneIsRequired = (currentWorkPlaneABC == undefined) || abcFormat.areDifferent(abc.x, currentWorkPlaneABC.x) || abcFormat.areDifferent(abc.y, currentWorkPlaneABC.y) || abcFormat.areDifferent(abc.z, currentWorkPlaneABC.z); writeStartBlocks(workplaneIsRequired, function () { if (!retracted) { writeRetract(Z); } if (currentSection.getId() > 0 && (isTCPSupportedByOperation(getSection(currentSection.getId() - 1) || tcp.isSupportedByOperation)) && typeof disableLengthCompensation == "function") { disableLengthCompensation(); // cancel TCP } if (settings.workPlaneMethod.useTiltedWorkplane) { onCommand(COMMAND_UNLOCK_MULTI_AXIS); cancelWorkPlane(); if (machineConfiguration.isMultiAxisConfiguration()) { var machineABC = abc.isNonZero() ? (currentSection.isMultiAxis() ? getCurrentDirection() : getWorkPlaneMachineABC(currentSection, false)) : abc; if (settings.workPlaneMethod.useABCPrepositioning || machineABC.isZero()) { positionABC(machineABC, false); } else { setCurrentABC(machineABC); } } if (abc.isNonZero() || !machineConfiguration.isMultiAxisConfiguration()) { gRotationModal.reset(); writeBlock( gRotationModal.format(68.2), "X" + xyzFormat.format(currentSection.workOrigin.x), "Y" + xyzFormat.format(currentSection.workOrigin.y), "Z" + xyzFormat.format(currentSection.workOrigin.z), "I" + abcFormat.format(abc.x), "J" + abcFormat.format(abc.y), "K" + abcFormat.format(abc.z) ); // set frame writeBlock(gFormat.format(53.1)); // turn machine } } else { positionABC(abc, true); } if (!currentSection.isMultiAxis()) { onCommand(COMMAND_LOCK_MULTI_AXIS); } currentWorkPlaneABC = abc; }); } // <<<<< INCLUDED FROM include_files/workPlaneFunctions_fanuc.cpi // >>>>> INCLUDED FROM include_files/writeRetract_fanuc.cpi function writeRetract() { var retract = getRetractParameters.apply(this, arguments); if (retract && retract.words.length > 0) { if (typeof gRotationModal != "undefined" && gRotationModal.getCurrent() == 68 && settings.retract.cancelRotationOnRetracting) { // cancel rotation before retracting cancelWorkPlane(true); } switch (retract.method) { case "G28": forceModals(gMotionModal, gAbsIncModal); writeBlock(gFormat.format(28), gAbsIncModal.format(91), retract.words); writeBlock(gAbsIncModal.format(90)); break; case "G30": forceModals(gMotionModal, gAbsIncModal); writeBlock(gFormat.format(30), gAbsIncModal.format(91), retract.words); writeBlock(gAbsIncModal.format(90)); break; case "G53": forceModals(gMotionModal); writeBlock(gAbsIncModal.format(90), gFormat.format(53), gMotionModal.format(0), retract.words); break; case "clearanceHeight": forceModals(gMotionModal, gAbsIncModal); writeBlock(gAbsIncModal.format(90)); break; default: if (typeof writeRetractCustom == "function") { writeRetractCustom(retract); } else { error(subst(localize("Unsupported safe position method '%1'"), retract.method)); return; } } } } // <<<<< INCLUDED FROM include_files/writeRetract_fanuc.cpi // >>>>> INCLUDED FROM include_files/initialPositioning_fanuc.cpi /** * Writes the initial positioning procedure for a section to get to the start position of the toolpath. * @param {Vector} position The initial position to move to * @param {boolean} isRequired true: Output full positioning, false: Output full positioning in optional state or output simple positioning only * @param {String} codes1 Allows to add additional code to the first positioning line * @param {String} codes2 Allows to add additional code to the second positioning line (if applicable) * @example var myVar1 = formatWords("T" + tool.number, currentSection.wcs); var myVar2 = getCoolantCodes(tool.coolant); writeInitialPositioning(initialPosition, isRequired, myVar1, myVar2); */ function writeInitialPositioning(position, isRequired, codes1, codes2) { var motionCode = {single:0, multi:0}; switch (highFeedMapping) { case HIGH_FEED_MAP_ANY: motionCode = {single:1, multi:1}; // map all rapid traversals to high feed break; case HIGH_FEED_MAP_MULTI: motionCode = {single:0, multi:1}; // map rapid traversal along more than one axis to high feed break; } var feed = (highFeedMapping != HIGH_FEED_NO_MAPPING) ? getFeed(highFeedrate) : ""; var gOffset = getSetting("outputToolLengthCompensation", true) ? gFormat.format(getOffsetCode()) : ""; var hOffset = getSetting("outputToolLengthOffset", true) ? hFormat.format(tool.lengthOffset) : ""; var additionalCodes = [formatWords(codes1), formatWords(codes2)]; forceModals(gMotionModal); writeStartBlocks(isRequired, function() { var modalCodes = formatWords(gAbsIncModal.format(90), gPlaneModal.format(17)); if (typeof disableLengthCompensation == "function") { disableLengthCompensation(false); // cancel tool length compensation prior to enabling it, required when switching G43/G43.4 modes } // multi axis prepositioning with TWP if (currentSection.isMultiAxis() && getSetting("workPlaneMethod.prepositionWithTWP", true) && getSetting("workPlaneMethod.useTiltedWorkplane", false) && tcp.isSupportedByOperation && getCurrentDirection().isNonZero()) { var W = machineConfiguration.isMultiAxisConfiguration() ? machineConfiguration.getOrientation(getCurrentDirection()) : Matrix.getOrientationFromDirection(getCurrentDirection()); var prePosition = W.getTransposed().multiply(position); var angles = W.getEuler2(settings.workPlaneMethod.eulerConvention); setWorkPlane(angles); writeBlock(modalCodes, gMotionModal.format(motionCode.multi), xOutput.format(prePosition.x), yOutput.format(prePosition.y), feed, additionalCodes[0]); cancelWorkPlane(); writeBlock(gOffset, hOffset, additionalCodes[1]); // omit Z-axis output is desired lengthCompensationActive = true; forceAny(); // required to output XYZ coordinates in the following line } else { if (machineConfiguration.isHeadConfiguration()) { writeBlock(modalCodes, gMotionModal.format(motionCode.multi), gOffset, xOutput.format(position.x), yOutput.format(position.y), zOutput.format(position.z), hOffset, feed, additionalCodes ); } else { writeBlock(modalCodes, gMotionModal.format(motionCode.multi), xOutput.format(position.x), yOutput.format(position.y), feed, additionalCodes[0]); writeBlock(gMotionModal.format(motionCode.single), gOffset, zOutput.format(position.z), hOffset, additionalCodes[1]); } lengthCompensationActive = true; } forceModals(gMotionModal); if (isRequired) { additionalCodes = []; // clear additionalCodes buffer } }); validate(lengthCompensationActive, "Tool length compensation is not active."); // make sure that lenght compensation is enabled if (!isRequired) { // simple positioning var modalCodes = formatWords(gAbsIncModal.format(90), gPlaneModal.format(17)); if (!settings.probing.probeOn || productionMode) { if (!retracted && xyzFormat.getResultingValue(getCurrentPosition().z) < xyzFormat.getResultingValue(position.z)) { writeBlock(modalCodes, gMotionModal.format(motionCode.single), zOutput.format(position.z), feed); } forceXYZ(); writeBlock(modalCodes, gMotionModal.format(motionCode.multi), xOutput.format(position.x), yOutput.format(position.y), feed, additionalCodes); } else { forceXYZ(); writeBlock(modalCodes, feed, additionalCodes); protectedProbeMove(undefined, position.x, position.y, position.z); } } } Matrix.getOrientationFromDirection = function (ijk) { var forward = ijk; var unitZ = new Vector(0, 0, 1); var W; if (Math.abs(Vector.dot(forward, unitZ)) < 0.5) { var imX = Vector.cross(forward, unitZ).getNormalized(); W = new Matrix(imX, Vector.cross(forward, imX), forward); } else { var imX = Vector.cross(new Vector(0, 1, 0), forward).getNormalized(); W = new Matrix(imX, Vector.cross(forward, imX), forward); } return W; }; // <<<<< INCLUDED FROM include_files/initialPositioning_fanuc.cpi // >>>>> INCLUDED FROM include_files/getOffsetCode_fanuc.cpi function getOffsetCode() { var offsetCode = 43; if (tcp.isSupportedByOperation) { offsetCode = machineConfiguration.isMultiAxisConfiguration() ? 43.4 : 43.5; } return offsetCode; } // <<<<< INCLUDED FROM include_files/getOffsetCode_fanuc.cpi // >>>>> INCLUDED FROM include_files/commonInspectionFunctions_fanuc.cpi var macroFormat = createFormat({prefix:(typeof inspectionVariables == "undefined" ? "#" : inspectionVariables.localVariablePrefix), decimals:0}); var macroRoundingFormat = (unit == MM) ? "[53]" : "[44]"; var isDPRNTopen = false; var localVariableStart = 19; var localVariable = [ macroFormat.format(localVariableStart + 1), macroFormat.format(localVariableStart + 2), macroFormat.format(localVariableStart + 3), macroFormat.format(localVariableStart + 4), macroFormat.format(localVariableStart + 5), macroFormat.format(localVariableStart + 6) ]; function defineLocalVariable(indx, value) { writeln(localVariable[indx - 1] + " = " + value); } function formatLocalVariable(prefix, indx, rnd) { return prefix + localVariable[indx - 1] + rnd; } function inspectionCreateResultsFileHeader() { if (isDPRNTopen) { if (!getProperty("singleResultsFile")) { writeln("DPRNT[END]"); writeBlock("PCLOS"); isDPRNTopen = false; } } if (isProbeOperation() && !printProbeResults()) { return; // if print results is not desired by probe/ probeWCS } if (!isDPRNTopen) { writeBlock("PCLOS"); writeBlock("POPEN"); // check for existence of none alphanumeric characters but not spaces var resFile; if (getProperty("singleResultsFile")) { resFile = getParameter("job-description") + "-RESULTS"; } else { resFile = getParameter("operation-comment") + "-RESULTS"; } resFile = resFile.replace(/:/g, "-"); resFile = resFile.replace(/[^a-zA-Z0-9 -]/g, ""); resFile = resFile.replace(/\s/g, "-"); resFile = resFile.toUpperCase(); writeln("DPRNT[START]"); writeln("DPRNT[RESULTSFILE*" + resFile + "]"); if (hasGlobalParameter("document-id")) { writeln("DPRNT[DOCUMENTID*" + getGlobalParameter("document-id").toUpperCase() + "]"); } if (hasGlobalParameter("model-version")) { writeln("DPRNT[MODELVERSION*" + getGlobalParameter("model-version").toUpperCase() + "]"); } } if (isProbeOperation() && printProbeResults()) { isDPRNTopen = true; } } function getPointNumber() { if (typeof inspectionWriteVariables == "function") { return (inspectionVariables.pointNumber); } else { return ("#122[60]"); } } function inspectionWriteCADTransform() { var cadOrigin = currentSection.getModelOrigin(); var cadWorkPlane = currentSection.getModelPlane().getTransposed(); var cadEuler = cadWorkPlane.getEuler2(EULER_XYZ_S); defineLocalVariable(1, abcFormat.format(cadEuler.x)); defineLocalVariable(2, abcFormat.format(cadEuler.y)); defineLocalVariable(3, abcFormat.format(cadEuler.z)); defineLocalVariable(4, xyzFormat.format(-cadOrigin.x)); defineLocalVariable(5, xyzFormat.format(-cadOrigin.y)); defineLocalVariable(6, xyzFormat.format(-cadOrigin.z)); writeln( "DPRNT[G331" + "*N" + getPointNumber() + formatLocalVariable("*A", 1, macroRoundingFormat) + formatLocalVariable("*B", 2, macroRoundingFormat) + formatLocalVariable("*C", 3, macroRoundingFormat) + formatLocalVariable("*X", 4, macroRoundingFormat) + formatLocalVariable("*Y", 5, macroRoundingFormat) + formatLocalVariable("*Z", 6, macroRoundingFormat) + "]" ); } function inspectionWriteWorkplaneTransform() { var orientation = machineConfiguration.isMultiAxisConfiguration() ? machineConfiguration.getOrientation(getCurrentDirection()) : currentSection.workPlane; var abc = orientation.getEuler2(EULER_XYZ_S); defineLocalVariable(1, abcFormat.format(abc.x)); defineLocalVariable(2, abcFormat.format(abc.y)); defineLocalVariable(3, abcFormat.format(abc.z)); writeln("DPRNT[G330" + "*N" + getPointNumber() + formatLocalVariable("*A", 1, macroRoundingFormat) + formatLocalVariable("*B", 2, macroRoundingFormat) + formatLocalVariable("*C", 3, macroRoundingFormat) + "*X0*Y0*Z0*I0*R0]" ); } function writeProbingToolpathInformation(cycleDepth) { defineLocalVariable(1, getParameter("autodeskcam:operation-id")); writeln(formatLocalVariable("DPRNT[TOOLPATHID*", 1, "[54]]")); if (isInspectionOperation()) { writeln("DPRNT[TOOLPATH*" + getParameter("operation-comment").toUpperCase().replace(/[()]/g, "") + "]"); } else { defineLocalVariable(2, xyzFormat.format(cycleDepth)); writeln(formatLocalVariable("DPRNT[CYCLEDEPTH*", 2, macroRoundingFormat + "]")); } } // <<<<< INCLUDED FROM include_files/commonInspectionFunctions_fanuc.cpi // >>>>> INCLUDED FROM include_files/setProbeAngle_fanuc.cpi function setProbeAngle() { if (probeVariables.outputRotationCodes) { var probeOutputWorkOffset = currentSection.probeWorkOffset; validate(probeOutputWorkOffset <= 6, "Angular Probing only supports work offsets 1-6."); if (settings.probing.probeAngleMethod == "G68" && (Vector.diff(currentSection.getGlobalInitialToolAxis(), new Vector(0, 0, 1)).length > 1e-4)) { error(localize("You cannot use multi axis toolpaths while G68 Rotation is in effect.")); } var validateWorkOffset = false; switch (settings.probing.probeAngleMethod) { case "G54.4": var param = 26000 + (probeOutputWorkOffset * 10); writeBlock("#" + param + "=#135"); writeBlock("#" + (param + 1) + "=#136"); writeBlock("#" + (param + 5) + "=#144"); writeBlock(gFormat.format(54.4), "P" + probeOutputWorkOffset); break; case "G68": gRotationModal.reset(); gAbsIncModal.reset(); if (getProperty("probingType") == "Renishaw") { writeBlock(gRotationModal.format(68), gAbsIncModal.format(90), probeVariables.compensationXY, "R[#144]"); } else { writeBlock(gRotationModal.format(68), gAbsIncModal.format(90), probeVariables.compensationXY, "R[#143]"); } validateWorkOffset = true; break; case "AXIS_ROT": var param = 5200 + probeOutputWorkOffset * 20 + 5; writeBlock("#" + param + " = " + "[#" + param + " + #144]"); forceWorkPlane(); // force workplane to rotate ABC in order to apply rotation offsets currentWorkOffset = undefined; // force WCS output to make use of updated parameters validateWorkOffset = true; break; default: error(localize("Angular Probing is not supported for this machine configuration.")); return; } if (validateWorkOffset) { for (var i = currentSection.getId(); i < getNumberOfSections(); ++i) { if (getSection(i).workOffset != currentSection.workOffset) { error(localize("WCS offset cannot change while using angle rotation compensation.")); return; } } } probeVariables.outputRotationCodes = false; } } // <<<<< INCLUDED FROM include_files/setProbeAngle_fanuc.cpi // >>>>> INCLUDED FROM include_files/setProbeAngleMethod.cpi function setProbeAngleMethod() { settings.probing.probeAngleMethod = (machineConfiguration.getNumberOfAxes() < 5 || is3D()) ? (getProperty("useG54x4") ? "G54.4" : "G68") : "UNSUPPORTED"; var axes = [machineConfiguration.getAxisU(), machineConfiguration.getAxisV(), machineConfiguration.getAxisW()]; for (var i = 0; i < axes.length; ++i) { if (axes[i].isEnabled() && isSameDirection((axes[i].getAxis()).getAbsolute(), new Vector(0, 0, 1)) && axes[i].isTable()) { settings.probing.probeAngleMethod = "AXIS_ROT"; break; } } probeVariables.outputRotationCodes = true; } // <<<<< INCLUDED FROM include_files/setProbeAngleMethod.cpi