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
@@ -92,11 +92,11 @@
<p>The key models used by the Controller Page are:</p>
<ul>
<li><a class="xref" href="../../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a></li>
<li><a class="xref" href="../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a></li>
<li><code>MachiningProjectDisplayee</code> (GUI-layer, app-owned)</li>
</ul>
<p>The <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a> contains <a class="xref" href="../../api/Hi.Numerical.IsoCoordinateEntryDisplayee.html">IsoCoordinateEntryDisplayee</a> and <a class="xref" href="../../api/Hi.Numerical.HeidenhainCoordinateEntryDisplayee.html">HeidenhainCoordinateEntryDisplayee</a>. They are used in this GUI.</p>
<p>The <code>MachiningProjectDisplayee</code> contains <code>IsoCoordinateEntryDisplayee</code> and <code>HeidenhainCoordinateEntryDisplayee</code>. They are GUI-layer composition classes owned by each front-end (every app carries its own copies, e.g. under <code>HiNC-2025-webservice/Disp/</code>) and compose only public API types.</p>
<h3 id="connection-with-main-panel">Connection with Main Panel</h3>
<p>The Controller Page is activated through the <a href="../main-panel.html">Main Panel</a>'s Environment menu. It retrieves the <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> from the Main Panel and updates the model.</p>
<p>The Controller Page is activated through the <a href="../main-panel.html">Main Panel</a>'s <code>Util → Legacy-Controller</code> entry. It retrieves the <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> from the Main Panel and updates the model.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Controller Page
@@ -131,7 +131,7 @@
<li><a class="xref" href="../../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_HeidenhainDatumPresetTable">HeidenhainDatumPresetTable</a> Panel
(Note that The XYZ is not sortable on the table.)
<ul>
<li>Show Datum Preset Toggle Button for <a class="xref" href="../../api/Hi.Numerical.HeidenhainCoordinateEntryDisplayee.html">HeidenhainCoordinateEntryDisplayee</a></li>
<li>Show Datum Preset Toggle Button for <code>HeidenhainCoordinateEntryDisplayee</code></li>
</ul>
</li>
</ul>
@@ -140,7 +140,7 @@
(Note that The XYZ is not sortable on the table.)
<ul>
<li><a class="xref" href="../../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_HeidenhainDatumShiftTable">HeidenhainDatumShiftTable</a> Panel</li>
<li>Show Datum Shift Toggle Button for <a class="xref" href="../../api/Hi.Numerical.HeidenhainCoordinateEntryDisplayee.html">HeidenhainCoordinateEntryDisplayee</a></li>
<li>Show Datum Shift Toggle Button for <code>HeidenhainCoordinateEntryDisplayee</code></li>
</ul>
</li>
<li>Offset Table Tab
@@ -202,7 +202,7 @@ See Rendering Items SubMenu from <a href="../player/player-extended-renderingcan
</li>
<li>RenderingCanvas
<ul>
<li>The <a class="xref" href="../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a> is <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a></li>
<li>The <a class="xref" href="../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a> is <code>MachiningProjectDisplayee</code></li>
</ul>
</li>
</ul>
@@ -227,13 +227,13 @@ See Rendering Items SubMenu from <a href="../player/player-extended-renderingcan
<li>X, Y, Z coordinate values</li>
<li>Action buttons to set the entry to program zero or machine zero</li>
</ul>
<p>Row selection updates <a class="xref" href="../../api/Hi.Numerical.IsoCoordinateEntryDisplayee.html#Hi_Numerical_IsoCoordinateEntryDisplayee_IsoCoordinateId">IsoCoordinateId</a>.</p>
<p>Row selection updates <code>IsoCoordinateEntryDisplayee.IsoCoordinateId</code>.</p>
<h3 id="datum-preset-and-shift-tables-heidenhain">Datum Preset and Shift Tables (Heidenhain)</h3>
<p>These tables are specific to <a class="xref" href="../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Heidenhain">Heidenhain</a> controllers and provide interfaces for:</p>
<ul>
<li>Setting datum preset positions in <a class="xref" href="../../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_HeidenhainDatumPresetTable">HeidenhainDatumPresetTable</a></li>
<li>Configuring datum shifts in <a class="xref" href="../../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_HeidenhainDatumShiftTable">HeidenhainDatumShiftTable</a></li>
<li>Visualizing selected datum in the 3D viewer with <a class="xref" href="../../api/Hi.Numerical.HeidenhainCoordinateEntryDisplayee.html">HeidenhainCoordinateEntryDisplayee</a></li>
<li>Visualizing selected datum in the 3D viewer with <code>HeidenhainCoordinateEntryDisplayee</code></li>
</ul>
<h3 id="offset-table">Offset Table</h3>
<p>Manages tool offsets with the following capabilities:</p>
@@ -118,7 +118,7 @@
<li><code>PUT /api/Controller/iso-coordinate-table/{index}</code></li>
<li><code>POST /api/Controller/iso-coordinate-table/{index}/set-to-program-zero</code></li>
<li><code>POST /api/Controller/iso-coordinate-table/{index}/set-to-machine-zero</code></li>
<li><code>PUT /api/Controller/iso-coordinate-selection</code> - updates <a class="xref" href="../../api/Hi.Numerical.IsoCoordinateEntryDisplayee.html">IsoCoordinateEntryDisplayee</a>.</li>
<li><code>PUT /api/Controller/iso-coordinate-selection</code> - updates <code>IsoCoordinateEntryDisplayee</code>.</li>
</ul>
</li>
<li><strong>Heidenhain datum preset / shift</strong>
@@ -157,7 +157,7 @@
</li>
<li><strong>Display</strong>
<ul>
<li><code>POST /api/Controller/initialize-display/{connectionId}</code> - binds the shared <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a> to the rendering engine keyed by <code>connectionId</code>. The Controller page and Player page share this displayee, so <code>Display Options ▾</code> toggles via the rendering-flags API propagate to both viewers.</li>
<li><code>POST /api/Controller/initialize-display/{connectionId}</code> - binds the shared <code>MachiningProjectDisplayee</code> to the rendering engine keyed by <code>connectionId</code>. The Controller page and Player page share this displayee, so <code>Display Options ▾</code> toggles via the rendering-flags API propagate to both viewers.</li>
</ul>
</li>
</ul>
@@ -92,7 +92,10 @@
<ul>
<li>Extended Cylinder Panel
<ul>
<li>FullLength Input Field</li>
<li>FullLength Input Field — full length from <code>Z=0</code> (the cutter tip), <strong>includes
the span below the start section</strong> (for a cutter upper beam: the flute
height). The web editor shows the valid range (must exceed the start-section
Z, served as <code>minFullLength</code>) and the backend rejects values at or below it.</li>
</ul>
</li>
</ul>
@@ -140,8 +140,8 @@
</thead>
<tbody>
<tr>
<td><a href="runtime-geom-panel.html">Runtime Geometry Panel</a></td>
<td>Manages runtime geometry (not <a class="xref" href="../../api/Hi.Geom.IStlSource.html">IStlSource</a>, but follows similar patterns)</td>
<td><a href="meshed-geom-panel.html">Meshed Geometry Panel</a></td>
<td>Manages meshed geometry (not <a class="xref" href="../../api/Hi.Geom.IStlSource.html">IStlSource</a>, but follows similar patterns)</td>
</tr>
<tr>
<td><a href="extended-cylinder-panel.html">Extended Cylinder Panel</a></td>
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Runtime Geometry Panel | HiAPI-C# 2025 </title>
<title>Meshed Geometry Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Runtime Geometry Panel | HiAPI-C# 2025 ">
<meta name="title" content="Meshed Geometry Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,16 +85,16 @@
</div>
<article data-uid="">
<h1 id="runtime-geometry-panel">Runtime Geometry Panel</h1>
<h1 id="meshed-geometry-panel">Meshed Geometry Panel</h1>
<p>Key model is <a class="xref" href="../../api/Hi.Cbtr.CubeTreeFile.html">CubeTreeFile</a>.</p>
<div class="NOTE">
<h5>Note</h5>
<p>The term Runtime Geometry is <a class="xref" href="../../api/Hi.Cbtr.CubeTree.html">CubeTree</a>.</p>
<p>The term Meshed Geometry is <a class="xref" href="../../api/Hi.Cbtr.CubeTree.html">CubeTree</a>.</p>
</div>
<h2 id="layout">Layout</h2>
<ul>
<li>Runtime Geom Panel
<li>Meshed Geom Panel
<ul>
<li>File Selector</li>
</ul>
@@ -104,12 +104,12 @@
<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>
<ul>
<li>Geom/RuntimeGeomPanel</li>
<li>Geom/MeshedGeomPanel</li>
</ul>
<h3 id="web-service-application-source-code-path">Web Service Application Source Code Path</h3>
<ul>
<li>wwwroot/geom/runtime-geom-panel.js</li>
<li>Geom/RuntimeGeomHub.cs (to be created)</li>
<li>wwwroot/geom/meshed-geom-panel.js</li>
<li>Geom/MeshedGeomHub.cs (to be created)</li>
<li>Geom/GeometryController.cs</li>
</ul>
@@ -90,7 +90,7 @@
<p>This section is a <strong>transparent, per-component anatomy of the HiNC application family</strong>. The forward-looking flagship is <strong>HiNC-2025-webservice</strong> (Quasar SPA + ASP.NET Core); <strong>HiNC-2025-win-desktop</strong> (the WPF client) is included only as a <strong>legacy reference</strong> — it is waiting to be fully obsoleted and is kept here so readers can map old screens onto their web-service successors. Every page dissects one UI component and exposes three layers:</p>
<ol>
<li><strong>Layout</strong> — the visual / widget tree the user sees.</li>
<li><strong>Key Model</strong> — the backing HiAPI types (<a class="xref" href="../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a>, <a class="xref" href="../api/Hi.HiNcKits.UserService.html">UserService</a>, …).</li>
<li><strong>Key Model</strong> — the backing HiAPI types (<a class="xref" href="../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a>, <a class="xref" href="../sample/Sample.Common.UserService.html">UserService</a>, …).</li>
<li><strong>Source Code Path</strong> — the concrete files (WPF <code>.xaml</code> + Quasar <code>.vue</code> + controller <code>.cs</code>) that implement the component, per application variant.</li>
</ol>
<p>The sibling <a href="general-rules.html">General Rules</a> describes conventions shared across the anatomy.</p>
@@ -110,6 +110,10 @@
<ul>
<li>Repository: <a href="https://superhightech-gitea.webredirect.org/HiNC-Deploy/HiNC-2025-webservice.git">https://superhightech-gitea.webredirect.org/HiNC-Deploy/HiNC-2025-webservice.git</a></li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p><code>appsettings.json</code> pins the listening address through <code>Kestrel:Endpoints</code>, which <strong>overrides</strong> <code>ASPNETCORE_URLS</code> and the <code>launchSettings.json</code> <code>applicationUrl</code>. To run a throwaway local instance on another port (for example, next to a live one), set the <code>Kestrel__Endpoints__Http__Url</code> environment variable — setting <code>ASPNETCORE_URLS</code> alone is silently ignored.</p>
</div>
<h3 id="hinc-2025-win-desktop-legacy-pending-obsoletion">HiNC-2025-win-desktop (legacy, pending obsoletion)</h3>
<p>Native Windows desktop client built on WPF. <strong>Slated to be fully obsoleted</strong> — listed here only so readers familiar with the desktop UI can locate the equivalent web-service component. Do not start new work against this codebase.</p>
<ul>
@@ -96,7 +96,7 @@
<li><strong>Web Service Application</strong>: Service inherits from <a class="xref" href="../api/Hi.MachiningProcs.IProjectService.html">IProjectService</a></li>
</ul>
</li>
<li><strong>User Service</strong>: <a class="xref" href="../api/Hi.HiNcKits.UserService.html">UserService</a></li>
<li><strong>User Service</strong>: <a class="xref" href="../sample/Sample.Common.UserService.html">UserService</a></li>
</ul>
<h2 id="layout-structure">Layout Structure</h2>
<ul>
@@ -111,7 +111,7 @@
<li><code>Save As MenuItem</code></li>
</ul>
</li>
<li><code>Environment Menu Dropdown</code>
<li><code>Environment Menu Dropdown</code> (WPF application only — the web application has no such dropdown; see below)
<ul>
<li>Machine Tool MenuItem
Open <a href="mech/machining-chain-page.html">Machine Tool Page</a>
@@ -127,16 +127,26 @@ Open <a href="mech/workpiece-page.html">Workpiece Page</a></li>
</ul>
</li>
<li>Mission MenuItem
Open <a href="mission/index.html">Mission Page</a></li>
Open <a href="mission/index.html">Mission Page</a>
In the web application the Mission editor is a Player Control Tree branch; <code>/mission</code> redirects there.</li>
<li>Player MenuItem
Link to <a href="player/index.html">Player Panel</a>
(Not exist on WPF app.)</li>
<li>Player Belonged Tool Bars. See <a href="player/index.html">Player Panel</a>. Shows only if the Main Panel content is Player Panel.</li>
<li><code>Util Menu Dropdown</code> (web application only). See <a href="util/index.html">Util Pages</a>.
<ul>
<li>File Explorer MenuItem</li>
<li>Mechanism Builder MenuItem</li>
<li>Legacy-Controller MenuItem (below a separator)
Open <a href="controller/index.html">Controller Page</a></li>
</ul>
</li>
<li><a href="preference/index.html">Preference Menu Dropdown</a></li>
<li>Help MenuItem
<ul>
<li>HiAPI Version label
A label to show the HiNc library version.</li>
A label to show the HiNc library version.
The web application shows this as a version badge next to the brand logo, with no Help dropdown.</li>
</ul>
</li>
</ul>
@@ -145,7 +155,8 @@ A label to show the HiNc library version.</li>
Open Log Viewer to display application logs for the current day.
The Log Viewer provides real-time access to system logs with filtering and download capabilities.
It reads log files from the server's log directory and presents them in a formatted, searchable interface.
Users can refresh the log content or download the current day's log file for offline analysis.</li>
Users can refresh the log content or download the current day's log file for offline analysis.
In the web application this is an always-visible <code>Show Log</code> button on the menu bar's right side.</li>
<li>Central <code>Page Panel</code></li>
<li><a href="message-section-on-main-panel.html">Message Section on Main Panel</a></li>
</ul>
@@ -183,10 +194,10 @@ Users can refresh the log content or download the current day's log file for off
</tr>
</tbody>
</table>
<p>All operation results (success or exception) are displayed via <a class="xref" href="../api/Hi.Common.Messages.MultiTagMessageUtil.html">MultiTagMessageUtil</a>. When a project is loaded, the Player Panel's RenderingCanvas is set to isometric view using <a class="xref" href="../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToIsometricView">SetViewToIsometricView()</a>.</p>
<p>All operation results (success or exception) are reported as <code>IMessage</code> notifications through the <a class="xref" href="../api/Hi.Common.Messages.MessageUtil.html">MessageUtil</a> helpers. When a project is loaded, the Player Panel's RenderingCanvas is set to isometric view using <a class="xref" href="../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToIsometricView">SetViewToIsometricView()</a>.</p>
<div class="NOTE">
<h5>Note</h5>
<p>The implementation uses static functions of <a class="xref" href="../api/Hi.Common.Messages.MultiTagMessageUtil.html">MultiTagMessageUtil</a> for message handling. Async operations ensure smooth user experience during file I/O.</p>
<p>The implementation uses the <a class="xref" href="../api/Hi.Common.Messages.MessageUtil.html">MessageUtil</a> extension methods for message handling. Async operations ensure smooth user experience during file I/O.</p>
</div>
<h2 id="platform-specific-differences">Platform-Specific Differences</h2>
<h3 id="wpf-application">WPF Application</h3>
@@ -198,6 +209,7 @@ Users can refresh the log content or download the current day's log file for off
<ul>
<li>The Player Panel is the default panel displayed on the main page</li>
<li>The page URL and panel state are synchronized (bi-directional navigation)</li>
<li>There is no Environment dropdown. Machine Tool, Tool House, Fixture, Workpiece, Background / Coolant and Spindle Capability are all Player Control Tree roots or branches (their old routes redirect there), and Controller moved to <code>Util → Legacy-Controller</code>. The menu bar is therefore <code>Project ▾ | Player | Util ▾ | Preference ▾</code>.</li>
</ul>
<h2 id="source-code-locations">Source Code Locations</h2>
<p>See <a href="index.html">HiNC GUI Architecture</a> for git repository links.</p>
@@ -209,9 +221,9 @@ Users can refresh the log content or download the current day's log file for off
<ul>
<li><code>Environments/PreferenceController.cs</code></li>
<li><code>Environments/ProjectController.cs</code></li>
<li><code>wwwroot/app.js</code></li>
<li><code>wwwroot/index.html</code></li>
<li><code>wwwroot/preference/log-viewer.js</code></li>
<li><code>wwwroot-src/src/components/AppMenuBar.vue</code> — the whole navigation menu.</li>
<li><code>wwwroot-src/src/layouts/MainLayout.vue</code> — the shell that hosts the menu bar and the central page panel.</li>
<li><code>wwwroot-src/src/pages/LogViewerPage.vue</code> — the Log Viewer the <code>Show Log</code> button opens.</li>
</ul>
</article>
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Background / Coolant Page | HiAPI-C# 2025 </title>
<title>Background / Coolant (Control Tree) | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Background / Coolant Page | HiAPI-C# 2025 ">
<meta name="title" content="Background / Coolant (Control Tree) | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,34 +85,36 @@
</div>
<article data-uid="">
<h1 id="background--coolant-page">Background / Coolant Page</h1>
<h1 id="background--coolant-control-tree">Background / Coolant (Control Tree)</h1>
<p>The Background / Coolant page edits three thermal scalars on the current project's <a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html">MachiningEquipment</a>:</p>
<p>Background and Coolant are two leaves under the Player control tree's <strong>Equipment Setup</strong> group (<code>/player?tree=equipment/background</code>, <code>/player?tree=equipment/coolant</code>), sharing one panel component. They edit the thermal condition on the current project's <a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html">MachiningEquipment</a>:</p>
<ul>
<li><a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_BackgroundTemperature_C">BackgroundTemperature_C</a></li>
<li><code>CoolantHeatCondition.CoolantTemperature_C</code></li>
<li><code>CoolantHeatCondition.CoolantConvectionCoefficient_Wdm2K</code></li>
<li><a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_BackgroundTemperature_C">BackgroundTemperature_C</a> (Background leaf)</li>
<li>the whole <a class="xref" href="../../api/Hi.Physics.CoolantHeatCondition.html">CoolantHeatCondition</a> (Coolant leaf) — preset-first, see below</li>
</ul>
<p>Key Model: <a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html">MachiningEquipment</a> (+ its <code>CoolantHeatCondition</code>).</p>
<div class="NOTE">
<h5>Note</h5>
<p>This page exists only in the Quasar webservice. The WPF desktop app has no equivalent; the values are edited via scripting or XML.</p>
<p>These leaves exist only in the Quasar webservice. The WPF desktop app has no equivalent; the values are edited via scripting or XML.</p>
</div>
<h2 id="layout">Layout</h2>
<ul>
<li>Background / Coolant Page
<ul>
<li>Background Card
<li>Background leaf
<ul>
<li>Background Temperature NumberField (°C) — <a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_BackgroundTemperature_C">BackgroundTemperature_C</a>.</li>
</ul>
</li>
<li>Coolant Card
<li>Coolant leaf (pure WorkpieceMaterial layout — file pick on top, properties below)
<ul>
<li>&ldquo;Not attached&rdquo; badge — visible until the first coolant-related save (see <em>Lazy CoolantHeatCondition creation</em> below).</li>
<li>Coolant Temperature NumberField (°C) — <code>CoolantHeatCondition.CoolantTemperature_C</code>.</li>
<li>Coolant Convection Coefficient NumberField (W/(m²·K)) — <code>CoolantHeatCondition.CoolantConvectionCoefficient_Wdm2K</code>. Clamped to <code>min: 0</code>.</li>
<li>Sanity-range hint — echoes the table from <code>CoolantHeatCondition.cs</code> doc-comments (forced air 10500, typical coolant 100010000).</li>
<li><strong>File row</strong><code>FilePathInput</code> (<code>.CoolantHeatCondition</code>, resource subfolder <code>CoolantHeatCondition</code>) loading a saved condition by named root, plus a <strong>Save As&hellip;</strong> prompt exporting the current condition to a project-relative file. Tracked in <code>MachiningEquipment.CoolantHeatConditionFile</code>. The three standard cooling types ship as ready-made files in <code>HiNc-Resource</code> (<code>Resource/CoolantHeatCondition/*.CoolantHeatCondition</code>), so <strong>Browse Resource&hellip;</strong> starts populated like the workpiece-material picker — picking a shipped file <em>is</em> the cooling-type selection.</li>
<li>Name / Note — read-only mirror of the loaded condition.</li>
<li>Property fields (always visible, under Name / Note):
<ul>
<li>Coolant Temperature (°C) — <code>CoolantTemperature_C</code>.</li>
<li>Flood Convection Coefficient (W/(m²·K)) — <code>CoolantConvectionCoefficient_Wdm2K</code>, <code>min: 0</code>.</li>
<li>Mist / Flood Ratio — <code>MistFloodConvectionRatio</code>, <code>min: 0</code>.</li>
<li>Off (Air) Convection Coefficient (W/(m²·K)) — <code>OffConvectionCoefficient_Wdm2K</code>, <code>min: 0</code>.</li>
</ul>
</li>
</ul>
@@ -120,10 +122,11 @@
</ul>
<h2 id="behavior">Behavior</h2>
<ul>
<li><strong>Lazy <code>CoolantHeatCondition</code> creation.</strong> If the machining equipment has no <code>CoolantHeatCondition</code> yet, the first write lazy-creates one server-side so the page can edit a fresh project before the operator explicitly attaches a coolant condition. The &ldquo;not attached&rdquo; badge disappears once the first value is saved.</li>
<li><strong>File-based conditions (WorkpieceMaterial pattern).</strong> Picking a <code>.CoolantHeatCondition</code> file installs it as the whole condition (<code>XFactory.GenByFile</code>); <strong>Save As&hellip;</strong> exports the current values and renames the condition after the file (<code>IPreferredFileName</code>). While <code>MachiningEquipment.CoolantHeatConditionFile</code> is set, the project save externalizes the condition as <code>&lt;CoolantHeatCondition&gt;&lt;XmlSource&gt;relPath&lt;/XmlSource&gt;&lt;/CoolantHeatCondition&gt;</code> and regenerates the side-file (a resource pick is copied into the project on save); with no file the legacy bare inline shape is kept byte-compatible. Coefficient edits tune <em>this project's</em> copy. The static presets on <code>CoolantHeatCondition</code> (<code>StandardPresets</code> / <code>ApplyPreset</code> / <code>MatchStandardPreset</code>) remain the API-side source of the shipped files.</li>
<li><strong>Lazy <code>CoolantHeatCondition</code> creation.</strong> If the machining equipment has no <code>CoolantHeatCondition</code> yet, the first write lazy-creates one server-side so the panel can edit a fresh project before the operator explicitly attaches a coolant condition. The &ldquo;not attached&rdquo; badge disappears once the first value is saved.</li>
<li><strong>Celsius is the wire format.</strong> <code>CoolantHeatCondition</code> stores Kelvin internally but exposes <code>_C</code> getters that handle the conversion.</li>
<li><strong>No file IO.</strong> Background / coolant settings are part of the <code>.hincproj</code> save; there's no separate file to load.</li>
<li><strong>Infinity round-trip.</strong> <code>NumericInput</code> handles <code>Infinity</code> for free. Background and coolant temperatures allow negatives (e.g. -40 °C for cryogenic coolant); the convection coefficient is clamped to <code>min: 0</code>.</li>
<li><strong>No file IO.</strong> Background / coolant settings are part of the <code>.hincproj</code> save; there's no separate file to load. A fresh project value-matches <code>StandardWaterSolubleCoolant</code> (the class defaults), so the select starts on a meaningful entry instead of &ldquo;Custom&rdquo;.</li>
<li><strong>Infinity round-trip.</strong> <code>NumericInput</code> handles <code>Infinity</code> for free. Background and coolant temperatures allow negatives (e.g. -40 °C for cryogenic coolant); the convection fields are clamped to <code>min: 0</code>.</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">HiNC App Anatomy</a> for git repository links.</p>
@@ -134,22 +137,23 @@
<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/pages/BackgroundCoolantPage.vue</code> — routed page at <code>/equipment/background-coolant</code>.</li>
<li><code>wwwroot-src/src/components/controlTree/ThermalConditionPanel.vue</code> — the shared Background / Coolant panel (keyed off the node's role path).</li>
<li><code>wwwroot-src/src/components/controlTree/useControlTreeHost.ts</code> — the two <code>ThermalCondition</code> tree nodes under the Equipment Setup group.</li>
<li><code>wwwroot-src/src/api/backgroundCoolant.ts</code> — typed wrapper over <code>/api/mech/background-coolant/*</code>.</li>
<li><code>wwwroot-src/src/router/routes.ts</code><code>/equipment/background-coolant</code> entry.</li>
<li><code>wwwroot-src/src/layouts/AppMenuBar.vue</code><code>Environment → Background / Coolant</code> menu entry below Workpiece.</li>
<li><code>Mech/BackgroundCoolantController.cs</code> — REST endpoints:
<ul>
<li><code>GET /api/mech/background-coolant</code> — flat snapshot <code>{ hasEquipment, backgroundTemperature_C, hasCoolant, coolantTemperature_C, coolantConvectionCoefficient_Wdm2K }</code>.</li>
<li><code>GET /api/mech/background-coolant</code> — flat snapshot <code>{ hasEquipment, backgroundTemperature_C, hasCoolant, coolantTemperature_C, coolantConvectionCoefficient_Wdm2K, mistFloodConvectionRatio, offConvectionCoefficient_Wdm2K, coolantName, coolantNote, coolantHeatConditionFile }</code>.</li>
<li><code>POST /load</code>, <code>POST /save-as</code><code>{ rootName, relFile }</code>: install a <code>.CoolantHeatCondition</code> file / export the current condition (extension auto-appended, renames via <code>IPreferredFileName</code>), both recording <code>MachiningEquipment.CoolantHeatConditionFile</code>.</li>
<li><code>PUT /background-temperature-c</code> — set <a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_BackgroundTemperature_C">BackgroundTemperature_C</a>.</li>
<li><code>PUT /coolant-temperature-c</code> — lazy-creates <code>CoolantHeatCondition</code> if needed, then sets <code>CoolantTemperature_C</code>.</li>
<li><code>PUT /coolant-convection-coefficient-wdm2k</code> — same pattern for the heat-transfer coefficient.</li>
<li><code>PUT /coolant-convection-coefficient-wdm2k</code>, <code>PUT /mist-flood-convection-ratio</code>, <code>PUT /off-convection-coefficient-wdm2k</code> — same pattern for the three convection values (Custom mode).</li>
</ul>
</li>
</ul>
<h2 id="related-pages">Related Pages</h2>
<ul>
<li><a href="spindle-capability-page.html">Spindle Capability Page</a> — sibling under <code>Environment</code>, also targets <code>MachiningEquipment</code>.</li>
<li><a href="spindle-capability-page.html">Spindle Capability Page</a> — sibling equipment editor, also targets <code>MachiningEquipment</code>.</li>
<li><a href="../../manual/setup/coolant.html">Coolant (manual)</a> — the end-user / API manual page for the cooling types.</li>
</ul>
</article>
@@ -147,7 +147,7 @@
</li>
</ul>
<h3 id="property-tab">Property Tab</h3>
<p>Visible if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<p>Visible if <a class="xref" href="../../../sample/Sample.Common.UserService.html#Sample_Common_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<ul>
<li>Integral Mode Selection Dropdown
<ul>
@@ -186,7 +186,7 @@ Since the thickness depdents on the Workpiece Cutting Parameter and hone radius.
</li>
</ul>
<h3 id="insert-cutter-tab">Insert-Cutter Tab</h3>
<p>Visible if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true and Integral Mode is Insert End.</p>
<p>Visible if <a class="xref" href="../../../sample/Sample.Common.UserService.html#Sample_Common_UserService_EnablePhysics">EnablePhysics</a> is true and Integral Mode is Insert End.</p>
<ul>
<li>Insert Number Input field</li>
<li>Insert Mass Input field (g)
@@ -202,7 +202,7 @@ Since the thickness depdents on the Workpiece Cutting Parameter and hone radius.
</li>
</ul>
<h3 id="material-tab">Material Tab</h3>
<p>Visible if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<p>Visible if <a class="xref" href="../../../sample/Sample.Common.UserService.html#Sample_Common_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<ul>
<li>Shank Material (visible only for Integral Mode is Insert End mode)
<ul>
@@ -302,13 +302,13 @@ Apply <a class="xref" href="../../../api/Hi.Physics.CoatingMaterial.html">Coatin
<li>&ldquo;Resource/CoatingMaterial&rdquo;</li>
</ul>
<h3 id="flute-contours-tab">Flute-Contours Tab</h3>
<p>Visible if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<p>This part manages <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_FluteContourTray">FluteContourTray</a>.</p>
<p>Visible if <a class="xref" href="../../../sample/Sample.Common.UserService.html#Sample_Common_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<p>This part manages <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_Fluting">Fluting</a>.</p>
<ul>
<li>Contour Tray Selection Dropdown
<ul>
<li>Uniform Contour Tray (<a class="xref" href="../../../api/Hi.Milling.FluteContours.UniformContourTray.html">UniformContourTray</a>)</li>
<li>Free Contour Tray (<a class="xref" href="../../../api/Hi.Milling.FluteContours.FreeContourTray.html">FreeContourTray</a>)</li>
<li>Uniform Fluting (<a class="xref" href="../../../api/Hi.Milling.FluteContours.UniformFluting.html">UniformFluting</a>)</li>
<li>Free Fluting (<a class="xref" href="../../../api/Hi.Milling.FluteContours.FreeFluting.html">FreeFluting</a>)</li>
<li>Unset</li>
</ul>
</li>
@@ -333,7 +333,7 @@ Apply <a class="xref" href="../../../api/Hi.Physics.CoatingMaterial.html">Coatin
</li>
</ul>
<h3 id="flute-inner-beam-tab">Flute-Inner-Beam Tab</h3>
<p>Visible if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<p>Visible if <a class="xref" href="../../../sample/Sample.Common.UserService.html#Sample_Common_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<p>This part manages <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_InnerBeamProfile">InnerBeamProfile</a>.</p>
<ul>
<li>Profile Type Selection Dropdown
@@ -351,7 +351,7 @@ Apply <a class="xref" href="../../../api/Hi.Physics.CoatingMaterial.html">Coatin
<ul>
<li>Radius Ratio Number Field (readonly)
<ul>
<li>Label also shows the additional information: &lsquo;Dependent on flute num xxx&rsquo;, the &lsquo;xxx&rsquo; is the flute number that pass by <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html">MillingCutter</a>.<a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_FluteContourTray_">FluteContourTray</a>. Series pass the model by the GUI if needed.</li>
<li>Label also shows the additional information: &lsquo;Dependent on flute num xxx&rsquo;, the &lsquo;xxx&rsquo; is the flute number that pass by <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html">MillingCutter</a>.<a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_Fluting_">Fluting</a>. Series pass the model by the GUI if needed.</li>
</ul>
</li>
</ul>
@@ -370,7 +370,7 @@ Apply <a class="xref" href="../../../api/Hi.Physics.CoatingMaterial.html">Coatin
</li>
</ul>
<h3 id="optimization-tab">Optimization Tab</h3>
<p>Visible if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<p>Visible if <a class="xref" href="../../../sample/Sample.Common.UserService.html#Sample_Common_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<p>This part manages <a class="xref" href="../../../api/Hi.NcOpt.MillingCutterOptOption.html">MillingCutterOptOption</a>.</p>
<ul>
<li>Enable Optimization Checkbox
@@ -90,7 +90,7 @@
<p>The page triggers by <a href="../main-panel.html">Main Panel</a>.</p>
<p>The key model is <a class="xref" href="../../api/Hi.NcMech.Fixtures.Fixture.html">Fixture</a> and <a class="xref" href="../../api/Hi.NcMech.Fixtures.FixtureEditorDisplayeeConfig.html">FixtureEditorDisplayeeConfig</a>.
Fixture is assigned from the Main Panel's <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_Fixture">Fixture</a>.</p>
<p><a class="xref" href="../../api/Hi.NcMech.Fixtures.FixtureEditorDisplayeeConfig.html">FixtureEditorDisplayeeConfig</a> is from <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_UserConfig">UserConfig</a> which assigned from the parent component.</p>
<p><a class="xref" href="../../api/Hi.NcMech.Fixtures.FixtureEditorDisplayeeConfig.html">FixtureEditorDisplayeeConfig</a> is from <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_UserConfig">UserConfig</a> which assigned from the parent component.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Fixture Page
@@ -146,7 +146,7 @@
<li><code>wwwroot-src/src/components/mech/MechBuilderGraph.vue</code> — lazy mermaid loader + click-proxy onto mermaid node / edge DOM. Mermaid is dynamic-imported so the first bundle stays slim (~1 MB raw split into its own chunk).</li>
<li><code>wwwroot-src/src/api/generalMechanism.ts</code> — typed wrapper over <code>/api/general-mechanism/*</code>.</li>
<li><code>wwwroot-src/src/router/routes.ts</code><code>/util/mech-builder</code> entry.</li>
<li><code>wwwroot-src/src/layouts/AppMenuBar.vue</code><code>Util → Mechanism Builder</code> entry.</li>
<li><code>wwwroot-src/src/components/AppMenuBar.vue</code><code>Util → Mechanism Builder</code> entry.</li>
<li><code>Mech/MechBuilder/GeneralMechanismService.cs</code> — DI singleton that holds the current mechanism + last <code>BaseDirectory</code> + <code>RelFile</code>.</li>
<li><code>Mech/MechBuilder/GeneralMechanismController.cs</code><code>/api/general-mechanism/*</code> CRUD over anchors / branches / per-anchor <code>TransformationGeom</code>; XML Save As for both <code>GeneralMechanism</code> and <code>GeneralXyzabcMachineTool</code> envelopes.</li>
<li><code>Mech/MechBuilder/GeneralMechanismDisplayController.cs</code><code>/api/general-mechanism/display/*</code> view init.</li>
@@ -165,7 +165,7 @@
<li><code>wwwroot-src/src/pages/SpindleCapabilityPage.vue</code> — routed page at <code>/equipment/spindle</code>.</li>
<li><code>wwwroot-src/src/api/spindleCapability.ts</code> — typed wrapper over <code>/api/mech/spindle-capability/*</code>.</li>
<li><code>wwwroot-src/src/router/routes.ts</code><code>/equipment/spindle</code> entry.</li>
<li><code>wwwroot-src/src/layouts/AppMenuBar.vue</code><code>Environment → Spindle Capability</code> menu entry between Controller and Tool House.</li>
<li>No menu-bar entry: the Environment menu is gone (<code>wwwroot-src/src/components/AppMenuBar.vue</code>), and Spindle Capability is reached as its own Player Control Tree root.</li>
<li><code>Mech/SpindleCapabilityController.cs</code> — REST endpoints:
<ul>
<li><code>GET /api/mech/spindle-capability</code> — flat snapshot (metadata + contour keys).</li>
@@ -89,7 +89,7 @@
<p>The term stick is for not only milling, but other remover like electric discharge machining tool.</p>
<p>The key model is MillingTool.
Other model: <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a>.</p>
Other model: <a class="xref" href="../../../sample/Sample.Common.UserService.html">UserService</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Head Line
@@ -122,7 +122,7 @@ Other model: <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">Us
</ul>
</li>
<li>Intelligent Holder Tab
Visible if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</li>
Visible if <a class="xref" href="../../../sample/Sample.Common.UserService.html#Sample_Common_UserService_EnablePhysics">EnablePhysics</a> is true.</li>
<li>Info Tab
<ul>
<li>Abstract Note TextField (readonly)</li>
@@ -89,7 +89,7 @@
<p>The page triggers by <a href="../main-panel.html">Main Panel</a>.</p>
<p>The key model is MachiningToolHouse.
The model <a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a> is delivered by the host GUI.</p>
The model <a class="xref" href="../../sample/Sample.Common.UserService.html">UserService</a> is delivered by the host GUI.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Tool House Page
@@ -147,11 +147,11 @@ The panel has CRUD (and Duplicate) of the tools. Read and Update the selected to
<li>(Options of <a class="xref" href="../../api/Hi.Milling.Cutters.MillingCutterEditorDisplayee.html">MillingCutterEditorDisplayee</a>)
<ul>
<li>Shape Mode SubMenu
Set <a class="xref" href="../../api/Hi.Milling.Cutters.MillingCutterEditorDisplayee.html#Hi_Milling_Cutters_MillingCutterEditorDisplayee_ShapeMode">ShapeMode</a> to Solid Bounding Shape if <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is false on GUI initialization.
Set <a class="xref" href="../../api/Hi.Milling.Cutters.MillingCutterEditorDisplayee.html#Hi_Milling_Cutters_MillingCutterEditorDisplayee_ShapeMode">ShapeMode</a> to Solid Bounding Shape if <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_EnablePhysics">EnablePhysics</a> is false on GUI initialization.
<ul>
<li>Solid Bounding Shape Ratio Button</li>
<li>Detail Physics Shape Ratio Button
Visible if <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</li>
Visible if <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_EnablePhysics">EnablePhysics</a> is true.</li>
</ul>
</li>
</ul>
@@ -212,31 +212,38 @@ Visible if <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcK
<li>Mech/ToolHouse/ToolHouseWindow</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<p>HiNC-2025-webservice (Quasar CLI SPA):</p>
<p>HiNC-2025-webservice (Quasar CLI SPA). The page is built on the shared Control Tree: the tool nodes on the left, the selected node's tab cascade in the middle, the canvas on the right.</p>
<ul>
<li><code>wwwroot-src/src/pages/ToolHousePage.vue</code> — routed page: left Tool List (with inline double-click Tool ID rename) + middle Selected Tool Editor + right Viewer, three <code>&lt;q-splitter&gt;</code> panes with Display Options dropdown (Show Cutter / Show Holder + 3 anchor flags + Holder Rendering Mode).</li>
<li><code>wwwroot-src/src/components/toolhouse/StickToolEditor.vue</code> Cutter / Holder / Clamping / Int. Holder / Info tabs.</li>
<li><code>wwwroot-src/src/components/toolhouse/IntelligentHolderDiv.vue</code> — Intelligent Holder (Observation Location) editor: <code>ObservationAnchorReference</code> enum dropdown + relative Z + ring radius.</li>
<li><code>wwwroot-src/src/components/toolhouse/CutterManagementPanel.vue</code> — cutter-type select + inner tabs (General / Flute Profile / Flute Contours / Optimization).</li>
<li><code>wwwroot-src/src/components/toolhouse/contourTray/ContourTrayDiv.vue</code> — Uniform / Free tray switch + <code>FreeContourTray</code> child CRUD.</li>
<li><code>wwwroot-src/src/components/toolhouse/contourTray/FluteContourDiv.vue</code> — SetupAngle + SideContour selector + BottomContour selector.</li>
<li><code>wwwroot-src/src/components/toolhouse/contourTray/ConstHelixSideContourDiv.vue</code> — Helix / Radial Rake / Radial Relief angles.</li>
<li><code>wwwroot-src/src/components/toolhouse/contourTray/SlideBottomContourDiv.vue</code> — OuterRadius / CutterLength / Eccentric / Disk / AxialRake.</li>
<li><code>wwwroot-src/src/components/toolhouse/MillingCutterOptLimitDiv.vue</code> — EnableOpt + MinFeed / MaxFeed / YieldingUtilizationFactor.</li>
<li><code>wwwroot-src/src/components/toolhouse/HolderPanel.vue</code> — None / CylindroidHolder / FreeformHolder switch; dispatches to a per-type holder editor component.</li>
<li><code>wwwroot-src/src/components/toolhouse/CylindroidHolderEditor.vue</code> — dedicated CylindroidHolder editor (Geometry / Resolution / Info tabs); wraps the reusable <code>CylindroidEditor.vue</code> and resyncs the holder (<code>UpdateByCylindroid()</code>) after geometry / resolution edits.</li>
<li><code>wwwroot-src/src/pages/ToolHousePage.vue</code> — routed page: <code>ToolHouseRootPanel</code> + tool list on the left, a <code>NodeTabCascade</code> tab strip for the selected tool in the middle, <code>ToolHouseSetupPanel</code> on the right, in resizable <code>&lt;q-splitter&gt;</code> panes.</li>
<li><code>wwwroot-src/src/components/toolhouse/ToolHouseSetupPanel.vue</code> — the canvas column: one RenderingCanvas bound server-side to <code>MillingToolEditorDisplayee</code>, following the page's selected tool, with the Display Options dropdown (Show Cutter / Show Holder + 3 anchor flags + Holder Rendering Mode + Cutter Shape Mode).</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolHouseRootPanel.vue</code> — the tool-house root node: Object Management (Load / Save / Paste / XML of the <code>MachiningToolHouse</code>) + New Tool.</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolNodePanel.vue</code> — one tool's General tab: Tool ID / Note / auto Abstract Note + Duplicate / Delete. Mounting it points the tool canvas at that tool.</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolCutterPanel.vue</code> — the Cutter stem: cutter type selector plus the MillingCutter identity fields (Shank Mass / Hone Radius / Relief Angle).</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/CutterSectionPanel.vue</code> — the cutter's inner tabs, keyed off the node's role path (<code>material</code> / <code>profile</code> / <code>upper-beam</code> / <code>opt</code>). Flute Profile is edited inline; the others dispatch to <code>toolhouse/MaterialDiv.vue</code> (which grows <code>CoatingLayersDiv.vue</code>), <code>toolhouse/UpperBeamDiv.vue</code> and <code>toolhouse/MillingCutterOptLimitDiv.vue</code>.</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/CutterContoursPanel.vue</code> — the Flute Contours stem: the fluting <strong>type</strong> selector only. The selected fluting's editor grows below it.</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/FlutingPanel.vue</code> — the concrete fluting node and its fluting-level fields; uniform fluting grows one Baseline Contour, free fluting one tab per flute.</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/FluteContourPanel.vue</code> — one flute contour node (<code>baseline</code>, or <code>flute-&lt;i&gt;</code> for a free fluting): hosts Setup Angle, with Side Contour and Bottom Contour as sub-tabs. <code>fluteContourNode.ts</code> carries the shared re-commit.</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/FluteSideContourPanel.vue</code> / <code>FluteBottomContourPanel.vue</code> — kind selector + editor, dispatching to <code>toolhouse/fluting/ConstHelixSideContourDiv.vue</code>, <code>FreeformSideContourDiv.vue</code>, <code>SlideBottomContourDiv.vue</code> and <code>FreeformBottomContourDiv.vue</code>; the two freeform editors share <code>SpanContourPosListDiv.vue</code> for the per-flute position list.</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolHolderPanel.vue</code> — the Holder stem: holder type selector plus the Cylindroid holder's Name / Note / auto Abstract Note.</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/HolderSectionPanel.vue</code> — the Cylindroid holder's Geometry (the Z-R profile, via <code>geom/CylindroidEditor.vue</code>) and Resolution tabs; resyncs the holder (<code>UpdateByCylindroid()</code>) after each edit.</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolClampingPanel.vue</code> — the Clamping tab: <code>ExposedCutterHeight</code> = <code>PreservedDistance</code> + <code>FluteHeight</code>; changing either field updates the other on the server.</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolIntelligentPanel.vue</code> — the Intelligent Holder tab; a thin wrapper over <code>toolhouse/IntelligentHolderDiv.vue</code> (Observation Location: <code>ObservationAnchorReference</code> dropdown + relative Z + ring radius).</li>
<li><code>wwwroot-src/src/api/toolHouse.ts</code> — typed wrapper over three server modules: <code>ToolHouseController</code> (<code>/api/ToolHouse</code>), <code>CutterController</code> (<code>/api/Cutter</code>) and <code>ToolHouseDisplayController</code> (<code>/api/mech/tool-house-display</code>).</li>
<li><code>wwwroot-src/src/api/cylindroidHolder.ts</code> — typed wrapper over <code>CylindroidHolderController</code>.</li>
<li><code>wwwroot-src/src/api/toolHouse.ts</code> — typed wrapper over <code>ToolHouseController</code> (CRUD + Initialize / SelectTool / EnsureCutter / shaper profile / contour tray / holder / <code>FreeContour</code> CRUD / opt-limit / general) and <code>ToolHouseDisplayController</code> (Show flags + Holder rendering mode + Cutter shape mode).</li>
<li><code>Mech/ToolHouseController.cs</code>REST endpoints: <code>GET /</code>, <code>GET /{id}</code>, <code>GET/PUT /{id}/observation</code>, <code>PUT /{id}/note | exposed-height | preserved-distance | shaper-profile | contour-tray | general | opt-limit</code>, <code>POST /Initialize | SelectTool | CreateTool | DuplicateTool | RenameTool | EnsureCutter | ClearCutter | SetHolderType | GetHolder | ClearToolCache</code>, <code>DELETE /DeleteTool</code>, and <code>FreeContourTray</code> child CRUD at <code>/{id}/contour-tray/contours[/{index}]</code>.</li>
<li><code>Mech/ToolHouseController.cs</code> — the tool-house collection and the tool-level fields. REST endpoints: <code>GET /</code>, <code>GET /{id}</code>, <code>GET /GetHolder</code>, <code>GET/PUT /{id}/observation</code>, <code>PUT /{id}/note | exposed-height | preserved-distance</code>, <code>POST /Initialize | Update | SelectTool | CreateTool | DuplicateTool | RenameTool | SetHolderType | ClearToolCache</code>, <code>DELETE /DeleteTool</code>.</li>
<li><code>Mech/CutterController.cs</code>cutter editing, split out of <code>ToolHouseController</code>. REST endpoints at <code>/api/Cutter/*</code>: <code>POST EnsureCutter | ClearCutter</code>, <code>PUT /{id}/shaper-profile | fluting | general | opt-limit</code>, <code>FreeFluting</code> child CRUD at <code>/{id}/fluting/contours[/{index}]</code>, <code>GET/POST /{id}/upper-beam[/create | /resync]</code>, and the material endpoints <code>/{id}/flute-material/*</code>, <code>/{id}/shank-material/*</code>, <code>/{id}/coating-layers/*</code>.</li>
<li><code>Mech/ToolHouseDisplayController.cs</code> — REST endpoints at <code>/api/mech/tool-house-display/*</code> for display options (initialize, select-tool, show-cutter / show-holder / show-geom-anchor / show-spindle-buckle / show-cutter-buckle, holder-rendering-mode, cutter-shape-mode, clear-cache).</li>
<li><code>Mech/CylindroidHolderController.cs</code> — holder-aware layer over a tool's <code>CylindroidHolder</code>. REST endpoints at <code>/api/CylindroidHolder/*</code>: <code>GET Get</code> (returns name / note / abstract note / resolution + indexes the holder's <code>Cylindroid</code>), <code>POST UpdateGeometryContent | SetName | SetNote | SetPolarResolution</code>. <code>UpdateGeometryContent</code> is the post-edit resync (<code>UpdateByCylindroid()</code> + <code>ClearCache()</code>) that the generic <code>CylindroidController</code> cannot perform.</li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p>The engine's <code>ContourTray</code> type family was renamed <strong>Fluting</strong>. Both spellings still resolve: the pre-rename <code>UniformContourTray</code> / <code>FreeContourTray</code> DTO type names are still accepted by <code>PUT /{id}/fluting</code>, and a Control-Tree id minted before the rename (<code>…/cutter/contours/tray…</code>) is migrated to <code>…/contours/fluting…</code> on the way in.</p>
</div>
<p>Not yet ported to the Quasar page (deferred; edit via the WPF client in the meantime):</p>
<ul>
<li>FreeformRemover cutter type.</li>
<li>FreeformHolder geometry / transformer editing.</li>
<li>FreeformSideContour per-flute CSV position list editing. Existing FreeformSideContour values are preserved on save but read-only in the web UI.</li>
<li>Physics-only cutter sub-tabs (Material, InsertCutter, FluteInnerBeam, UpperBeam).</li>
<li>InsertCutter and FluteInnerBeam physics sub-tabs.</li>
<li>CustomSpinningProfile shaper profile type.</li>
</ul>
@@ -90,7 +90,7 @@
<p>The page triggers by <a href="../main-panel.html">Main Panel</a>.</p>
<p>The key model is <a class="xref" href="../../api/Hi.NcMech.Workpieces.Workpiece.html">Workpiece</a> and <a class="xref" href="../../api/Hi.NcMech.Workpieces.WorkpieceEditorDisplayeeConfig.html">WorkpieceEditorDisplayeeConfig</a>.
Which is assigned from the Main Panel's <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_Workpiece">Workpiece</a>.</p>
<p><a class="xref" href="../../api/Hi.NcMech.Fixtures.FixtureEditorDisplayeeConfig.html">FixtureEditorDisplayeeConfig</a> is from <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_UserConfig">UserConfig</a> which assigned from the parent component.</p>
<p><a class="xref" href="../../api/Hi.NcMech.Fixtures.FixtureEditorDisplayeeConfig.html">FixtureEditorDisplayeeConfig</a> is from <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_UserConfig">UserConfig</a> which assigned from the parent component.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Workpiece Page
@@ -112,12 +112,12 @@ Which is assigned from the Main Panel's <a class="xref" href="../../api/Hi.Machi
<ul>
<li>Raw Shape Tab
<ul>
<li>Raw Geometry Source DropDown (Common Geometry and Runtime Geometry are EXCLUSIVE)
<li>Raw Geometry Source DropDown (Common Geometry and Meshed Geometry are EXCLUSIVE)
<ul>
<li>Common Geometry
Apply <a href="../geom/geom-manage-control.html">Geometry Management Control</a></li>
<li>Runtime Geometry
Apply <a href="../geom/runtime-geom-panel.html">Runtime Geometry Panel</a></li>
<li>Meshed Geometry
Apply <a href="../geom/meshed-geom-panel.html">Meshed Geometry Panel</a></li>
</ul>
</li>
</ul>
@@ -165,7 +165,7 @@ Apply <a href="../geom/runtime-geom-panel.html">Runtime Geometry Panel</a></li>
</ul>
</li>
<li>Material Tab
Visible if <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.
Visible if <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_EnablePhysics">EnablePhysics</a> is true.
<ul>
<li>Workpiece Material File Selector
<ul>
@@ -92,7 +92,7 @@
<li>Assistant Model
<ul>
<li><a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></li>
<li><a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a></li>
<li><a class="xref" href="../../sample/Sample.Common.UserService.html">UserService</a></li>
</ul>
</li>
</ul>
@@ -171,7 +171,8 @@ The boxes are draggable for re-order.
</li>
<li>Title Label
<ul>
<li>Apply <a class="xref" href="../../api/Hi.SessionCommands.ITitleCommand.html#Hi_SessionCommands_ITitleCommand_GetCommandTitle_">GetCommandTitle</a> if the command is inherited from <a class="xref" href="../../api/Hi.SessionCommands.ITitleCommand.html">ITitleCommand</a>; otherwise, show the class name.</li>
<li>Apply <a class="xref" href="../../api/Hi.SessionCommands.ITitleCommand.html#Hi_SessionCommands_ITitleCommand_GetCommandTitle_">GetCommandTitle</a> if the command is inherited from <a class="xref" href="../../api/Hi.SessionCommands.ITitleCommand.html">ITitleCommand</a>; otherwise, show its localized display name (the <code>DisplayName</code> attribute), never the class name.</li>
<li>The label always leads with the command's NAME. A title the user typed is appended as <code>Name [title]</code>, it does not replace the name — a row has to say what it is.</li>
</ul>
</li>
</ul>
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>NcFileCommand Panel | HiAPI-C# 2025 </title>
<title>NcFileCommand Panel (Program File) | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="NcFileCommand Panel | HiAPI-C# 2025 ">
<meta name="title" content="NcFileCommand Panel (Program File) | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,12 +85,19 @@
</div>
<article data-uid="">
<h1 id="ncfilecommand-panel">NcFileCommand Panel</h1>
<h1 id="ncfilecommand-panel-program-file">NcFileCommand Panel (Program File)</h1>
<p>The key model is <a class="xref" href="../../api/Hi.SessionCommands.NcFileCommand.html">NcFileCommand</a>.</p>
<ul>
<li>Other Model: string BaseDirectory.</li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p>The GUI labels this command &ldquo;Program File&rdquo;: it plays NC, CL (CLSF) and CSV
files — the runner is picked by
<a class="xref" href="../../api/Hi.SessionCommands.NcFileCommand.html#Hi_SessionCommands_NcFileCommand_NcKind">NcKind</a>
(<a class="xref" href="../../api/Hi.MachiningProcs.NcKind.html#Hi_MachiningProcs_NcKind_Auto">Auto</a> detects by file extension).</p>
</div>
<h2 id="layout">Layout</h2>
<ul>
<li>NcFileCommand Panel
@@ -148,7 +155,7 @@ Set NC Code TextArea height resizable.</p>
<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/mission/NcFileCommandPanel.vue</code>NC File text field + Browse (prompt-based per <code>apply-prompt-instead-of-local-file-upload-browser</code>) + <code>&lt;q-banner&gt;</code> live file-info banner + Preview dialog. File-loading is server-side; the browser never uploads file bytes.</li>
<li><code>wwwroot-src/src/components/mission/NcFileCommandPanel.vue</code>Program File text field + Browse (prompt-based per <code>apply-prompt-instead-of-local-file-upload-browser</code>) + &ldquo;Play As&rdquo; NC-kind select (Auto / Brand NC / CL / CSV) + <code>&lt;q-banner&gt;</code> live file-info banner + Preview dialog. File-loading is server-side; the browser never uploads file bytes.</li>
<li><code>wwwroot-src/src/api/mission.ts</code> — typed wrapper over the NcFile-related endpoints on <code>MissionController.cs</code>.</li>
<li><code>Missions/MissionController.cs</code> — REST endpoints for <code>NcFile</code> property updates and file-info queries.</li>
</ul>
@@ -96,7 +96,7 @@
<li>Assistant Model
<ul>
<li><a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></li>
<li><a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a></li>
<li><a class="xref" href="../../sample/Sample.Common.UserService.html">UserService</a></li>
</ul>
</li>
</ul>
@@ -120,7 +120,7 @@
</ul>
</li>
<li>Output Shot Files Section
Visible if <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.
Visible if <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_EnablePhysics">EnablePhysics</a> is true.
<ul>
<li>Enable Write Shot Files CheckBox
<ul>
@@ -142,7 +142,7 @@ Visible if <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcK
</ul>
</li>
<li>Optimization Files Section
Visible if <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.
Visible if <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_EnablePhysics">EnablePhysics</a> is true.
<ul>
<li>Enable Optimize To Files CheckBox
<ul>
@@ -157,6 +157,21 @@ Visible if <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcK
</li>
</ul>
</li>
<li>CL → NC Writeback Section
<ul>
<li>Enable Convert CL To NC Files CheckBox
<ul>
<li>The model is <a class="xref" href="../../api/Hi.SessionCommands.PostExecutionCommand.html#Hi_SessionCommands_PostExecutionCommand_EnableConvertClToNcFiles">EnableConvertClToNcFiles</a>.</li>
</ul>
</li>
<li>NC Output Template Text Field
<ul>
<li>The model is <a class="xref" href="../../api/Hi.SessionCommands.PostExecutionCommand.html#Hi_SessionCommands_PostExecutionCommand_ClToNcFileTemplate">ClToNcFileTemplate</a>.</li>
<li>Default value: &ldquo;Output/[NcName].nc&rdquo;</li>
</ul>
</li>
</ul>
</li>
<li>Geometry Difference Section
<ul>
<li>Enable Geom Diff CheckBox
@@ -174,6 +189,15 @@ Visible if <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcK
</ul>
</li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p>Meshed-geometry output is no longer a Post-Execution section: a geometry
snapshot can be taken at any spot of the mission, unlike the run-derived
file outputs above. Use the standalone Record Meshed Geometry
(<a class="xref" href="../../api/Hi.SessionCommands.RecordMeshedGeomCommand.html">RecordMeshedGeomCommand</a>) or Export Meshed
Geometry (<a class="xref" href="../../api/Hi.SessionCommands.ExportMeshedGeomToStlCommand.html">ExportMeshedGeomToStlCommand</a>) commands
instead.</p>
</div>
<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>
@@ -183,7 +207,7 @@ Visible if <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcK
<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/mission/PostExecutionCommandPanel.vue</code> — five cards: Step Files / Shot Files / Optimization / Geom Diff / Runtime Geom. Shot Files and Optimization cards are gated on <code>appState.isShowPhysicsOptions</code> (matches legacy). GeomDiff is embedded inline because it is a property on <code>PostExecutionCommand</code> rather than a standalone <code>ISessionCommand</code>.</li>
<li><code>wwwroot-src/src/components/mission/PostExecutionCommandPanel.vue</code> — five cards: Step Files / Shot Files / Optimization / CL → NC Writeback / Geom Diff. Shot Files and Optimization cards are gated on <code>appState.isShowPhysicsOptions</code> (matches legacy). GeomDiff is embedded inline because it is a property on <code>PostExecutionCommand</code> rather than a standalone <code>ISessionCommand</code>.</li>
<li><code>wwwroot-src/src/api/mission.ts</code> — typed wrapper; uses <code>commands/{path}/postexecution/*</code> endpoints including <code>enable-geom-diff</code> + <code>geom-diff-detect-radius-mm</code>.</li>
<li><code>Missions/MissionController.cs</code> — REST endpoints for PostExecution per-property PUTs.</li>
</ul>
@@ -96,7 +96,7 @@
<li>Assistant Model
<ul>
<li><a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></li>
<li><a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a></li>
<li><a class="xref" href="../../sample/Sample.Common.UserService.html">UserService</a></li>
</ul>
</li>
</ul>
@@ -181,7 +181,7 @@ If <a class="xref" href="../../api/Hi.SessionCommands.PreSettingCommand.html#Hi_
<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/mission/PreSettingCommandPanel.vue</code>Runtime Geometry + Machining Resolution + Motion Resolution type select (with embedded Fixed sub-fields: Linear + Rotary) + Collision / Pause / Physics checkboxes. <code>MachiningMotionResolution</code> is embedded inline because it is a property on <code>PreSettingCommand</code> rather than a standalone <code>ISessionCommand</code>.</li>
<li><code>wwwroot-src/src/components/mission/PreSettingCommandPanel.vue</code>Meshed Geometry + Machining Resolution + Motion Resolution type select (with embedded Fixed sub-fields: Linear + Rotary) + Collision / Pause / Physics checkboxes. <code>MachiningMotionResolution</code> is embedded inline because it is a property on <code>PreSettingCommand</code> rather than a standalone <code>ISessionCommand</code>.</li>
<li><code>wwwroot-src/src/api/mission.ts</code> — typed wrapper; uses <code>commands/{path}/presetting/*</code> endpoints including <code>machining-motion-resolution-type</code>, <code>fixed-linear-resolution-mm</code>, <code>fixed-rotary-resolution-deg</code>.</li>
<li><code>Missions/MissionController.cs</code> — REST endpoints for PreSetting per-property PUTs.</li>
</ul>
@@ -1,246 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Classic Session Command Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Classic Session Command Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="classic-session-command-panel">Classic Session Command Panel</h1>
<p>The key model is <a class="xref" href="../../api/Hi.SessionCommands.SimpleSessionCommand.html">SimpleSessionCommand</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Head Line
<ul>
<li><a href="../widget/object-management-menu-button.html">Object Management Menu Button</a>
<ul>
<li>file extension is ShellCommand</li>
<li>The pointed Editor Panel is Session Management Panel</li>
</ul>
</li>
</ul>
</li>
<li>Title Label</li>
<li>Session Management Panel
<ul>
<li>NC/Command List Tab
<ul>
<li>Shell Commands ListBox
<ul>
<li>The model is <a class="xref" href="../../api/Hi.SessionCommands.SimpleSessionCommand.html#Hi_SessionCommands_SimpleSessionCommand_NcCommandList">NcCommandList</a>.</li>
<li>Support add, remove, reorder commands.</li>
<li>The items are multi-selectable.</li>
<li>Support file drag from the external application (such as file explorer), files drag into the Shell Commands List is equivalent to create <a class="xref" href="../../api/Hi.SessionCommands.NcFileCommand.html">NcFileCommand</a>s.</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>don't use file filter to the drag behavior</p>
</div>
<ul>
<li>On each NC File Command:
<ul>
<li>Only one line for each entry.</li>
<li>Batch Selection CheckBox with &lsquo;Select&rsquo; Text Label</li>
<li><a href="NcFileCommand-panel.html">NC File Command Panel</a>.</li>
</ul>
</li>
<li>The horizontal auto scroll bar is required.</li>
</ul>
</li>
</ul>
</li>
<li>Output Tab
<ul>
<li>Output Shot Files Tab
<ul>
<li>Enable Write Shot Files CheckBox
<ul>
<li>The model is <a class="xref" href="../../api/Hi.SessionCommands.SimpleSessionCommand.html#Hi_SessionCommands_SimpleSessionCommand_EnableWriteShotFiles">EnableWriteShotFiles</a>.</li>
</ul>
</li>
<li>Shot File Template Text Field
<ul>
<li>The model is <a class="xref" href="../../api/Hi.SessionCommands.SimpleSessionCommand.html#Hi_SessionCommands_SimpleSessionCommand_ShotFileTemplate">ShotFileTemplate</a>.</li>
<li>Default value: <code>Output/[NcName].shot.csv</code></li>
</ul>
</li>
<li>Shot File Time Resolution (ms) Number Field
<ul>
<li>The model is <a class="xref" href="../../api/Hi.SessionCommands.SimpleSessionCommand.html#Hi_SessionCommands_SimpleSessionCommand_ShotFileTimeResolution_ms">ShotFileTimeResolution_ms</a>.</li>
<li>Default value: 1</li>
</ul>
</li>
</ul>
</li>
<li>Output Step Files Tab
<ul>
<li>Enable Write Step Files CheckBox
<ul>
<li>The model is <a class="xref" href="../../api/Hi.SessionCommands.SimpleSessionCommand.html#Hi_SessionCommands_SimpleSessionCommand_EnableWriteStepFiles">EnableWriteStepFiles</a>.</li>
</ul>
</li>
<li>Step File Template Label</li>
<li>Step File Template Text Field
<ul>
<li>The model is <a class="xref" href="../../api/Hi.SessionCommands.SimpleSessionCommand.html#Hi_SessionCommands_SimpleSessionCommand_StepFileTemplate">StepFileTemplate</a>.</li>
<li>Default value: &ldquo;Output/[NcName].step.csv&rdquo;</li>
</ul>
</li>
<li>Apply one line layout to the label and the text field.</li>
</ul>
</li>
<li>Optimization Files Tab
<ul>
<li>Enable Optimize To Files CheckBox
<ul>
<li>The model is <a class="xref" href="../../api/Hi.SessionCommands.SimpleSessionCommand.html#Hi_SessionCommands_SimpleSessionCommand_EnableOptimizeToFiles">EnableOptimizeToFiles</a>.</li>
</ul>
</li>
<li>Optimization File Template Text Field
<ul>
<li>The model is <a class="xref" href="../../api/Hi.SessionCommands.SimpleSessionCommand.html#Hi_SessionCommands_SimpleSessionCommand_OptimizationFileTemplate">OptimizationFileTemplate</a>.</li>
<li>Default value: &ldquo;Output/Opt-[NcName]&rdquo;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Geometry Difference Tab
<ul>
<li>Enable Geom Diff CheckBox
<ul>
<li>The model is <a class="xref" href="../../api/Hi.SessionCommands.SimpleSessionCommand.html#Hi_SessionCommands_SimpleSessionCommand_EnableGeomDiff">EnableGeomDiff</a>.</li>
</ul>
</li>
<li>Geom Diff Detect Radius (mm) Number Field
<ul>
<li>One Line layout</li>
<li>The model is <a class="xref" href="../../api/Hi.SessionCommands.SimpleSessionCommand.html#Hi_SessionCommands_SimpleSessionCommand_GeomDiffDetectRadius_mm">GeomDiffDetectRadius_mm</a>.</li>
<li>Default value: 1</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>Use Disabled Style if the section key checkbox is not checked.</p>
</div>
<div class="TIP">
<h5>Tip</h5>
<p>The file templates support placeholder <code>[NcName]</code> which will be replaced with actual NC program name.</p>
</div>
<h2 id="wpf-application-source-code-path">WPF Application Source Code Path</h2>
<ul>
<li>Mission/SimpleSessionCommandPanel</li>
</ul>
<p>see <a href="../index.html">this page</a> for git repository.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -94,7 +94,7 @@
<li><strong>Supporting</strong>:
<ul>
<li><a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></li>
<li><a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a></li>
<li><a class="xref" href="../../sample/Sample.Common.UserService.html">UserService</a></li>
</ul>
</li>
</ul>
@@ -91,7 +91,7 @@
<h2 id="key-models">Key Models</h2>
<ul>
<li><a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> - Project data service</li>
<li><a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a> - User service</li>
<li><a class="xref" href="../../sample/Sample.Common.UserService.html">UserService</a> - User service</li>
</ul>
<h2 id="associated-tool-bars">Associated Tool Bars</h2>
<ul>
@@ -128,7 +128,7 @@
<h2 id="renderingcanvas-behavior">RenderingCanvas Behavior</h2>
<p>The RenderingCanvas displays the machining project visualization:</p>
<ol>
<li>On initialization, a <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a> is created and assigned to <code>RenderingCanvas</code>.<a class="xref" href="../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a></li>
<li>On initialization, a <code>MachiningProjectDisplayee</code> (the front-end's own copy of the GUI-layer displayee) is created and assigned to <code>RenderingCanvas</code>.<a class="xref" href="../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a></li>
<li>The displayee receives project data from <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a></li>
<li>The RenderingCanvas is disposed when the Player Panel is disposed</li>
</ol>
@@ -88,18 +88,18 @@
<h1 id="player-extended-renderingcanvas-tool-bar">Player extended RenderingCanvas Tool Bar</h1>
<p>The model of the tool bar is <a class="xref" href="../../api/Hi.Disp.DispEngine.html">DispEngine</a> which is assigned from the RenderingCanvas of <a href="index.html">Player Panel</a>.</p>
<p>The content of DispEngine.<a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a> here is <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a>. the key content of the <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a> is <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a>.</p>
<p>The sub-model is <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a> and <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a>.</p>
<p>The content of DispEngine.<a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a> here is <code>MachiningProjectDisplayee</code>. the key content of the <code>MachiningProjectDisplayee</code> is <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a>.</p>
<p>The sub-model is <code>MachiningProjectDisplayee</code> and <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li><code>Player extended RenderingCanvas Tool Bar</code>
<ul>
<li><code>Show CL Strip Button</code></li>
<li><code>Show CL Strip Dots Button</code>
Only editable if the <a class="xref" href="../../api/Hi.MachiningProcs.RenderingFlag.html#Hi_MachiningProcs_RenderingFlag_ClStrip">ClStrip</a> in <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html#Hi_MachiningProcs_MachiningProjectDisplayee_RenderingFlagBitArray">RenderingFlagBitArray</a> is true.</li>
Only editable if the <a class="xref" href="../../api/Hi.MachiningProcs.RenderingFlag.html#Hi_MachiningProcs_RenderingFlag_ClStrip">ClStrip</a> in <code>MachiningProjectDisplayee.RenderingFlagBitArray</code> is true.</li>
<li><code>Fit View Button</code></li>
<li><code>Rendering Items SubMenu</code>
<a class="xref" href="../../api/Hi.MachiningProcs.RenderingFlag.html">RenderingFlag</a>-based checkboxes that deal the boolean value in <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html#Hi_MachiningProcs_MachiningProjectDisplayee_RenderingFlagBitArray">RenderingFlagBitArray</a>, such as &ldquo;Show Machine&rdquo;, &ldquo;Show Workpiece&rdquo;, etc..
<a class="xref" href="../../api/Hi.MachiningProcs.RenderingFlag.html">RenderingFlag</a>-based checkboxes that deal the boolean value in <code>MachiningProjectDisplayee.RenderingFlagBitArray</code>, such as &ldquo;Show Machine&rdquo;, &ldquo;Show Workpiece&rdquo;, etc..
Except the ClStrip option since there has already be managed by the Show CL Strip Button.
Show HeidenhainCoordinate checkbox only if <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a>.<a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html#Hi_MachiningProcs_MachiningProject_NcEnv">NcEnv</a>.<a class="xref" href="../../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_CncBrand">CncBrand</a> is <a class="xref" href="../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Heidenhain">Heidenhain</a>.
Create the submenu component class since the other GUI component also use it. See <a href="../controller/index.html">controller page</a></li>
@@ -111,10 +111,10 @@ Create the submenu component class since the other GUI component also use it. Se
<p>checkboxs in Project Rendering Items SubMenu can be classified by the category of <a class="xref" href="../../api/Hi.MachiningProcs.RenderingFlag.html">RenderingFlag</a> (see the hyperlink for the categories).</p>
</div>
<h2 id="behavior-of-cl-strip-buttons-and-fit-view-button">Behavior of CL Strip Buttons and Fit View Button</h2>
<p>Apply <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html#Hi_MachiningProcs_MachiningProjectDisplayee_RenderingFlagBitArray">RenderingFlagBitArray</a> to set the Project Rendering Items.</p>
<p>Apply <code>MachiningProjectDisplayee.RenderingFlagBitArray</code> to set the Project Rendering Items.</p>
<div class="TIP">
<h5>Tip</h5>
<p>Extract the <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> From the <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a> and use it to set the behaviors.</p>
<p>Extract the <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> From the <code>MachiningProjectDisplayee</code> and use it to set the behaviors.</p>
</div>
<h2 id="behavior-of-project-rendering-items-dropdown">Behavior of <code>Project Rendering Items DropDown</code></h2>
<p>See <a class="xref" href="../../sample/Sample.Machining.DemoRenderingMachiningProcessAndStripPosSelection.html">DemoRenderingMachiningProcessAndStripPosSelection</a> for the sample code to complete the behavior of the buttons.</p>
@@ -88,9 +88,9 @@
<h1 id="selected-step-info-panel">Selected-Step Info Panel</h1>
<p>The panel locates on the <a href="index.html">Player Panel</a>.</p>
<p>The model is <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a> and <a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a>.</p>
<p>The model is <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a> and <a class="xref" href="../../sample/Sample.Common.UserService.html">UserService</a>.</p>
<p>The <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a> is assigned by <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_ClStrip">ClStrip</a>.<a class="xref" href="../../api/Hi.CutterLocations.ClStrips.ClStrip.html#Hi_CutterLocations_ClStrips_ClStrip_PosSelected">PosSelected</a>.</p>
<p>Show step infomation from <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_DisplayedStepPresentAccessList">DisplayedStepPresentAccessList</a>.</p>
<p>Show step infomation from <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_DisplayedStepPresentAccessList">DisplayedStepPresentAccessList</a>.</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>
<p>See Also <a href="../preference/step-present-preference-page.html">Step Present Preference Page</a>.</p>
<h2 id="sample-code">Sample Code</h2>
@@ -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>
@@ -87,70 +87,73 @@
<article data-uid="">
<h1 id="session-message-panel">Session Message Panel</h1>
<p>The model is <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_SessionProgress">SessionProgress</a>.</p>
<p><a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> is obtained via dependency injection.</p>
<p>Session messages are partitioned by kind into three sinks on <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> (obtained via dependency injection):</p>
<ul>
<li><a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_ShellProgress">ShellProgress</a> — session-level routine / lifecycle messages (<a class="xref" href="../../api/Hi.MachiningProcs.ShellProgress.html">ShellProgress</a>). Session-scoped: the property is null outside <code>BeginSession</code>/<code>EndSession</code>.</li>
<li><a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_NcDiagnosticProgress">NcDiagnosticProgress</a> — NC-pipeline diagnostics (<a class="xref" href="../../api/Hi.NcParsers.NcDiagnosticProgress.html">NcDiagnosticProgress</a>), each anchored to its NC source sentence.</li>
<li><a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_StepDiagnosticProgress">StepDiagnosticProgress</a> — diagnostics anchored to a motion step (<a class="xref" href="../../api/Hi.MachiningProcs.StepDiagnosticProgress.html">StepDiagnosticProgress</a>).</li>
</ul>
<p>The panel surfaces each sink in its own tab, so one tab holds one message kind.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Top Message Filter ToolBar
<li>Tab Bar
<ul>
<li>Message Type Filter SubMenu
<ul>
<li>NC CheckBox</li>
<li>Progress CheckBox</li>
<li>Error CheckBox</li>
<li>Shell Tab</li>
<li>NC Diagnostics Tab</li>
<li>Step Diagnostics Tab</li>
</ul>
</li>
<li>Message Text Filter Input
<li>Per-Tab Content
<ul>
<li>Message Text Filter Input Text Area</li>
<li>Message Text Filter Reset Button</li>
<li>Message Text Filter Input</li>
<li>Message Table</li>
</ul>
</li>
<li>Export Button</li>
</ul>
</li>
<li>Central Message Table</li>
<h2 id="message-table-per-tab">Message Table (per tab)</h2>
<p>Each tab renders its sink's message list — <a class="xref" href="../../api/Hi.MachiningProcs.ShellProgress.html#Hi_MachiningProcs_ShellProgress_Messages">Messages</a>, <a class="xref" href="../../api/Hi.NcParsers.NcDiagnosticProgress.html#Hi_NcParsers_NcDiagnosticProgress_Diagnostics">Diagnostics</a>, or <a class="xref" href="../../api/Hi.MachiningProcs.StepDiagnosticProgress.html#Hi_MachiningProcs_StepDiagnosticProgress_Messages">Messages</a> — as rows of:</p>
<ul>
<li><code>Severity</code> (colour-coded via <a class="xref" href="../../api/Hi.Common.Messages.IMessage.html#Hi_Common_Messages_IMessage_GetSeverity">GetSeverity()</a>)</li>
<li><code>Anchor</code> — the kind-specific position: the NC sentence index (<code>Sn</code>) for NC diagnostics, the step index for step diagnostics, none for shell messages</li>
<li><code>Message</code><a class="xref" href="../../api/Hi.Common.Messages.IMessage.html#Hi_Common_Messages_IMessage_GetId">GetId()</a> and <a class="xref" href="../../api/Hi.Common.Messages.IMessage.html#Hi_Common_Messages_IMessage_GetNotification">GetNotification()</a></li>
</ul>
<h2 id="central-message-table">Central Message Table</h2>
<p>The model of Central Message Table is <a class="xref" href="../../api/Hi.MachiningProcs.SessionProgress.html">SessionProgress</a>.<a class="xref" href="../../api/Hi.MachiningProcs.SessionProgress.html#Hi_MachiningProcs_SessionProgress_MessageCollection">MessageCollection</a>.</p>
<p>Only take last 1000 filtered elements in the <a class="xref" href="../../api/Hi.MachiningProcs.SessionProgress.html#Hi_MachiningProcs_SessionProgress_MessageCollection">MessageCollection</a> by <a class="xref" href="../../api/Hi.MachiningProcs.SessionProgress.html#Hi_MachiningProcs_SessionProgress_GetFliteredList_Hi_MachiningProcs_SessionProgress_FilterFlag_System_String_">GetFliteredList(FilterFlag, string)</a> to show for user experience. Find the usage example in the code:</p>
<p>Only take the last filtered elements (e.g. 5001000) for user experience. Find the usage example in the code:</p>
<pre><code class="lang-csharp" name="Demo_UseSessionMessageHost">internal static void DemoUseSessionMessageHost(LocalProjectService localProjectService)
{
SessionProgress sessionMessageHost = localProjectService.SessionProgress;
// Session messages are partitioned by kind into three sinks on LocalProjectService:
// - ShellProgress: session-level routine / lifecycle messages
// (session-scoped: null outside BeginSession/EndSession).
// - NcDiagnosticProgress: NC-pipeline diagnostics, anchored to the NC source sentence.
// - StepDiagnosticProgress: diagnostics anchored to a motion step.
SessionProgress.FilterFlag filterFlags =
SessionProgress.FilterFlag.NC |
SessionProgress.FilterFlag.Progress |
SessionProgress.FilterFlag.Error;
string filterText = null;
var filteredSessionMessageList = sessionMessageHost
.GetFliteredList(filterFlags, filterText);
ShellProgress shellProgress = localProjectService.ShellProgress;
List&lt;IMessage&gt; shellMessages = shellProgress == null
? new List&lt;IMessage&gt;() : shellProgress.Messages.ToList();
foreach (IMessage message in shellMessages)
Console.WriteLine(
$&quot;Shell [{message.GetSeverity()}] {message.GetId()}: {message.GetNotification()}&quot;);
foreach (var sessionMessage in filteredSessionMessageList)
foreach (NcDiagnostic diagnostic in
localProjectService.NcDiagnosticProgress.Diagnostics.ToList())
{
//M.I.: Message Index.
Console.Write($&quot;M.I.: {sessionMessage.Index}; Role: {sessionMessage.MessageRoleText}&quot;);
// For SessionMessageHost.FilterFlag.NC
var nc = sessionMessage.DirectInstantSourceCommand;
if (nc != null)
Console.Write($&quot;Message/NC: {nc.Line}; File: {nc.FilePath}; LineNo: {nc.GetLineNo()}; &quot;);
// For SessionMessageHost.FilterFlag.Progress or Error.
var multiTagMessage = sessionMessage.MultiTagMessage;
if (multiTagMessage != null)
Console.WriteLine($&quot;Message/NC: {multiTagMessage.Message}&quot;);
var exception = sessionMessage.Exception;
if (exception != null)
Console.WriteLine($&quot;Message/NC: {exception.Message}&quot;);
var ncLine = diagnostic.SentenceCarrier?.GetSentence()?.FirstIndexedFileLine;
Console.WriteLine(
$&quot;NC [{diagnostic.GetSeverity()}] {diagnostic.GetId()}: {diagnostic.GetNotification()}; &quot; +
$&quot;File: {ncLine?.FilePath}; LineNo: {ncLine?.GetLineNo()}; NC: {ncLine?.Line}&quot;);
}
foreach (StepDiagnostic diagnostic in
localProjectService.StepDiagnosticProgress.Messages.ToList())
Console.WriteLine(
$&quot;Step {diagnostic.StepIndex} [{diagnostic.GetSeverity()}] &quot; +
$&quot;{diagnostic.GetId()}: {diagnostic.GetNotification()}&quot;);
File.WriteAllLines(&quot;output-session-messages.txt&quot;,
filteredSessionMessageList.Select(m =&gt;
$&quot;Msg[{m.Index}][{m.MessageRoleText}]: {m}&quot;));
shellMessages.Select(m =&gt;
$&quot;[{m.GetSeverity()}] {m.GetId()}: {m.GetNotification()}&quot;));
}
</code></pre>
<p>In the table, show the columns: <code>Role</code>, <code>NC/Message</code>.</p>
<p>Add update table event to <a class="xref" href="../../api/Hi.MachiningProcs.SessionProgress.html#Hi_MachiningProcs_SessionProgress_CollectionItemChanged">CollectionItemChanged</a>. The updating process has to be called by <a href="../general-rules.html">Loose Manner</a> for user experience.</p>
<p>Add the update-table event per sink: <a class="xref" href="../../api/Hi.MachiningProcs.StepDiagnosticProgress.html#Hi_MachiningProcs_StepDiagnosticProgress_MessageAdded">MessageAdded</a> / <a class="xref" href="../../api/Hi.NcParsers.NcDiagnosticProgress.html#Hi_NcParsers_NcDiagnosticProgress_MessageAdded">MessageAdded</a>, and for the session-scoped shell sink the app-lifetime bridge <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_OnShellMessageAdded">OnShellMessageAdded</a> (with the matching <code>Cleared</code> events). The updating process has to be called by <a href="../general-rules.html">Loose Manner</a> for user experience.</p>
<div class="TIP">
<h5>Tip</h5>
<p>On window desktop application (WPF), consider use textarea instead of datagrid to MessageTable for better performance. Use padding to show the different columns. And use the font in the textarea that with consistent width.</p>
@@ -160,9 +163,9 @@
<p>The message display should be real-time.</p>
</div>
<h2 id="behavior-of-export-button">Behavior of Export Button</h2>
<p>Export ALL filtered elements in the <a class="xref" href="../../api/Hi.MachiningProcs.SessionProgress.html#Hi_MachiningProcs_SessionProgress_MessageCollection">MessageCollection</a> by <a class="xref" href="../../api/Hi.MachiningProcs.SessionProgress.html#Hi_MachiningProcs_SessionProgress_GetFliteredList_Hi_MachiningProcs_SessionProgress_FilterFlag_System_String_">GetFliteredList(FilterFlag, string)</a>.</p>
<p>Export ALL filtered elements of the active tab's sink.</p>
<h2 id="signalr-implementation-webapi-only">SignalR Implementation (Webapi Only)</h2>
<p><code>SessionMessageHub</code> provides real-time message updates with method <code>GetSessionMessages(string filterFlags, string filterText, int limit)</code> and event <code>SessionMessagesUpdated</code>. <code>SessionMessageService</code> monitors <a class="xref" href="../../api/Hi.MachiningProcs.SessionProgress.html#Hi_MachiningProcs_SessionProgress_CollectionItemChanged">CollectionItemChanged</a> and broadcasts updates. The service uses <a class="xref" href="../../api/Hi.Common.LooseRunner.html">LooseRunner</a> for non-blocking async operations. The JavaScript component connects to <code>/sessionMessageHub</code> to receive real-time message updates.</p>
<p>One hub per sink — <code>/shellMessageHub</code>, <code>/ncDiagnosticHub</code>, <code>/stepDiagnosticHub</code> — each with a <code>GetMessages(int limit)</code> pull returning <code>MessagesUpdate { messages, totalCount }</code>. A per-sink broadcast service subscribes its sink's <code>MessageAdded</code>/<code>Cleared</code> and raises a coalesced <code>MessagesChanged</code> notification via <a class="xref" href="../../api/Hi.Common.LooseRunner.html">LooseRunner</a>; the client re-pulls the recent window on each notification (loss-free regardless of how many appends coalesced). The JavaScript components connect to the three hubs to receive real-time updates.</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>
@@ -171,10 +174,12 @@
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/player/session-message-panel.js (Vue component)</li>
<li>Players/PlayerController.cs (REST API - GetSessionMessages endpoint)</li>
<li>Players/SessionMessageService.cs (Business logic)</li>
<li>Players/SessionMessageHub.cs (SignalR Hub for real-time updates)</li>
<li>wwwroot-src/src/components/player/SessionMessagePanel.vue (tabbed panel)</li>
<li>wwwroot-src/src/components/player/SessionMessageTab.vue + MessageRow.vue (per-tab list)</li>
<li>wwwroot-src/src/composables/useSessionSinkHub.ts (the three hub composables)</li>
<li>Players/SessionSinkHub.cs (SignalR hubs for the three sinks)</li>
<li>Players/SessionSinkBroadcastService.cs + {Shell,Nc,Step}*BroadcastService.cs (subscribe-and-rebroadcast)</li>
<li>Players/SessionSinkDtos.cs (typed DTOs)</li>
</ul>
</article>
@@ -146,7 +146,7 @@
<a href="geom/geom-manage-control.html" name="" title="Geometry Management Panel">Geometry Management Panel</a>
</li>
<li>
<a href="geom/runtime-geom-panel.html" name="" title="Runtime Geometry Panel">Runtime Geometry Panel</a>
<a href="geom/meshed-geom-panel.html" name="" title="Meshed Geometry Panel">Meshed Geometry Panel</a>
</li>
<li>
<a href="geom/stlfile-control.html" name="" title="STL File Control">STL File Control</a>
@@ -265,9 +265,6 @@
<li>
<a href="mission/PostExecutionCommand-panel.html" name="" title="PostExecution Command Panel">PostExecution Command Panel</a>
</li>
<li>
<a href="mission/SimpleSessionCommand-panel.html" name="" title="Classic Session Command Panel">Classic Session Command Panel</a>
</li>
</ul>
</li>
</ul>
File diff suppressed because one or more lines are too long
@@ -131,7 +131,7 @@
</li>
<li><p>Preset 前設置</p>
</li>
<li><p>Runtime Geometry 運行時幾何</p>
<li><p>Meshed Geometry 運行時幾何</p>
</li>
<li><p>Machining Resolution 加工解析度</p>
</li>
@@ -186,7 +186,7 @@
<li><code>wwwroot-src/src/components/widgets/editorLanguage.ts</code> — extension → <code>EditorLanguage</code> mapping.</li>
<li><code>wwwroot-src/src/api/fileExplorer.ts</code> — typed wrapper over <code>/api/file-explorer/*</code>.</li>
<li><code>wwwroot-src/src/router/routes.ts</code><code>/util/file-explorer</code> entry (route name <code>util-file-explorer</code>).</li>
<li><code>wwwroot-src/src/layouts/AppMenuBar.vue</code><code>Util → File Explorer</code> entry.</li>
<li><code>wwwroot-src/src/components/AppMenuBar.vue</code><code>Util → File Explorer</code> entry.</li>
<li><code>Common/FileExplorerController.cs</code> — REST endpoints under <code>/api/file-explorer</code>:</li>
</ul>
<table>
@@ -92,6 +92,7 @@
<ul>
<li><a href="file-explorer.html">File Explorer</a> — server-side filesystem browser with named roots (Admin / Project / Resource), in-page text editor with CodeMirror 6 syntax highlighting, zip pack / extract, and rename / copy / delete.</li>
<li><a href="../mech/mech-builder-page.html">Mechanism Builder</a> — generic mechanism XML editor. Documented under <code>mech/</code> because its model lives there; reachable from <code>Util → Mechanism Builder</code>.</li>
<li><a href="../controller/index.html">Legacy-Controller</a> — the Controller Page, superseded by the Player's Control Tree but still reachable from <code>Util → Legacy-Controller</code> (below a separator) while it carries settings the tree has no editor for.</li>
</ul>
<h2 id="pending">Pending</h2>
<ul>
@@ -146,9 +146,9 @@ Action&lt;TargetObject&gt; TargetObjectSetter{get;set;}
<li>Object Copy/Paste (i.e. Select/Set or Duplicated-Set)
<ul>
<li>Copy (i.e. Select)
Set the model to <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_SelectedItem">SelectedItem</a>.</li>
Set the model to <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_SelectedItem">SelectedItem</a>.</li>
<li>Paste
Set <a class="xref" href="../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_SelectedItem">SelectedItem</a> to the model.
Set <a class="xref" href="../../sample/Sample.Common.UserService.html#Sample_Common_UserService_SelectedItem">SelectedItem</a> to the model.
Set by reference is default. Apply Duplicated-Set if explicitly required.</li>
</ul>
</li>