From efc92d0380f90f7db57c9a86a0c566cbe17b1049 Mon Sep 17 00:00:00 2001 From: cnc Date: Sun, 24 May 2026 21:52:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20LinuxCNC=20NURBS=20?= =?UTF-8?q?=E5=B9=B3=E9=9D=A2=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/linuxcnc_canon_bridge.cpp | 35 +++++++++++++++++++-------- test-linuxcnc-source-link.sh | 16 ++++++++++++ tests/gcode/linuxcnc_g52_xz_nurbs.ngc | 7 ++++++ 3 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 tests/gcode/linuxcnc_g52_xz_nurbs.ngc diff --git a/core/src/linuxcnc_canon_bridge.cpp b/core/src/linuxcnc_canon_bridge.cpp index 7e7e40d..d3b4340 100644 --- a/core/src/linuxcnc_canon_bridge.cpp +++ b/core/src/linuxcnc_canon_bridge.cpp @@ -96,6 +96,27 @@ const CncSimPose ¤t_position() { return active_sink ? active_sink->position() : zero; } +template +CncSimPose nurbs_plane_point_to_pose(const NurbsPoint &point, CANON_PLANE plane) { + CncSimPose end = current_position(); + switch (plane) { + case CANON_PLANE::YZ: + end.y = point.NURBS_X; + end.z = point.NURBS_Y; + break; + case CANON_PLANE::XZ: + end.x = point.NURBS_Y; + end.z = point.NURBS_X; + break; + case CANON_PLANE::XY: + default: + end.x = point.NURBS_X; + end.y = point.NURBS_Y; + break; + } + return end; +} + void trace_call(const char *name) { if (std::getenv("CNC_SIM_TRACE_CANON")) { std::fprintf(stderr, "canon:%s\n", name); @@ -385,27 +406,21 @@ void STOP_SPEED_FEED_SYNCH() { } } -void NURBS_G5_FEED(int lineno, const std::vector &points, unsigned int, CANON_PLANE) { +void NURBS_G5_FEED(int lineno, const std::vector &points, unsigned int, CANON_PLANE plane) { if (!active_sink) { return; } for (const auto &point : points) { - CncSimPose end = active_sink->position(); - end.x = point.NURBS_X; - end.y = point.NURBS_Y; - active_sink->straight_feed(lineno, end); + active_sink->straight_feed(lineno, nurbs_plane_point_to_pose(point, plane)); } } -void NURBS_G6_FEED(int lineno, const std::vector &points, unsigned int, double, int, CANON_PLANE) { +void NURBS_G6_FEED(int lineno, const std::vector &points, unsigned int, double, int, CANON_PLANE plane) { if (!active_sink) { return; } for (const auto &point : points) { - CncSimPose end = active_sink->position(); - end.x = point.NURBS_X; - end.y = point.NURBS_Y; - active_sink->straight_feed(lineno, end); + active_sink->straight_feed(lineno, nurbs_plane_point_to_pose(point, plane)); } } diff --git a/test-linuxcnc-source-link.sh b/test-linuxcnc-source-link.sh index 8e08ce5..bbadea6 100755 --- a/test-linuxcnc-source-link.sh +++ b/test-linuxcnc-source-link.sh @@ -472,6 +472,10 @@ cp "$base_var_file" "$var_file" CNC_SIM_RS274_VAR="$var_file" \ "$build_dir/linuxcnc_rs274_source_dump" tests/gcode/linuxcnc_g52_offset.ngc \ >/tmp/cnc_sim_linuxcnc_source_g52_offset.json +cp "$base_var_file" "$var_file" +CNC_SIM_RS274_VAR="$var_file" \ + "$build_dir/linuxcnc_rs274_source_dump" tests/gcode/linuxcnc_g52_xz_nurbs.ngc \ + >/tmp/cnc_sim_linuxcnc_source_g52_xz_nurbs.json python3 - <<'PY' import json @@ -2026,6 +2030,17 @@ if g52_states != expected_g52_states: raise SystemExit(f"unexpected source-linked G52 shared offset sequence: {g52_states!r}") if not any(event["type"] == "program-end" and event["line"] == 7 for event in g52_offset): raise SystemExit("missing source-linked G52 offset program end line number") + +g52_xz_nurbs = json.loads(Path("/tmp/cnc_sim_linuxcnc_source_g52_xz_nurbs.json").read_text()) +if not any( + event["type"] == "linear-feed" and + event["plane"] == 18 and + event["end"]["x"] == 3 and + event["end"]["y"] == 0 and + event["end"]["z"] == 3 + for event in g52_xz_nurbs +): + raise SystemExit("missing source-linked G18/XZ NURBS endpoint mapped to X/Z axes") PY echo "linuxcnc rs274 source link smoke passed (${#objects[@]} local objects)" @@ -2112,3 +2127,4 @@ echo "dumped /tmp/cnc_sim_linuxcnc_source_coordinate_p0.json" echo "dumped /tmp/cnc_sim_linuxcnc_source_coordinate_select_all.json" echo "dumped /tmp/cnc_sim_linuxcnc_source_g92_restore.json" echo "dumped /tmp/cnc_sim_linuxcnc_source_g52_offset.json" +echo "dumped /tmp/cnc_sim_linuxcnc_source_g52_xz_nurbs.json" diff --git a/tests/gcode/linuxcnc_g52_xz_nurbs.ngc b/tests/gcode/linuxcnc_g52_xz_nurbs.ngc new file mode 100644 index 0000000..066c7b6 --- /dev/null +++ b/tests/gcode/linuxcnc_g52_xz_nurbs.ngc @@ -0,0 +1,7 @@ +G21 G90 G18 +F100 +G5.2 X1 Z1 P1 +G5.2 X2 Z2 P1 +G5.2 X3 Z3 P1 +G5.3 +M2