This repository has been archived on 2026-10-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
HiNC-2025-win-desktop-Deploy/App/wwwroot/HiAPI-docsite/api/Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html
T
2026-09-15 01:12:50 +08:00

721 lines
33 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>Class McAbcCyclicPathSyntax | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class McAbcCyclicPathSyntax | HiAPI-C# 2025 ">
<meta name="description" content="Resolve modular rotary axes to the shortest cyclic path relative to the previous node. Uses to determine which axes within need cyclic resolution. Falls back to hardcoded A/B/C if no is available. Must be placed after in . Two stages, mirroring : Root MachineCoordinateState — anchored at the previous block&#39;s modal rotary state..[*] — sequential walk through items, anchoring item 0 at the previous block&#39;s modal state and item i &amp;gt; 0 at item i-1&#39;s post-cycle value (per-axis chain). Items without a rotary MachineCoordinateState are skipped. The items pass enables rotary motion (e.g. G28 ABC intermediate / home stages) to surface as motion segments rather than a single root-MC stamp. Per-word directional override: a block-root entry (stamped by ) valued (Siemens ACP()) or (ACN()) swaps that axis&#39;s window for this block only: [anchor, anchor+360&#176;) / (anchor-360&#176;, anchor] instead of the default &#177;180&#176; — the approach direction is forced even when it is the longer way around. A target congruent with the anchor (within an ULP-scale epsilon) keeps the anchor value verbatim — no move, never a spurious full turn, and no deg→rad→deg drift. (DC()) is the default window and needs no special path here. The override is read from the current block only (it is one-shot, never carried — deliberately unlike the modal RotaryWrap gate&#39;s one-step previous fallback) and applies to the root MC stage, not to items in general (G28/G74/G75 expansions capture their words in sub-objects the stamping syntax never sees, so an override can only ever describe a root word) — with one exception: an item whose value for an axis equals the root&#39;s pre-pass value verbatim carries that same root word (the canned-cycle pre-positioning item that stamps from the root MC) and inherits the root&#39;s directive for that axis, so the default window cannot fold the forced swing the root resolved into the short way. Directional/shortest entries keyed by an axis outside the modular set are reported as Coord-McAbc--003 — the promise cannot be honored there and silence would mis-read the program&#39;s intent; an entry with no anchor to resolve against (first rotary value in the stream) is reported as Coord-McAbc--004 and adopted unwrapped, matching the default path. Incremental words: a rotary word programmed as an increment — per-word (Siemens IC(), klartext IC+270) or a bare word under modal G91 — is a signed traverse by definition. already wrote anchor + delta into the MC and listed the axis in the one-shot record; this pass reads that record — and only that record — and keeps the listed axes verbatim instead of folding them into the &#177;180&#176; window (a +270&#176; chain dimension must not become a -90&#176; swing). A listed non-modular axis needs nothing: the literal value is what the axis would do anyway. A rotary value the block carries without a word (lookback fill, or an absolute target another writer put there — G53.1, the Heidenhain PLANE syntax) is not listed and keeps the default window even under G91.">
<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.LogicSyntaxs.McAbcCyclicPathSyntax">
<h1 id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax" class="text-break">
Class McAbcCyclicPathSyntax
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="Hi.html">Hi</a>.<a class="xref" href="Hi.NcParsers.html">NcParsers</a>.<a class="xref" href="Hi.NcParsers.LogicSyntaxs.html">LogicSyntaxs</a></dd></dl>
<dl><dt>Assembly</dt><dd>HiMech.dll</dd></dl>
</div>
<div class="markdown summary"><p>Resolve modular rotary axes to the shortest cyclic path relative to the previous node.
Uses <a class="xref" href="Hi.NcParsers.Dependencys.IMachineAxisConfig.html#Hi_NcParsers_Dependencys_IMachineAxisConfig_IsModularRotary_System_String_">IsModularRotary(string)</a> to determine which axes
within <a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a> need cyclic resolution.
Falls back to hardcoded A/B/C if no <a class="xref" href="Hi.NcParsers.Dependencys.IMachineAxisConfig.html">IMachineAxisConfig</a> is available.
Must be placed after <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a> in <a class="xref" href="Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_NcSyntaxList">NcSyntaxList</a>.</p>
<p>
Two stages, mirroring <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a>:
<ol><li>Root <code>MachineCoordinateState</code> — anchored at the previous
block's modal rotary state.</li><li><a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html">CompoundMotion</a>.<a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html#Hi_NcParsers_Keywords_CompoundMotion_ItemsKey">ItemsKey</a>[*]
— sequential walk through items, anchoring item 0 at the previous
block's modal state and item <code>i &gt; 0</code> at item <code>i-1</code>'s
post-cycle value (per-axis chain). Items without a rotary
<code>MachineCoordinateState</code> are skipped.</li></ol>
The items pass enables rotary motion (e.g. G28 ABC intermediate /
home stages) to surface as motion <a class="xref" href="Hi.Numerical.Acts.IAct.html">IAct</a>
segments rather than a single root-MC stamp.
<p>
Per-word directional override: a block-root
<a class="xref" href="Hi.NcParsers.Keywords.PositioningOverride.html">PositioningOverride</a> entry (stamped by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensAcIcSyntax.html">SiemensAcIcSyntax</a>) valued
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_PositiveOnly">PositiveOnly</a> (Siemens <code>ACP()</code>) or
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_NegativeOnly">NegativeOnly</a> (<code>ACN()</code>) swaps that
axis's window for this block only: [anchor, anchor+360°) /
(anchor-360°, anchor] instead of the default ±180° — the approach
direction is forced even when it is the longer way around. A target
congruent with the anchor (within an ULP-scale epsilon) keeps the
anchor value verbatim — no move, never a spurious full turn, and no
deg→rad→deg drift. <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Shortest">Shortest</a> (<code>DC()</code>)
is the default window and needs no special path here. The override
is read from the current block only (it is one-shot, never carried —
deliberately unlike the modal <code>RotaryWrap</code> gate's one-step
previous fallback) and applies to the root MC stage, not to
<a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html">CompoundMotion</a> items in general (G28/G74/G75 expansions
capture their words in sub-objects the stamping syntax never sees, so
an override can only ever describe a root word) — with one exception:
an item whose value for an axis equals the root's pre-pass value
verbatim carries that same root word (the canned-cycle
pre-positioning item that
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">WriteCompoundMotion(JsonObject, string, JsonArray, Vec3d)</a> stamps
from the root MC) and inherits the root's directive for that axis, so
the default window cannot fold the forced swing the root resolved
into the short way. Directional/shortest
entries keyed by an axis outside the modular set are reported as
<code>Coord-McAbc--003</code> — the promise cannot be honored there and
silence would mis-read the program's intent; an entry with no anchor
to resolve against (first rotary value in the stream) is reported as
<code>Coord-McAbc--004</code> and adopted unwrapped, matching the default
path.
</p>
<p>
Incremental words: a rotary word programmed as an increment —
per-word (Siemens <code>IC()</code>, klartext <code>IC+270</code>) or a bare
word under modal <code>G91</code> — is a signed traverse by definition.
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> already wrote anchor + delta into the MC
and listed the axis in the one-shot <a class="xref" href="Hi.NcParsers.Keywords.IncrementalWords.html">IncrementalWords</a>
record; this pass reads that record — and only that record — and
keeps the listed axes verbatim instead of folding them into the ±180°
window (a +270° chain dimension must not become a -90° swing). A
listed non-modular axis needs nothing: the literal value is what the
axis would do anyway. A rotary value the block carries without a
word (lookback fill, or an absolute target another writer put there
— <code>G53.1</code>, the Heidenhain <code>PLANE</code> syntax) is not listed
and keeps the default window even under G91.
</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public class McAbcCyclicPathSyntax : ISituNcSyntax, INcSyntax, IMakeXmlSource</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">McAbcCyclicPathSyntax</span></div>
</dd>
</dl>
<dl class="typelist implements">
<dt>Implements</dt>
<dd>
<div><a class="xref" href="Hi.NcParsers.Syntaxs.ISituNcSyntax.html">ISituNcSyntax</a></div>
<div><a class="xref" href="Hi.NcParsers.Syntaxs.INcSyntax.html">INcSyntax</a></div>
<div><a class="xref" href="Hi.Common.XmlUtils.IMakeXmlSource.html">IMakeXmlSource</a></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone">object.MemberwiseClone()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
</dd></dl>
<dl class="typelist extensionMethods">
<dt>Extension Methods</dt>
<dd>
<div>
<a class="xref" href="Hi.Common.DuplicateUtil.html#Hi_Common_DuplicateUtil_TryDuplicate__1___0_System_Object___">DuplicateUtil.TryDuplicate&lt;TSelf&gt;(TSelf, params object[])</a>
</div>
<div>
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__1___0_System_Action___0__">InvokeUtil.SelfInvoke&lt;TSrc&gt;(TSrc, Action&lt;TSrc&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__2___0_System_Func___0___1__">InvokeUtil.SelfInvoke&lt;TSrc, TDst&gt;(TSrc, Func&lt;TSrc, TDst&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Coloring.ColorUtil.html#Hi_Coloring_ColorUtil_GetGloomyColor_System_Object_System_Double_System_Double_">ColorUtil.GetGloomyColor(object, double, double)</a>
</div>
<div>
<a class="xref" href="Hi.Common.NameUtil.html#Hi_Common_NameUtil_GetSelectionName_System_Object_">NameUtil.GetSelectionName(object)</a>
</div>
<div>
<a class="xref" href="Hi.Common.StringUtil.html#Hi_Common_StringUtil_GetPropertyStringIfToStringNotOverloaded_System_Object_System_Boolean_System_Boolean_">StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool)</a>
</div>
<div>
<a class="xref" href="Hi.Parallels.LockUtil.html#Hi_Parallels_LockUtil_Lock_System_Object_">LockUtil.Lock(object)</a>
</div>
</dd></dl>
<h2 id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax_examples">Examples</h2>
<p>Cases below run with no <a class="xref" href="Hi.NcParsers.Dependencys.IMachineAxisConfig.html">IMachineAxisConfig</a> on the dep
list, so the syntax uses the A/B/C fallback (a configuration
warning is emitted but does not affect the JSON). The syntax is
the tail-pass rotary-wrap centraliser — upstream rotary writers
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a>, G28, G53.1, ...) store raw degrees and
let this pass resolve to the shortest cyclic path.</p>
<p>
Current B is within ±180° of the previous B — no wrap needed; the
value is rewritten in place but equals the input:
</p>
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 0 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 10 } }</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 10 } }</code></pre>
Current B is 270° but previous B is 0° — the shortest path is the
other way around, so the value is rewritten as -90° (mathematically
equivalent, geometrically the same orientation, but signalling the
shorter rotation to a downstream motion consumer). 270/0 round-trips
through <code>ToRad</code>→<code>Cycle</code>→<code>ToDeg</code> with no rounding
noise (1.5π → -0.5π → -90 exactly); other angle pairs (e.g.
350° → -10°) emit a trailing ULP-scale drift instead:
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 0 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 270 } }</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": -90 } }</code></pre>
First block of the stream (no <code>#Previous:</code>) — no anchor to
resolve against, so the syntax early-returns and the raw value is
preserved verbatim:
#BeforeBuild:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 350 } }</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 350 } }</code></pre>
<p>
<code>CompoundMotion.Items</code> walk — two items chain: item 0 cycles
against the previous block's modal B = 0° (270° → -90°), and item 1
cycles against item 0's post-cycle -90° (170° → -190°, since the
shorter path from -90° to 170° wraps backward through -180°). If
item 1 had used the previous-block anchor instead of the chained
anchor, 170° would have stayed at 170° (already in the ±180° window
around 0°), so the test discriminates between chain and no-chain:
</p>
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 0 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{
"CompoundMotion": {
"Items": [
{ "MachineCoordinateState": { "B": 270 } },
{ "MachineCoordinateState": { "B": 170 } }
]
}
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"CompoundMotion": {
"Items": [
{ "MachineCoordinateState": { "B": -90 } },
{ "MachineCoordinateState": { "B": -190 } }
]
}
}</code></pre>
<p>
<code>ACP</code> (PositiveOnly) forces the positive swing even though the
shortest path from 0° to 270° is -90° (compare the default case
above — same numbers, opposite outcome). The override section stays
on the block (nothing consumes it away):
</p>
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 0 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 270 },
"PositioningOverride": { "B": "PositiveOnly" }
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 270 },
"PositioningOverride": { "B": "PositiveOnly" }
}</code></pre>
<code>ACN</code> (NegativeOnly) mirror — target 90° from anchor 0° swings
-270° instead of the shortest +90°:
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 0 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 90 },
"PositioningOverride": { "B": "NegativeOnly" }
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": -270 },
"PositioningOverride": { "B": "NegativeOnly" }
}</code></pre>
Congruent target under a directional override — the raw anchor sits
at 370° (e.g. after an earlier ACP long-way swing) and the ACN
target 10° is the same physical position: no move, the anchor value
is kept verbatim (the epsilon snap; without it, radian ULP noise
would decide between "no move" and a spurious full -360° turn):
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 370 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 10 },
"PositioningOverride": { "B": "NegativeOnly" }
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 370 },
"PositioningOverride": { "B": "NegativeOnly" }
}</code></pre>
Incremental word (<code>B=IC(270)</code> / klartext <code>L IB+270</code>): the
rotary writer accumulated anchor 0° + 270° = 270° and listed B in
<code>IncrementalWords</code>, and the pass keeps the traverse literal —
the same 270° that the default window above rewrote to -90° stays
+270°. The per-word entry is still on the block (nothing consumes
it) but is not what this pass reads:
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 0 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 270 },
"PositioningOverride": { "B": "Incremental" },
"IncrementalWords": { "B": 270 }
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 270 },
"PositioningOverride": { "B": "Incremental" },
"IncrementalWords": { "B": 270 }
}</code></pre>
A <code>CompoundMotion</code> item carrying the root word verbatim — the
canned-cycle pre-positioning item that
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">WriteCompoundMotion(JsonObject, string, JsonArray, Vec3d)</a> stamps from
the root MC of a <code>B=ACP(270)</code> block — inherits the root's
<code>PositiveOnly</code> directive: both stay +270 instead of the item
folding to -90 as the plain items-walk case above would (same
numbers, opposite outcome). The second item is not a copy (170 ≠ 270)
and resolves under the default window against the chained anchor
270°, where 170 is already the short way:
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 0 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 270 },
"PositioningOverride": { "B": "PositiveOnly" },
"CompoundMotion": {
"Items": [
{ "MachineCoordinateState": { "B": 270 } },
{ "MachineCoordinateState": { "B": 170 } }
]
}
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 270 },
"PositioningOverride": { "B": "PositiveOnly" },
"CompoundMotion": {
"Items": [
{ "MachineCoordinateState": { "B": 270 } },
{ "MachineCoordinateState": { "B": 170 } }
]
}
}</code></pre>
A bare rotary word under modal G91 (Fanuc <code>G91 … B270.</code>) has no
per-word entry at all — the rotary writer accumulated 0° + 270° and
listed B in <code>IncrementalWords</code>, and that listing alone keeps the
+270° traverse literal. C is on the block without a word (the value
an absolute writer such as <code>G53.1</code> would leave), so it is not
listed and still resolves under the default window: 270° from anchor
0° folds to −90°. Neither <code>Positioning</code> nor <code>RotaryWords</code>
is consulted, so the case carries neither:
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "B": 0, "C": 0 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{
"IncrementalWords": { "B": 270 },
"MachineCoordinateState": { "B": 270, "C": 270 }
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"IncrementalWords": { "B": 270 },
"MachineCoordinateState": { "B": 270, "C": -90 }
}</code></pre>
<h2 class="section" id="constructors">Constructors
</h2>
<a id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax__ctor_" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.#ctor*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax__ctor" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.#ctor">
McAbcCyclicPathSyntax()
</h3>
<div class="markdown level1 summary"><p>Initializes a new instance with default settings.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public McAbcCyclicPathSyntax()</code></pre>
</div>
<a id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax__ctor_" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.#ctor*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax__ctor_System_Xml_Linq_XElement_" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.#ctor(System.Xml.Linq.XElement)">
McAbcCyclicPathSyntax(XElement)
</h3>
<div class="markdown level1 summary"><p>Initializes a new instance by deserializing from the given XML element.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public McAbcCyclicPathSyntax(XElement src)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>src</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.xml.linq.xelement">XElement</a></dt>
<dd><p>Source XML element.</p>
</dd>
</dl>
<h2 class="section" id="properties">Properties
</h2>
<a id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax_Name_" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.Name*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax_Name" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.Name">
Name
</h3>
<div class="markdown level1 summary"><p>Syntax kind name (typically the concrete type name).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public string Name { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<a id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax_XName_" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.XName*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax_XName" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.XName">
XName
</h3>
<div class="markdown level1 summary"><p>XML element name used to register this syntax with <a class="xref" href="Hi.Common.XmlUtils.XFactory.html">XFactory</a>.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static string XName { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
<a id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax_Build_" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.Build*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax_Build_Hi_Common_Collections_LazyLinkedListNode_Hi_NcParsers_Syntaxs_SyntaxPiece__System_Collections_Generic_List_Hi_NcParsers_Dependencys_INcDependency__Hi_NcParsers_NcDiagnosticProgress_" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.Build(Hi.Common.Collections.LazyLinkedListNode{Hi.NcParsers.Syntaxs.SyntaxPiece},System.Collections.Generic.List{Hi.NcParsers.Dependencys.INcDependency},Hi.NcParsers.NcDiagnosticProgress)">
Build(LazyLinkedListNode&lt;SyntaxPiece&gt;, List&lt;INcDependency&gt;, NcDiagnosticProgress)
</h3>
<div class="markdown level1 summary"><p>Build syntax arrangement into the
<code class="paramref">syntaxPieceNode</code> in-place.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void Build(LazyLinkedListNode&lt;SyntaxPiece&gt; syntaxPieceNode, List&lt;INcDependency&gt; ncDependencyList, NcDiagnosticProgress ncDiagnosticProgress)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>syntaxPieceNode</code> <a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html">LazyLinkedListNode</a>&lt;<a class="xref" href="Hi.NcParsers.Syntaxs.SyntaxPiece.html">SyntaxPiece</a>&gt;</dt>
<dd></dd>
<dt><code>ncDependencyList</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;<a class="xref" href="Hi.NcParsers.Dependencys.INcDependency.html">INcDependency</a>&gt;</dt>
<dd></dd>
<dt><code>ncDiagnosticProgress</code> <a class="xref" href="Hi.NcParsers.NcDiagnosticProgress.html">NcDiagnosticProgress</a></dt>
<dd></dd>
</dl>
<a id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax_MakeXmlSource_" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.MakeXmlSource*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax_MakeXmlSource_System_String_System_String_System_Boolean_" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.MakeXmlSource(System.String,System.String,System.Boolean)">
MakeXmlSource(string, string, bool)
</h3>
<div class="markdown level1 summary"><p>Creates an XML representation of the object.
This method may also generate additional resources such as related files.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public XElement MakeXmlSource(string baseDirectory, string relFile, bool exhibitionOnly)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>baseDirectory</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd><p>The base directory for resolving relative paths</p>
</dd>
<dt><code>relFile</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd><p>The relative file path for the XML source</p>
</dd>
<dt><code>exhibitionOnly</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd><p>if true, the extended file creation is suppressed.</p>
</dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.xml.linq.xelement">XElement</a></dt>
<dd><p>An XML element representing the object's state</p>
</dd>
</dl>
<h4 class="section" id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax_MakeXmlSource_System_String_System_String_System_Boolean__remarks">Remarks</h4>
<div class="markdown level1 remarks"><p>For the demand of easy moving source folder (especially project folder) without configuration file path corruption, the relative file path is applied.
The <code class="paramref">baseDirectory</code> is typically the folder at the nearest configuration file folder.
Since the folder can be moving with the configuration file.</p>
</div>
<a id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax_Reg_" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.Reg*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_McAbcCyclicPathSyntax_Reg_Hi_Common_XmlUtils_XFactory_" data-uid="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.Reg(Hi.Common.XmlUtils.XFactory)">
Reg(XFactory)
</h3>
<div class="markdown level1 summary"><p>Registers this type's deserializer with the given <a class="xref" href="Hi.Common.XmlUtils.XFactory.html">XFactory</a>
(or <a class="xref" href="Hi.Common.XmlUtils.XFactory.html#Hi_Common_XmlUtils_XFactory_Default">Default</a> when <code class="paramref">factory</code> is
<code>null</code>). Idempotent.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static void Reg(XFactory factory = null)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>factory</code> <a class="xref" href="Hi.Common.XmlUtils.XFactory.html">XFactory</a></dt>
<dd></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>