deploy fixed MRR drift and webservice CylindroidHolder buckle branch update issue.

This commit is contained in:
2026-05-28 19:42:05 +08:00
parent d7836db45f
commit 95b5790622
140 changed files with 8079 additions and 14099 deletions
@@ -94,6 +94,44 @@
<h3 id="classes">
Classes
</h3>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucConditionReader.html">FanucConditionReader</a></dt>
<dd><p>Shared polymorphic reader for Fanuc Custom Macro B conditional gate
expressions (<code>IF [...] GOTO</code>, <code>IF [...] THEN</code>,
<code>WHILE [...] DO m</code>). The condition node is read post-evaluation —
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.VariableEvaluatorSyntax.html">VariableEvaluatorSyntax</a>'s pass-2 tree walk has already
substituted the original expression string with a numeric
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonvalue">JsonValue</a> when evaluation succeeded; this helper maps
that node to a tri-state truthy outcome plus a display form for
diagnostics.</p>
<p>
Three states, mapping directly to the
<code>ConditionEvaluated: true | false | null</code> stamp shape used by
all three consumers (see <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucGotoSyntax.html">FanucGotoSyntax</a>,
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucIfThenSyntax.html">FanucIfThenSyntax</a>, and the WHILE-loop syntax):
</p>
<ul><li><b>Truthy = true</b> — node is a finite non-zero numeric;
gate fires.</li><li><b>Truthy = false</b> — node is a finite numeric equal to
zero; gate falls through silently.</li><li><b>Truthy = null</b> — node is null, still a string
(evaluator failed), or non-finite double (NaN / ±∞); gate falls
through and the caller emits its own
<code>&lt;Syntax&gt;--ConditionNotEvaluated</code> warning.</li></ul>
<p>
The <code>Display</code> form is the human-readable expression text for
diagnostic messages. For resolved numerics it is the value formatted
via <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.globalization.cultureinfo.invariantculture">InvariantCulture</a>; for unresolved
strings it is the original expression text. Diagnostics build their
own message text — the helper just provides the source string so the
caller can compose <code>"IF [&lt;Display&gt;] GOTO ..."</code> etc.
</p>
<p>
Callers typically <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonnode.deepclone">DeepClone()</a> the original node
before passing in here, then again before stamping back, so removing
the parsing section and writing the host-level stamp can happen in
any order without dangling references.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucGotoSyntax.html">FanucGotoSyntax</a></dt>
<dd><p>Resolves Fanuc Custom Macro B GOTO control flow.
@@ -111,10 +149,11 @@ Both unconditional <code>GOTO &lt;n&gt;</code> and conditional
form leans on <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.VariableEvaluatorSyntax.html">VariableEvaluatorSyntax</a>'s pass-2 tree walk
to substitute <code>Parsing.FanucGoto.Condition</code> with a numeric
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonvalue">JsonValue</a> when the expression
evaluates successfully — <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonnode">ReadCondition(JsonNode)</a> then reads the
node polymorphically. Truthy non-zero fires the redirect; zero falls
through silently; a still-string (unresolved) Condition emits
<code>FanucGoto--ConditionNotEvaluated</code> and falls through.
evaluates successfully — <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucConditionReader.html#Hi_NcParsers_EvaluationSyntaxs_Fanuc_FanucConditionReader_ReadCondition_System_Text_Json_Nodes_JsonNode_">ReadCondition(JsonNode)</a>
then reads the node polymorphically. Truthy non-zero fires the
redirect; zero falls through silently; a still-string (unresolved)
Condition emits <code>FanucGoto--ConditionNotEvaluated</code> and falls
through.
</p>
<p>
Pipeline placement: tail of the Fanuc / Mazak / Syntec Evaluation
@@ -171,7 +210,7 @@ the lifted entries reach the readers as if they had been written by
</p>
<p>
Three condition outcomes mirror the
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonnode">ReadCondition(JsonNode)</a> shape:
<code>FanucGotoSyntax.ReadCondition</code> shape:
<ul><li>Truthy non-zero → lift assignments, stamp Applied=true.</li><li>Truthy zero → fall through silently, Applied=false.</li><li>Truthy null (evaluator failed, condition still a string or
non-finite) → warn <code>FanucIfThen--ConditionNotEvaluated</code>, do not
lift, Applied=false.</li></ul>
@@ -356,6 +395,58 @@ Fanuc-family only — Siemens uses named system variables
(<code>$AC_TIME</code>, <code>$A_DAY</code>, …) and Heidenhain uses
<code>FN18: SYSREAD</code>; neither flows through <code>Parsing.Assignments.#nnn</code>.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucWhileDoSyntax.html">FanucWhileDoSyntax</a></dt>
<dd><p>Resolves Fanuc Custom Macro B <code>WHILE [..] DO m ... END m</code>
bounded loops. Two phrases dispatched by
<a class="xref" href="Hi.NcParsers.Keywords.FanucWhileDo.html#Hi_NcParsers_Keywords_FanucWhileDo_Term">Term</a>:</p>
<ul><li><code>WHILE [..] DO m</code> — entry: reads the resolved condition
via <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucConditionReader.html">FanucConditionReader</a>, manages the per-LoopId
frame in the top-level <code>WhileFrames</code> dict, and either falls
through (truthy) or forward-jumps past the matching END m
(falsy / unresolved).</li><li><code>END m</code> — terminator: unconditionally reverse-jumps to
the WHILE block recorded in <code>WhileFrames[LoopId].BeginLineNo</code>
so the next iteration re-evaluates the entry condition. Increments
the per-loop iteration counter on
<a class="xref" href="Hi.NcParsers.Dependencys.Fanuc.FanucWhileDoIterationDependency.html">FanucWhileDoIterationDependency</a>; suppresses the
redirect above <a class="xref" href="Hi.NcParsers.Dependencys.Fanuc.FanucWhileDoIterationDependency.html#Hi_NcParsers_Dependencys_Fanuc_FanucWhileDoIterationDependency_MaxIterationsPerLoopId">MaxIterationsPerLoopId</a>.</li></ul>
<p>
<b>WhileFrames carrier.</b> The top-level <code>WhileFrames</code> JSON
section is a <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">JsonObject</a> keyed by LoopId-as-string
whose values are <code>{ BeginLineNo: int }</code>. Frames are pushed when
a WHILE block first encounters a truthy condition with no existing
frame for that LoopId; popped when the condition becomes falsy or
unresolved; otherwise carried forward unchanged by
<a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html">ModalCarrySyntax</a>'s
<a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html#Hi_NcParsers_PostLogicSyntaxs_ModalCarrySyntax_Logic">Logic</a> tracked-key
list. Nested loops with distinct LoopIds coexist in the same dict;
same-LoopId nesting (spec-undefined) overwrites and is not given
special handling.
</p>
<p>
<b>Pipeline placement.</b> Evaluation bundle, after the variable
readers (defensive — WHILE/END blocks per spec do not carry
assignments, but the placement is consistent with GOTO). Must run
after <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.VariableEvaluatorSyntax.html">VariableEvaluatorSyntax</a> so the condition string
has been substituted to numeric.
</p>
<p>
<b>Forward scan to matching END m</b> uses the
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.LabelScanUtil.html">LabelScanUtil</a> predicate overload — probe runs the
brand-default <a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Fanuc.FanucWhileDoParsingSyntax.html">FanucWhileDoParsingSyntax</a> on each
candidate, predicate matches on
<code>Parsing.FanucWhileDo.Term == "END" &amp;&amp; LoopId == target</code>.
</p>
<p>
<b>Reverse scan to WHILE BeginLineNo</b> does not need a label
predicate — the BeginLineNo is a known file-line index recorded in
the active frame, so the END side re-segments the file from the top
and returns the slice starting at the first piece whose
<a class="xref" href="Hi.NcParsers.Sentence.html#Hi_NcParsers_Sentence_CharIndexSegment">CharIndexSegment</a>.<code>Begin.LineIndex</code>
matches.
</p>
</dd>
</dl>
<h3 id="enums">