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 ModalCarrySyntax | HiAPI-C# 2025 ">
<meta name="description" content="Per-block modal-section carry. For each key in , if the current block has no section for that key, deep-clone the same section from the immediately previous block (which is itself guaranteed to carry it because every block is processed by this syntax) and set = inside the cloned section. Lets every block stand alone with its full modal context, so downstream readers (cache-file dumps, semantics, UI jumping to a single block) do not need to resolve modal state. A JSON section is a candidate for when ALL four criteria hold: Writers concentrated — one or two syntaxes own the section (e.g. / own MotionState; the call/return pair own SubProgramCall-derived state).Readers distributed — multiple downstream consumers each need the value, and none of them should walk back to find it. Single-reader sections do not benefit from blanket carry.Every block must see the section — cache-dump readers landing randomly, single-block UI views, and look-ahead syntaxes all require the section to be present on every block.Carry is unconditional — no frame-gating or other per-block veto. Sections that need conditional carry (e.g. &#39;s frame-aware Vars.Local dict-merge — carry only when MacroFrame matches) belong in the owning syntax&#39;s own carry logic, not here. A section failing any criterion should be carried through its owning syntax&#39;s own logic (single-step node.Previous read, or no carry at all if absence is meaningful — e.g. MacroFrame absent = main frame). This replaces the earlier CacheSyntax design (which sampled every Pace blocks). The legacy CacheSyntax XName is still recognised on load for backward compatibility with previously-saved project files.">
<meta name="description" content="Per-block modal-section carry. For each key in , if the current block has no section for that key, deep-clone the same section from the immediately previous block (which is itself guaranteed to carry it because every block is processed by this syntax) and set = inside the cloned section. For each key in , a block that DID write its own (partial) section additionally receives the previous block&#39;s remaining entries — the block&#39;s own values win, only missing keys are filled — so a partially-written modal section (e.g. an XYZ-only motion block&#39;s , which lacks the rotary axes) does not break the carry chain for the keys it did not write. Lets every block stand alone with its full modal context, so downstream readers (cache-file dumps, semantics, UI jumping to a single block) do not need to resolve modal state. A JSON section is a candidate for when ALL four criteria hold: Writers concentrated — one or two syntaxes own the section (e.g. / own MotionState; the call/return pair own SubProgramCall-derived state).Readers distributed — multiple downstream consumers each need the value, and none of them should walk back to find it. Single-reader sections do not benefit from blanket carry.Every block must see the section — cache-dump readers landing randomly, single-block UI views, and look-ahead syntaxes all require the section to be present on every block.Carry is unconditional — no frame-gating or other per-block veto. Sections that need conditional carry (e.g. &#39;s frame-aware Vars.Local dict-merge — carry only when MacroFrame matches) belong in the owning syntax&#39;s own carry logic, not here. A section failing any criterion should be carried through its owning syntax&#39;s own logic (single-step node.Previous read, or no carry at all if absence is meaningful — e.g. MacroFrame absent = main frame). This replaces the earlier CacheSyntax design (which sampled every Pace blocks). The legacy CacheSyntax XName is still recognised on load for backward compatibility with previously-saved project files.">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
@@ -102,7 +102,14 @@ if the current block has no section for that key, deep-clone the same
section from the immediately previous block (which is itself guaranteed
to carry it because every block is processed by this syntax) and set
<a class="xref" href="Hi.NcParsers.Syntaxs.SyntaxStageKeys.html#Hi_NcParsers_Syntaxs_SyntaxStageKeys_AddedByKey">AddedByKey</a> = <a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html#Hi_NcParsers_PostLogicSyntaxs_ModalCarrySyntax_AddedByValue">AddedByValue</a>
inside the cloned section. Lets every block stand alone with its full
inside the cloned section. For each key in <a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html#Hi_NcParsers_PostLogicSyntaxs_ModalCarrySyntax_MergeKeys">MergeKeys</a>, a
block that DID write its own (partial) section additionally receives the
previous block's remaining entries — the block's own values win, only
missing keys are filled — so a partially-written modal section (e.g. an
XYZ-only motion block's
<a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a>,
which lacks the rotary axes) does not break the carry chain for the keys
it did not write. Lets every block stand alone with its full
modal context, so downstream readers (cache-file dumps, semantics, UI
jumping to a single block) do not need
<a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html#Hi_Common_Collections_LazyLinkedListNode_1_EnumerateBack">EnumerateBack()</a> to resolve modal state.</p>
@@ -403,6 +410,50 @@ before the intermediate block's PostLogic ModalCarry has run.</p>
<a id="Hi_NcParsers_PostLogicSyntaxs_ModalCarrySyntax_MergeKeys_" data-uid="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.MergeKeys*"></a>
<h3 id="Hi_NcParsers_PostLogicSyntaxs_ModalCarrySyntax_MergeKeys" data-uid="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.MergeKeys">
MergeKeys
</h3>
<div class="markdown level1 summary"><p>Section keys whose carry is per-KEY, not just per-section: when the
current block already has the section, entries it did not write are
filled from the previous block's section (own values win;
<a class="xref" href="Hi.NcParsers.Syntaxs.SyntaxStageKeys.html#Hi_NcParsers_Syntaxs_SyntaxStageKeys_AddedByKey">AddedByKey</a> is never copied as data).
Opt-in and deliberately separate from <a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html#Hi_NcParsers_PostLogicSyntaxs_ModalCarrySyntax_TrackedKeys">TrackedKeys</a> —
stack-like sections (<code>CallStack</code>, <code>WhileFrames</code>) must NOT
be merged: a popped frame would be resurrected. Today only
<a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a>
qualifies: its writers are per-axis (an XYZ motion block writes only
X/Y/Z), and without the merge the modal rotary values die at every
partially-written section, forcing downstream modal lookbacks into
unbounded <a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html#Hi_Common_Collections_LazyLinkedListNode_1_EnumerateBack">EnumerateBack()</a> walks
(progress-dependent slowdown once executed pieces freeze).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public List&lt;string&gt; MergeKeys { 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.collections.generic.list-1">List</a>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>&gt;</dt>
<dd></dd>
</dl>
<a id="Hi_NcParsers_PostLogicSyntaxs_ModalCarrySyntax_Name_" data-uid="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.Name*"></a>
<h3 id="Hi_NcParsers_PostLogicSyntaxs_ModalCarrySyntax_Name" data-uid="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.Name">