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
@@ -107,7 +107,7 @@ block, applicable to any interpolated point along the contour.</li><li><a class=
of a rotary-state-dependent transform (RTCP rotary-dynamic). Composing it
produces a correct endpoint MC, but interpolated points along the contour
must be derived per-step by motion semantics
(<a class="xref" href="Hi.NcParsers.Semantics.ClLinearMotionSemantic.html">ClLinearMotionSemantic</a>); do not apply it to
(<a class="xref" href="Hi.NcParsers.Semantics.ClLinearMcMotionSemantic.html">ClLinearMcMotionSemantic</a>); do not apply it to
interpolated ProgramXyz.</li></ul>
Both kinds carry a real Mat4d so composition stays a pure matrix product —
no entry has a missing matrix. Use <a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_HasDynamicEntry_System_Text_Json_Nodes_JsonObject_">HasDynamicEntry(JsonObject)</a> to detect
@@ -484,6 +484,91 @@ the endpoint-semantic contract.</p>
<a id="Hi_NcParsers_Syntaxs_TransformationUtil_GetComposedTransformAtAbc_" data-uid="Hi.NcParsers.Syntaxs.TransformationUtil.GetComposedTransformAtAbc*"></a>
<h3 id="Hi_NcParsers_Syntaxs_TransformationUtil_GetComposedTransformAtAbc_System_Text_Json_Nodes_JsonObject_Hi_Geom_Vec3d_Hi_Geom_Vec3d_Hi_Numerical_Xyzabc_IMachineKinematics_System_Double_" data-uid="Hi.NcParsers.Syntaxs.TransformationUtil.GetComposedTransformAtAbc(System.Text.Json.Nodes.JsonObject,Hi.Geom.Vec3d,Hi.Geom.Vec3d,Hi.Numerical.Xyzabc.IMachineKinematics,System.Double)">
GetComposedTransformAtAbc(JsonObject, Vec3d, Vec3d, IMachineKinematics, double)
</h3>
<div class="markdown level1 summary"><p>Composes the chain into the Mat4d valid at an INTERPOLATED contour
point whose rotary state is <code class="paramref">stepAbc_rad</code>, by
rebuilding every <a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_KindDynamic">KindDynamic</a> entry at that rotary state
while keeping every <a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_KindStatic">KindStatic</a> entry's stored snapshot.
The per-step dual of <a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_GetComposedTransform_System_Text_Json_Nodes_JsonObject_">GetComposedTransform(JsonObject)</a>, which is
endpoint-only when the chain carries a Dynamic entry.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static Mat4d GetComposedTransformAtAbc(JsonObject json, Vec3d stepAbc_rad, Vec3d endpointAbc_rad, IMachineKinematics kinematics, double toolHeightOffset_mm)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>json</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">JsonObject</a></dt>
<dd><p>The block's JSON sections carrying the chain.</p>
</dd>
<dt><code>stepAbc_rad</code> <a class="xref" href="Hi.Geom.Vec3d.html">Vec3d</a></dt>
<dd><p>The interpolated point's MC rotary state in
radians (NaN axes are treated as 0, mirroring
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.PivotTransformUtil.html#Hi_NcParsers_LogicSyntaxs_PivotTransformUtil_ResolveEndpointAbc_Hi_Common_Collections_LazyLinkedListNode_Hi_NcParsers_Syntaxs_SyntaxPiece__Hi_NcParsers_Dependencys_IMachineAxisConfig_">ResolveEndpointAbc(LazyLinkedListNode&lt;SyntaxPiece&gt;, IMachineAxisConfig)</a>).</p>
</dd>
<dt><code>endpointAbc_rad</code> <a class="xref" href="Hi.Geom.Vec3d.html">Vec3d</a></dt>
<dd><p>The block-endpoint MC rotary state in
radians — the state the stored Dynamic snapshots were built at.</p>
</dd>
<dt><code>kinematics</code> <a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html">IMachineKinematics</a></dt>
<dd><p>The machine kinematics; null keeps every
stored snapshot.</p>
</dd>
<dt><code>toolHeightOffset_mm</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.double">double</a></dt>
<dd><p>The block's
<a class="xref" href="Hi.NcParsers.Keywords.ToolHeightCompensation.html">ToolHeightCompensation</a> offset in mm (the value its
Dynamic height entry was built with).</p>
</dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="Hi.Geom.Mat4d.html">Mat4d</a></dt>
<dd></dd>
</dl>
<h4 class="section" id="Hi_NcParsers_Syntaxs_TransformationUtil_GetComposedTransformAtAbc_System_Text_Json_Nodes_JsonObject_Hi_Geom_Vec3d_Hi_Geom_Vec3d_Hi_Numerical_Xyzabc_IMachineKinematics_System_Double__remarks">Remarks</h4>
<div class="markdown level1 remarks"><p>Rebuild rules, per Dynamic entry source:</p>
<ul><li><a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_ToolHeightCompensationSource">ToolHeightCompensationSource</a> — rebuilt with
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_MakeToolHeightMat_Hi_Numerical_Xyzabc_IMachineKinematics_Hi_Geom_Vec3d_System_Double_">MakeToolHeightMat(IMachineKinematics, Vec3d, double)</a> at <code class="paramref">stepAbc_rad</code>
and <code class="paramref">toolHeightOffset_mm</code>: the same construction
every writer uses (<a class="xref" href="Hi.NcParsers.LogicSyntaxs.G43p4RtcpSyntax.html">G43p4RtcpSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.Siemens.SiemensTraoriSyntax.html">SiemensTraoriSyntax</a>), so at
<code class="paramref">stepAbc_rad</code> equal to the block-endpoint ABC the
rebuilt matrix is bit-identical to the stored snapshot.</li><li><a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_PivotTransformSource">PivotTransformSource</a> — rebuilt
anchor-agnostically as
<code>stored · K(endpointAbc) · K(stepAbc)⁻¹</code>, recovering the
writer's pre-pivot anchor (<code>preFrameToPn = stored · K(endpointAbc)</code>,
see <a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_MakePivotTransformMat_Hi_Numerical_Xyzabc_IMachineKinematics_Hi_Geom_Vec3d_Hi_Geom_Mat4d_">MakePivotTransformMat(IMachineKinematics, Vec3d, Mat4d)</a>)
from the snapshot itself instead of assuming the NC pipeline's
machine-zero anchor — the CLSF pivot
(<a class="xref" href="Hi.Numerical.ClsfParsers.ClToMcTransformSyntax.html">ClToMcTransformSyntax</a>) folds a
fixture-topology anchor into the same entry and stays correct here.</li><li>Any other Dynamic source — kept as stored (no rebuild recipe;
no shipped writer produces one).</li></ul>
With a <code>null</code> <code class="paramref">kinematics</code> every entry keeps its
stored snapshot, collapsing to <a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_GetComposedTransform_System_Text_Json_Nodes_JsonObject_">GetComposedTransform(JsonObject)</a> —
correct for the only kinematics-less Dynamic corner (the
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.G43p4RtcpSyntax.html">G43p4RtcpSyntax</a> UnitZ height fallback,
whose matrix does not depend on ABC).
</div>
<a id="Hi_NcParsers_Syntaxs_TransformationUtil_GetTransformBySource_" data-uid="Hi.NcParsers.Syntaxs.TransformationUtil.GetTransformBySource*"></a>
<h3 id="Hi_NcParsers_Syntaxs_TransformationUtil_GetTransformBySource_System_Text_Json_Nodes_JsonObject_System_String_" data-uid="Hi.NcParsers.Syntaxs.TransformationUtil.GetTransformBySource(System.Text.Json.Nodes.JsonObject,System.String)">
@@ -580,10 +665,39 @@ a Pn-frame point, but expressed as a reusable Mat4d so the chain
stays a pure matrix product (no per-point IK call inside
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_GetComposedTransform_System_Text_Json_Nodes_JsonObject_">GetComposedTransform(JsonObject)</a>).</p>
<p>
The pre-pivot anchor is the machine-zero attacher point
<code>McToPn(0).Point</code> as a <b>pure translation</b> — the same
origin anchor HardNc keeps in
<code>HardNcEnv.AttacherAtMcZeroOnTableCoordinate</code>. Program-frame
vectors already point along the Pn (table-buckle) axes, so only
<code>K(0)</code>'s translation may enter the anchor. Folding the full
<code>K(0)</code> (its linear part encodes per-axis motion sense — a
workpiece-side linear axis contributes a <b>negated</b> row)
would flip those axes' program components before the IK; on a
machine whose Z rides the table (e.g. the B-x7000 WAC chain,
table branch <code>Base→Z→B→W</code>) that mirrored every program Z
and, at B≈180°, threw the resolved MC off by twice the
pivot-to-attacher distance (~3.5 m).
</p>
<p>
Requiring machine files to be modelled the other way instead —
workpiece-side axes negative, which makes <code>K(0)</code>'s linear part
the identity and the two constructions equivalent — was evaluated as
an alternative to this fix and deliberately rejected.
<a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html">IMachineKinematics</a> resolves either axis direction, so a
file that positions correctly through
<a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html#Hi_Numerical_Xyzabc_IMachineKinematics_PnToMc_Hi_Geom_DVec3d_Hi_Geom_DVec3d__">PnToMc(DVec3d, out DVec3d)</a> has to position correctly
through this transform as well; a precondition enforced here and
nowhere else would only make one consumer diverge from the kinematics
on files every other consumer accepts. The modelling convention
governs how MC values read against the machine panel, and belongs to
a check on the data when it loads — never to this matrix.
</p>
<p>
Constructed by probing <a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html#Hi_Numerical_Xyzabc_IMachineKinematics_McToPn_Hi_Geom_DVec3d_">McToPn(DVec3d)</a> at
the four standard basis points (origin + XYZ unit vectors) at the
target ABC to derive <code>K(abc)</code>, and similarly at ABC=0 to derive
<code>K(0)</code>; returns <code>K(0) · K(abc).GetInverse()</code>. Topology-
target ABC to derive <code>K(abc)</code>; returns
<code>T(McToPn(0).Point) · K(abc).GetInverse()</code>. Topology-
agnostic — works for any affine kinematic chain regardless of axis
order. Legacy <a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html#Hi_Numerical_Xyzabc_IMachineKinematics_PnToMc_Hi_Geom_DVec3d_Hi_Geom_DVec3d__">PnToMc(DVec3d, out DVec3d)</a> remains the
reference oracle.
@@ -619,6 +733,57 @@ reference oracle.
<a id="Hi_NcParsers_Syntaxs_TransformationUtil_MakePivotTransformMat_" data-uid="Hi.NcParsers.Syntaxs.TransformationUtil.MakePivotTransformMat*"></a>
<h3 id="Hi_NcParsers_Syntaxs_TransformationUtil_MakePivotTransformMat_Hi_Numerical_Xyzabc_IMachineKinematics_Hi_Geom_Vec3d_Hi_Geom_Mat4d_" data-uid="Hi.NcParsers.Syntaxs.TransformationUtil.MakePivotTransformMat(Hi.Numerical.Xyzabc.IMachineKinematics,Hi.Geom.Vec3d,Hi.Geom.Mat4d)">
MakePivotTransformMat(IMachineKinematics, Vec3d, Mat4d)
</h3>
<div class="markdown level1 summary"><p>Variant anchored to an arbitrary pre-pivot frame: builds the
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_PivotTransformSource">PivotTransformSource</a> Mat4d
<code>preFrameToPn · K(abc)⁻¹</code> that maps a point of the chain's
accumulated pre-pivot frame directly to MC at the block's endpoint
ABC. The two-parameter overload is this variant specialised to the
NC pipeline's machine-zero program frame
(<code>preFrameToPn = T(McToPn(0).Point)</code>, translation only — see
its remarks for why <code>K(0)</code>'s linear part must stay out); the
CLSF pipeline passes its workpiece→Pn fixture-topology matrix
instead, so the pivot entry absorbs the workpiece placement
together with the kinematics.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static Mat4d MakePivotTransformMat(IMachineKinematics kinematics, Vec3d abc_rad, Mat4d preFrameToPn)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>kinematics</code> <a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html">IMachineKinematics</a></dt>
<dd></dd>
<dt><code>abc_rad</code> <a class="xref" href="Hi.Geom.Vec3d.html">Vec3d</a></dt>
<dd></dd>
<dt><code>preFrameToPn</code> <a class="xref" href="Hi.Geom.Mat4d.html">Mat4d</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="Hi.Geom.Mat4d.html">Mat4d</a></dt>
<dd></dd>
</dl>
<a id="Hi_NcParsers_Syntaxs_TransformationUtil_MakeToolHeightMat_" data-uid="Hi.NcParsers.Syntaxs.TransformationUtil.MakeToolHeightMat*"></a>
<h3 id="Hi_NcParsers_Syntaxs_TransformationUtil_MakeToolHeightMat_Hi_Numerical_Xyzabc_IMachineKinematics_Hi_Geom_Vec3d_System_Double_" data-uid="Hi.NcParsers.Syntaxs.TransformationUtil.MakeToolHeightMat(Hi.Numerical.Xyzabc.IMachineKinematics,Hi.Geom.Vec3d,System.Double)">