This commit is contained in:
2026-09-15 01:12:50 +08:00
parent 2db889ad89
commit 1a75503105
99 changed files with 4168 additions and 726 deletions
@@ -358,6 +358,58 @@ downstream blocks unchanged).
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.Feedrate.html">Feedrate</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.IFeedrateDef.html">IFeedrateDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IncrementalWords.html">IncrementalWords</a></dt>
<dd><p>One-shot block-root record of the axis words this block programmed as
<b>increments</b> — under modal <code>G91</code>, or through a per-word
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Incremental">Incremental</a> entry (Siemens <code>IC()</code>,
klartext <code>IX+</code>/<code>IC+</code>) — valued with the programmed delta
and shaped like the <code>Parsing</code> tree the word came from: a root
word is a root key (<code>{ &ldquo;X&rdquo;: 10 }</code>, <code>{ &ldquo;C&rdquo;: 20 }</code>), a word
inside a nested record sits under that record's key
(<code>{ &ldquo;G28&rdquo;: { &ldquo;X&rdquo;: 0, &ldquo;C&rdquo;: 10 } }</code>,
<code>{ &ldquo;CC&rdquo;: { &ldquo;X&rdquo;: 0, &ldquo;Y&rdquo;: 11 } }</code>).</p>
<p>
Why it exists: the resolve is in place.
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> rewrites the word
inside <code>Parsing</code> to its absolute value and
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> writes the accumulated angle
into <code>MachineCoordinateState</code>, while the modal
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html">Positioning</a> section must keep saying <code>G91</code> for the
next block's lookback. From that point on
<code>{ "Positioning": G91, "Parsing": { "G28": { "X": 100 } } }</code> is
byte-identical to a program that wrote <code>G90 G28 X100.</code>, and once
the consumer has taken the word out of <code>Parsing</code> the programmed
text is gone from the JSON altogether. This section is the trace that
the word was an increment, and of what it was.
</p>
<p>
Written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> (the
words at its working paths — root, <code>G28</code>, the klartext
<code>CC</code> record) and <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> (root
rotary words). Read by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a>
as an idempotency guard — a word already listed at its path is never
converted twice, whatever the syntax list looks like (a project file
whose serialized list carries two instances, a re-run over a frozen
piece) — and by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a>,
where a listed rotary axis is a signed traverse that passes the
shortest-path wrap literally, whichever spelling made it incremental.
Not listed in any <a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html">ModalCarrySyntax</a> key
set — it never carries to later blocks.
</p>
<p>
Not recorded: coded-position words (Siemens <code>CIC()</code> counts
indexing positions, not an angle — its trace is the rewritten
<a class="xref" href="Hi.NcParsers.Keywords.PositioningOverride.html">PositioningOverride</a> entry), and the words the two
consumers ahead of the shared resolve take for themselves
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.Heidenhain.HeidenhainCannedCycleSyntax.html">HeidenhainCannedCycleSyntax</a>'s
cycle words, <a class="xref" href="Hi.NcParsers.LogicSyntaxs.MachineCoordSelectSyntax.html">MachineCoordSelectSyntax</a>'s
machine-frame words): both consume the word into their own section, so
no absolute-looking copy is left in <code>Parsing</code> to be mistaken for
a programmed absolute.
</p>
</dd>
</dl>
<dl class="jumplist">
@@ -484,14 +536,19 @@ the tool position, and stay inside the cycle's own record.
Consumed by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> (linear axes) and
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> (rotary axes) — both treat
every non-Incremental value as an absolute write, and both resolve a
every non-Incremental value as an absolute write, both follow the
modal <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html">Positioning</a> state for a word that has no entry,
and both resolve a
coded entry's indexing position number through
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.CodedPositionUtil.html">CodedPositionUtil</a> and rewrite the entry to
its plain counterpart in place — by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a> (the directional
window for <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_PositiveOnly">PositiveOnly</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_NegativeOnly">NegativeOnly</a> and the non-modular-axis
boundary warning; it never sees a coded value), and by
boundary warning; it never sees a coded value, and it does not read
an <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Incremental">Incremental</a> entry — the literal
pass-through follows the <a class="xref" href="Hi.NcParsers.Keywords.IncrementalWords.html">IncrementalWords</a> record the
rotary writer leaves), and by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.Siemens.SiemensCircularMotionSyntax.html">SiemensCircularMotionSyntax</a>
(absolute I/J/K center components) — and, ahead of the shared
resolve, by two consumers that take the raw word before it can see
@@ -501,7 +558,9 @@ the last programmed position on the spot) and
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.MachineCoordSelectSyntax.html">MachineCoordSelectSyntax</a> (a distance in
the machine frame); words without an entry keep the default behavior
unchanged. The section is not listed in any ModalCarry key set — it
never carries to later blocks.
never carries to later blocks. It describes the <i>programmed</i>
spelling; what the write stage actually converted, with the
programmed delta, is the <a class="xref" href="Hi.NcParsers.Keywords.IncrementalWords.html">IncrementalWords</a> record.
</p>
</dd>
</dl>
@@ -545,10 +604,20 @@ drills again) and
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">WriteCompoundMotion(JsonObject, string, JsonArray, Vec3d)</a>
(the cycle's pre-positioning item carries the block's MC A/B/C so the
physical rotary state matches the root record instead of lagging one
block behind). Not listed in any
<a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html">ModalCarrySyntax</a> key set — it never
block behind) and <a class="xref" href="Hi.NcParsers.LogicSyntaxs.PivotTransformUtil.html">PivotTransformUtil</a> (the
tilted-feature-frame re-anchor on a rotary-word block). Not listed in
any <a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html">ModalCarrySyntax</a> key set — it never
carries to later blocks.
</p>
<p>
This section says <i>which</i> rotary words the block spoke, not how:
an absolute <code>C40.</code> and an incremental <code>C40.</code> both record 40.
Which of them were increments — and so which MC angles are
accumulations rather than programmed absolutes — is the sibling
<a class="xref" href="Hi.NcParsers.Keywords.IncrementalWords.html">IncrementalWords</a> record, the one
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a> reads for its
literal pass-through.
</p>
</dd>
</dl>
<dl class="jumplist">
@@ -911,9 +980,19 @@ the math is <code>InitRxcz + ProgramPolarRxcz</code>, mirroring HardNc
<dt><a class="xref" href="Hi.NcParsers.Keywords.IPositioningDef.html">IPositioningDef</a></dt>
<dd><p>Modal positioning state — ISO Group 03 (G90 absolute / G91 incremental).
Written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.PositioningSyntax.html">PositioningSyntax</a>, consumed by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a>, canned cycle
syntaxes, and <a class="xref" href="Hi.NcParsers.LogicSyntaxs.MachineCoordSelectSyntax.html">MachineCoordSelectSyntax</a>.
Property names are used as JSON keys via <code>nameof</code>.</p>
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> (linear words),
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> (rotary words: G91
accumulates anchor + delta) and
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a> (the wrap pass
keeps the axes the <a class="xref" href="Hi.NcParsers.Keywords.IncrementalWords.html">IncrementalWords</a> record lists
literal), canned cycle syntaxes, and
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.MachineCoordSelectSyntax.html">MachineCoordSelectSyntax</a>. A per-word
<a class="xref" href="Hi.NcParsers.Keywords.PositioningOverride.html">PositioningOverride</a> entry beats this modal state for
its word. The section stays <code>G91</code> after the consumers have
rewritten the block's words to absolutes (the next block's lookback
needs it); the words that were converted are listed in the one-shot
<a class="xref" href="Hi.NcParsers.Keywords.IncrementalWords.html">IncrementalWords</a> record. Property names are used as
JSON keys via <code>nameof</code>.</p>
<p>
<a class="xref" href="Hi.NcParsers.Keywords.IPositioningDef.html#Hi_NcParsers_Keywords_IPositioningDef_Term">Term</a> is the brand-specific G-code (Fanuc/ISO G90/G91);
<a class="xref" href="Hi.NcParsers.Keywords.IPositioningDef.html#Hi_NcParsers_Keywords_IPositioningDef_Mode">Mode</a> is the conventional, brand-neutral name