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 ProgramXyzUtil | HiAPI-C# 2025 ">
<meta name="description" content="Shared utilities for and lookback and resolution. Used by , , and semantic resolvers that need position lookback. Two strategies for &quot;what&#39;s the program coordinate at a block&#39;s endpoint?&quot; — both invert an MC value through an chain, but they pick the chain from different nodes: By current-state transform () — modal anchor is . Re-expresses an MC value (typically a predecessor&#39;s modal MC) into the current block&#39;s program frame using the current block&#39;s chain. Suitable for chain-change blocks where the spindle physically stays put while the chain (G54 swap, G68.2 activation, G43.4 toggle, tool-height change, ...) re-anchors the program frame; mirrors legacy HardNcLine.RebuildProgramXyzByMc. By corresponding-state transform () — modal anchor is . Recovers the program coordinate that nodeCarryingMc was originally commanded at, by inverting that same node&#39;s own transform on its own MC. Suitable for RTCP rotary-dynamic inheritance, where the modal invariant is &quot;tool tip in workpiece frame stays put while rotary axes turn&quot; — the recovered Vec3d carries forward as the next rotary block&#39;s modal ProgramXyz unchanged, regardless of how its PivotTransform differs. Both strategies yield the same Vec3d when prev and current share the same chain modal state; they only diverge across chain boundaries (RTCP toggle, coord-system swap, tilt activation) and at rotary motion (PivotTransform difference). Pick the wrong one and the result lands in a stale frame: Non-RTCP using &quot;corresponding&quot; — leaves the pre-chain-change values, so a block emitted right after G43.4 H03 would inherit ProgramXyz still in the G49 frame and the next motion&#39;s MC.Z drifts by the introduced tool-height offset. (This was the 2026-04-25 SoftNc / HardNc divergence on DemoPmcAirPlane/NC/02-ED6L20.NC.) RTCP using &quot;current&quot; — double-counts the rotary PivotTransform difference, so the inherited workpiece anchor rotates by the C delta on every rotary block. Direct callers of the two strategy helpers are rare — typically you call the dispatcher (block&#39;s own MC vs predecessor lookback, picks strategy from ) or (pure predecessor lookback).">
<meta name="description" content="Shared utilities for and lookback and resolution. Used by , , and semantic resolvers that need position lookback. Two strategies for &quot;what&#39;s the program coordinate at a block&#39;s endpoint?&quot; — both invert an MC value through an chain, but they pick the chain from different nodes: By current-state transform () — modal anchor is . Re-expresses an MC value (typically a predecessor&#39;s modal MC) into the current block&#39;s program frame using the current block&#39;s chain. Suitable for chain-change blocks where the spindle physically stays put while the chain (G54 swap, G68.2 activation, G43.4 toggle, tool-height change, ...) re-anchors the program frame; mirrors legacy HardNcLine.RebuildProgramXyzByMc. By corresponding-state transform () — modal anchor is . Recovers the program coordinate that nodeCarryingMc was originally commanded at, by inverting that same node&#39;s own transform on its own MC. Suitable for RTCP rotary-dynamic inheritance, where the modal invariant is &quot;tool tip in workpiece frame stays put while rotary axes turn&quot; — the recovered Vec3d carries forward as the next rotary block&#39;s modal ProgramXyz unchanged, regardless of how its PivotTransform differs. Both strategies yield the same Vec3d when prev and current share the same chain modal state; they only diverge across chain boundaries (RTCP toggle, coord-system swap, tilt activation) and at rotary motion (PivotTransform difference). Pick the wrong one and the result lands in a stale frame: Non-RTCP using &quot;corresponding&quot; — leaves the pre-chain-change values, so a block emitted right after G43.4 H03 would inherit ProgramXyz still in the G49 frame and the next motion&#39;s MC.Z drifts by the introduced tool-height offset. (This was the 2026-04-25 SoftNc / HardNc divergence found on a five-axis sample program.) RTCP using &quot;current&quot; — double-counts the rotary PivotTransform difference, so the inherited workpiece anchor rotates by the C delta on every rotary block. Direct callers of the two strategy helpers are rare — typically you call the dispatcher (block&#39;s own MC vs predecessor lookback, picks strategy from ) or (pure predecessor lookback).">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
@@ -142,7 +142,7 @@ Non-RTCP using "corresponding" — leaves the pre-chain-change values,
so a block emitted right after <code>G43.4 H03</code> would inherit
ProgramXyz still in the G49 frame and the next motion's MC.Z drifts
by the introduced tool-height offset. (This was the 2026-04-25
SoftNc / HardNc divergence on <code>DemoPmcAirPlane/NC/02-ED6L20.NC</code>.)
SoftNc / HardNc divergence found on a five-axis sample program.)
</li><li>
RTCP using "current" — double-counts the rotary
<code>PivotTransform</code> difference, so the inherited workpiece anchor
@@ -323,6 +323,52 @@ from the non-RTCP branch of <a class="xref" href="Hi.NcParsers.LogicSyntaxs.Prog
<a id="Hi_NcParsers_LogicSyntaxs_ProgramXyzUtil_DidAbcChange_" data-uid="Hi.NcParsers.LogicSyntaxs.ProgramXyzUtil.DidAbcChange*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_ProgramXyzUtil_DidAbcChange_Hi_Common_Collections_LazyLinkedListNode_Hi_NcParsers_Syntaxs_SyntaxPiece__Hi_NcParsers_Dependencys_IMachineAxisConfig_" data-uid="Hi.NcParsers.LogicSyntaxs.ProgramXyzUtil.DidAbcChange(Hi.Common.Collections.LazyLinkedListNode{Hi.NcParsers.Syntaxs.SyntaxPiece},Hi.NcParsers.Dependencys.IMachineAxisConfig)">
DidAbcChange(LazyLinkedListNode&lt;SyntaxPiece&gt;, IMachineAxisConfig)
</h3>
<div class="markdown level1 summary"><p>True when any rotary axis differs between the current block's
<a class="xref" href="Hi.NcParsers.Keywords.MachineCoordinateState.html">MachineCoordinateState</a> and the previous modal value
(per-axis, 1e-9 rad tolerance; a NaN↔value transition counts as a
change). Used by the RTCP syntaxes (<a class="xref" href="Hi.NcParsers.LogicSyntaxs.G43p4RtcpSyntax.html">G43p4RtcpSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.Siemens.SiemensTraoriSyntax.html">SiemensTraoriSyntax</a>) to decide the
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_KindDynamic">KindDynamic</a> tagging of the
tool-height chain entry — when the tool orientation varies along
the contour, the entry is an endpoint-only snapshot.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static bool DidAbcChange(LazyLinkedListNode&lt;SyntaxPiece&gt; node, IMachineAxisConfig axisConfig)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>node</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>axisConfig</code> <a class="xref" href="Hi.NcParsers.Dependencys.IMachineAxisConfig.html">IMachineAxisConfig</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</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_ProgramXyzUtil_FindPreviousMc_" data-uid="Hi.NcParsers.LogicSyntaxs.ProgramXyzUtil.FindPreviousMc*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_ProgramXyzUtil_FindPreviousMc_Hi_Common_Collections_LazyLinkedListNode_Hi_NcParsers_Syntaxs_SyntaxPiece__" data-uid="Hi.NcParsers.LogicSyntaxs.ProgramXyzUtil.FindPreviousMc(Hi.Common.Collections.LazyLinkedListNode{Hi.NcParsers.Syntaxs.SyntaxPiece})">
@@ -380,11 +426,29 @@ XYZ-carrying block lacks a particular rotary value, we continue
walking back to find the last block that wrote that axis (modal
rotary state). This matches NC semantics — unchanged rotary axes
carry forward silently — and prevents NaN rotary deltas from
stopping <a class="xref" href="Hi.NcParsers.Semantics.ClLinearMotionSemantic.html">ClLinearMotionSemantic</a>'s
stopping <a class="xref" href="Hi.NcParsers.Semantics.ClLinearMcMotionSemantic.html">ClLinearMcMotionSemantic</a>'s
duration computation in RTCP contours where the XYZ block right
before the current one didn't record ABC.
</p>
<p>
In the standard pipeline the per-axis walks are BOUNDED:
<a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html#Hi_NcParsers_PostLogicSyntaxs_ModalCarrySyntax_MergeKeys">MergeKeys</a> completes
every block's section with the carried modal values, and
<a class="xref" href="Hi.NcParsers.Initializers.HomeMcInitializer.html">HomeMcInitializer</a> seeds every DECLARED
axis on the first piece — so the nearest XYZ carrier already
answers all declared axes and the backfill loop is a fallback only:
for Logic-stage reads inside a
<a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.RadiusCompensationSyntax.html">RadiusCompensationSyntax</a> look-forward
window (dragged builds see not-yet-completed predecessors) and for
pipelines without the carry. Both legs matter: without the home
seed, a declared axis the program never writes would walk the whole
history on every block. Do not remove the walks, and never let
a new backward walk read frozen pieces per node without such a
bound: each visited frozen piece re-parses its whole JSON snapshot,
which made per-step cost grow with playback progress before the
merge existed.
</p>
<p>
<code class="paramref">axisConfig</code> scopes the rotary-backfill to the
machine's declared rotary axes (via
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.RotaryAxisUtil.html#Hi_NcParsers_LogicSyntaxs_RotaryAxisUtil_GetRotaryAxes_Hi_NcParsers_Dependencys_IMachineAxisConfig_">GetRotaryAxes(IMachineAxisConfig)</a>): non-rotary axes stay