How to read this page
Codes in the first group are executed: they move the simulated machine and their time lands in the estimate. Codes in the second group are declared out of scope: the viewer falls back to safe behaviour and names them in a per-file note, so you always know what the number covers. A file made entirely of codes from the first group simulates completely.
Motion & time model
- G00 rapid, G01 feed, G02/G03 arcs (R or I/J/K) in all three planes (G17/G18/G19)
- Every move is motion planned against your machine profile: per-axis rapid and acceleration limits, corner speed from true path geometry (√(a × R)), and, when a jerk value is set, full S-curve ramps with a jerk corner limit (∛(J × R²)). Jerk = 0 gives exact trapezoidal motion.
- G90/G91 absolute / incremental, G20/G21 inch / metric
Canned cycles, expanded and timed
- G81 drill, G82 spot/counterbore with bottom dwell, G83 deep-hole peck, G73 chip-break peck
- G84 / G74 rigid tapping: feed in, spindle reversal pause at the bottom, feed out
- G85 / G86 boring, G89 boring with dwell. Feed retracts where the cycle feeds out
- G80 cancel, G98/G99 retract planes, L repeat counts, modal cycle parameters
Subprograms, expanded inline
- Fanuc M98 P with L repeats, including the packed form (
M98 P51000= O1000 × 5), plus M99 return - Haas M97 local N-block calls (resolved after M30, per convention)
- LinuxCNC
o…sub / o…call / o…return / o…endsub, numbered or named - Nested calls to depth 10, up to 10,000 repeats per call and 200,000 expanded lines. Beyond a cap, or on any unresolved call, the file falls back to unexpanded, with the reason named.
Dwells, read by dialect
G04 with P or X. Integer P is read as milliseconds for Fanuc/Haas-style programs and seconds for LinuxCNC/GRBL-style ones. The viewer infers the dialect from the whole file (headers, parameter style) and tells you which rule it applied. Cycle dwells (G82/G89 P) follow the same rules.
Feed modes
G94 units per minute and G95 units per revolution. In G95 the actual feed is F × S from the modal spindle speed, and the viewer says so if S was never set.
Path control, in the time model
G61 / G61.1 exact stop mode and G09 (single block) bring the tool to a full stop at block ends. G64 P blend tolerance raises corner speed by exactly the tolerance you programmed.
Program flow & M-codes
- M02 / M30 program end. Nothing after it runs except called subprograms
- M06 tool change at your configured seconds, animated in playback. T words tracked
- M03 / M04 / M05 spindle (feeds G95 and tapping behaviour). S and F modal
- G28 / G30 reference return via the optional intermediate point, to a home position you set
- Comments, N numbers,
%wrappers and blank lines handled as a control reads them
Machine dynamics you configure
Rapid XY and Z, acceleration XY and Z, jerk (0 = off), tool change seconds, and the G28/G30 home position. Two numbers from your machine’s manual get close. Simulating a program you’ve actually timed gets exact.
Declared out of scope, disclosed per file
When any of these appear, the viewer names them in the “Good to know” panel and falls back safely:
- Macro B: #variables, G65, WHILE/IF/REPEAT. Subprogram calls with [arguments] are left unexpanded and named
- G41/G42 cutter compensation. The programmed path is shown, not the offset path
- G10 / G52 / G53 / G92 coordinate system offsets. Not applied
- Multiple work offsets (G54 to G59). The time is right, but all fixtures plot from one origin, so rapids between them are approximate
- G76 / G87 / G88 fine and back-boring cycles
- G33 threading, G5.x splines/NURBS, G7 lathe diameter mode
- G93 inverse-time feed. Affected moves use an assumed feed, with a warning
- M00 / M01 program stop. Operator wait time is yours to add
Finding one of these in a file without a matching note would be a bug, so please tell us.
Reporting a file we simulate wrong
That’s the most valuable thing you can send. Confirmed issues get fixed, added to our regression tests, and credited in the changelog. Include the file, or just the offending lines, with your report via feedback. A stripped-down snippet that shows the problem is plenty.
Testing, on the other hand, is always private: the viewer runs your G-code locally and never uploads it. What you share with a bug report is entirely your call.