929 lines
57 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Namespace Hi.NcParsers.Keywords | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Namespace Hi.NcParsers.Keywords | HiAPI-C# 2025 ">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
<meta name="docfx:navrel" content="../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../index.html">
<img id="logo" class="svg" src="../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Hi.NcParsers.Keywords">
<h1 id="Hi_NcParsers_Keywords" data-uid="Hi.NcParsers.Keywords" class="text-break">Namespace Hi.NcParsers.Keywords</h1>
<div class="markdown level0 summary"></div>
<div class="markdown level0 conceptual"></div>
<div class="markdown level0 remarks"></div>
<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.CallFrame.html">CallFrame</a></dt>
<dd><p>One entry in <a class="xref" href="Hi.NcParsers.Keywords.CallStack.html#Hi_NcParsers_Keywords_CallStack_Frames">Frames</a>. Holds the caller-side
information consumers need to &ldquo;unwind&rdquo; or &ldquo;look back&rdquo; — currently
only the relative file path of the caller, used by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.SubProgramReturnSyntax.html">SubProgramReturnSyntax</a> on
<code>M99 P{seq}</code> to locate the caller's <code>N{seq}</code> block.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.CallStack.html">CallStack</a></dt>
<dd><p>JSON-section data shape representing the active call-frame stack on
a block — pushed by call-and-inline syntaxes
(<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.SubProgramCallSyntax.html">SubProgramCallSyntax</a> for M98/M198,
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucMacroCallSyntax.html">FanucMacroCallSyntax</a> for G65, and
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucModalMacroSyntax.html">FanucModalMacroSyntax</a>'s expansion
phase for G66 implicit triggers) and popped by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.SubProgramReturnSyntax.html">SubProgramReturnSyntax</a> on M99. Every
block between push and pop carries the section forward via
<a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html">ModalCarrySyntax</a>; the caller's blocks
before push and after pop carry the surrounding stack state
(typically empty when running from the main file).</p>
<p>
The section is wrapped in a <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">JsonObject</a> rather than
exposed as a bare <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonarray">JsonArray</a> so it fits ModalCarry's
"deep-clone JsonObject" carry pattern — the array of frames lives
inside <a class="xref" href="Hi.NcParsers.Keywords.CallStack.html#Hi_NcParsers_Keywords_CallStack_Frames">Frames</a>.
</p>
</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><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">
<dt><a class="xref" href="Hi.NcParsers.Keywords.CoordinateOffset.html">CoordinateOffset</a></dt>
<dd><p>Work coordinate offset state written by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoCoordinateOffsetSyntax.html">IsoCoordinateOffsetSyntax</a>.
Property names are used as JSON keys via <code>nameof</code>.</p>
<p>
Managed commands (ISO): G54, G55, G56, G57, G58, G59, G59.1G59.9.
Siemens: G54G57 + G505G599 (extended), G500 to cancel.
Heidenhain: CYCL DEF 247 (Datum Preset) / CYCL DEF 7 (Datum Shift).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.CsScript.html">CsScript</a></dt>
<dd><p>Section-key holder for inline C# scripts attached to an NC block. Carries
<a class="xref" href="Hi.NcParsers.Keywords.CsScript.html#Hi_NcParsers_Keywords_CsScript_BeginScript">BeginScript</a> (run before the block's acts) and
<a class="xref" href="Hi.NcParsers.Keywords.CsScript.html#Hi_NcParsers_Keywords_CsScript_EndScript">EndScript</a> (run after). Resolved by
<a class="xref" href="Hi.NcParsers.Semantics.CsScriptBeginSemantic.html">CsScriptBeginSemantic</a> and
<a class="xref" href="Hi.NcParsers.Semantics.CsScriptEndSemantic.html">CsScriptEndSemantic</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.Dwell.html">Dwell</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.IDwellDef.html">IDwellDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.FanucGoto.html">FanucGoto</a></dt>
<dd><p>Fanuc Custom Macro B GOTO record. Stamped on the host block by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucGotoSyntax.html">FanucGotoSyntax</a> after the control-flow
decision has been made; produced earlier by
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Fanuc.FanucGotoParsingSyntax.html">FanucGotoParsingSyntax</a> as a parsing-stage
sub-section (<code>Parsing.FanucGoto</code>) carrying the raw captured fields.</p>
<p>
Two source forms map to the same shape:
<ul><li><code>GOTO &lt;n&gt;</code> — unconditional jump. <a class="xref" href="Hi.NcParsers.Keywords.FanucGoto.html#Hi_NcParsers_Keywords_FanucGoto_Condition">Condition</a> is null.</li><li><code>IF [&lt;bool-expr&gt;] GOTO &lt;n&gt;</code> — conditional jump.
<a class="xref" href="Hi.NcParsers.Keywords.FanucGoto.html#Hi_NcParsers_Keywords_FanucGoto_Condition">Condition</a> holds the expression text from inside the
brackets.</li></ul>
<p>
At parsing time <a class="xref" href="Hi.NcParsers.Keywords.FanucGoto.html#Hi_NcParsers_Keywords_FanucGoto_N">N</a> is a raw token from the source — it may
be a literal (<code>"100"</code>), a variable reference (<code>"#1"</code>), or a
bracketed expression (<code>"#[#2+5]"</code>). <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.VariableEvaluatorSyntax.html">VariableEvaluatorSyntax</a>
substitutes a resolved literal back into the same field in the
Evaluation bundle; <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucGotoSyntax.html">FanucGotoSyntax</a> then
<code>int.TryParse</code>s the final string to produce an int target.
</p>
<p>
<b>Lifecycle of the condition fields.</b>
<ul><li><a class="xref" href="Hi.NcParsers.Keywords.FanucGoto.html#Hi_NcParsers_Keywords_FanucGoto_Condition">Condition</a> is written at Parsing time as the raw
expression text and substituted in place by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.VariableEvaluatorSyntax.html">VariableEvaluatorSyntax</a> pass-2 — the
original text is preserved at <code>Formula.FanucGoto.Condition</code>
when substitution succeeds.</li><li><a class="xref" href="Hi.NcParsers.Keywords.FanucGoto.html#Hi_NcParsers_Keywords_FanucGoto_ConditionEvaluated">ConditionEvaluated</a> is the host-level stamp
written by <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucGotoSyntax.html">FanucGotoSyntax</a>
carrying the tri-state truthy outcome.</li></ul>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.FanucIfThen.html">FanucIfThen</a></dt>
<dd><p>Fanuc Custom Macro B <code>IF [&lt;cond&gt;] THEN &lt;body&gt;</code>
single-block conditional record. Stamped on the host block by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucIfThenSyntax.html">FanucIfThenSyntax</a> after the gate
decision; produced earlier by
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Fanuc.FanucIfThenParsingSyntax.html">FanucIfThenParsingSyntax</a> as a parsing-stage
sub-section (<code>Parsing.FanucIfThen</code>) carrying the raw captured fields
plus an internal <code>PendingAssignments</code> sub-object harvested from the
body text.</p>
<p>
Spec: <code>IF [bool-expr] THEN &lt;stmt&gt;</code> executes <code>&lt;stmt&gt;</code>
only when the condition is truthy. Unlike <a class="xref" href="Hi.NcParsers.Keywords.FanucGoto.html">FanucGoto</a>'s
conditional form there is no jump — the body affects the current block
only, no source splice, no label scan, no iteration watchdog. The most
common body shape is a single Custom Macro B assignment
(<code>#nnn = &lt;expr&gt;</code>); multiple assignments in one body are also
accepted and lifted together.
</p>
<p>
<a class="xref" href="Hi.NcParsers.Keywords.FanucIfThen.html#Hi_NcParsers_Keywords_FanucIfThen_Condition">Condition</a> is held as a string at parsing time so
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.VariableEvaluatorSyntax.html">VariableEvaluatorSyntax</a>'s pass-2 tree walk can substitute
it to a numeric <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonvalue">JsonValue</a> in place;
the FanucIfThenSyntax tail then reads the resolved node polymorphically
via the same <code>ReadCondition</code> shape used by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucGotoSyntax.html">FanucGotoSyntax</a>.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.FanucMacroCall.html">FanucMacroCall</a></dt>
<dd><p>One-shot custom-macro-call record written by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucMacroCallSyntax.html">FanucMacroCallSyntax</a>. Lives on both the
<code>G65</code> host block (the caller) and every inlined block of the
macro body — so a cache-dump reader can land on any block inside the
macro and immediately see &ldquo;this block belongs to a G65 call of
<a class="xref" href="Hi.NcParsers.Keywords.FanucMacroCall.html#Hi_NcParsers_Keywords_FanucMacroCall_FileName">FileName</a> with these argument bindings&rdquo; without back-walking
to find the host.</p>
<p>
Each inlined block additionally carries the resolved
<code>Vars.Local</code> <code>#1-#26</code> bindings derived from <a class="xref" href="Hi.NcParsers.Keywords.FanucMacroCall.html#Hi_NcParsers_Keywords_FanucMacroCall_Args">Args</a>
(see <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucMacroArgumentMap.html">FanucMacroArgumentMap</a>), so
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Evaluation.LocalVariableLookup.html">LocalVariableLookup</a>
resolves macro args in a single-block lookup. Frame isolation is
structural: caller blocks never have <code>Vars.Local</code> written, so
after the macro body ends, the next caller block reads <code>null</code>
for any <code>#1-#26</code> without any explicit frame marker.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.FanucModalMacro.html">FanucModalMacro</a></dt>
<dd><p>Modal-macro-call record left by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucModalMacroSyntax.html">FanucModalMacroSyntax</a>. Carries Fanuc
<code>G66</code> setup state forward block-to-block until cancelled by
<code>G67</code>. The section is also written on the <code>G67</code> block itself
(with <a class="xref" href="Hi.NcParsers.Keywords.FanucModalMacro.html#Hi_NcParsers_Keywords_FanucModalMacro_Term">Term</a> = <code>&ldquo;G67&rdquo;</code>) so cache dumps show the cancel
edge; subsequent blocks then carry no section at all.</p>
<p>
Per-block expansion of the modal call into an actual macro inline at
every positioning move is not yet implemented — a
<code>FanucModalMacro--NotExpanded</code> warning is emitted on the setup
block to flag the simulation gap. The setup state itself is captured
faithfully so external tooling can detect "this block sits inside a
G66 modal" via the carried section.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.FanucPathSmoothing.html">FanucPathSmoothing</a></dt>
<dd><p>Section data holder for <a class="xref" href="Hi.NcParsers.Keywords.IFanucPathSmoothingDef.html">IFanucPathSmoothingDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.FanucProgramNumber.html">FanucProgramNumber</a></dt>
<dd><p>Fanuc-family program identifier header that follows a
<a class="xref" href="Hi.NcParsers.Keywords.TapeBoundary.html">TapeBoundary</a> line — e.g. <code>O1234</code> or
<code>&lt;O1234&gt;</code>. <a class="xref" href="Hi.NcParsers.Keywords.FanucProgramNumber.html#Hi_NcParsers_Keywords_FanucProgramNumber_Wrapper">Wrapper</a> records the surface form
so a parsed block can be emitted back to the original notation.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.FanucWhileDo.html">FanucWhileDo</a></dt>
<dd><p>Fanuc Custom Macro B WHILE/END bounded-loop record. Stamped on the
host block by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucWhileDoSyntax.html">FanucWhileDoSyntax</a> after the
control-flow decision has been made; produced earlier by
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Fanuc.FanucWhileDoParsingSyntax.html">FanucWhileDoParsingSyntax</a> as a
parsing-stage sub-section (<code>Parsing.FanucWhileDo</code>) carrying the
raw captured fields.</p>
<p>
Two phrases map to the same shape, distinguished by <a class="xref" href="Hi.NcParsers.Keywords.FanucWhileDo.html#Hi_NcParsers_Keywords_FanucWhileDo_Term">Term</a>:
<ul><li><code>WHILE [&lt;bool-expr&gt;] DO &lt;m&gt;</code> — loop entry.
<a class="xref" href="Hi.NcParsers.Keywords.FanucWhileDo.html#Hi_NcParsers_Keywords_FanucWhileDo_Condition">Condition</a> holds the expression text from inside the
brackets at parsing time; substituted to a numeric
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonvalue">JsonValue</a> by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.VariableEvaluatorSyntax.html">VariableEvaluatorSyntax</a> in place.
<a class="xref" href="Hi.NcParsers.Keywords.FanucWhileDo.html#Hi_NcParsers_Keywords_FanucWhileDo_ConditionEvaluated">ConditionEvaluated</a> carries the host-level truthy
outcome at stamp time.</li><li><code>END &lt;m&gt;</code> — loop terminator. Carries no condition;
unconditionally reverse-jumps to the matching WHILE block on every
execution (re-evaluation of the entry condition is the WHILE block's
responsibility).</li></ul>
<p>
<a class="xref" href="Hi.NcParsers.Keywords.FanucWhileDo.html#Hi_NcParsers_Keywords_FanucWhileDo_LoopId">LoopId</a> is the spec-named "identification number for
nesting" (the <code>m</code> in <code>DO m</code> / <code>END m</code>). Nested loops
must use distinct LoopIds; matching is by exact value. Same-LoopId
nesting is spec-undefined and not given special handling here.
</p>
<p>
Active loop frames are carried block-to-block via the top-level
<code>WhileFrames</code> JSON section (a <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">JsonObject</a>
keyed by LoopId-as-string, each entry recording the
<code>BeginLineNo</code> of the WHILE block that opened that frame).
Carried by <a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html">ModalCarrySyntax</a> as part
of its <a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html#Hi_NcParsers_PostLogicSyntaxs_ModalCarrySyntax_Logic">Logic</a> tracked
keys (mutated in Evaluation, must reach Logic-stage consumers and
downstream blocks unchanged).
</p>
</dd>
</dl>
<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.IndexNote.html">IndexNote</a></dt>
<dd><p>JSON-section data shape pairing a single-character address symbol
(e.g. <code>&lsquo;O&rsquo;</code>, <code>&lsquo;N&rsquo;</code>) with its numeric index, used to annotate
program/sequence numbers on an NC block.</p>
</dd>
</dl>
<dl class="jumplist">
<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>
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.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.MacroFrame.html">MacroFrame</a></dt>
<dd><p>Top-level integer marker stamped onto a <a class="xref" href="Hi.NcParsers.Syntaxs.SyntaxPiece.html">SyntaxPiece</a>'s JSON
to identify which call frame the block belongs to. Brand-agnostic by
design — written by <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucMacroCallSyntax.html">FanucMacroCallSyntax</a>
today, reusable by any future call-inlining syntax (Fanuc <code>G66</code>
modal expansion, Heidenhain <code>LBL CALL</code>, …) that needs
local-variable isolation across call boundaries.</p>
<p>
Semantics: the value is an opaque id; only equality matters. Two
blocks with the same <a class="xref" href="Hi.NcParsers.Keywords.MacroFrame.html">MacroFrame</a> id share a call frame
(locals visible across them via single-step carry); two blocks with
different ids do not. The id <code>0</code> is reserved for the main
program frame and is returned by <a class="xref" href="Hi.NcParsers.Keywords.MacroFrame.html#Hi_NcParsers_Keywords_MacroFrame_Get_System_Text_Json_Nodes_JsonObject_">Get(JsonObject)</a> when the field is
absent — so a plain caller block needs no stamp and yet compares
distinct from any inlined frame.
</p>
<p>
Stored as a top-level JSON int (not an object section) so it stays
lightweight on every inlined block. Decoupled from
<a class="xref" href="Hi.NcParsers.Keywords.FanucMacroCall.html">FanucMacroCall</a>: that section is a diagnostic record of
the call (what file, what args), while <code>MacroFrame</code> is the
purely functional marker the local-variable I/O syntaxes consult.
</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.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">
<dt><a class="xref" href="Hi.NcParsers.Keywords.SpindleControl.html">SpindleControl</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.ISpindleControlDef.html">ISpindleControlDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.SpindleOrientation.html">SpindleOrientation</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.ISpindleOrientationDef.html">ISpindleOrientationDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.SpindleSpeed.html">SpindleSpeed</a></dt>
<dd><p>Section key holder + concrete implementation for <a class="xref" href="Hi.NcParsers.Keywords.ISpindleSpeedDef.html">ISpindleSpeedDef</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.SubProgramCall.html">SubProgramCall</a></dt>
<dd><p>Subprogram call record left by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.SubProgramCallSyntax.html">SubProgramCallSyntax</a> on the M98 /
M198 host block and on every inlined body block. The call itself
emits no motion act; this section is bookkeeping so cache dumps and
diagnostic readers can see &quot;this block triggered (or sits inside)
an inline of program <code>P</code>&quot;.</p>
<p>
<code>M98</code> and <code>M198</code> share the exact same section shape. The
difference between them is purely environmental — which folder the
resolver looks in (<code>SubProgramFolderConfig.InternalFolder</code> vs
<code>ExternalFolder</code>) — and that lives on the dependency, not in
this JSON record.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.SubProgramReturn.html">SubProgramReturn</a></dt>
<dd><p>Subprogram return record left on the M99 host block by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.SubProgramReturnSyntax.html">SubProgramReturnSyntax</a>. Return blocks
produce no motion acts; this section makes the consumed M99 visible
in cache dumps and surfaces the <code>M99 P{seq}</code> jump decision.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.TapeBoundary.html">TapeBoundary</a></dt>
<dd><p>Tape leader / trailer line — the literal <code>%</code> that historically
marked the start and end of a punched paper-tape program. ISO-style
controllers (Fanuc, Mazak, Syntec, Siemens) all preserve it as a
file-level boundary marker. Distinct from a comment: the controller
uses it as a tape/file delimiter, not as embedded operator text.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.TiltTransform.html">TiltTransform</a></dt>
<dd><p>Concrete class for <a class="xref" href="Hi.NcParsers.Keywords.ITiltTransformDef.html">ITiltTransformDef</a> section serialization.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.ToolHeightCompensation.html">ToolHeightCompensation</a></dt>
<dd><p>Section key holder for <a class="xref" href="Hi.NcParsers.Keywords.IToolHeightCompensationDef.html">IToolHeightCompensationDef</a>.</p>
</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>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.Vars.html">Vars</a></dt>
<dd><p>JSON section schema for per-block variable storage. Each sub-property
names a sub-section that holds a <code>{ &ldquo;#nnn&rdquo;: value }</code> dictionary
keyed by Fanuc-style variable id.</p>
<p>
The sub-sections partition the variable space by lifetime:
</p>
<ul><li><a class="xref" href="Hi.NcParsers.Keywords.Vars.html#Hi_NcParsers_Keywords_Vars_Local">Local</a><code>#1-#33</code>, scope: macro call frame
(pushed/popped by G65 / G66 / M99).</li><li><a class="xref" href="Hi.NcParsers.Keywords.Vars.html#Hi_NcParsers_Keywords_Vars_Volatile">Volatile</a><code>#100-#499</code>, non-retained common;
carries block-to-block, cleared by <code>ProgramEndCleanSyntax</code> on M02 / M30.</li><li><a class="xref" href="Hi.NcParsers.Keywords.Vars.html#Hi_NcParsers_Keywords_Vars_SystemControl">SystemControl</a><code>#3000-#3999</code>, controller-side
system variables; offline-only round-trip record (real controller
effects such as clock reset / alarm trigger / message pause are not
simulated).</li></ul>
<p>
The property types are <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">JsonObject</a> rather than strongly-typed
dictionaries because each sub-section's keys are dynamic Fanuc variable
ids (<code>#100</code>, <code>#5001</code>, …) discovered at parse time, not a fixed
schema. This class exists solely to give the section name and sub-keys
stable <code>nameof()</code> targets — instances are never constructed at
runtime.
</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.MotionEvent.html">MotionEvent</a> JSON section alongside
<a class="xref" href="Hi.NcParsers.Keywords.IMotionEventDef.html">IMotionEventDef</a> properties. The arc plane is read from the
modal <a class="xref" href="Hi.NcParsers.Keywords.PlaneSelect.html">PlaneSelect</a> section via
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.PlaneSelectSyntax.html#Hi_NcParsers_LogicSyntaxs_PlaneSelectSyntax_GetPlaneNormalDir_System_Text_Json_Nodes_JsonObject_">GetPlaneNormalDir(JsonObject)</a> rather than
cached on the event — same source of truth as
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoG68RotationSyntax.html">IsoG68RotationSyntax</a>.</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">
<dt><a class="xref" href="Hi.NcParsers.Keywords.ICompoundMotionDef.html">ICompoundMotionDef</a></dt>
<dd><p>Compound motion section definition for commands that produce
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.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)
(<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 <span class="xref">Hi.NcParsers.Semantics.CompoundMotionSemanticUtil</span> into
<a class="xref" href="Hi.Numerical.Acts.ActDelay.html">ActDelay</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IFanucPathSmoothingDef.html">IFanucPathSmoothingDef</a></dt>
<dd><p>Fanuc-specific path smoothing state written by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.FanucPathSmoothingSyntax.html">FanucPathSmoothingSyntax</a>.</p>
<p>
Extends <a class="xref" href="Hi.NcParsers.Keywords.IPathSmoothingDef.html">IPathSmoothingDef</a> with the Fanuc G05.1 R argument
(precision / smoothness level number, R1..R10 mapping to controller-internal
tuning macro variables). Q is binary in current Fanuc firmware (Q0 disable /
Q1 enable), so <a class="xref" href="Hi.NcParsers.Keywords.IPathSmoothingDef.html#Hi_NcParsers_Keywords_IPathSmoothingDef_IsEnabled">IsEnabled</a> covers it directly
— no raw Q field is stored.
</p>
<p>
JSON section key remains <code>nameof(PathSmoothing)</code> so generic readers
(cache dumps, modal carry, UI) can cast to <a class="xref" href="Hi.NcParsers.Keywords.IPathSmoothingDef.html">IPathSmoothingDef</a>
across all controller brands; brand-specific readers cast to
<a class="xref" href="Hi.NcParsers.Keywords.IFanucPathSmoothingDef.html">IFanucPathSmoothingDef</a> for the extra fields.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IFeedrateDef.html">IFeedrateDef</a></dt>
<dd><p>Feedrate state written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.FeedrateSyntax.html">FeedrateSyntax</a>.
Property names are used as JSON keys via <code>nameof</code>.</p>
<p>
ISO standard: F command + G94 (per minute) / G95 (per revolution).
Supported by all major CNC brands.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html">IFlagsDef</a></dt>
<dd><p>JSON section schema describing the modal/non-modal flags that take effect
on an NC block. Each entry in <a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html#Hi_NcParsers_Keywords_IFlagsDef_Flags">Flags</a> is a brand-specific
keyword recognized by the soft-NC runtime.</p>
</dd>
</dl>
<dl class="jumplist">
<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.IMotionEventDef.html">IMotionEventDef</a></dt>
<dd><p>One-shot motion event — present on every block whose source <em>programmed</em>
a motion command, regardless of whether the resulting displacement is non-zero.
A redundant <code>G01 X10</code> on a block already at X10 still gets a
<a class="xref" href="Hi.NcParsers.Keywords.MotionEvent.html">MotionEvent</a>; the 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>)
then early-return on <code>distance &lt;= 0</code> and emit no
<a class="xref" href="Hi.Numerical.Acts.IAct.html">IAct</a>. NOT carried forward across blocks.</p>
<p>
Reason for the "programmed, not displaced" definition: Fanuc G66 modal
macro fires once per <em>programmed</em> motion command (per Fanuc spec —
no distance gate), so <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucModalMacroSyntax.html">FanucModalMacroSyntax</a>.Expansion uses
<a class="xref" href="Hi.NcParsers.Keywords.MotionEvent.html">MotionEvent</a> presence as its trigger. Suppressing the section
on zero-distance moves would silently change G66 behaviour. The modal
sibling <a class="xref" href="Hi.NcParsers.Keywords.MotionState.html">MotionState</a> separately latches the Group-01 mode for
readers that only need to know "what G-code is active".
</p>
Property names are used as JSON keys via <code>nameof</code>.
</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>
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>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IParsingDef.html">IParsingDef</a></dt>
<dd><p>JSON section schema carrying the raw, brand-specific parsing trace for an
NC block. The <a class="xref" href="Hi.NcParsers.Keywords.IParsingDef.html#Hi_NcParsers_Keywords_IParsingDef_Parsing">Parsing</a> node holds intermediate parser output
used by downstream syntaxes and diagnostics.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IPathSmoothingDef.html">IPathSmoothingDef</a></dt>
<dd><p>Path smoothing state. The base interface is brand-agnostic; controller
brands extend it with their own argument fields (e.g.
<a class="xref" href="Hi.NcParsers.Keywords.IFanucPathSmoothingDef.html">IFanucPathSmoothingDef</a> for Fanuc G05.1 R precision-level).
Fanuc-flavour writes are produced by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.FanucPathSmoothingSyntax.html">FanucPathSmoothingSyntax</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><p>JSON section schema carrying the program-coordinate position commanded on
the current block. Written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a>
before the <a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a> chain
composes it into machine coordinates.</p>
</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>
arrays. Resolved by <span class="xref">Hi.NcParsers.Semantics.CompoundMotionSemanticUtil</span>
into <a class="xref" href="Hi.Numerical.Acts.ActSpindleDirection.html">ActSpindleDirection</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.ISpindleOrientationDef.html">ISpindleOrientationDef</a></dt>
<dd><p>Oriented spindle stop item for use inside
<a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html#Hi_NcParsers_Keywords_CompoundMotion_ItemsKey">ItemsKey</a> arrays.
Commands the spindle to stop at a specific angular position (OSS).
Resolved by <span class="xref">Hi.NcParsers.Semantics.CompoundMotionSemanticUtil</span>
into <a class="xref" href="Hi.Numerical.Acts.ActSpindleOrientation.html">ActSpindleOrientation</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.ISpindleSpeedDef.html">ISpindleSpeedDef</a></dt>
<dd><p>Spindle speed and direction state written by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.SpindleSpeedSyntax.html">SpindleSpeedSyntax</a>.
Property names are used as JSON keys via <code>nameof</code>.</p>
<p>
ISO: S command for speed, M03/M04/M05 for direction.
Heidenhain: M3/M4/M5. Siemens: M3/M4/M5 or SPOS.
Direction is stored as the conventional <a class="xref" href="Hi.Numerical.SpindleDirection.html">SpindleDirection</a>
enum name (CW/CCW/STOP), not as brand-specific M-codes.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.ITiltTransformDef.html">ITiltTransformDef</a></dt>
<dd><p>Tilt transform state written by tilt transform syntaxes.
Property names are used as JSON keys via <code>nameof</code>.</p>
<p>
Managed commands (ISO/Fanuc): G68 (2D rotation), G68.2 (tilted work plane), G69 (cancel).
Siemens equivalent: CYCLE800, ROT/AROT (handled by separate syntax).
Heidenhain equivalent: PLANE SPATIAL / PLANE RESET (handled by separate syntax).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IToolHeightCompensationDef.html">IToolHeightCompensationDef</a></dt>
<dd><p>Tool height compensation state written by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolHeightOffsetSyntax.html">ToolHeightOffsetSyntax</a>.
Property names are used as JSON keys via <code>nameof</code>.
The JSON section can be deserialized to an instance implementing this interface.</p>
<p>
Managed commands (ISO/Fanuc): G43, G44, G49.
Fanuc extension: G43.4 (TCPM — parsed only in Fanuc syntax list).
Siemens equivalent: TRAFOOF/TRAORI (handled by separate syntax).
Heidenhain equivalent: TOOL CALL / M128/M129 (handled by separate syntax).
</p>
</dd>
</dl>
<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
<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">
<dt><a class="xref" href="Hi.NcParsers.Keywords.IUnparsedTextDef.html">IUnparsedTextDef</a></dt>
<dd><p>JSON section schema carrying the residual block text that was not consumed
by any registered syntax. Used for diagnostics and round-trip preservation.</p>
</dd>
</dl>
</article>
<div class="contribution d-print-none">
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>