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
@@ -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 10–500, typical coolant 1000–10000).</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>