fix SoftNcRunner GM code normalization.

This commit is contained in:
2026-05-06 13:21:19 +08:00
parent 0fe9497552
commit 2f57932000
1238 changed files with 69405 additions and 22511 deletions
@@ -94,13 +94,50 @@
<h3 id="classes">
Classes
</h3>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.BlockSkip.html">BlockSkip</a></dt>
<dd><p>Optional block skip marker extracted from the head of an NC block.
ISO 6983 / Fanuc calls this feature <i>Block Delete</i> (BDT switch);
Siemens / Syntec / Mazak use the same <code>/</code> prefix with matching
behaviour.</p>
<p>
The section is only present on blocks that carry a <code>/</code> prefix.
Whether the block's NC commands are actually skipped at runtime
depends on <a class="xref" href="Hi.NcParsers.Dependencys.IBlockSkipConfig.html">IBlockSkipConfig</a>:
<ul><li>Config absent or the <a class="xref" href="Hi.NcParsers.Keywords.BlockSkip.html#Hi_NcParsers_Keywords_BlockSkip_Layer">Layer</a> bit OFF → the <code>/</code>
prefix is consumed, <a class="xref" href="Hi.NcParsers.Keywords.BlockSkip.html#Hi_NcParsers_Keywords_BlockSkip_Body">Body</a> is left null, and the rest of
the line parses as a regular NC block (comments still take effect).</li><li>Config present and the <a class="xref" href="Hi.NcParsers.Keywords.BlockSkip.html#Hi_NcParsers_Keywords_BlockSkip_Layer">Layer</a> bit ON → the rest
of the line is moved into <a class="xref" href="Hi.NcParsers.Keywords.BlockSkip.html#Hi_NcParsers_Keywords_BlockSkip_Body">Body</a> and cleared from
<code>UnparsedText</code>, so downstream parsing syntaxes see nothing and
no NC action is emitted. Comment syntaxes run before this one so
comments (and any embedded CsScript) still take effect.</li></ul>
Not a comment: a comment is static metadata, block skip is a runtime
toggle that can change per machine/operator setting.
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.CannedCycle.html">CannedCycle</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.ICannedCycleDef.html">ICannedCycleDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.Comment.html">Comment</a></dt>
<dd></dd>
<dd><p>Comment extracted from an NC block.
<a class="xref" href="Hi.NcParsers.Keywords.Comment.html#Hi_NcParsers_Keywords_Comment_Symbol">Symbol</a> identifies the comment style;
<a class="xref" href="Hi.NcParsers.Keywords.Comment.html#Hi_NcParsers_Keywords_Comment_Text">Text</a> holds the content without the symbol.
Downstream syntaxes (e.g., <a class="xref" href="Hi.NcParsers.Keywords.CsScript.html">CsScript</a>) may
further trim <a class="xref" href="Hi.NcParsers.Keywords.Comment.html#Hi_NcParsers_Keywords_Comment_Text">Text</a> after extracting embedded markers.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html">CompoundMotion</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.ICompoundMotionDef.html">ICompoundMotionDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.Coolant.html">Coolant</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.ICoolantDef.html">ICoolantDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
@@ -134,20 +171,76 @@ Heidenhain: CYCL DEF 247 (Datum Preset) / CYCL DEF 7 (Datum Shift).
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.LocalCoordinateOffset.html">LocalCoordinateOffset</a></dt>
<dd><p>Local coordinate offset state (G52) written by
<dt><a class="xref" href="Hi.NcParsers.Keywords.IsoLocalCoordinateOffset.html">IsoLocalCoordinateOffset</a></dt>
<dd><p>ISO/Fanuc-family local coordinate offset state (G52) written by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoLocalCoordinateOffsetSyntax.html">IsoLocalCoordinateOffsetSyntax</a>.
Property names are used as JSON keys via <code>nameof</code>.</p>
<p>
ISO: G52 X Y Z (local coordinate system shift, additive to G54 series).
Cancelled by G52 X0 Y0 Z0 or M30 (program end).
Siemens equivalent: TRANS / ATRANS (handled by separate syntax).
G52 X Y Z installs a local coordinate-system shift that stacks on top of
the active G54-G59 work offset. The cancel mechanism is to write
<code>G52 X0 Y0 Z0</code> (or hit M30 / reset) — there is no separate G code
for "cancel". The offset vector is therefore always modal: zero is a
valid modal value, not a "disabled" state, so the section is recorded
on every block.
</p>
<p>
Brand-specific kin: Siemens <code>TRANS</code>/<code>ATRANS</code> (which can also
carry rotation/scale/mirror) and Heidenhain <code>TRANS DATUM</code> are
handled by their own syntaxes and write to their own sections — they
do not share this key, because their data shapes are richer.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.Motion.html">Motion</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.IMotionDef.html">IMotionDef</a>.</p>
<dt><a class="xref" href="Hi.NcParsers.Keywords.MachineCoordinateState.html">MachineCoordinateState</a></dt>
<dd><p>Section key holder for <a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html">IMachineCoordinateStateDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.MotionEvent.html">MotionEvent</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.IMotionEventDef.html">IMotionEventDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.MotionState.html">MotionState</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.IMotionStateDef.html">IMotionStateDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.PathSmoothing.html">PathSmoothing</a></dt>
<dd><p>Section key holder for <a class="xref" href="Hi.NcParsers.Keywords.IPathSmoothingDef.html">IPathSmoothingDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.PlaneSelect.html">PlaneSelect</a></dt>
<dd><p>Section key holder for <a class="xref" href="Hi.NcParsers.Keywords.IPlaneSelectDef.html">IPlaneSelectDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.Positioning.html">Positioning</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.IPositioningDef.html">IPositioningDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.ProgramBoundary.html">ProgramBoundary</a></dt>
<dd><p>Program start/end delimiter line (e.g., <code>%</code> in Fanuc/Mazak/Syntec,
<code>%_N_xxx_MPF</code> in Siemens).
Not a comment — the controller uses it as a tape/file boundary marker.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.ProgramEnd.html">ProgramEnd</a></dt>
<dd><p>Section key holder for <a class="xref" href="Hi.NcParsers.Keywords.IProgramEndDef.html">IProgramEndDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.ProgramStop.html">ProgramStop</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.IProgramStopDef.html">IProgramStopDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.RadiusCompensation.html">RadiusCompensation</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.IRadiusCompensationDef.html">IRadiusCompensationDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
@@ -174,14 +267,39 @@ Siemens equivalent: TRANS / ATRANS (handled by separate syntax).
<dt><a class="xref" href="Hi.NcParsers.Keywords.ToolHeightCompensation.html">ToolHeightCompensation</a></dt>
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.Unit.html">Unit</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.IUnitDef.html">IUnitDef</a>.</p>
</dd>
</dl>
<h3 id="interfaces">
Interfaces
</h3>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IArcMotionDef.html">IArcMotionDef</a></dt>
<dd><p>Arc motion data written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.html">CircularMotionSyntax</a>.
Stored under the <a class="xref" href="Hi.NcParsers.Keywords.Motion.html">Motion</a> JSON section alongside
<a class="xref" href="Hi.NcParsers.Keywords.IMotionDef.html">IMotionDef</a> properties.</p>
Stored under the <a class="xref" href="Hi.Motion.html">Hi.Motion</a> JSON section alongside
<a class="xref" href="Hi.NcParsers.Keywords.IMotionEventDef.html">IMotionEventDef</a> properties.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.ICannedCycleDef.html">ICannedCycleDef</a></dt>
<dd><p>Canned cycle modal state (Group 09). Captures which cycle is
currently active, its return mode (G98/G99), and the resolved
absolute parameter set used for modal lookback.</p>
<p>
Written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> on
every block that belongs to the canned-cycle group:
cycle code present (G81/G82/G83/G73/G84/G74/G85/G86/G89/G76/G87),
modal repeat (cycle still active, only coordinates given), or
explicit cancel (<a class="xref" href="Hi.NcParsers.Keywords.Generic.IsoKeywords.html#Hi_NcParsers_Keywords_Generic_IsoKeywords_G80">G80</a>).
</p>
<p>
<a class="xref" href="Hi.NcParsers.Keywords.ICannedCycleDef.html#Hi_NcParsers_Keywords_ICannedCycleDef_Term">Term</a> = <code>"G80"</code> is the explicit-cancel sentinel
used by <a class="xref" href="Hi.NcParsers.Syntaxs.SyntaxPiece.html">FindPreviousActiveCycle(LazyLinkedListNode&lt;SyntaxPiece&gt;, string[])</a>
to terminate modal lookback without ambiguity; regular blocks
(e.g. <code>G00 X.. Y..</code>) simply omit the section entirely.
</p>
</dd>
</dl>
<dl class="jumplist">
@@ -191,16 +309,30 @@ multiple sub-operations (G28, G53.1, G81, G82, etc.).
Contains a <a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html#Hi_NcParsers_Keywords_CompoundMotion_ItemsKey">ItemsKey</a> array resolved by
<span class="xref">Hi.NcParsers.Semantics.CompoundMotionSemanticUtil</span>.</p>
<p>Item types (discriminated by key presence):</p>
<ul><li><a class="xref" href="Hi.NcParsers.Keywords.Motion.html">Motion</a> — rapid/feed linear motion
(<a class="xref" href="Hi.NcParsers.Keywords.IMotionDef.html">IMotionDef</a> + <a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateDef.html">IMachineCoordinateDef</a>)</li><li><a class="xref" href="Hi.NcParsers.Keywords.Dwell.html">Dwell</a> — pause (<a class="xref" href="Hi.NcParsers.Keywords.IDwellDef.html#Hi_NcParsers_Keywords_IDwellDef_Time">Time</a> in seconds)</li><li><a class="xref" href="Hi.NcParsers.Keywords.SpindleControl.html">SpindleControl</a> — spindle direction change
<ul><li><a class="xref" href="Hi.Motion.html">Hi.Motion</a> — rapid/feed linear motion
(<a class="xref" href="Hi.NcParsers.Keywords.IMotionEventDef.html">IMotionEventDef</a> + <a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html">IMachineCoordinateStateDef</a>)</li><li><a class="xref" href="Hi.NcParsers.Keywords.Dwell.html">Dwell</a> — pause (<a class="xref" href="Hi.NcParsers.Keywords.IDwellDef.html#Hi_NcParsers_Keywords_IDwellDef_Time">Time</a> in seconds)</li><li><a class="xref" href="Hi.NcParsers.Keywords.SpindleControl.html">SpindleControl</a> — spindle direction change
(<a class="xref" href="Hi.NcParsers.Keywords.ISpindleControlDef.html#Hi_NcParsers_Keywords_ISpindleControlDef_Direction">Direction</a>)</li><li><a class="xref" href="Hi.NcParsers.Keywords.SpindleOrientation.html">SpindleOrientation</a> — oriented spindle stop (OSS)
(ISpindleOrientationDef.Angle_rad)</li></ul>
(<a class="xref" href="Hi.NcParsers.Keywords.ISpindleOrientationDef.html#Hi_NcParsers_Keywords_ISpindleOrientationDef_Angle_deg">Angle_deg</a>)</li></ul>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.ICoolantDef.html">ICoolantDef</a></dt>
<dd><p>Coolant state (M07 mist / M08 flood / M09 off).
Written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CoolantSyntax.html">CoolantSyntax</a>.
Modal — persists until changed.</p>
<p>
<a class="xref" href="Hi.NcParsers.Keywords.ICoolantDef.html#Hi_NcParsers_Keywords_ICoolantDef_IsOn">IsOn</a> is the on/off convenience flag (true for M07 and
M08, false for M09). <a class="xref" href="Hi.NcParsers.Keywords.ICoolantDef.html#Hi_NcParsers_Keywords_ICoolantDef_Mode">Mode</a> carries the abstract kind
(<a class="xref" href="Hi.NcParsers.Keywords.Coolant.html#Hi_NcParsers_Keywords_Coolant_Flood">Flood</a> / <a class="xref" href="Hi.NcParsers.Keywords.Coolant.html#Hi_NcParsers_Keywords_Coolant_Mist">Mist</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Coolant.html#Hi_NcParsers_Keywords_Coolant_Off">Off</a>) for consumers that need to distinguish
flood vs mist.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IDwellDef.html">IDwellDef</a></dt>
<dd><p>Dwell/pause section definition for use inside Sequence items.
Resolved by Semantics.SequenceUtil into
Resolved by <span class="xref">Hi.NcParsers.Semantics.CompoundMotionSemanticUtil</span> into
<a class="xref" href="Hi.Numerical.Acts.ActDelay.html">ActDelay</a>.</p>
</dd>
</dl>
@@ -219,15 +351,49 @@ Supported by all major CNC brands.
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateDef.html">IMachineCoordinateDef</a></dt>
<dd></dd>
<dt><a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html">IMachineCoordinateStateDef</a></dt>
<dd><p>Modal machine-coordinate state — absolute six-axis machine position
after the block has executed. Written on every block by motion-related
LogicSyntaxs (<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcXyzFallbackSyntax.html">McAbcXyzFallbackSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.MachineCoordSelectSyntax.html">MachineCoordSelectSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.G53p1RotaryPositionSyntax.html">G53p1RotaryPositionSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ReferenceReturnSyntax.html">ReferenceReturnSyntax</a>); seeded on the init
block by <a class="xref" href="Hi.NcParsers.Initializers.HomeMcInitializer.html">HomeMcInitializer</a>; carried across
non-motion blocks by <a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html">ModalCarrySyntax</a>.</p>
<p>
Only configured axes appear as keys (X/Y/Z/A/B/C). Non-existent axes
(e.g., A/B/C on a 3-axis machine) are <b>omitted</b> rather than written
as NaN sentinels.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IMotionDef.html">IMotionDef</a></dt>
<dd><p>Motion state written by LogicSyntaxs.MotionSyntax.
Property names are used as JSON keys via <code>nameof</code>.</p>
<dt><a class="xref" href="Hi.NcParsers.Keywords.IMotionEventDef.html">IMotionEventDef</a></dt>
<dd><p>One-shot motion event — present only on blocks that actually issue a
motion command. Used by motion semantics (<a class="xref" href="Hi.NcParsers.Semantics.McLinearMotionSemantic.html">McLinearMotionSemantic</a>,
<a class="xref" href="Hi.NcParsers.Semantics.McArcMotionSemantic.html">McArcMotionSemantic</a>, <a class="xref" href="Hi.NcParsers.Semantics.ClLinearMotionSemantic.html">ClLinearMotionSemantic</a>)
as the trigger to emit motion <a class="xref" href="Hi.Numerical.Acts.IAct.html">IAct</a>. NOT carried
forward across blocks. Property names are used as JSON keys via <code>nameof</code>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IMotionStateDef.html">IMotionStateDef</a></dt>
<dd><p>Modal motion state — Group 01 G-code mode (G00 / G01 / G02 / G03 ...).
Written on every block by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMotionSyntax.html">LinearMotionSyntax</a> /
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.html">CircularMotionSyntax</a>; carried across non-motion
blocks by <a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html">ModalCarrySyntax</a>. Property names are
used as JSON keys via <code>nameof</code>.</p>
<p>
ISO standard: G00 (rapid) / G01 (linear feed) are Group 01 modal codes.
Unlike sibling modal sections (<a class="xref" href="Hi.NcParsers.Keywords.Unit.html">Unit</a>, <a class="xref" href="Hi.NcParsers.Keywords.PlaneSelect.html">PlaneSelect</a>,
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html">Positioning</a>) which carry both a brand-specific <code>Term</code>
and a brand-neutral conventional field, <a class="xref" href="Hi.NcParsers.Keywords.MotionState.html">MotionState</a> intentionally
keeps only <a class="xref" href="Hi.NcParsers.Keywords.IMotionStateDef.html#Hi_NcParsers_Keywords_IMotionStateDef_Term">Term</a>: the brand-neutral semantic ("what kind of
motion happened") lives on the sibling one-shot <a class="xref" href="Hi.NcParsers.Keywords.MotionEvent.html">MotionEvent</a>
(<a class="xref" href="Hi.NcParsers.Keywords.IMotionEventDef.html#Hi_NcParsers_Keywords_IMotionEventDef_Form">Form</a> = McLinear / McArc / ClLinear / ClArc).
State here is purely the modal latch of the last Group-01 G-code so
downstream <code>FindPrevious*</code> can resume motion-mode bookkeeping.
</p>
</dd>
</dl>
@@ -236,17 +402,88 @@ ISO standard: G00 (rapid) / G01 (linear feed) are Group 01 modal codes.
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IPositioningModeDef.html">IPositioningModeDef</a></dt>
<dd><p>JsonObject key for positioning mode (G90 absolute / G91 incremental).
Written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.PositioningModeSyntax.html">PositioningModeSyntax</a>,
consumed by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a>
and canned cycle syntaxes.</p>
<dt><a class="xref" href="Hi.NcParsers.Keywords.IPathSmoothingDef.html">IPathSmoothingDef</a></dt>
<dd><p>Path smoothing state written by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.PathSmoothingSyntax.html">PathSmoothingSyntax</a>.</p>
<p>
ISO/Fanuc G05.1 Q1 (enable) / G05.1 Q0 (disable):
high-precision contour control / AICC / Nano Smoothing.
Controller-internal interpolation black box — simulation records
the state but does not alter the tool path.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IPlaneSelectDef.html">IPlaneSelectDef</a></dt>
<dd><p>Active plane selection state written by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.PlaneSelectSyntax.html">PlaneSelectSyntax</a>.
Property names are used as JSON keys via <code>nameof</code>.</p>
<p>
ISO: G17/G18/G19. Heidenhain: implicit from L/CC syntax.
<a class="xref" href="Hi.NcParsers.Keywords.IPlaneSelectDef.html#Hi_NcParsers_Keywords_IPlaneSelectDef_Term">Term</a> carries the brand-specific G-code; <a class="xref" href="Hi.NcParsers.Keywords.IPlaneSelectDef.html#Hi_NcParsers_Keywords_IPlaneSelectDef_Plane">Plane</a>
stores the conventional, brand-neutral axis-pair name (XY/ZX/YZ).
</p>
</dd>
</dl>
<dl class="jumplist">
<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>
<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
(<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Absolute">Absolute</a> / <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Incremental">Incremental</a>).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IProgramEndDef.html">IProgramEndDef</a></dt>
<dd><p>Program end marker (M02/M30).
Written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramEndSyntax.html">ProgramEndSyntax</a>.
Other syntaxes (e.g. <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoLocalCoordinateOffsetSyntax.html">IsoLocalCoordinateOffsetSyntax</a>)
read this section to reset modal state instead of detecting M30 directly.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IProgramStopDef.html">IProgramStopDef</a></dt>
<dd><p>Program-stop marker (M00 unconditional / M01 optional).
Written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramStopSyntax.html">ProgramStopSyntax</a> on each
block that carries an M00/M01 flag. Non-modal: the section appears
only on the exact block where the stop code is present.</p>
<p>
Distinct from <a class="xref" href="Hi.NcParsers.Keywords.IProgramEndDef.html">IProgramEndDef</a> (M02/M30, end of program).
</p>
<p>
M00 halts execution unconditionally; the operator must press Cycle
Start to resume. M01 is an optional stop gated by the operator's
"Optional Stop" panel switch — ignored when the switch is off.
This parsing-layer section records the NC intent; runtime /
semantic layers decide whether to actually pause.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IProgramXyzDef.html">IProgramXyzDef</a></dt>
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IRadiusCompensationDef.html">IRadiusCompensationDef</a></dt>
<dd><p>Radius compensation state written by
<a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.RadiusCompensationSyntax.html">RadiusCompensationSyntax</a>.
Property names are used as JSON keys via <code>nameof</code>.</p>
<p>
Managed commands (ISO): G41 (left), G42 (right), G40 (cancel).
Heidenhain Klartext maps RL → G41, RR → G42, R0 → G40.
When active, the tool path is offset perpendicular to the programmed path
by <a class="xref" href="Hi.NcParsers.Keywords.IRadiusCompensationDef.html#Hi_NcParsers_Keywords_IRadiusCompensationDef_Radius_mm">Radius_mm</a>; <a class="xref" href="Hi.NcParsers.Keywords.IRadiusCompensationDef.html#Hi_NcParsers_Keywords_IRadiusCompensationDef_Side">Side</a> determines left vs right.
The root <code>ProgramXyz</code> retains the user-programmed position;
<code>MachineCoordinate</code> is overwritten to reflect the compensated path.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.ISpindleControlDef.html">ISpindleControlDef</a></dt>
<dd><p>Spindle control item for use inside <a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html#Hi_NcParsers_Keywords_CompoundMotion_ItemsKey">ItemsKey</a>
@@ -304,10 +541,38 @@ Heidenhain equivalent: TOOL CALL / M128/M129 (handled by separate syntax).
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html">ITransformationDef</a></dt>
<dd><p>Chain of named ProgramXyz → MachineCoordinate transformation entries.
Stored as a <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonarray">JsonArray</a> of entries, each with &ldquo;Source&rdquo; and &ldquo;Mat4d&rdquo; keys.
Each contributing <a class="xref" href="Hi.NcParsers.Syntaxs.INcSyntax.html">INcSyntax</a> adds or replaces its own entry by source name.
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a> composes all entries in order:
<code>McXyz = ProgramXyz * T[0] * T[1] * ... * T[n]</code>.</p>
Stored as a <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonarray">JsonArray</a> of entries, each with
<code>&ldquo;Source&rdquo;</code>, <code>&ldquo;Kind&rdquo;</code>, and <code>&ldquo;Mat4d&rdquo;</code> keys.
Each contributing <a class="xref" href="Hi.NcParsers.Syntaxs.INcSyntax.html">INcSyntax</a> adds or replaces its own
entry by source name.
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_GetComposedTransform_System_Text_Json_Nodes_JsonObject_">GetComposedTransform(JsonObject)</a>
composes entries in order: <code>McXyz = ProgramXyz * T[0] * T[1] * ... * T[n]</code>.</p>
<p>
<b><code>Kind</code> contour-validity classification.</b> Each entry is either:
<ul><li><code>"Static"</code> — the Mat4d is valid for any point along the contour.
Tilt, coord-offset, and the kinematic pivot in non-RTCP / rotary-stable
blocks are all Static.</li><li><code>"Dynamic"</code> — the Mat4d is a <i>block-endpoint snapshot</i> of a
rotary-state-dependent transform (RTCP rotary-dynamic). Composition still
yields a correct endpoint MC, but the matrix is not contour-valid:
intermediate CL-point positions cannot be derived by applying it to an
interpolated ProgramXyz. The semantic layer
(<a class="xref" href="Hi.NcParsers.Semantics.ClLinearMotionSemantic.html">ClLinearMotionSemantic</a>) handles per-step IK
separately.</li></ul>
Use <a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_HasDynamicEntry_System_Text_Json_Nodes_JsonObject_">HasDynamicEntry(JsonObject)</a> to detect
the presence of any Dynamic entry on this block.
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IUnitDef.html">IUnitDef</a></dt>
<dd><p>Unit-system state (ISO Group 06: G20 inch / G21 metric).
Written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.UnitModeSyntax.html">UnitModeSyntax</a>. Modal.</p>
<p>
HiNC's NC pipeline works exclusively in millimetres. G21 is therefore
a no-op confirmation of the default; G20 is reported as an
Unsupported Error and callers are expected to pre-convert the NC
program to metric before loading.
</p>
</dd>
</dl>
<dl class="jumplist">