Archived
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:
@@ -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 "what's the program coordinate at a block's endpoint?" — 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's modal MC) into the current block's program frame using the current block'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's own transform on its own MC. Suitable for RTCP rotary-dynamic inheritance, where the modal invariant is "tool tip in workpiece frame stays put while rotary axes turn" — the recovered Vec3d carries forward as the next rotary block'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 "corresponding" — 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'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 "current" — 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'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 "what's the program coordinate at a block's endpoint?" — 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's modal MC) into the current block's program frame using the current block'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's own transform on its own MC. Suitable for RTCP rotary-dynamic inheritance, where the modal invariant is "tool tip in workpiece frame stays put while rotary axes turn" — the recovered Vec3d carries forward as the next rotary block'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 "corresponding" — 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'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 "current" — 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'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<SyntaxPiece>, 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<SyntaxPiece> 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><<a class="xref" href="Hi.NcParsers.Syntaxs.SyntaxPiece.html">SyntaxPiece</a>></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
|
||||
|
||||
Reference in New Issue
Block a user