This repository has been archived on 2026-10-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
HiNC-2025-win-desktop-Deploy/App/wwwroot/HiAPI-docsite/anatomy/general-setup/spindle-capability.html
T
2026-09-09 17:35:23 +08:00

329 lines
21 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Spindle Capability | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Spindle Capability | 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="Anatomy-SpindleCapabilityPage">
<h1 id="spindle-capability">Spindle Capability</h1>
<p>The Spindle Capability editor is the <code>equipment/spindle</code> branch of the General Setup page's Control
Tree (<code>/general-setup?tree=equipment/spindle</code>), the equipment child after Machine Tool. Two older
paths redirect onto it: <code>/spindle-capability/:tab?</code>, whose tab segment maps straight onto one of the
branch's five children, and <code>/equipment/spindle</code>. The menu bar carries no entry of its own for it —
the Page menu reaches General Setup, and the tree reaches the branch.</p>
<p>It edits <a class="xref" href="../../api/Hi.Milling.SpindleCapability.html">SpindleCapability</a> on the project's authored equipment face,
<a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html">SetupEquipment</a>, reached as
<a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_SetupEquipment">SetupEquipment</a>. It exposes the metadata (name, note),
the thermal scalars (energy efficiency, working-temperature ceiling), the gear-shift spindle speed,
the two dry-run coefficients, and the power / torque contour lists.</p>
<ul>
<li>Key Model: <a class="xref" href="../../api/Hi.Milling.SpindleCapability.html">SpindleCapability</a></li>
<li>Assistant Model:
<ul>
<li><a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html">SetupEquipment</a> — owns the capability as
<a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html#Hi_Machining_MachiningEquipmentUtils_SetupEquipment_SpindleCapability">SpindleCapability</a> and its optional
side-file reference
<a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html#Hi_Machining_MachiningEquipmentUtils_SetupEquipment_SpindleCapabilityFile">SpindleCapabilityFile</a>.</li>
<li><a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> — carries that face across the <code>.hincproj</code> save.</li>
</ul>
</li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p>The WPF desktop app has no spindle-capability surface: no page, no panel, and no handler for the
<code>.SpindleCapability</code> extension. There, the value is whatever the project XML carries on the
equipment face, or the class defaults when the XML says nothing. The <code>.SpindleCapability</code> object
management menu ships on the web only, on this branch's root panel.</p>
</div>
<h2 id="layout">Layout</h2>
<p>The branch is one root plus five children, six selectable nodes in all. Each node's editor occupies
the dock's PRIMARY row, and all six — the root included — register the <em>same</em> CONTENT-column view,
the two contour charts, so the charts stay mounted while the operator walks the branch.</p>
<h3 id="control-tree-branch">Control Tree Branch</h3>
<ul>
<li>Spindle Capability Root Panel — <code>equipment/spindle</code>, item type <code>SpindleCapabilityRoot</code>
<ul>
<li><a class="xref" href="../widget/object-management-menu-button.html">Object Management Menu Button</a> — Load / Save As /
Copy / Paste / XML over file extension <code>.SpindleCapability</code>, load type
<code>Hi.Milling.SpindleCapability, HiMech</code>, rel file <code>SpindleCapability.xml</code>, based at the project
directory. This is the whole file surface of the editor.</li>
<li>Caption — the capability's name, or a &ldquo;no capability&rdquo; note.</li>
<li>Empty state, while nothing is attached: an hourglass, a &ldquo;not attached to project&rdquo; line and a
hint pointing at the ⋮ menu's Load entry.</li>
<li>Name TextField — <a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_Name">Name</a>.</li>
<li>Note TextField — <a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_Note">Note</a>.</li>
</ul>
</li>
<li><code>equipment/spindle/thermal</code> — &ldquo;Thermal / Energy&rdquo;, item type <code>SpindleScalars</code>
<ul>
<li>Energy Efficiency NumberField — <a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_EnergyEfficiency">EnergyEfficiency</a>, clamped to
0 – 1.</li>
<li>Working Temperature Upper Boundary NumberField (°C) —
<a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_WorkingTemperatureUpperBoundary_C">WorkingTemperatureUpperBoundary_C</a>.</li>
</ul>
</li>
<li><code>equipment/spindle/gear-shift</code> — &ldquo;Gear Shift&rdquo;, item type <code>SpindleScalars</code>
<ul>
<li>Has-Gear-Shift CheckBox — flips
<a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_GearShiftSpindleSpeed_rpm">GearShiftSpindleSpeed_rpm</a> between <code>null</code> (no mechanism) and
<code>0</code> (mechanism present; the operator dials in the speed).</li>
<li>Gear Shift Spindle Speed NumberField (rpm) — always rendered, disabled until the checkbox is on.</li>
</ul>
</li>
<li><code>equipment/spindle/dry-run</code> — &ldquo;Dry-Run Coefficients&rdquo;, item type <code>SpindleScalars</code>
<ul>
<li>Friction Power Coefficient NumberField (mW/rpm) —
<a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_DryRunFrictionPowerCoefficient_mWdrpm">DryRunFrictionPowerCoefficient_mWdrpm</a>.</li>
<li>Windage Power Coefficient NumberField (pW/rpm³) —
<a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_DryRunWindagePowerCoefficient_pWdrpm3">DryRunWindagePowerCoefficient_pWdrpm3</a>.</li>
</ul>
</li>
<li><code>equipment/spindle/power</code> — &ldquo;Power Contours&rdquo;, item type <code>SpindleContour</code>
<ul>
<li>Count line and an <strong>Add</strong> button.</li>
<li>Contour Selector — a select over the contour list, each entry labelled by its workable duration
(<code>n min</code>, or Continuous for the infinite one).</li>
<li>Edit-duration Button — opens the modal below.</li>
<li>Delete Button — confirms, then removes the selected contour. Disabled at one remaining contour.</li>
<li>Points Table — the selected contour's points, one row per point: a spindle-speed cell (rpm,
<code>min: 0</code>), a value cell, an insert-next button that clones the row, and a double-click remove
that is disabled at one remaining point. A cell edit replaces the whole point list server-side.</li>
<li>Empty state, when the axis has no contour yet.</li>
<li>Edit-duration Modal
<ul>
<li>Continuous (∞) CheckBox — disabled when another contour already holds the continuous key.</li>
<li>Workable Duration NumberField (min), shown while Continuous is off, <code>min: 0</code>.</li>
<li>Save rejects a non-positive duration and is a no-op when the key is unchanged.</li>
</ul>
</li>
</ul>
</li>
<li><code>equipment/spindle/torque</code> — &ldquo;Torque Contours&rdquo;, item type <code>SpindleContour</code>, the same shape over
the torque list.</li>
<li>Shared content view, registered by the root and by all five children: the two contour charts in
the General Setup page's CONTENT column.
<ul>
<li>Power chart and Torque chart, each with a chip legend — one chip per contour, showing its
duration and, on hover, its point count. Clicking a chip selects the contour the PRIMARY-row
editor edits.</li>
<li>A vertical marker line at the gear-shift spindle speed, while one is set.</li>
<li>Its own not-attached empty state, mirroring the root panel's.</li>
</ul>
</li>
</ul>
<h2 id="behavior">Behavior</h2>
<ul>
<li><strong>Rpm ↔ cycles/s conversion lives server-side.</strong> <a class="xref" href="../../api/Hi.Milling.SpindleCapability.html">SpindleCapability</a> stores
spindle speed in cycles/s (Hz); the controller converts to rpm in its DTOs and back on write. The
frontend only ever sees rpm.</li>
<li><strong>Nullable gear shift.</strong> The Has-Gear-Shift checkbox writes <code>0</code> when checked and <code>null</code> when
cleared, which is how the model distinguishes &ldquo;mechanism present, speed not yet dialled in&rdquo; from
&ldquo;no gear-shift mechanism&rdquo;.</li>
<li><strong>One state, thin views throughout.</strong> Every panel on the branch — root, the three scalar
sections, the two contour sections and the charts — reads and writes one module-singleton
composable. A point edit therefore redraws the chart in the same tick, and a legend click moves
the editor. The composable installs a single project-change watch that reloads on open and clears
on close.</li>
<li><strong>No cache chain.</strong> These scalars feed the cutting-force and thermal physics, not the setup
canvas, so the branch's afterChange does nothing — unlike the geometry branches, nothing here
clears a geometry cache.</li>
<li><strong>Add Contour.</strong> The prompt is pre-filled with <code>60</code>; a blank entry means continuous (∞). A
duration already present is refused, a second continuous contour included. The new contour is
seeded from the currently selected contour, falling back to the first in the list, and to a
built-in default curve when the axis is empty — so the operator rarely draws from scratch.</li>
<li><strong>Project-scoped, and forwarded to the run.</strong> The capability lives on the authored equipment face
and is persisted with the <code>.hincproj</code> save; setting
<a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.SetupEquipment.html#Hi_Machining_MachiningEquipmentUtils_SetupEquipment_SpindleCapabilityFile">SpindleCapabilityFile</a> externalizes it
to a side-file instead. The runtime equipment face holds the same object by reference, so a scalar
or point edit is visible to a run immediately; a <em>replacement</em> (Load, Paste, XML Apply) re-stamps
that reference through the project service's ForwardSetupEnvironmentToExecution.</li>
<li><strong>Load / Paste / XML-Apply only swap the IndexService entry.</strong> The root panel then installs the
result onto the equipment through the controller's <code>update</code>, and reloads the snapshot and the key.
The controller's <code>initialize</code> indexes a blank placeholder when nothing is attached yet, which is
what keeps the ⋮ menu usable — and Load reachable — on a project with no capability.</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a class="xref" href="../index.html">HiNC App Anatomy</a> for git repository links.</p>
<h3 id="web-application">Web Application</h3>
<p>HiNC-2025-webservice (Quasar CLI SPA):</p>
<ul>
<li><code>wwwroot-src/src/components/controlTree/useControlTreeHost.ts</code> — builds the <code>equipment/spindle</code>
root (item type <code>SpindleCapabilityRoot</code>) and its five children: thermal, gear-shift and dry-run as
<code>SpindleScalars</code>, power and torque as <code>SpindleContour</code>.</li>
<li><code>wwwroot-src/src/components/controlTree/itemTypes.ts</code> — registers those three item types and gives
all of them the same CONTENT-column view.</li>
<li><code>wwwroot-src/src/components/controlTree/SpindleCapabilityPanel.vue</code> — the branch root panel: the
Object Management button, the name caption, the not-attached empty state, and the Name / Note
fields.</li>
<li><code>wwwroot-src/src/components/controlTree/SpindleScalarsPanel.vue</code> — one scalar section per role
path: thermal, gear-shift (checkbox plus the rpm field, disabled while the value is null) and
dry-run.</li>
<li><code>wwwroot-src/src/components/controlTree/SpindleContourPanel.vue</code> — the power / torque child: the
count line, Add, the contour selector, the edit-duration modal and the delete button, hosting the
point editor.</li>
<li><code>wwwroot-src/src/components/spindle/SpindleContourEditor.vue</code> — the selected contour's numeric
points table; its own header is hidden when the tree panel drives it.</li>
<li><code>wwwroot-src/src/components/spindle/SpindleContoursPanel.vue</code> — the CONTENT-column view every
spindle item registers: both charts.</li>
<li><code>wwwroot-src/src/components/spindle/SpindleContoursChart.vue</code> — one plotted chart with the
clickable chip legend that selects the contour the editor edits, plus the gear-shift marker line.</li>
<li><code>wwwroot-src/src/components/controlTree/ContentSlavePanel.vue</code> — the General Setup page's CONTENT
column, which mounts whichever content panel the selection's item type registers; it deliberately
leaves that component unkeyed so the charts survive a move between the branch's six nodes.</li>
<li><code>wwwroot-src/src/composables/useSpindleCapability.ts</code> — the module-singleton state and every
mutation on the branch: the scalar handlers, add / remove / rename contour, the point updates and
the object-management install hooks.</li>
<li><code>wwwroot-src/src/components/widgets/ObjectManagementMenuButton.vue</code> — the reused ⋮ menu carrying
Load / Save As / Copy / Paste / XML for the <code>.SpindleCapability</code> file surface.</li>
<li><code>wwwroot-src/src/api/spindleCapability.ts</code> — typed client for <code>/api/mech/spindle-capability/*</code>.</li>
<li><code>wwwroot-src/src/router/routes.ts</code> — the <code>spindle-capability/:tab?</code> redirect (the tab mapped onto
the branch child id) and the <code>equipment/spindle</code> redirect, both landing on <code>general-setup?tree=…</code>.</li>
<li><code>wwwroot-src/src/router/treeRoutes.ts</code> — defines the tab segments that redirect accepts: thermal,
gear-shift, dry-run, power, torque.</li>
<li><code>Mech/SpindleCapabilityController.cs</code> — REST surface at <code>/api/mech/spindle-capability</code> over the
authored equipment face's capability:
<ul>
<li><code>GET /</code> — flat snapshot: metadata plus the contour keys of each axis.</li>
<li><code>GET /power-contours</code>, <code>GET /torque-contours</code> — per-axis contour lists with their points.</li>
<li><code>PUT /name | /note | /energy-efficiency | /working-temperature-upper-boundary-c | /gear-shift-spindle-speed-rpm | /dry-run-friction-power-coefficient-mwdrpm | /dry-run-windage-power-coefficient-pwdrpm3</code> — one scalar each.</li>
<li><code>POST /power-contours | /torque-contours</code> — add one contour.</li>
<li><code>DELETE /power-contours/{key} | /torque-contours/{key}</code> — remove one contour (<code>{key}</code> accepts
numeric strings and <code>&quot;inf&quot;</code> / <code>&quot;infinity&quot;</code>).</li>
<li><code>PUT /power-contours/{key}/points | /torque-contours/{key}/points</code> — replace one contour's
points; this is what backs per-point editing.</li>
<li><code>PUT /power-contours/{key}/key | /torque-contours/{key}/key</code> — rename a contour's
workable-duration key, refusing a key that already exists; this is what backs the edit-duration
modal.</li>
<li><code>GET /xml</code> — serialise to XML text.</li>
<li><code>POST /load</code>, <code>POST /load-file</code>, <code>POST /reload</code> — install from XML text, from a file under a
named root, or from the file already stamped on the equipment.</li>
<li><code>PUT /capability-file</code> — set the side-file reference without reloading.</li>
<li><code>POST /initialize</code>, <code>POST /update</code> — index the capability for the Object Management button, and
install the swapped-in object back onto the equipment.</li>
</ul>
</li>
</ul>
<h3 id="hiapi-engine">HiAPI Engine</h3>
<ul>
<li><code>HiMech/Milling/SpindleCapability.cs</code> — the model: EnergyEfficiency,
WorkingTemperatureUpperBoundary_K with its <code>_C</code> accessor, the nullable GearShiftSpindleSpeed_cycleds
with its <code>_rpm</code> convenience property, the two dry-run coefficients and the power / torque contour
dictionaries keyed by workable duration.</li>
<li><code>HiMech/Machining/MachiningEquipmentUtils/SetupEquipment.cs</code> — the authored equipment face that
owns the capability and its file reference and serializes them, inline or as a side-file
reference.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../util/mech-builder.html">Mechanism Builder Page</a> — same file-level IO pattern (Load / Reload / Save As) but user-scoped rather than project-scoped.</li>
<li><a class="xref" href="background-coolant.html">Background / Coolant</a> — sibling branch of the same Control Tree, editing the same authored equipment face.</li>
<li><a class="xref" href="../../technique/machine-capability/spindle-capability.html">Spindle Capability</a> — what the model represents physically and how the per-step ratios come out of it.</li>
</ul>
</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>