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
@@ -94,10 +94,45 @@
<h3 id="classes">
Classes
</h3>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.AllowNoActiveSessionAttribute.html">AllowNoActiveSessionAttribute</a></dt>
<dd><p>Marks a session-scoped controller action as callable without an active session, exempting it
from <a class="xref" href="Hi.MachiningProcs.RequireActiveSessionAttribute.html">RequireActiveSessionAttribute</a>. Use on the session lifecycle entry points
(BeginSession / EndSession), which by definition run when no session exists yet.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.AllowNoLoadedProjectAttribute.html">AllowNoLoadedProjectAttribute</a></dt>
<dd><p>Marks a project-level controller action as callable without a loaded project, exempting it
from <a class="xref" href="Hi.MachiningProcs.RequireLoadedProjectAttribute.html">RequireLoadedProjectAttribute</a>. Use on the endpoints that create or load a
project (which by definition run when no project is open yet).</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.ApiActionResult.html">ApiActionResult</a></dt>
<dd><p>The shared outcome envelope for a web-API action: whether it succeeded and the messages
it reported, in order. Returned by the project-level surface
(<a class="xref" href="Hi.MachiningProcs.LocalProjectServiceController.html">LocalProjectServiceController</a>) and, on the no-active-session boundary, by
the session-scoped surface (<a class="xref" href="Hi.MachiningProcs.SessionShellController.html">SessionShellController</a> via
<a class="xref" href="Hi.MachiningProcs.RequireActiveSessionAttribute.html">RequireActiveSessionAttribute</a>). A REST / AI caller therefore reads the
progress / success / error notifications <i>inline in the HTTP response</i> instead of
only out-of-band via the SignalR sinks, and can branch on <a class="xref" href="Hi.MachiningProcs.ApiActionResult.html#Hi_MachiningProcs_ApiActionResult_Success">Success</a> without
parsing severities.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a></dt>
<dd><p>Root(Local) project service.
Apply absolute file path.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.LocalProjectServiceController.html">LocalProjectServiceController</a></dt>
<dd><p>HTTP controller exposing the <b>project-level</b> (session-independent) operations of
<span class="xref">Hi.MachiningProcs.LocalProjectServiceController.LocalProjectService</span> — the lean API-user surface, parallel to
<a class="xref" href="Hi.MachiningProcs.SessionShellController.html">SessionShellController</a> (which mirrors the session-scoped
<a class="xref" href="Hi.MachiningProcs.SessionShell.html">SessionShell</a>). A controller mirrors exactly one body; project-level
settings belong here, not bolted onto the session controller.</p>
</dd>
</dl>
<dl class="jumplist">
@@ -130,11 +165,6 @@ such as sweeping, subtraction, force calculation, and physics simulation.</p>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></dt>
<dd><p>Represents a milling project that manages the execution, simulation, and analysis of NC programs.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a></dt>
<dd><p>Represents a displayable wrapper for a machining project.</p>
</dd>
</dl>
<dl class="jumplist">
@@ -143,20 +173,37 @@ such as sweeping, subtraction, force calculation, and physics simulation.</p>
Provides functionality for controlling the machining process, handling optimization options,
and managing session state. Implements <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.idisposable">IDisposable</a> to clean up
<a class="xref" href="Hi.MachiningProcs.MachiningSession.html#Hi_MachiningProcs_MachiningSession_SessionWriters">SessionWriters</a> on session end.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.MessageDto.html">MessageDto</a></dt>
<dd><p>One reported <a class="xref" href="Hi.Common.Messages.IMessage.html">IMessage</a>, flattened for JSON transport.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.MillingUtil.html">MillingUtil</a></dt>
<dd><p>Provides utility methods for milling calculations and operations.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.NcKindUtil.html">NcKindUtil</a></dt>
<dd><p><a class="xref" href="Hi.MachiningProcs.NcKind.html">NcKind</a> helpers.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.NcRunnerSessionState.html">NcRunnerSessionState</a></dt>
<dd><p>NC pipeline state held on a <a class="xref" href="Hi.MachiningProcs.MachiningSession.html">MachiningSession</a> and shared across multiple
<a class="xref" href="Hi.Numerical.IControlRunner.html#Hi_Numerical_IControlRunner_RunControlLines_System_String_System_Collections_Generic_IEnumerable_System_String__Hi_MachiningProcs_MachiningSession_Hi_MachiningProcs_SessionProgress_System_Threading_CancellationToken_">RunControlLines(string, IEnumerable&lt;string&gt;, MachiningSession, SessionProgress, CancellationToken)</a> calls within that session. The per-layer
<a class="xref" href="Hi.Numerical.INcRunner.html#Hi_Numerical_INcRunner_RunNcLines_System_String_System_Collections_Generic_IEnumerable_System_String__Hi_MachiningProcs_MachiningSession_Hi_MachiningProcs_StepDiagnosticProgress_Hi_NcParsers_NcDiagnosticProgress_System_Threading_CancellationToken_">RunNcLines(string, IEnumerable&lt;string&gt;, MachiningSession, StepDiagnosticProgress, NcDiagnosticProgress, CancellationToken)</a> calls within that session. The per-layer
<a class="xref" href="Hi.MachiningProcs.NcRunnerSessionState.html#Hi_MachiningProcs_NcRunnerSessionState_SyntaxPieceLayers">SyntaxPieceLayers</a> are extended via <a class="xref" href="Hi.Common.Collections.LazyLinkedList-1.html#Hi_Common_Collections_LazyLinkedList_1_AppendSource_System_Collections_Generic_IEnumerable__0__">AppendSource(IEnumerable&lt;T&gt;)</a>
for each subsequent file so that <code>Previous</code>/<code>Next</code> connectivity (and thus
<code>ModalCarrySyntax</code> deep-clone) crosses file boundaries.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.ProjectFileBusyException.html">ProjectFileBusyException</a></dt>
<dd><p>Thrown when a project-file operation (New / Load / Save / SaveAs / Reload) is
requested while another one is already in progress. The newcomer is cancelled
rather than queued; controllers surface this as HTTP 409 Conflict.</p>
</dd>
</dl>
<dl class="jumplist">
@@ -166,19 +213,26 @@ Apply relative file path from <a class="xref" href="Hi.MachiningProcs.ProxyProje
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.SessionMessage.html">SessionMessage</a></dt>
<dd><p>Represents a message in the machining process that can contain various types of data
such as source commands, machining steps, exceptions, and tagged messages.</p>
<dt><a class="xref" href="Hi.MachiningProcs.RequireActiveSessionAttribute.html">RequireActiveSessionAttribute</a></dt>
<dd><p>Action filter for the <b>session-scoped</b> web-API surface: before a guarded action runs,
verifies a machining session is active (<a class="xref" href="Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_SessionShell">SessionShell</a> is
non-null). When none is active it short-circuits with HTTP 409 and an
<a class="xref" href="Hi.MachiningProcs.ApiActionResult.html#Hi_MachiningProcs_ApiActionResult_NoActiveSession">NoActiveSession()</a> envelope, so a REST / AI caller gets a helpful
&ldquo;call BeginSession() first&rdquo; notice instead of a null-reference 500. Apply at the controller
level; exempt the session lifecycle entry points (BeginSession / EndSession) with
<a class="xref" href="Hi.MachiningProcs.AllowNoActiveSessionAttribute.html">AllowNoActiveSessionAttribute</a>.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.SessionMessagePack.html">SessionMessagePack</a></dt>
<dd><p>Represents a package containing a machining message and its associated context.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.SessionProgress.html">SessionProgress</a></dt>
<dd><p>Represents a host for managing milling messages with thread-safe operations and stable index tracking.</p>
<dt><a class="xref" href="Hi.MachiningProcs.RequireLoadedProjectAttribute.html">RequireLoadedProjectAttribute</a></dt>
<dd><p>Action filter for the <b>project-level</b> web-API surface: before a guarded action runs,
verifies a project is loaded (<a class="xref" href="Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_MachiningProject">MachiningProject</a> is
non-null). When none is loaded it short-circuits with HTTP 409 and an
<a class="xref" href="Hi.MachiningProcs.ApiActionResult.html#Hi_MachiningProcs_ApiActionResult_NoProjectLoaded">NoProjectLoaded()</a> envelope, so a REST / AI caller gets a helpful
&ldquo;create or load a project first&rdquo; notice instead of a null-reference 500 (the project-level
members — <code>MachiningActRunner.Config</code>, workpiece, runners — are null until a project is
open). Apply at the controller level; exempt the endpoints that create or load a project
with <a class="xref" href="Hi.MachiningProcs.AllowNoLoadedProjectAttribute.html">AllowNoLoadedProjectAttribute</a>.</p>
</dd>
</dl>
<dl class="jumplist">
@@ -198,11 +252,93 @@ Each action delegates to the underlying <a class="xref" href="Hi.MachiningProcs.
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.SetupController.html">SetupController</a></dt>
<dd><p>Controller for setup operations of machining projects.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.ShellProgress.html">ShellProgress</a></dt>
<dd><p>Append-only, thread-safe sink for <b>session-level routine / lifecycle</b> messages on the
<a class="xref" href="Hi.Common.Messages.IMessage.html">IMessage</a> channel — one of the partitioned message homes.</p>
<p>
This is partitioned by message <b>kind</b>, orthogonal to the other sinks: plain
<a class="xref" href="Hi.Common.Messages.SimpleMessage.html">SimpleMessage</a> notices that belong to the session as a whole (cache reset, file
load / save progress, session start/done) live here; messages tied to a particular machining
step live in <a class="xref" href="Hi.MachiningProcs.StepDiagnosticProgress.html">StepDiagnosticProgress</a>; NC-pipeline diagnostics live in
<code>NcDiagnosticProgress</code>.
</p>
<p>
Append-only: session-routine messages are emitted sequentially, so report order already is
execution order — there is no per-step anchor and no stable-index bookkeeping.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.SpindleSpeedCache.html">SpindleSpeedCache</a></dt>
<dd><p>Represents cached spindle speed information.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.StepDiagnostic.html">StepDiagnostic</a></dt>
<dd><p>An <a class="xref" href="Hi.Common.Messages.IMessage.html">IMessage</a> produced while constructing a <a class="xref" href="Hi.MachiningSteps.MachiningStep.html">MachiningStep</a>,
anchored to the step's execution-order <a class="xref" href="Hi.MachiningProcs.StepDiagnostic.html#Hi_MachiningProcs_StepDiagnostic_StepIndex">StepIndex</a> and (when available) its NC-source
<a class="xref" href="Hi.MachiningProcs.StepDiagnostic.html#Hi_MachiningProcs_StepDiagnostic_SentenceCarrier">SentenceCarrier</a>.</p>
<p>
Decorator over an inner <a class="xref" href="Hi.MachiningProcs.StepDiagnostic.html#Hi_MachiningProcs_StepDiagnostic_Message">Message</a> — the five <a class="xref" href="Hi.Common.Messages.IMessage.html">IMessage</a> members delegate
to it — so a plain <a class="xref" href="Hi.Common.Messages.SimpleMessage.html">SimpleMessage</a> emitted during step processing can be upgraded to a
step-anchored diagnostic without the producer needing to know the step context.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.StepDiagnosticAnchorUtil.html">StepDiagnosticAnchorUtil</a></dt>
<dd><p>Bridges a step-anchored <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iprogress-1">IProgress&lt;T&gt;</a> sink (e.g.
<a class="xref" href="Hi.MachiningProcs.StepDiagnosticProgress.html">StepDiagnosticProgress</a>) back to the generic <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iprogress-1">IProgress&lt;T&gt;</a> surface, so
out-of-step-pipeline producers can keep using the id-first <a class="xref" href="Hi.Common.Messages.MessageUtil.html">MessageUtil</a> shorthands
(<code>ValidationError</code>, <code>ConfigurationWarning</code>, …) and still land a
<a class="xref" href="Hi.MachiningProcs.StepDiagnostic.html">StepDiagnostic</a> on the sink.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.StepDiagnosticProgress.html">StepDiagnosticProgress</a></dt>
<dd><p>Append-only, thread-safe sink for <b>step-anchored</b> diagnostics on the <a class="xref" href="Hi.Common.Messages.IMessage.html">IMessage</a>
channel.</p>
<p>
This sink stores <b>only <a class="xref" href="Hi.MachiningProcs.StepDiagnostic.html">StepDiagnostic</a></b>: every message is anchored to a motion step.
Per-step batches arrive via <a class="xref" href="Hi.MachiningProcs.StepScopedProgress.html#Hi_MachiningProcs_StepScopedProgress_FlushTo_System_IProgress_Hi_MachiningProcs_StepDiagnostic__">FlushTo(IProgress&lt;StepDiagnostic&gt;)</a>; out-of-pipeline emits
(e.g. stroke-limit / tooling diagnostics) anchor themselves with
<a class="xref" href="Hi.MachiningProcs.StepDiagnosticAnchorUtil.html#Hi_MachiningProcs_StepDiagnosticAnchorUtil_AnchoredToStep_System_IProgress_Hi_MachiningProcs_StepDiagnostic__System_Int32_Hi_NcParsers_ISentenceCarrier_">AnchoredToStep(IProgress&lt;StepDiagnostic&gt;, int, ISentenceCarrier)</a> before reporting. Data that already has
another owner is <b>not</b> duplicated here — NC diagnostics live in <code>NcDiagnosticProgress</code>,
plain session-level notices live in <a class="xref" href="Hi.MachiningProcs.ShellProgress.html">ShellProgress</a>, cutter positions live in the
CL strip.
</p>
<p>
Because every <a class="xref" href="Hi.MachiningProcs.StepDiagnostic.html">StepDiagnostic</a> carries its own <a class="xref" href="Hi.MachiningProcs.StepDiagnostic.html#Hi_MachiningProcs_StepDiagnostic_StepIndex">StepIndex</a>
anchor, ordering is recovered downstream by sorting on that anchor. Producers therefore only ever
<a class="xref" href="Hi.MachiningProcs.StepDiagnosticProgress.html#Hi_MachiningProcs_StepDiagnosticProgress_Report_Hi_MachiningProcs_StepDiagnostic_">Report(StepDiagnostic)</a> (append) — even from parallel step-processing tasks — and never insert at a
computed position.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.StepScopedProgress.html">StepScopedProgress</a></dt>
<dd><p>A per-step <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iprogress-1">IProgress&lt;T&gt;</a> of <a class="xref" href="Hi.Common.Messages.IMessage.html">IMessage</a> that <b>accumulates</b> the
messages emitted while one step is built, upgrading any plain message to a
<a class="xref" href="Hi.MachiningProcs.StepDiagnostic.html">StepDiagnostic</a> anchored to this step's <a class="xref" href="Hi.MachiningProcs.StepScopedProgress.html#Hi_MachiningProcs_StepScopedProgress_StepIndex">StepIndex</a> /
<a class="xref" href="Hi.MachiningProcs.StepScopedProgress.html#Hi_MachiningProcs_StepScopedProgress_SentenceCarrier">SentenceCarrier</a>. An already step-anchored <a class="xref" href="Hi.MachiningProcs.StepDiagnostic.html">StepDiagnostic</a> is kept
unchanged. (NC diagnostics are not seen here — they live in their own
<a class="xref" href="Hi.NcParsers.NcDiagnosticProgress.html">NcDiagnosticProgress</a>, not on this channel.)</p>
<p>
It does not forward to a downstream sink as messages arrive; instead it collects them into
<a class="xref" href="Hi.MachiningProcs.StepScopedProgress.html#Hi_MachiningProcs_StepScopedProgress_MessageList">MessageList</a> and is drained once via <a class="xref" href="Hi.MachiningProcs.StepScopedProgress.html#Hi_MachiningProcs_StepScopedProgress_FlushTo_System_IProgress_Hi_MachiningProcs_StepDiagnostic__">FlushTo(IProgress&lt;StepDiagnostic&gt;)</a> at the step's
<b>sequential</b> post-physics stage. Because that stage runs strictly in step order, the
per-step batches land in execution order with no position-scanning insert.
</p>
<p>
No locking: a single step's construction is a data-dependency chain (substraction → physics →
post-physics), so only one task writes <a class="xref" href="Hi.MachiningProcs.StepScopedProgress.html#Hi_MachiningProcs_StepScopedProgress_MessageList">MessageList</a> at a time; parallelism across
steps writes to <i>different</i> scopes. Each parallel step task therefore holds its own
instance — never a shared mutable "current step" on <a class="xref" href="Hi.MachiningProcs.StepDiagnosticProgress.html">StepDiagnosticProgress</a>, which would
race.
</p>
</dd>
</dl>
<h3 id="interfaces">
@@ -222,13 +358,16 @@ Interfaces
Enums
</h3>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.RenderingFlag.html">RenderingFlag</a></dt>
<dd><p>Flags that control which elements are rendered in the visualization.</p>
<dt><a class="xref" href="Hi.MachiningProcs.NcKind.html">NcKind</a></dt>
<dd><p>Kind of an NC program file — selects which of the session's runners plays
it (<a class="xref" href="Hi.MachiningSteps.IMachiningService.html#Hi_MachiningSteps_IMachiningService_ActiveNcRunner">ActiveNcRunner</a> /
<a class="xref" href="Hi.MachiningSteps.IMachiningService.html#Hi_MachiningSteps_IMachiningService_ClRunner">ClRunner</a> /
<a class="xref" href="Hi.MachiningSteps.IMachiningService.html#Hi_MachiningSteps_IMachiningService_CsvRunner">CsvRunner</a>).</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.MachiningProcs.SessionProgress.FilterFlag.html">SessionProgress.FilterFlag</a></dt>
<dd><p>Filtering flags for querying messages.</p>
<dt><a class="xref" href="Hi.MachiningProcs.RenderingFlag.html">RenderingFlag</a></dt>
<dd><p>Flags that control which elements are rendered in the visualization.</p>
</dd>
</dl>
<h3 id="delegates">