I finally managed to implement this and it seems to work very well.
What it does:
- Detects the first G5x coordinate system (G54–G59.3) used in a G-code file
- Prints a debug log to the terminal: [DEBUG] G57 on line 4
- Sends the detected G5x via MDI so that the GUI updates to reflect the active work coordinate system
How I implemented it:
I added the following method to the StatCanon class in:
/usr/lib/python3/dist-packages/qt5_graphics.py
def set_g5x_offset(self, index, x, y, z, a, b, c, u=None, v=None, w=None):
print("[DEBUG-TRACE] >>> set_g5x_offset() is running <<<")
g5x = {
1: "G54", 2: "G55", 3: "G56", 4: "G57",
5: "G58", 6: "G59", 7: "G59.1", 8: "G59.2", 9: "G59.3"
}
print(f"[DEBUG] set_g5x_offset() called: {g5x.get(index)} on line {getattr(self, 'lineno', '?')}")
if not getattr(self, "g5x_mdi_sent", False):
if self.lineno > 0:
self.g5x_mdi_sent = True
print(f"[DEBUG] Sending initial MDI: {g5x.get(index)}")
try:
import linuxcnc
c = linuxcnc.command()
c.mode(linuxcnc.MODE_MDI)
c.wait_complete()
c.mdi(g5x.get(index))
print(f"[DEBUG] Sent MDI: {g5x.get(index)}")
except Exception as e:
print(f"[ERROR] Failed to send MDI: {e}")
super().set_g5x_offset(index, x, y, z, a, b, c, u, v, w)
Notes:
- Make sure this method is placed inside the StatCanon class with consistent 4-space indentation.
- The initial G54 on line 0 and final G54 at the end (due to GUI reset) are ignored using: self.lineno > 0
- Only the first explicitly used G5x is applied via MDI.
- Verified to work reliably in QtDragon simulator config.
This improves usability by ensuring the GUI’s coordinate system matches what the G-code will actually use.
Tested with:
- LinuxCNC 2.9.4
- QtDragon (QtVCP)
- sim.qtdragon.qtdragon_tool_probe configuration
Let me know if this is helpful or if there’s a cleaner way to hook into the coordinate system logic.