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
@@ -87,8 +87,8 @@
<article data-uid="">
<h1 id="graphic-cache-submenu">Graphic-Cache SubMenu</h1>
<p>The submenu locates on the <a href="index.html">Preference Menu Dropdown</a>.</p>
<p>The model <a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a> is from its parent component.</p>
<p>In the WPF application the submenu locates on the <a href="index.html">Preference Menu Dropdown</a>. The web application moved it onto the Player toolbar's <code>Workpiece ▾</code> dropdown, since it acts on the workpiece meshed geometry's rendering cache.</p>
<p>The model <a class="xref" href="../../sample/Sample.Common.UserService.html">UserService</a> is from its parent component.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Graphic-Cache SubMenu
@@ -101,7 +101,7 @@
</li>
</ul>
<h2 id="behavior">Behavior</h2>
<p><code>Graphic-Cache Input Text Field</code> and <code>Graphic-Cache Slider</code> bind the <a class="xref" href="../../api/Hi.HiNcKits.UserConfig.html#Hi_HiNcKits_UserConfig_GraphicCacheMb">GraphicCacheMb</a>. The limit text fields also bind to the properties of <a class="xref" href="../../api/Hi.HiNcKits.UserConfig.html">UserConfig</a>.</p>
<p><code>Graphic-Cache Input Text Field</code> and <code>Graphic-Cache Slider</code> bind the <a class="xref" href="../../sample/Sample.Common.UserConfig.html#Sample_Common_UserConfig_GraphicCacheMb">GraphicCacheMb</a>. The limit text fields also bind to the properties of <a class="xref" href="../../sample/Sample.Common.UserConfig.html">UserConfig</a>.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
@@ -111,9 +111,9 @@
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<p>HiNC-2025-webservice (Quasar CLI SPA):</p>
<ul>
<li><code>wwwroot-src/src/components/preference/GraphicCacheMenu.vue</code> — nested <code>&lt;q-menu&gt;</code> under <code>Preference → Graphic Cache</code> with Lower / Upper (<code>NumericInput</code>) + Current (<code>NumericInput</code>) + <code>&lt;q-slider&gt;</code>. Commits on blur / change.</li>
<li><code>wwwroot-src/src/components/preference/GraphicCacheMenu.vue</code> — nested <code>&lt;q-menu&gt;</code> under <code>Workpiece → Graphic Cache</code> with Lower / Upper (<code>NumericInput</code>) + Current (<code>NumericInput</code>) + <code>&lt;q-slider&gt;</code>. Commits on blur / change.</li>
<li><code>wwwroot-src/src/components/widgets/NumericInput.vue</code> — shared <code>Infinity</code>-friendly numeric field reused for the three limit inputs.</li>
<li><code>wwwroot-src/src/layouts/AppMenuBar.vue</code> — hosts the Graphic Cache entry inside the Preference dropdown.</li>
<li><code>wwwroot-src/src/components/player/PlayerExtendedToolBar.vue</code> — hosts the Graphic Cache entry inside the Player toolbar's <code>Workpiece ▾</code> dropdown (next to Diff Visual Radius). The menu bar (<code>wwwroot-src/src/components/AppMenuBar.vue</code>) no longer carries it.</li>
<li><code>wwwroot-src/src/api/preference.ts</code> — typed wrapper over <code>GET/POST /api/preference/graphic-cache</code>.</li>
<li><code>Environments/PreferenceController.cs</code> — REST endpoints: <code>GET /api/preference/graphic-cache</code> returns <code>{ graphicCacheMb, lowerLimitMb, upperLimitMb }</code>; <code>POST</code> writes through <code>UserService.SaveUserConfig()</code> → <code>UserConfig.GraphicCacheMb</code> → <code>CubeTree.DispCacheMb</code>.</li>
</ul>
@@ -87,28 +87,37 @@
<article data-uid="">
<h1 id="preference-menu-dropdown">Preference Menu Dropdown</h1>
<p>The model of the UI is <a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a>.
<a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a> contains <a class="xref" href="../../api/Hi.HiNcKits.UserConfig.html">UserConfig</a>, which is rapidly used in the GUI.</p>
<p>The model of the UI is <a class="xref" href="../../sample/Sample.Common.UserService.html">UserService</a>.
<a class="xref" href="../../sample/Sample.Common.UserService.html">UserService</a> contains <a class="xref" href="../../sample/Sample.Common.UserConfig.html">UserConfig</a>, which is rapidly used in the GUI.</p>
<p>The dropdown is on the <a href="../main-panel.html">Main Panel</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Preference Menu Dropdown
<ul>
<li><a href="step-present-preference-page.html">Step Present Preference</a> Button</li>
<li><a href="graphic-cache-dropdown.html">Graphic-Cache Dropdown</a></li>
<li><a href="step-present-preference-page.html">Step Present Preference</a> Button
<ul>
<li>Web application only: relocated to the Player's Step Info column, where a <code>Step Present</code> button on the Step Properties panel title bar opens it as a modal next to the list it configures.</li>
</ul>
</li>
<li><a href="graphic-cache-dropdown.html">Graphic-Cache Dropdown</a>
<ul>
<li>Web application only: relocated to the Player toolbar's <code>Workpiece ▾</code> dropdown.</li>
</ul>
</li>
<li><a href="language-selection-submenu.html">Language Selection SubMenu</a></li>
<li>Show Physics Options CheckBox
<ul>
<li>The model is <a class="xref" href="../../api/Hi.HiNcKits.UserConfig.html#Hi_HiNcKits_UserConfig_ShowPhysicsOptions">ShowPhysicsOptions</a>.</li>
<li>The checkbox is disabled and unchecked if <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_IsPhysicsLicensed">IsPhysicsLicensed</a> is false.</li>
<li>The model is <a class="xref" href="../../sample/Sample.Common.UserConfig.html#Sample_Common_UserConfig_ShowPhysicsOptions">ShowPhysicsOptions</a>.</li>
<li>The checkbox is disabled and unchecked if <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_IsPhysicsLicensed">IsPhysicsLicensed</a> is false.</li>
</ul>
</li>
<li>Show Log Button
See <a href="../message-section-on-main-panel.html">Message Section</a>.
The button does not exist on WPF application.</li>
The button does not exist on WPF application. In the web application it is an always-visible button on the menu bar's right side rather than a dropdown entry.</li>
</ul>
</li>
</ul>
<p>So the web application's Preference dropdown itself carries only the Language submenu and the Show Physics Options checkbox.</p>
<h2 id="source-code-locations">Source Code Locations</h2>
<p>See <a href="../index.html">HiNC GUI Architecture</a> for git repository links.</p>
<h3 id="wpf-application">WPF Application</h3>
@@ -117,7 +126,7 @@ The button does not exist on WPF application.</li>
</ul>
<h3 id="web-application">Web Application</h3>
<ul>
<li><code>wwwroot/preference/preference-menu.js</code></li>
<li><code>wwwroot-src/src/components/AppMenuBar.vue</code> — the <code>Preference ▾</code> dropdown itself.</li>
<li><code>Environments/PreferenceController.cs</code></li>
</ul>
@@ -88,7 +88,7 @@
<h1 id="language-selection-submenu">Language Selection SubMenu</h1>
<p>The submenu locates on the <a href="index.html">Preference Menu Dropdown</a>.</p>
<p>The model <a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a> is from its parent component.</p>
<p>The model <a class="xref" href="../../sample/Sample.Common.UserService.html">UserService</a> is from its parent component.</p>
<p>Load the language preference on application start.</p>
<div class="NOTE">
<h5>Note</h5>
@@ -113,7 +113,7 @@
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<p>HiNC-2025-webservice (Quasar CLI SPA):</p>
<ul>
<li><code>wwwroot-src/src/layouts/AppMenuBar.vue</code> — nested <code>Preference → Language ▸</code> dropdown with English / 简体中文 / 繁體中文 radio items. The selected code is persisted via <code>appState.setLanguageCode(code)</code>.</li>
<li><code>wwwroot-src/src/components/AppMenuBar.vue</code> — nested <code>Preference → Language ▸</code> dropdown with English / 简体中文 / 繁體中文 radio items. The selected code is persisted via <code>appState.setLanguageCode(code)</code>.</li>
<li><code>wwwroot-src/src/stores/appState.ts</code> — <code>languageCode</code> state + <code>setLanguageCode(code)</code> action; hydrated on layout mount by <code>loadServerPreferences()</code>.</li>
<li><code>wwwroot-src/src/api/preference.ts</code> — typed wrapper over <code>GET/POST /api/preference/language</code>.</li>
<li><code>Environments/PreferenceController.cs</code> — REST endpoints: <code>GET /api/preference/language</code> → <code>{ languageCode }</code>; <code>POST</code> validates against <code>[&quot;en&quot;, &quot;zh-Hans&quot;, &quot;zh-Hant&quot;]</code> and writes through <code>UserService.SaveUserConfig()</code> → <code>UserConfig.LanguageCode</code>.</li>
@@ -87,9 +87,9 @@
<article data-uid="">
<h1 id="step-present-preference-page">Step Present Preference Page</h1>
<p>The model <a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a> is from its parent component. The <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_UserConfig">UserConfig</a> is rapidly used.</p>
<p>The model of Candidate Keys Panel is <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_CandidateStepPresentKeyList">CandidateStepPresentKeyList</a>.
The model of Displayed Keys Panel is <a class="xref" href="../../api/Hi.HiNcKits.UserConfig.html#Hi_HiNcKits_UserConfig_DisplayedStepPresentKeyList">DisplayedStepPresentKeyList</a>.</p>
<p>The model <a class="xref" href="../../sample/Sample.Common.UserService.html">UserService</a> is from its parent component. The <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_UserConfig">UserConfig</a> is rapidly used.</p>
<p>The model of Candidate Keys Panel is <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_CandidateStepPresentKeyList">CandidateStepPresentKeyList</a>.
The model of Displayed Keys Panel is <a class="xref" href="../../sample/Sample.Common.UserConfig.html#Sample_Common_UserConfig_DisplayedStepPresentKeyList">DisplayedStepPresentKeyList</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Step Present Preference Page (or window)
@@ -124,15 +124,15 @@ The model of Displayed Keys Panel is <a class="xref" href="../../api/Hi.HiNcKits
</ul>
<p>The categories are not defined for programming logic but only for user experience. So decide and define the categories in the GUI here only.</p>
<p>Since the Keys are not all come from the properties of <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a>, a category panel (Category Other Panel) for the uncategoried keys is required.</p>
<p>The keys in the Displayed Keys Panel is in sequence of <a class="xref" href="../../api/Hi.HiNcKits.UserConfig.html#Hi_HiNcKits_UserConfig_DisplayedStepPresentKeyList">DisplayedStepPresentKeyList</a>. User tune the sequence and remove key by the Displayed Keys Panel. User add and remove the key from the ToggleButtons in Candidate Keys Panel. Those UI control items are required.</p>
<p>The keys in the Displayed Keys Panel is in sequence of <a class="xref" href="../../sample/Sample.Common.UserConfig.html#Sample_Common_UserConfig_DisplayedStepPresentKeyList">DisplayedStepPresentKeyList</a>. User tune the sequence and remove key by the Displayed Keys Panel. User add and remove the key from the ToggleButtons in Candidate Keys Panel. Those UI control items are required.</p>
<p>To both Candidate Keys Panel and Displayed Keys Panel:
Apply <a class="xref" href="../../api/Hi.MachiningSteps.PresentAttribute.html">PresentAttribute</a>.<a class="xref" href="../../api/Hi.MachiningSteps.PresentAttribute.html#Hi_MachiningSteps_PresentAttribute_Name">Name</a> as Key label by <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_StepPresentAccessDictionary">StepPresentAccessDictionary</a>. Apply the key to the button tooltip.</p>
Apply <a class="xref" href="../../api/Hi.MachiningSteps.PresentAttribute.html">PresentAttribute</a>.<a class="xref" href="../../api/Hi.MachiningSteps.PresentAttribute.html#Hi_MachiningSteps_PresentAttribute_Name">Name</a> as Key label by <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_StepPresentAccessDictionary">StepPresentAccessDictionary</a>. Apply the key to the button tooltip.</p>
<p>The resx of <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a> contains the translation of <a class="xref" href="../../api/Hi.MachiningSteps.PresentAttribute.html">PresentAttribute</a>.<a class="xref" href="../../api/Hi.MachiningSteps.PresentAttribute.html#Hi_MachiningSteps_PresentAttribute_Name">Name</a>, apply the translation to the GUI. If the translation not existed, use the original value.</p>
<h3 id="categories">Categories</h3>
<p>Categories are a GUI-level grouping of keys. The seven canonical categories are hard-coded on both the WPF window and the webservice backend, and share the same <code>nameof(MachiningStep.*)</code> switch so that adding a new property requires one change in one place (<code>ResolveStepPresentCategory(key)</code>). The current category order is:</p>
<ol>
<li>File (<code>NcName</code>, <code>NcLineNumber</code>, …).</li>
<li>Time (<code>AccumulatedTime</code>, <code>StepTime</code>, …).</li>
<li>Time (<code>EndTimecode</code>, <code>StepTime</code>, …).</li>
<li>Tool (<code>ToolId</code>, <code>CutterName</code>, …).</li>
<li>Coordinate (<code>Position</code>, <code>Coordinate</code>, <code>Orientation</code>, …).</li>
<li>Motion (<code>Feedrate</code>, <code>SpindleSpeed</code>, <code>Move</code>, …).</li>