deploy webservice static-file routing for docsite folder URLs, per-instance step-cache db, and constant-height panel title bars.

This commit is contained in:
2026-08-27 14:51:37 +08:00
parent 1fc510af5e
commit 2a98ae7556
1468 changed files with 182837 additions and 18888 deletions
@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class CircularMotionSyntax | HiAPI-C# 2025 ">
<meta name="description" content="Writes motion for circular commands (ISO G02/G03). Detects motion mode from , reads I/J/K center offsets or R radius from , computes arc center in program coordinates, and writes a one-shot (form + arc params) plus a modal (Term). G02/G03 mode is modal (Group 01) — persists across blocks via . Arc parameters (I/J/K/R) are per-block and must be present in every arc block. Must be placed before in the syntax chain. Both share the Group 01 motion slot; whichever writes a first claims it.">
<meta name="description" content="Writes motion for circular commands (ISO G02/G03). Detects motion mode from , reads I/J/K center offsets or R radius from , computes arc center in program coordinates, and writes a one-shot (form + arc params) plus a modal (Term). G02/G03 mode is modal (Group 01) — persists across blocks via . Arc parameters (I/J/K/R) are per-block and must be present in every arc block. Must be placed before in the syntax chain. Both share the Group 01 motion slot; whichever writes a first claims it. switches the I/J/K reading to absolute center coordinates (Heidenhain DIN/ISO — the ISO twin of the Klartext CC pole; the Heidenhain list sets it, every other brand keeps the offset default). In that mode the center is modal: letters not written in a block inherit the previous absolute pole (, carried by the brand&#39;s ), a letter never written falls back to the arc start&#39;s component, a letters-free block that commands an endpoint continues the modal arc off the pole (a flags-only block stays motionless), a G91 block reads offsets again and breaks the pole chain, and the plane-normal letter is a center coordinate — never the per-turn helix pitch. Behavior mirrors HardNcLine.BuildArcNcArg + ArcNcArg.GetCenterOrCenterOnBeginPlane (HiUniNc 3.1.152.2) bit for bit.">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
@@ -114,6 +114,23 @@ Must be placed before <a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMoti
syntax chain. Both share the Group 01 motion slot; whichever
writes a <a class="xref" href="Hi.NcParsers.Keywords.MotionEvent.html">MotionEvent</a> first claims it.
</p>
<p>
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.html#Hi_NcParsers_LogicSyntaxs_CircularMotionSyntax_IsIjkAbsolute">IsIjkAbsolute</a> switches the I/J/K reading to absolute
center coordinates (Heidenhain DIN/ISO — the ISO twin of the
Klartext CC pole; the Heidenhain list sets it, every other brand
keeps the offset default). In that mode the center is modal: letters
not written in a block inherit the previous absolute pole
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.html#Hi_NcParsers_LogicSyntaxs_CircularMotionSyntax_AbsoluteIjkPoleKey">AbsoluteIjkPoleKey</a>, carried by the brand's
<a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html">ModalCarrySyntax</a>), a letter never
written falls back to the arc start's component, a letters-free
block that commands an endpoint continues the modal arc off the
pole (a flags-only block stays motionless), a G91 block reads
offsets again and breaks the pole chain, and the plane-normal letter
is a center coordinate — never the per-turn helix pitch. Behavior
mirrors <code>HardNcLine.BuildArcNcArg</code> +
<code>ArcNcArg.GetCenterOrCenterOnBeginPlane</code> (HiUniNc 3.1.152.2)
bit for bit.
</p>
</div>
<div class="markdown conceptual"></div>
@@ -347,8 +364,8 @@ semantic knows to draw the closed loop:
}</code></pre>
Fanuc L parameter (helix turn count, 1-based) — <code>L3</code> on a
start==end closed loop means three total turns, so
<code>AdditionalCircleNum = L − 1 = 2</code>. Matches legacy
<code>NcProc.cs:442</code>; the L parameter is consumed alongside I/J/K/R:
<code>AdditionalCircleNum = L − 1 = 2</code>. Matches the legacy
HardNc reading; the L parameter is consumed alongside I/J/K/R:
#BeforeBuild:
<pre><code class="lang-csharp">{
"Parsing": { "Flags": ["G02"], "I": 5, "J": 0, "L": 3 },
@@ -371,8 +388,8 @@ arc, it is the per-turn axial pitch, not a center offset. Here
<code>K = −3</code> mm/turn over <code>ΔZ = −9</code> mm gives
<code>AdditionalCircleNum = floor(−9 / −3) = 3</code>. The center stays
on the begin-plane (Z = 0) — <code>ResolveCenterFromIjk</code> zeros the
plane-normal component before adding to begin. Matches legacy
<code>NcProc.cs:458</code>:
plane-normal component before adding to begin. Matches the legacy
HardNc reading:
#BeforeBuild:
<pre><code class="lang-csharp">{
"Parsing": { "Flags": ["G02"], "I": 5, "J": 0, "K": -3 },
@@ -389,6 +406,95 @@ plane-normal component before adding to begin. Matches legacy
"AdditionalCircleNum": 3
}
}</code></pre>
Absolute I/J (<code>IsIjkAbsolute = true</code> on the SUT — the
Heidenhain DIN/ISO reading; values taken from a real production
program): I/J ARE the center's program coordinates, the center
is locked onto the begin plane (Z from the previous block), the
post-inheritance letters are recorded as the modal
<code>AbsoluteIjkPole</code> section and the event is stamped
<code>IsIjkAbsolute</code> for the NcOpt splition write-back (the arc
start comes from the predecessor's <code>MachineCoordinateState</code> —
the modal anchor <code>GetLastProgramXyz</code> reads; no transform chain
here, so it equals the program position):
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "X": -23.958, "Y": -0.0965, "Z": 3.4338 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{
"Parsing": { "Flags": ["G02"], "I": -23.3261, "J": -1.2062 },
"ProgramXyz": { "X": -23.3253, "Y": 0.0708, "Z": 3.4338 }
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"ProgramXyz": { "X": -23.3253, "Y": 0.0708, "Z": 3.4338 },
"AbsoluteIjkPole": { "I": -23.3261, "J": -1.2062 },
"MotionState": { "Term": "G02" },
"MotionEvent": {
"Form": "McArc",
"ArcCenter": { "X": -23.3261, "Y": -1.2062, "Z": 3.4338 },
"IsCcw": false,
"AdditionalCircleNum": 0,
"IsIjkAbsolute": true
}
}</code></pre>
Absolute modal pole (the CC-pole twin): a continuation block writes
only J — the I component inherits the previous block's
<code>AbsoluteIjkPole</code>, the G03 mode continues via
<code>#Previous:</code> <code>MotionState.Term</code>, and the refreshed pole is
written back:
#Previous:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "X": -25.2297, "Y": 0.0704, "Z": 0 },
"AbsoluteIjkPole": { "I": -25.2029, "J": -0.9154 },
"MotionState": { "Term": "G03" }
}</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{
"Parsing": { "J": -0.9154 },
"ProgramXyz": { "X": -24.9288, "Y": 0.5929, "Z": 0 }
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"ProgramXyz": { "X": -24.9288, "Y": 0.5929, "Z": 0 },
"AbsoluteIjkPole": { "I": -25.2029, "J": -0.9154 },
"MotionState": { "Term": "G03" },
"MotionEvent": {
"Form": "McArc",
"ArcCenter": { "X": -25.2029, "Y": -0.9154, "Z": 0 },
"IsCcw": true,
"AdditionalCircleNum": 0,
"IsIjkAbsolute": true
}
}</code></pre>
G91 on an <code>IsIjkAbsolute</code> SUT switches the block back to the
ordinary start-to-center offsets (center = begin + (I, J)), ignores
the inherited pole and BREAKS the pole chain — the emptied section
blocks the ModalCarry copy, so a later absolute block falls back to
the arc start (the <code>preArcNcArg.IsIjkAbsolute</code> check of
<code>HardNcLine.BuildArcNcArg</code>):
#Previous:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "X": 10, "Y": 0, "Z": 0 },
"AbsoluteIjkPole": { "I": -25.2029, "J": -0.9154 }
}</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{
"Parsing": { "Flags": ["G02"], "I": 10, "J": 0 },
"Positioning": { "Term": "G91", "Mode": "Incremental" },
"ProgramXyz": { "X": 20, "Y": 10, "Z": 0 }
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"Positioning": { "Term": "G91", "Mode": "Incremental" },
"ProgramXyz": { "X": 20, "Y": 10, "Z": 0 },
"AbsoluteIjkPole": {},
"MotionState": { "Term": "G02" },
"MotionEvent": {
"Form": "McArc",
"ArcCenter": { "X": 20, "Y": 0, "Z": 0 },
"IsCcw": false,
"AdditionalCircleNum": 0
}
}</code></pre>
@@ -457,10 +563,87 @@ plane-normal component before adding to begin. Matches legacy
<h2 class="section" id="fields">Fields
</h2>
<h3 id="Hi_NcParsers_LogicSyntaxs_CircularMotionSyntax_AbsoluteIjkPoleKey" data-uid="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.AbsoluteIjkPoleKey">
AbsoluteIjkPoleKey
</h3>
<div class="markdown level1 summary"><p>Root-section key of the modal absolute-center pole (the letters of
the last absolute arc, post-inheritance — the SoftNc dual of
<code>HardNcLine.ArcNcArg.Ijk</code>). Written by every effective-absolute
arc block, emptied by a G91 arc block to break the chain, and
carried across intermediate blocks by the brand list's
<a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html">ModalCarrySyntax</a> Logic track. Kept
apart from <code>HeidenhainCircleCenterSyntax</code>'s Klartext CC
section — the two dialect poles never share a key.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public const string AbsoluteIjkPoleKey = &quot;AbsoluteIjkPole&quot;</code></pre>
</div>
<h4 class="section">Field 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="properties">Properties
</h2>
<a id="Hi_NcParsers_LogicSyntaxs_CircularMotionSyntax_IsIjkAbsolute_" data-uid="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.IsIjkAbsolute*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_CircularMotionSyntax_IsIjkAbsolute" data-uid="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.IsIjkAbsolute">
IsIjkAbsolute
</h3>
<div class="markdown level1 summary"><p>When true, I/J/K address the circle center as absolute program
coordinates instead of start-to-center offsets, with the modal-pole
/ G91 semantics described on the class doc. Set by the Heidenhain
list (DIN/ISO dialect); every other brand keeps the offset default.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public bool IsIjkAbsolute { get; set; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="Hi_NcParsers_LogicSyntaxs_CircularMotionSyntax_Name_" data-uid="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.Name*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_CircularMotionSyntax_Name" data-uid="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.Name">