This commit is contained in:
2026-09-13 19:45:24 +08:00
parent 397a7a8cc4
commit 2db889ad89
58 changed files with 3526 additions and 213 deletions
@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class McAbcCyclicPathSyntax | HiAPI-C# 2025 ">
<meta name="description" content="Resolve modular rotary axes to the shortest cyclic path relative to the previous node. Uses to determine which axes within need cyclic resolution. Falls back to hardcoded A/B/C if no is available. Must be placed after in . Two stages, mirroring : Root MachineCoordinateState — anchored at the previous block&#39;s modal rotary state..[*] — sequential walk through items, anchoring item 0 at the previous block&#39;s modal state and item i &amp;gt; 0 at item i-1&#39;s post-cycle value (per-axis chain). Items without a rotary MachineCoordinateState are skipped. The items pass enables rotary motion (e.g. G28 ABC intermediate / home stages) to surface as motion segments rather than a single root-MC stamp. Per-word directional override: a block-root entry (stamped by ) valued (Siemens ACP()) or (ACN()) swaps that axis&#39;s window for this block only: [anchor, anchor+360&#176;) / (anchor-360&#176;, anchor] instead of the default &#177;180&#176; — the approach direction is forced even when it is the longer way around. A target congruent with the anchor (within an ULP-scale epsilon) keeps the anchor value verbatim — no move, never a spurious full turn, and no deg→rad→deg drift. (DC()) is the default window and needs no special path here. The override is read from the current block only (it is one-shot, never carried — deliberately unlike the modal RotaryWrap gate&#39;s one-step previous fallback) and applies to the root MC stage only, not to items (G28/G74/G75 expansions capture their words in sub-objects the stamping syntax never sees, so an override can only ever describe a root word). Directional/shortest entries keyed by an axis outside the modular set are reported as Coord-McAbc--003 — the promise cannot be honored there and silence would mis-read the program&#39;s intent; an entry with no anchor to resolve against (first rotary value in the stream) is reported as Coord-McAbc--004 and adopted unwrapped, matching the default path. Per-word incremental override: an entry (Siemens IC(), klartext IC+270) is a signed traverse by definition — already wrote anchor + delta — so this pass keeps that value verbatim for the axis instead of folding it into the &#177;180&#176; window (a +270&#176; chain dimension must not become a -90&#176; swing). Incremental entries on non-modular axes need no warning: the literal value is what the axis would do anyway.">
<meta name="description" content="Resolve modular rotary axes to the shortest cyclic path relative to the previous node. Uses to determine which axes within need cyclic resolution. Falls back to hardcoded A/B/C if no is available. Must be placed after in . Two stages, mirroring : Root MachineCoordinateState — anchored at the previous block&#39;s modal rotary state..[*] — sequential walk through items, anchoring item 0 at the previous block&#39;s modal state and item i &amp;gt; 0 at item i-1&#39;s post-cycle value (per-axis chain). Items without a rotary MachineCoordinateState are skipped. The items pass enables rotary motion (e.g. G28 ABC intermediate / home stages) to surface as motion segments rather than a single root-MC stamp. Per-word directional override: a block-root entry (stamped by ) valued (Siemens ACP()) or (ACN()) swaps that axis&#39;s window for this block only: [anchor, anchor+360&#176;) / (anchor-360&#176;, anchor] instead of the default &#177;180&#176; — the approach direction is forced even when it is the longer way around. A target congruent with the anchor (within an ULP-scale epsilon) keeps the anchor value verbatim — no move, never a spurious full turn, and no deg→rad→deg drift. (DC()) is the default window and needs no special path here. The override is read from the current block only (it is one-shot, never carried — deliberately unlike the modal RotaryWrap gate&#39;s one-step previous fallback) and applies to the root MC stage, not to items in general (G28/G74/G75 expansions capture their words in sub-objects the stamping syntax never sees, so an override can only ever describe a root word) — with one exception: an item whose value for an axis equals the root&#39;s pre-pass value verbatim carries that same root word (the canned-cycle pre-positioning item that stamps from the root MC) and inherits the root&#39;s directive for that axis, so the default window cannot fold the forced swing the root resolved into the short way. Directional/shortest entries keyed by an axis outside the modular set are reported as Coord-McAbc--003 — the promise cannot be honored there and silence would mis-read the program&#39;s intent; an entry with no anchor to resolve against (first rotary value in the stream) is reported as Coord-McAbc--004 and adopted unwrapped, matching the default path. Per-word incremental override: an entry (Siemens IC(), klartext IC+270) is a signed traverse by definition — already wrote anchor + delta — so this pass keeps that value verbatim for the axis instead of folding it into the &#177;180&#176; window (a +270&#176; chain dimension must not become a -90&#176; swing). Incremental entries on non-modular axes need no warning: the literal value is what the axis would do anyway.">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
@@ -129,10 +129,17 @@ deg→rad→deg drift. <a class="xref" href="Hi.NcParsers.Keywords.Positioning.h
is the default window and needs no special path here. The override
is read from the current block only (it is one-shot, never carried —
deliberately unlike the modal <code>RotaryWrap</code> gate's one-step
previous fallback) and applies to the root MC stage only, not to
<a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html">CompoundMotion</a> items (G28/G74/G75 expansions capture
their words in sub-objects the stamping syntax never sees, so an
override can only ever describe a root word). Directional/shortest
previous fallback) and applies to the root MC stage, not to
<a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html">CompoundMotion</a> items in general (G28/G74/G75 expansions
capture their words in sub-objects the stamping syntax never sees, so
an override can only ever describe a root word) — with one exception:
an item whose value for an axis equals the root's pre-pass value
verbatim carries that same root word (the canned-cycle
pre-positioning item that
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">WriteCompoundMotion(JsonObject, string, JsonArray, Vec3d)</a> stamps
from the root MC) and inherits the root's directive for that axis, so
the default window cannot fold the forced swing the root resolved
into the short way. Directional/shortest
entries keyed by an axis outside the modular set are reported as
<code>Coord-McAbc--003</code> — the promise cannot be honored there and
silence would mis-read the program's intent; an entry with no anchor
@@ -362,6 +369,39 @@ rewrote to -90° stays +270°:
"MachineCoordinateState": { "B": 270 },
"PositioningOverride": { "B": "Incremental" }
}</code></pre>
A <code>CompoundMotion</code> item carrying the root word verbatim — the
canned-cycle pre-positioning item that
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">WriteCompoundMotion(JsonObject, string, JsonArray, Vec3d)</a> stamps from
the root MC of a <code>B=ACP(270)</code> block — inherits the root's
<code>PositiveOnly</code> directive: both stay +270 instead of the item
folding to -90 as the plain items-walk case above would (same
numbers, opposite outcome). The second item is not a copy (170 ≠ 270)
and resolves under the default window against the chained anchor
270°, where 170 is already the short way:
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 0 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 270 },
"PositioningOverride": { "B": "PositiveOnly" },
"CompoundMotion": {
"Items": [
{ "MachineCoordinateState": { "B": 270 } },
{ "MachineCoordinateState": { "B": 170 } }
]
}
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 270 },
"PositioningOverride": { "B": "PositiveOnly" },
"CompoundMotion": {
"Items": [
{ "MachineCoordinateState": { "B": 270 } },
{ "MachineCoordinateState": { "B": 170 } }
]
}
}</code></pre>