Search Results (Searched for: )
- tuxcnc
- tuxcnc
03 Oct 2026 14:32
Replied by tuxcnc on topic Standalone LinuxCNC machine simulator using the Stepper-Ninja HAL interface
Standalone LinuxCNC machine simulator using the Stepper-Ninja HAL interface
Category: General LinuxCNC Questions
Can't compile ninja hal driver for LinuxCNC 2.10, so your hard work is useless for me.
Building LinuxCNC HAL module stepgen-ninja
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:34:13: note: ‘#pragma message: Ethernet version’
34 | #pragma message "Ethernet version"
| ^~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:99:5: error: unknown type name ‘hal_float_t’; did you mean ‘hal_port_t’?
99 | hal_float_t *command[stepgens];
| ^~~~~~~~~~~
| hal_port_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:100:5: error: unknown type name ‘hal_float_t’; did you mean ‘hal_port_t’?
100 | hal_float_t *feedback[stepgens];
| ^~~~~~~~~~~
| hal_port_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:101:5: error: unknown type name ‘hal_float_t’; did you mean ‘hal_port_t’?
101 | hal_float_t *scale[stepgens];
| ^~~~~~~~~~~
| hal_port_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:102:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
102 | hal_bit_t *mode[stepgens];
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:103:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
103 | hal_bit_t *enable[stepgens];
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:104:5: error: unknown type name ‘hal_u32_t’; did you mean ‘hal_uint_t’?
104 | hal_u32_t *pulse_width;
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:107:5: error: unknown type name ‘hal_s32_t’; did you mean ‘hal_sint_t’?
107 | hal_s32_t *raw_count[encoders];
| ^~~~~~~~~
| hal_sint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:108:5: error: unknown type name ‘hal_float_t’; did you mean ‘hal_port_t’?
108 | hal_float_t *enc_scale[encoders];
| ^~~~~~~~~~~
| hal_port_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:109:5: error: unknown type name ‘hal_float_t’; did you mean ‘hal_port_t’?
109 | hal_float_t *enc_position[encoders];
| ^~~~~~~~~~~
| hal_port_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:110:5: error: unknown type name ‘hal_float_t’; did you mean ‘hal_port_t’?
110 | hal_float_t *enc_velocity[encoders];
| ^~~~~~~~~~~
| hal_port_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:111:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
111 | hal_bit_t *enc_index[encoders];
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:112:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
112 | hal_bit_t *enc_reset[encoders];
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:113:5: error: unknown type name ‘hal_float_t’; did you mean ‘hal_port_t’?
113 | hal_float_t *enc_rpm[encoders];
| ^~~~~~~~~~~
| hal_port_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:131:5: error: unknown type name ‘hal_s32_t’; did you mean ‘hal_sint_t’?
131 | hal_s32_t *jitter;
| ^~~~~~~~~
| hal_sint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:132:5: error: unknown type name ‘hal_u32_t’; did you mean ‘hal_uint_t’?
132 | hal_u32_t *step_ring_fill;
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:133:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
133 | hal_bit_t *step_ring_active;
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:134:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
134 | hal_bit_t *step_ring_underflow;
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:135:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
135 | hal_bit_t *step_ring_overflow;
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:136:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
136 | hal_bit_t *input[96];
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:137:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
137 | hal_bit_t *input_not[96];
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:138:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
138 | hal_bit_t *rpi_input[32];
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:139:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
139 | hal_bit_t *rpi_input_not[32];
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:141:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
141 | hal_bit_t *output[64];
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:142:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
142 | hal_bit_t *rpi_output[32];
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:157:5: error: unknown type name ‘hal_float_t’; did you mean ‘hal_port_t’?
157 | hal_float_t *debug_freq;
| ^~~~~~~~~~~
| hal_port_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:158:5: error: unknown type name ‘hal_s32_t’; did you mean ‘hal_sint_t’?
158 | hal_s32_t *debug_steps[stepgens];
| ^~~~~~~~~
| hal_sint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:159:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
159 | hal_bit_t *debug_steps_reset;
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:161:5: error: unknown type name ‘hal_u32_t’; did you mean ‘hal_uint_t’?
161 | hal_u32_t *period;
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:162:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
162 | hal_bit_t *connected;
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:163:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
163 | hal_bit_t *io_ready_in;
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:164:5: error: unknown type name ‘hal_bit_t’; did you mean ‘hal_uint_t’?
164 | hal_bit_t *io_ready_out;
| ^~~~~~~~~
| hal_uint_t
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c: In function ‘watchdog_process’:
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:367:39: warning: unused parameter ‘period’ [-Wunused-parameter]
367 | void watchdog_process(void *arg, long period)
| ~~~~~^~~~~~
In file included from /usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:441:
/usr/src/stepper-ninja-hal/hal-driver/modules/breakoutboard_hal_0.c: In function ‘bb_hal_setup_pins’:
/usr/src/stepper-ninja-hal/hal-driver/modules/breakoutboard_hal_0.c:23:13: error: implicit declaration of function ‘hal_pin_bit_newf’ [-Wimplicit-function-declaration]
23 | r = hal_pin_bit_newf(HAL_OUT, &d->input[i], comp_id, name, j);
| ^~~~~~~~~~~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c: In function ‘_receive’:
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:445:27: warning: unused parameter ‘arg’ [-Wunused-parameter]
445 | static int _receive(void *arg)
| ~~~~~~^~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c: In function ‘udp_io_process_recv’:
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:480:42: warning: unused parameter ‘period’ [-Wunused-parameter]
480 | void udp_io_process_recv(void *arg, long period)
| ~~~~~^~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c: In function ‘udp_io_process_send’:
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:630:29: warning: comparison of integer expressions of different signedness: ‘uint32_t’ {aka ‘unsigned int’} and ‘int’ [-Wsign-compare]
630 | if (old_pulse_width != *d->pulse_width) {
| ^~
In file included from /usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:49:
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c: In function ‘rtapi_app_main’:
/usr/src/stepper-ninja-hal/hal-driver/hal_pin_macros.h:65:13: error: implicit declaration of function ‘hal_pin_u32_newf’ [-Wimplicit-function-declaration]
65 | r = hal_pin_u32_newf(dir, ptr, comp_id, name, j); \
| ^~~~~~~~~~~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:882:9: note: in expansion of macro ‘PIN_U32_INIT’
882 | PIN_U32_INIT(&hal_data[j].pulse_width, HAL_IN, default_pulse_width, module_name ".%d.stepgen.pulse-width", j);
| ^~~~~~~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/hal_pin_macros.h:77:13: error: implicit declaration of function ‘hal_pin_float_newf’ [-Wimplicit-function-declaration]
77 | r = hal_pin_float_newf(dir, ptr, comp_id, name, j); \
| ^~~~~~~~~~~~~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:885:13: note: in expansion of macro ‘PIN_FLOAT’
885 | PIN_FLOAT(&hal_data[j].debug_freq, HAL_OUT, module_name ".%d.stepgen.max-freq-khz", j);
| ^~~~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/hal_pin_macros.h:31:13: error: implicit declaration of function ‘hal_pin_s32_newf’ [-Wimplicit-function-declaration]
31 | r = hal_pin_s32_newf(dir, ptr, comp_id, name, j); \
| ^~~~~~~~~~~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:890:9: note: in expansion of macro ‘PIN_S32’
890 | PIN_S32(&hal_data[j].jitter, HAL_OUT, module_name ".%d.jitter", j);
| ^~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:980:17: note: ‘#pragma message: Adding export functions. (watchdog)’
980 | #pragma message "Adding export functions. (watchdog)"
| ^~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:984:13: error: too many arguments to function ‘hal_export_funct’
984 | r = hal_export_funct(watchdog_name, watchdog_process, &hal_data[j], 1, 1, comp_id);
| ^~~~~~~~~~~~~~~~
In file included from /usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:4:
/usr/include/linuxcnc/hal.h:807:5: note: declared here
807 | int hal_export_funct(const char *name, void (*funct) (void *, long),
| ^~~~~~~~~~~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:992:17: note: ‘#pragma message: Adding export functions. (process-send)’
992 | #pragma message "Adding export functions. (process-send)"
| ^~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:996:13: error: too many arguments to function ‘hal_export_funct’
996 | r = hal_export_funct(process_send, udp_io_process_send, &hal_data[j], 1, 1, comp_id);
| ^~~~~~~~~~~~~~~~
/usr/include/linuxcnc/hal.h:807:5: note: declared here
807 | int hal_export_funct(const char *name, void (*funct) (void *, long),
| ^~~~~~~~~~~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:1004:17: note: ‘#pragma message: Adding export functions. (process-recv)’
1004 | #pragma message "Adding export functions. (process-recv)"
| ^~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:1008:13: error: too many arguments to function ‘hal_export_funct’
1008 | r = hal_export_funct(process_recv, udp_io_process_recv, &hal_data[j], 1, 1, comp_id);
| ^~~~~~~~~~~~~~~~
/usr/include/linuxcnc/hal.h:807:5: note: declared here
807 | int hal_export_funct(const char *name, void (*funct) (void *, long),
| ^~~~~~~~~~~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c: At top level:
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:445:12: warning: ‘_receive’ defined but not used [-Wunused-function]
445 | static int _receive(void *arg)
| ^~~~~~~~
/usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:203:17: warning: ‘counter’ defined but not used [-Wunused-variable]
203 | static uint32_t counter = 0;
| ^~~~~~~
In file included from /usr/src/stepper-ninja-hal/hal-driver/config.h:83,
from /usr/src/stepper-ninja-hal/hal-driver/transmission.h:5,
from /usr/src/stepper-ninja-hal/hal-driver/stepgen-ninja.c:13:
/usr/src/stepper-ninja-hal/hal-driver/kbmatrix.h:12:14: warning: ‘key_names’ defined but not used [-Wunused-variable]
12 | static char *key_names[] = {"softkey-00", // column 0 - row 0
| ^~~~~~~~~
gmake[4]: *** [/usr/src/stepper-ninja-hal/hal-driver/build-cmake/stepgen-ninja/Makefile:9: stepgen-ninja.o] Błąd 1
gmake[3]: *** [CMakeFiles/stepgen-ninja.dir/build.make:109: stepgen-ninja/stepgen-ninja.so] Błąd 2
gmake[2]: *** [CMakeFiles/Makefile2:91: CMakeFiles/stepgen-ninja.dir/all] Błąd 2
gmake[1]: *** [CMakeFiles/Makefile2:98: CMakeFiles/stepgen-ninja.dir/rule] Błąd 2
gmake: *** [Makefile:170: stepgen-ninja] Błąd 2
- fmueller
- fmueller
03 Oct 2026 12:54 - 03 Oct 2026 13:27
Standalone LinuxCNC machine simulator using the Stepper-Ninja HAL interface was created by fmueller
Standalone LinuxCNC machine simulator using the Stepper-Ninja HAL interface
Category: General LinuxCNC Questions
Hi,
I've been working on a standalone CNC machine simulator for LinuxCNC and have now published the first experimental version.
The main idea is that the simulator does NOT interpret G-code itself.
LinuxCNC remains responsible for G-code interpretation, trajectory planning, coordinate systems, offsets and compensation. The simulator sits behind LinuxCNC where real motion hardware would normally be connected.
Currently I use the original Stepper-Ninja HAL driver and its UDP protocol as the interface:
The important part of this approach is that the simulator sees the motion that LinuxCNC actually sends to the virtual hardware instead of trying to reproduce LinuxCNC's trajectory planner.
Communication is bidirectional. The simulator can also send virtual machine inputs back to LinuxCNC. I can already use this for limit switches, homing and a simple configurable probe plane.
The current version also contains a sparse voxel workpiece and persistent material removal. Tool movement is processed as continuous swept volumes rather than just removing material at individual sampled positions.
One interesting problem was performance during curved motion. LinuxCNC can generate many small motion segments. Instead of approximating those segments with a larger chord, I batch the actual swept segments for a short time window and calculate the union of their removal volumes. This keeps the resulting voxel state identical while greatly reducing repeated work.
At the moment the simulation is still quite limited:
- flat-end cutter only
- no geometric stock probing yet
- no toolsetter yet
- no spindle/holder model
- no general collision detection
- no rotary material transform
The next area I would like to work on is geometric contact detection. My idea is to use the same contact system later for workpiece probing, a machine-fixed toolsetter and eventually collision detection.
Stepper-Ninja is currently just the interface between LinuxCNC and the simulator. A physical machine does not need to use Stepper-Ninja hardware. I chose it because an existing LinuxCNC HAL driver and a small bidirectional protocol already existed, so I did not have to invent another LinuxCNC hardware interface.
This is my first public release and I consider it experimental development software, not a machine safety system.
Source and v0.1.0:
github.com/FredericM88/linuxcnc-sim
I would be particularly interested in feedback about the architecture. Does placing the simulator behind LinuxCNC at the hardware interface make sense to you? Are there LinuxCNC behaviours or use cases that would be especially useful to test with this approach?
Frederic
I've been working on a standalone CNC machine simulator for LinuxCNC and have now published the first experimental version.
The main idea is that the simulator does NOT interpret G-code itself.
LinuxCNC remains responsible for G-code interpretation, trajectory planning, coordinate systems, offsets and compensation. The simulator sits behind LinuxCNC where real motion hardware would normally be connected.
Currently I use the original Stepper-Ninja HAL driver and its UDP protocol as the interface:
G-code
|
v
LinuxCNC
|
v
Trajectory planner / compensation
|
v
Original Stepper-Ninja HAL driver
|
| UDP
v
linuxcnc-sim
|
+-- virtual machine motion
+-- virtual digital inputs
+-- limit switches
+-- probe input
+-- OpenGL visualization
+-- voxel workpiece
+-- material removalThe important part of this approach is that the simulator sees the motion that LinuxCNC actually sends to the virtual hardware instead of trying to reproduce LinuxCNC's trajectory planner.
Communication is bidirectional. The simulator can also send virtual machine inputs back to LinuxCNC. I can already use this for limit switches, homing and a simple configurable probe plane.
The current version also contains a sparse voxel workpiece and persistent material removal. Tool movement is processed as continuous swept volumes rather than just removing material at individual sampled positions.
One interesting problem was performance during curved motion. LinuxCNC can generate many small motion segments. Instead of approximating those segments with a larger chord, I batch the actual swept segments for a short time window and calculate the union of their removal volumes. This keeps the resulting voxel state identical while greatly reducing repeated work.
At the moment the simulation is still quite limited:
- flat-end cutter only
- no geometric stock probing yet
- no toolsetter yet
- no spindle/holder model
- no general collision detection
- no rotary material transform
The next area I would like to work on is geometric contact detection. My idea is to use the same contact system later for workpiece probing, a machine-fixed toolsetter and eventually collision detection.
Stepper-Ninja is currently just the interface between LinuxCNC and the simulator. A physical machine does not need to use Stepper-Ninja hardware. I chose it because an existing LinuxCNC HAL driver and a small bidirectional protocol already existed, so I did not have to invent another LinuxCNC hardware interface.
This is my first public release and I consider it experimental development software, not a machine safety system.
Source and v0.1.0:
github.com/FredericM88/linuxcnc-sim
I would be particularly interested in feedback about the architecture. Does placing the simulator behind LinuxCNC at the hardware interface make sense to you? Are there LinuxCNC behaviours or use cases that would be especially useful to test with this approach?
Frederic
- trackwhack
- trackwhack
03 Oct 2026 05:25
Replied by trackwhack on topic Perpetual License CAM
Perpetual License CAM
Category: Show Your Stuff
Hi @dbtayl
Thanks for taking the time to write all of this up, and for the screenshots -- they made every point easy to follow.
Here's where each one stands.
Chamfer running into a wall (your first report): fixed for 1.0.8. An edge run that ends against the part -- a wall, a pocket corner, a slot or step just past the end, a fillet rising from it -- now stops each pass where the tool would touch the part, and a notice tells you how much of the edge is left and where. A free end is cut through, with the tool running on past it into air, and a convex corner runs out the way a CAD chamfer on that edge would. While we were in there we also fixed Mill Chamfer cutting into the faces at the corners of an open chain, and a link between passes that cut across the corner. Every case was measured against the finished part.
AFR list: you were right that something was off -- features you picked by hand were being listed in the AFR panel as if AFR had found them. The AFR list now shows only what AFR detected. Fixed for 1.0.8.
Edge break on a face (your U-shaped top face): picking a flat face for a chamfer currently looks for a modelled chamfer on it, hence the geometry error. We're changing it so that picking a face breaks all of its edges, inside and out, at the width you enter -- the one-click edge break you were after. Auto loop should already walk the whole boundary of that face, and on a look-alike part it does, so something in your geometry stops it. The STEP would let us find out what (see below).
Edge break hitting the boss: reproduced. The rim of a slot is a closed loop, and nothing checked the tool against the rest of the part along the pass. We're extending the check to the whole pass: where the tool would hit the part, it lifts over and carries on past, and tells you what it skipped. Start point control is still on the list as well.
Pocket entry: confirmed. Only the first entry at each depth uses the helix. After a retract -- and a pocket with an island retracts between rings -- the tool comes back down with a straight plunge, and the island also switches Keep tool down off. Every re-entry will follow the entry method you chose: link through area already cleared where it can, otherwise come down in cleared area, otherwise helix, and plunge only when no helix fits, with a notice.
Helix angle: today it's fixed at 3 degrees (you can only set the pitch per turn). We're adding a max ramp angle to each tool in the library, which fills in a ramp angle on every op with a helix or ramp entry, so you can still change it per op.
The green highlight: that's the selected op's picked faces, kept lit on purpose so you can see what the op cuts. It shouldn't hide the toolpath, though -- we'll change how it's drawn once the op has a toolpath.
Adaptive: I couldn't reproduce the stock outside the part being left behind -- a test part with 50 mm of stock all round cleared right to the edge -- so something about your setup is different. On depth of cut, you're right: Adaptive adds extra levels at flat floors, so the depths vary. We'll add a fixed-stepdown option, where every level is the same depth and the floors are left for a finishing op.
Leads: separate lead-in and lead-out, a line or an arc, the arc's sweep -- all noted. That's a bigger piece of work, and it's on the list after the items above.
And I agree with your broader point: give people the plain manual control first, then the convenience. We're going through each Mill op's settings with exactly that in mind.
One ask: could you attach the project file (.tks) and the part's STEP to your bug report on the hub (hub.takshakcam.com)? That will let us see why Adaptive left the outside stock and what stops Auto loop on that face.
Thanks again for the detailed write-up and the kind words. I'll post here when 1.0.8 is out.
Kind Regards,
George
Thanks for taking the time to write all of this up, and for the screenshots -- they made every point easy to follow.
Here's where each one stands.
Chamfer running into a wall (your first report): fixed for 1.0.8. An edge run that ends against the part -- a wall, a pocket corner, a slot or step just past the end, a fillet rising from it -- now stops each pass where the tool would touch the part, and a notice tells you how much of the edge is left and where. A free end is cut through, with the tool running on past it into air, and a convex corner runs out the way a CAD chamfer on that edge would. While we were in there we also fixed Mill Chamfer cutting into the faces at the corners of an open chain, and a link between passes that cut across the corner. Every case was measured against the finished part.
AFR list: you were right that something was off -- features you picked by hand were being listed in the AFR panel as if AFR had found them. The AFR list now shows only what AFR detected. Fixed for 1.0.8.
Edge break on a face (your U-shaped top face): picking a flat face for a chamfer currently looks for a modelled chamfer on it, hence the geometry error. We're changing it so that picking a face breaks all of its edges, inside and out, at the width you enter -- the one-click edge break you were after. Auto loop should already walk the whole boundary of that face, and on a look-alike part it does, so something in your geometry stops it. The STEP would let us find out what (see below).
Edge break hitting the boss: reproduced. The rim of a slot is a closed loop, and nothing checked the tool against the rest of the part along the pass. We're extending the check to the whole pass: where the tool would hit the part, it lifts over and carries on past, and tells you what it skipped. Start point control is still on the list as well.
Pocket entry: confirmed. Only the first entry at each depth uses the helix. After a retract -- and a pocket with an island retracts between rings -- the tool comes back down with a straight plunge, and the island also switches Keep tool down off. Every re-entry will follow the entry method you chose: link through area already cleared where it can, otherwise come down in cleared area, otherwise helix, and plunge only when no helix fits, with a notice.
Helix angle: today it's fixed at 3 degrees (you can only set the pitch per turn). We're adding a max ramp angle to each tool in the library, which fills in a ramp angle on every op with a helix or ramp entry, so you can still change it per op.
The green highlight: that's the selected op's picked faces, kept lit on purpose so you can see what the op cuts. It shouldn't hide the toolpath, though -- we'll change how it's drawn once the op has a toolpath.
Adaptive: I couldn't reproduce the stock outside the part being left behind -- a test part with 50 mm of stock all round cleared right to the edge -- so something about your setup is different. On depth of cut, you're right: Adaptive adds extra levels at flat floors, so the depths vary. We'll add a fixed-stepdown option, where every level is the same depth and the floors are left for a finishing op.
Leads: separate lead-in and lead-out, a line or an arc, the arc's sweep -- all noted. That's a bigger piece of work, and it's on the list after the items above.
And I agree with your broader point: give people the plain manual control first, then the convenience. We're going through each Mill op's settings with exactly that in mind.
One ask: could you attach the project file (.tks) and the part's STEP to your bug report on the hub (hub.takshakcam.com)? That will let us see why Adaptive left the outside stock and what stops Auto loop on that face.
Thanks again for the detailed write-up and the kind words. I'll post here when 1.0.8 is out.
Kind Regards,
George
- dbtayl
- dbtayl
02 Oct 2026 23:07
Replied by dbtayl on topic Perpetual License CAM
Perpetual License CAM
Category: Show Your Stuff
For context, this is what I'd expect to be able to get out of the Adaptive operation:
That lets me set the speeds/feeds to optimize MRR within my machine's limits, based on the depth of cut I know it's taking. If it starts taking variable depths of cut, I'm running far slower than I need to for the shallow stepdowns. Not to say Z level detection is a bad feature at all! if I weren't so obsessive about trying to optimize toolpaths, it'd be great to have a one-click option. But it's suboptimal if you're trying to optimize cut time.
I'll try not to be a broken record about this, but IMO give me the dumbest, most manual way of specifying an operation first. Once that's bombproof, make it nicer/easier. Doesn't matter how easy it is if I have no way to get the output I want.
And again... I have strong opinions, they may not reflect the general public's. You should design your software to work for your target demographic, not a single squeaky wheel on a forum.
That lets me set the speeds/feeds to optimize MRR within my machine's limits, based on the depth of cut I know it's taking. If it starts taking variable depths of cut, I'm running far slower than I need to for the shallow stepdowns. Not to say Z level detection is a bad feature at all! if I weren't so obsessive about trying to optimize toolpaths, it'd be great to have a one-click option. But it's suboptimal if you're trying to optimize cut time.
I'll try not to be a broken record about this, but IMO give me the dumbest, most manual way of specifying an operation first. Once that's bombproof, make it nicer/easier. Doesn't matter how easy it is if I have no way to get the output I want.
And again... I have strong opinions, they may not reflect the general public's. You should design your software to work for your target demographic, not a single squeaky wheel on a forum.
- dbtayl
- dbtayl
02 Oct 2026 22:43
Replied by dbtayl on topic Perpetual License CAM
Perpetual License CAM
Category: Show Your Stuff
I've updated my initial comments to reflect where I mis-represented things.
I'll try to move more detailed bug reporting to your actual system, but quick notes below. Also a reminder that I'm just one voice- what I say isn't law, and the way I expect things to work isn't necessarily "right". So long as you can get to the same end result, there's room for interpretation. It's when you literally can't do what you need to that there's a problem.
Adaptive doesn't clear outside stock, regardless of bounding box vs silhouette selection. This is with bbox (silhouette is even more constrained):
(you can also see it cutting a bunch of layers, when I'd really like it to do one depth on the outside and one on the inside- at least the option to control that)
Re AFR: This appears to be a different bug than I presented- it appears cuts you add manually subsequently show up in the AFR list- that caused me to believe it was partially detecting features, when in fact I had only partially selected them.
Re chamfer: The highlighted face is one giving me problems. There's no chamfer modeled on it- I just want to do a slight edge break. The entire contour has tangent end points- tiny radii in the "sharp" corners. If I select the face and try to chamfer, I get an error about the geometry. If I select auto loop, it only touches the outside of the "U" shape. I have yet to get manual selection to work- it's really tedious, and the couple times I've tried it's said it's an open loop and can't connect the edges.
Separate chamfer issue- maybe your fix mentioned above will correct it- but it's not just walls. In this case, trying to deburr (again, add a small 0.1mm edge break to the slot in the bottom) will run into the boss marked in yellow. This is one of the places where being able to adjust the start point would be helpful- normally what I do in these cases is to manually offset the start of the path to skip the area that's problematic.
Re lead-in/-out: This is more about options than operations that I saw that need it. There are lots of places where more control over the lead is required. Different leads for the lead-in and -out may be appropriate. Sometimes you want to lead in with a tangent line, not an arc. Sometimes you want an arc, but only 60 degrees, not 90.
New thing I just found: Pocket operation doesn't seem to respect the entry method for more than the first pass- you can see one helix entry, then a plunge on the outside pass. Doesn't seem to matter if I check the "keep tool down" box or not.
(this also illustrates a second thing I think is a bug- that green face is stuck highlighted, makes it hard to see the toolpaths)
And while I'm being picky... controlling the helix angle is important. Some tools choke at more than 1 degree, others are fine at 5 degrees.
OK, that wasn't that quick... but I'd like to end on a positive note here. Like I said in my initial post, I think the core looks really good here, and you're clearly dedicated to making things better. I really like to see that, and am optimistic you'll get there quickly.
I'll try to move more detailed bug reporting to your actual system, but quick notes below. Also a reminder that I'm just one voice- what I say isn't law, and the way I expect things to work isn't necessarily "right". So long as you can get to the same end result, there's room for interpretation. It's when you literally can't do what you need to that there's a problem.
Adaptive doesn't clear outside stock, regardless of bounding box vs silhouette selection. This is with bbox (silhouette is even more constrained):
(you can also see it cutting a bunch of layers, when I'd really like it to do one depth on the outside and one on the inside- at least the option to control that)
Re AFR: This appears to be a different bug than I presented- it appears cuts you add manually subsequently show up in the AFR list- that caused me to believe it was partially detecting features, when in fact I had only partially selected them.
Re chamfer: The highlighted face is one giving me problems. There's no chamfer modeled on it- I just want to do a slight edge break. The entire contour has tangent end points- tiny radii in the "sharp" corners. If I select the face and try to chamfer, I get an error about the geometry. If I select auto loop, it only touches the outside of the "U" shape. I have yet to get manual selection to work- it's really tedious, and the couple times I've tried it's said it's an open loop and can't connect the edges.
Separate chamfer issue- maybe your fix mentioned above will correct it- but it's not just walls. In this case, trying to deburr (again, add a small 0.1mm edge break to the slot in the bottom) will run into the boss marked in yellow. This is one of the places where being able to adjust the start point would be helpful- normally what I do in these cases is to manually offset the start of the path to skip the area that's problematic.
Re lead-in/-out: This is more about options than operations that I saw that need it. There are lots of places where more control over the lead is required. Different leads for the lead-in and -out may be appropriate. Sometimes you want to lead in with a tangent line, not an arc. Sometimes you want an arc, but only 60 degrees, not 90.
New thing I just found: Pocket operation doesn't seem to respect the entry method for more than the first pass- you can see one helix entry, then a plunge on the outside pass. Doesn't seem to matter if I check the "keep tool down" box or not.
(this also illustrates a second thing I think is a bug- that green face is stuck highlighted, makes it hard to see the toolpaths)
And while I'm being picky... controlling the helix angle is important. Some tools choke at more than 1 degree, others are fine at 5 degrees.
OK, that wasn't that quick... but I'd like to end on a positive note here. Like I said in my initial post, I think the core looks really good here, and you're clearly dedicated to making things better. I really like to see that, and am optimistic you'll get there quickly.
- NWE

02 Oct 2026 20:32
I'm pretty sure I have a couple GTX1070 GPUs around here, I don't recall having much trouble with them, but have not recently run LinuxCNC with RT kernel on one. I might have live-booted it at some point but don't remember how it went. I will certainly try it out soon and if I make any progress on that I will share here.
You mention my project, I assume you are referring to halflow? That one got pushed back lately due to other high priority projects eating all my time. When I get back to it, I want to do a major rewrite of it. My new idea is to spend a lot more time planning the structure before the coding starts. AI/llm all the way. I can read and write bash, python and C++ but AI is just faster.
On several different recent projects I spent literally days planning and refining the whole thing before the coding started. I produce a big detailed text file with help from chatgpt, with the build split into stages and finally give it to claude and basically say go. Of course, it ends up needing lots of follow-up and direction. It produced a more coherent build. Back when I started with halflow I had only a vague idea what the end result was supposed to look like, so I simply plunged into building and trying stuff, eventually it became something of a spaghetti program for lack of a solid plan structure. To date, I've refused to buy anything more than Claude/Chatgpt's entry level $20usd/month plans. When they block me saying my quota is used up I say time for a break.
Replied by NWE on topic What once was no longer works.
What once was no longer works.
Category: Configuration Tools
Nice. I also enjoy using capable 'almost out-of-date by today's standards' PCs. There's lots of them that run great on linux.
I had an old I5 pc that I am repurposing. I have an old GTX1070 I was trying to get to work with the RT kernel (fail), so the gcode preview wouldn't take so long to load with 5MB+ file sizes.. I get that users can run linuxcnc on PI and other micro controllers, but I thought I could just repurpose this old pc to do the job, and have some cool bigger "out of left field" features. haha
I'm pretty sure I have a couple GTX1070 GPUs around here, I don't recall having much trouble with them, but have not recently run LinuxCNC with RT kernel on one. I might have live-booted it at some point but don't remember how it went. I will certainly try it out soon and if I make any progress on that I will share here.
You mention my project, I assume you are referring to halflow? That one got pushed back lately due to other high priority projects eating all my time. When I get back to it, I want to do a major rewrite of it. My new idea is to spend a lot more time planning the structure before the coding starts. AI/llm all the way. I can read and write bash, python and C++ but AI is just faster.
On several different recent projects I spent literally days planning and refining the whole thing before the coding started. I produce a big detailed text file with help from chatgpt, with the build split into stages and finally give it to claude and basically say go. Of course, it ends up needing lots of follow-up and direction. It produced a more coherent build. Back when I started with halflow I had only a vague idea what the end result was supposed to look like, so I simply plunged into building and trying stuff, eventually it became something of a spaghetti program for lack of a solid plan structure. To date, I've refused to buy anything more than Claude/Chatgpt's entry level $20usd/month plans. When they block me saying my quota is used up I say time for a break.
- spumco
- spumco
02 Oct 2026 18:23
It's really dependent on your location.
Some makes/models just aren't available in certain locations. @tommylight's suggestion of a Maho is fine if you're in Europe, but not in the US.
You'll want to find something local - if not, the transport costs will likely double the cost of an old machine.
And location also dictates - to some extent - the electrical supply you have to work with.
Power, at least in the US, is the primary bottleneck for many home-machinists. You can hire riggers, build a giant workshop, pour a thick concrete pad... but if you don't have enough amps to your house/location (or your breaker/service is near capacity) then it will be very expensive to upgrade your electrical system to handle a 3-phase converter. In this case you might still be able to run a Bridgeport-ish sized mill, but you will have to budget for a phase converting VFD as well as single-phase servo drives.
So...
Location?
Budget?
Power availability? (i.e. what phase/voltage/amps do you have - or can get w/in your budget?)
Maximum work envelope?
Replied by spumco on topic Looking for an older CNC mill to refurbish/retrofit
Looking for an older CNC mill to refurbish/retrofit
Category: General LinuxCNC Questions
I'm starting a search for an older CNC vertical/knee mill for my home shop and thought I'd introduce myself and ask for advice before buying something.
What machines from this era are worth saving, and what should I inspect before buying?
Thanks in advance
It's really dependent on your location.
Some makes/models just aren't available in certain locations. @tommylight's suggestion of a Maho is fine if you're in Europe, but not in the US.
You'll want to find something local - if not, the transport costs will likely double the cost of an old machine.
And location also dictates - to some extent - the electrical supply you have to work with.
Power, at least in the US, is the primary bottleneck for many home-machinists. You can hire riggers, build a giant workshop, pour a thick concrete pad... but if you don't have enough amps to your house/location (or your breaker/service is near capacity) then it will be very expensive to upgrade your electrical system to handle a 3-phase converter. In this case you might still be able to run a Bridgeport-ish sized mill, but you will have to budget for a phase converting VFD as well as single-phase servo drives.
So...
Location?
Budget?
Power availability? (i.e. what phase/voltage/amps do you have - or can get w/in your budget?)
Maximum work envelope?
- trackwhack
- trackwhack
02 Oct 2026 16:26
Replied by trackwhack on topic Perpetual License CAM
Perpetual License CAM
Category: Show Your Stuff
Hi @dbtayl, a follow-up on the chamfer point. You were right, and we've reproduced it.
When the edge you chamfer ends against a wall, the path runs the tool to the end of the edge, and the tool's side cuts into the wall. That was 3 mm with a 6 mm V-bit on our test part. Collision detection doesn't come into it: the chamfer path should never touch that wall in the first place.
While chasing it, we found a second issue in Mill Chamfer: the outside corners of an open chain of edges are cut up to 0.8 mm too deep. Closed loops (outer rims, pocket rims) are not affected by either.
Both are logged on our community hub. The fixes will be in the next update (1.0.8).
Thanks again. This is exactly the kind of report that makes the product better.
When the edge you chamfer ends against a wall, the path runs the tool to the end of the edge, and the tool's side cuts into the wall. That was 3 mm with a 6 mm V-bit on our test part. Collision detection doesn't come into it: the chamfer path should never touch that wall in the first place.
While chasing it, we found a second issue in Mill Chamfer: the outside corners of an open chain of edges are cut up to 0.8 mm too deep. Closed loops (outer rims, pocket rims) are not affected by either.
Both are logged on our community hub. The fixes will be in the next update (1.0.8).
Thanks again. This is exactly the kind of report that makes the product better.
- spumco
- spumco
02 Oct 2026 15:31
Replied by spumco on topic New LinuxCNC Multi-Channel System – Looking for Testers & Feedback
New LinuxCNC Multi-Channel System – Looking for Testers & Feedback
Category: Show Your Stuff
I’m also looking for a real machine for extended testing of the multi-channel system. It does not matter whether the machine still has the original drives.
Are you located in the US? If so, I can help you find/obtain a really cheap machine for testing. HGR Surplus typically has a number of obsolete swiss-type lathes for sale that can be had for essentially scrap value.
I'm only about an hour from HGR and can get eyes on any machine candidates if you're serious about acquiring hardware for testing.
Are you located in the US? If so, I can help you find/obtain a really cheap machine for testing. HGR Surplus typically has a number of obsolete swiss-type lathes for sale that can be had for essentially scrap value.
I'm only about an hour from HGR and can get eyes on any machine candidates if you're serious about acquiring hardware for testing.
- spumco
- spumco
02 Oct 2026 15:25
Replied by spumco on topic New LinuxCNC Multi-Channel System – Looking for Testers & Feedback
New LinuxCNC Multi-Channel System – Looking for Testers & Feedback
Category: Show Your Stuff
If anyone is interested in testing the system, contributing, or discussing the architecture, I’d be happy to share more details, screenshots and videos.
I don't have a machine that's a perfect candidate for testing, but I do have a subspindle gang-tool lathe with a separate parting slide mounted to the headstock. Both the slide - configured as either a V or X axis using switchkins - and the subspindle could be re-configured in a separate channel if that would be of any use to you.
Just to clarify, my sub is mounted on the X-slide and is intended to be used with tools (eventually) mounted next to the headstock for back-work.
My operations are (will be) sequential, other than the parting and sub hand-off; it's not the textbook example of multi-channel like a swiss or sliding headstock.
I am not skilled enough to really help with coding, but if you can walk me through a configuration and GUI setup I'd be happy to try something. Servos are step/dir with glass scale feedback.
And another thing... I struggled with LCNC's limitations on axis letters. While my main spindle is also the C-axis, my sub is not defined as an axis despite being mechanically capable of it (servo driven). I'm not aware of any way to add axes beyond the standard 9 which also participate in the trajectory planner (i.e. not 'extra-joints'). I would rally have liked to name the sub "C2" or similar. In your post you indicated 'C1' and 'C2' and that axes could be shifted between channels, but it's not clear how axes beyond the usual letters are named or handled. I'd be interested in how you're addressing duplicate axis names - a basic swiss lathe capable of simultaneous sub work would need C1, X1, Z1 (main) and C2, X2, Z2 (sub).
As @tommylight said, this would be a monumental addition to LCNC.
I don't have a machine that's a perfect candidate for testing, but I do have a subspindle gang-tool lathe with a separate parting slide mounted to the headstock. Both the slide - configured as either a V or X axis using switchkins - and the subspindle could be re-configured in a separate channel if that would be of any use to you.
Just to clarify, my sub is mounted on the X-slide and is intended to be used with tools (eventually) mounted next to the headstock for back-work.
My operations are (will be) sequential, other than the parting and sub hand-off; it's not the textbook example of multi-channel like a swiss or sliding headstock.
I am not skilled enough to really help with coding, but if you can walk me through a configuration and GUI setup I'd be happy to try something. Servos are step/dir with glass scale feedback.
And another thing... I struggled with LCNC's limitations on axis letters. While my main spindle is also the C-axis, my sub is not defined as an axis despite being mechanically capable of it (servo driven). I'm not aware of any way to add axes beyond the standard 9 which also participate in the trajectory planner (i.e. not 'extra-joints'). I would rally have liked to name the sub "C2" or similar. In your post you indicated 'C1' and 'C2' and that axes could be shifted between channels, but it's not clear how axes beyond the usual letters are named or handled. I'd be interested in how you're addressing duplicate axis names - a basic swiss lathe capable of simultaneous sub work would need C1, X1, Z1 (main) and C2, X2, Z2 (sub).
As @tommylight said, this would be a monumental addition to LCNC.
- grandixximo

02 Oct 2026 12:13 - 02 Oct 2026 12:16
Replied by grandixximo on topic Would you use a feed rate for rotary axes in mm/min (surface speed)?
Would you use a feed rate for rotary axes in mm/min (surface speed)?
Category: General LinuxCNC Questions
djdelorie, the error idea is good, and it's the missing half of this. With a radius reference available, the state space for a rotary cutting move in G94 becomes:
G93 active: fine, inverse time.
G94 with a radius set (INI default or a G-code word): fine, surface feed.
G94 with no radius anywhere: today this silently runs deg/min, your "stupidly slow" case.
An opt-in INI guard makes state 3 a hard error instead of a slow wreck: "rotary feed move with no radius reference, add G93 or set a feed radius". Loud failure with the fix in the message, instead of finding out by watching the machine crawl. Every rotary machine then either runs a correct feed or refuses to run.
The guard alone is worth having even without the rest, since it catches the forgotten-G93 case you described, which the feed feature by itself doesn't. Cheap to implement, breaks nothing, machine builder opts in.
On "anything new is work and learning": agreed, which is why I'd keep the operator-facing part to one G-code word and let everything else default to today's behavior. The guard is the one piece aimed at operators, and its whole job is to say "stop, your program is missing something" instead of teaching them a new mode.
G93 active: fine, inverse time.
G94 with a radius set (INI default or a G-code word): fine, surface feed.
G94 with no radius anywhere: today this silently runs deg/min, your "stupidly slow" case.
An opt-in INI guard makes state 3 a hard error instead of a slow wreck: "rotary feed move with no radius reference, add G93 or set a feed radius". Loud failure with the fix in the message, instead of finding out by watching the machine crawl. Every rotary machine then either runs a correct feed or refuses to run.
The guard alone is worth having even without the rest, since it catches the forgotten-G93 case you described, which the feed feature by itself doesn't. Cheap to implement, breaks nothing, machine builder opts in.
On "anything new is work and learning": agreed, which is why I'd keep the operator-facing part to one G-code word and let everything else default to today's behavior. The guard is the one piece aimed at operators, and its whole job is to say "stop, your program is missing something" instead of teaching them a new mode.
- grandixximo

02 Oct 2026 12:10
Replied by grandixximo on topic Would you use a feed rate for rotary axes in mm/min (surface speed)?
Would you use a feed rate for rotary axes in mm/min (surface speed)?
Category: General LinuxCNC Questions
tuxcnc, on the Mach3 comparison I think you're aiming at the wrong part. The thing that's bad in Mach3's rotation radius DRO isn't the concept, it's that the radius is a value the operator types per stock and nothing in the program records it. That critique I fully agree with, and it's exactly why a G/M word carrying the radius in the file is the right mechanism, as you said: one file, reusable per diameter in a single program, unused by anyone who doesn't want it. Nothing to argue about there.
Where I disagree is "the same g-code should execute the same way on different machines". That was never true, in LinuxCNC or anywhere else. WRAPPED_ROTARY in the INI already changes what G0 A400 does. The default G64 tolerance, the G20/G21 default, startup codes, and above all the kinematics the machine builder picks, all change how the same file executes. G-code describes a toolpath relative to a machine definition; cross-machine portability has always been the post-processor's job, not the interpreter's. An opt-in INI value that no existing config sets is the same kind of contract as those knobs: unset means behavior identical to today, zero risk to twenty-year-old programs.
And it isn't Mach3 lineage. Siemens has FGREF for exactly this, settable from the program, which is an argument for your G-code form. Fanuc goes further in the direction you dislike: a parameter bit switches rotary feed from deg/min to length/min outright (1404#1 RFD, if I remember the number right). So both ends exist in serious industrial controls.
On "questions like who would like it are the wrong questions": I think asking is precisely the right first step. A project like this stays alive for 20 years because the people building it keep an ear on what users actually need, and because users see that asking can lead somewhere. "Devs build whatever comes to mind, users take it or leave it" is the model that slowly empties a user base. A quick census before sinking weeks into a feature isn't design-by-committee, it's just checking that the work lands with someone. Nobody is bound by the answers; I'll weigh the design on its merits, this thread included.
Net result of the thread so far, the way I read it: G93 covers the CAM crowd, hand-writers would take a G-code word for the radius, and whatever lands must not change behavior on any existing config. That's a useful outcome for a few days of asking.
Where I disagree is "the same g-code should execute the same way on different machines". That was never true, in LinuxCNC or anywhere else. WRAPPED_ROTARY in the INI already changes what G0 A400 does. The default G64 tolerance, the G20/G21 default, startup codes, and above all the kinematics the machine builder picks, all change how the same file executes. G-code describes a toolpath relative to a machine definition; cross-machine portability has always been the post-processor's job, not the interpreter's. An opt-in INI value that no existing config sets is the same kind of contract as those knobs: unset means behavior identical to today, zero risk to twenty-year-old programs.
And it isn't Mach3 lineage. Siemens has FGREF for exactly this, settable from the program, which is an argument for your G-code form. Fanuc goes further in the direction you dislike: a parameter bit switches rotary feed from deg/min to length/min outright (1404#1 RFD, if I remember the number right). So both ends exist in serious industrial controls.
On "questions like who would like it are the wrong questions": I think asking is precisely the right first step. A project like this stays alive for 20 years because the people building it keep an ear on what users actually need, and because users see that asking can lead somewhere. "Devs build whatever comes to mind, users take it or leave it" is the model that slowly empties a user base. A quick census before sinking weeks into a feature isn't design-by-committee, it's just checking that the work lands with someone. Nobody is bound by the answers; I'll weigh the design on its merits, this thread included.
Net result of the thread so far, the way I read it: G93 covers the CAM crowd, hand-writers would take a G-code word for the radius, and whatever lands must not change behavior on any existing config. That's a useful outcome for a few days of asking.
- djdelorie
- djdelorie
02 Oct 2026 11:57
Replied by djdelorie on topic Would you use a feed rate for rotary axes in mm/min (surface speed)?
Would you use a feed rate for rotary axes in mm/min (surface speed)?
Category: General LinuxCNC Questions
I will suggest another option... An INI setting that causes any A motion other than a rapid to be an error, in G94 mode, or perhaps a pop-up warning.
A G94.1 mode for "It's G94 but use the X/Y/Z in the INI as the rotary center for calculations" would be nice, but anything "new" is work and learning for operators.
A G94.1 mode for "It's G94 but use the X/Y/Z in the INI as the rotary center for calculations" would be nice, but anything "new" is work and learning for operators.
- trackwhack
- trackwhack
02 Oct 2026 09:20
Replied by trackwhack on topic Perpetual License CAM
Perpetual License CAM
Category: Show Your Stuff
Danke Juergen, wir werden es uns ansehen.
- trackwhack
- trackwhack
02 Oct 2026 09:11
Replied by trackwhack on topic Perpetual License CAM
Perpetual License CAM
Category: Show Your Stuff
Hi @dbtayl. Thank you for the observations. Here are some thoughts on the ODD and Bad.
The Odd
1) Both Z43 and Mouse behaviour can be set in preferences.
2) Updates will be available for upto 24 months from a product launch. After that the product works as is forever. We expect to release a new product that keeps up with changes in OS and tech. You can continue using the old one forever.
3) We use Paddle - a UK based MOR. We are adding Paypal directly to the options soon to make it easier.
4) Let us know if you face any specific bugs and we can address it. We have a community hub website. We track all bugs live there and currently the queue is clean.
The Bad
1) Yes you can, the op specific parameters allow you to choose between sihouette and Bounding box
2) We will refine the strategy in the coming weeks. Thank you for the input
3) Understood, this is a likely bug where the face picker may be masking the edge picker. We will investigate and fix
4) Ramps for pocket is scheduled as a 1.0.10 update. About 3 weeks out from today.
5) Yes, we limited it to the operations we thought needed it. Can you kindly tell us which other ops you find it useful and missing
6) Our website states that collision detection is available only for 3D Ops and Complex Rotary Ops. Never oversold. If some literature miscommunicated the same, kindly let us know.
7) We have pick start in the op config section for the ops that we thought needed it. Once again, if you can help us identify other ops you think qualify for it, we'd be happy to take a look at it.
Your comment on AFR being a hit or miss is especially worrying to us as this is the first time we received this as feedback. All other customers are very happy with it and have not reported any false positives yet. Can you tell us how bad the miss was?
In process stock is scheduled for 1.0.12, which is about 5 weeks off.
Overall we thank you for an unbiased critical view of our app and we are certain we can improve all of these to meet your expectations.
The Odd
1) Both Z43 and Mouse behaviour can be set in preferences.
2) Updates will be available for upto 24 months from a product launch. After that the product works as is forever. We expect to release a new product that keeps up with changes in OS and tech. You can continue using the old one forever.
3) We use Paddle - a UK based MOR. We are adding Paypal directly to the options soon to make it easier.
4) Let us know if you face any specific bugs and we can address it. We have a community hub website. We track all bugs live there and currently the queue is clean.
The Bad
1) Yes you can, the op specific parameters allow you to choose between sihouette and Bounding box
2) We will refine the strategy in the coming weeks. Thank you for the input
3) Understood, this is a likely bug where the face picker may be masking the edge picker. We will investigate and fix
4) Ramps for pocket is scheduled as a 1.0.10 update. About 3 weeks out from today.
5) Yes, we limited it to the operations we thought needed it. Can you kindly tell us which other ops you find it useful and missing
6) Our website states that collision detection is available only for 3D Ops and Complex Rotary Ops. Never oversold. If some literature miscommunicated the same, kindly let us know.
7) We have pick start in the op config section for the ops that we thought needed it. Once again, if you can help us identify other ops you think qualify for it, we'd be happy to take a look at it.
Your comment on AFR being a hit or miss is especially worrying to us as this is the first time we received this as feedback. All other customers are very happy with it and have not reported any false positives yet. Can you tell us how bad the miss was?
In process stock is scheduled for 1.0.12, which is about 5 weeks off.
Overall we thank you for an unbiased critical view of our app and we are certain we can improve all of these to meet your expectations.
Time to create page: 3.216 seconds