Archived
721 lines
33 KiB
HTML
721 lines
33 KiB
HTML
<!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's modal rotary state..[*] — sequential walk through items, anchoring item 0 at the previous block's modal state and item i &gt; 0 at item i-1'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'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. (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'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'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'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'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 ±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 — 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 "{query}"">
|
||
<meta name="loc:searchNoResults" content="No results for "{query}"">
|
||
<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 > 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<TSelf>(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<TSrc>(TSrc, Action<TSrc>)</a>
|
||
</div>
|
||
<div>
|
||
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__2___0_System_Func___0___1__">InvokeUtil.SelfInvoke<TSrc, TDst>(TSrc, Func<TSrc, TDst>)</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<SyntaxPiece>, List<INcDependency>, 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<SyntaxPiece> syntaxPieceNode, List<INcDependency> 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><<a class="xref" href="Hi.NcParsers.Syntaxs.SyntaxPiece.html">SyntaxPiece</a>></dt>
|
||
<dd></dd>
|
||
<dt><code>ncDependencyList</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a><<a class="xref" href="Hi.NcParsers.Dependencys.INcDependency.html">INcDependency</a>></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>
|