Archived
deploy.
This commit is contained in:
@@ -0,0 +1,223 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>APT Profile Panel | HiAPI-C# 2025 </title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="title" content="APT Profile 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 "{query}"">
|
||||
<meta name="loc:searchNoResults" content="No results for "{query}"">
|
||||
<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-AptProfilePanel">
|
||||
<h1 id="apt-profile-panel">APT Profile Panel</h1>
|
||||
|
||||
<p>The main model is <a class="xref" href="../../../api/Hi.Milling.Cutters.AptProfile.html">AptProfile</a> and its property <a class="xref" href="../../../api/Hi.Milling.Cutters.AptProfile.html">AptProfile</a>.<a class="xref" href="../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a>.</p>
|
||||
<p>See <a class="xref" href="../../../technique/milling-physics/cutter-geometry.html">Cutter Geometry</a>. <a class="xref" href="../../../api/Hi.Milling.Apts.GeneralApt.html">GeneralApt</a> is the generalization of the other <a class="xref" href="../../../api/Hi.Milling.Apts.IAptBased.html">IAptBased</a> types.</p>
|
||||
<p>On the web client these fields have no panel of their own: they are rendered inline by the Flute Profile section of the cutter, the Control-Tree node whose role path is <code>toolhouse/tool-<id>/cutter/profile</code>, reached at <code>/tool-house/:toolId/cutter/profile</code> under the page route <code>/tool-house/:toolId?/:tab?/:subtab?</code>. That same section carries the Profile Type selector above the fields. In the WPF client the APT fields are a component of their own, hosted by the Milling Cutter panel's Flute-Profile tab.</p>
|
||||
<h2 id="layout">Layout</h2>
|
||||
<h3 id="web-layout">Web Layout</h3>
|
||||
<ul>
|
||||
<li>Flute Profile Section
|
||||
<ul>
|
||||
<li>Profile Type Selection Dropdown
|
||||
<ul>
|
||||
<li>General APT (<a class="xref" href="../../../api/Hi.Milling.Apts.GeneralApt.html">GeneralApt</a>)</li>
|
||||
<li>Ball APT (<a class="xref" href="../../../api/Hi.Milling.Apts.BallApt.html">BallApt</a>)</li>
|
||||
<li>Column APT (<a class="xref" href="../../../api/Hi.Milling.Apts.ColumnApt.html">ColumnApt</a>)</li>
|
||||
<li>Cone APT (<a class="xref" href="../../../api/Hi.Milling.Apts.ConeApt.html">ConeApt</a>)</li>
|
||||
<li>Taper APT (<a class="xref" href="../../../api/Hi.Milling.Apts.TaperApt.html">TaperApt</a>)</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>First row, always present
|
||||
<ul>
|
||||
<li>Diameter Input Field (mm)</li>
|
||||
<li>Length of Cut Input Field (mm)</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Type-dependent rows, one field per row, in this order
|
||||
<ul>
|
||||
<li>Round Radius (Rc) Input Field (mm)</li>
|
||||
<li>Round Ring Radius (Rr) Input Field (mm)</li>
|
||||
<li>Round Ring Height (Rz) Input Field (mm)</li>
|
||||
<li>Bottom Cone Angle (Alpha) Input Field (deg)</li>
|
||||
<li>Top Cone Angle (Beta) Input Field (deg)</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Which of the five type-dependent fields appear is decided by a per-APT-type table held in the panel itself, not by testing the APT object's interfaces:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Profile Type</th>
|
||||
<th>Fields shown</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>General APT</td>
|
||||
<td>Rc, Rr, Rz, Alpha, Beta</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ball APT</td>
|
||||
<td>none — Diameter and Length of Cut only</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Column APT</td>
|
||||
<td>Rc</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Cone APT</td>
|
||||
<td>Alpha</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Taper APT</td>
|
||||
<td>Rc, Rz, Alpha, Beta</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>The interface casts live one layer down, on the read side: the cutter DTO builder fills <code>rc_mm</code>, <code>rr_mm</code>, <code>rz_mm</code>, <code>alpha_deg</code> and <code>beta_deg</code> by casting the APT to <a class="xref" href="../../../api/Hi.Milling.Apts.IAptRc.html">IAptRc</a>, <a class="xref" href="../../../api/Hi.Milling.Apts.IAptRr.html">IAptRr</a>, <a class="xref" href="../../../api/Hi.Milling.Apts.IAptRz.html">IAptRz</a>, <a class="xref" href="../../../api/Hi.Milling.Apts.IAptAlpha.html">IAptAlpha</a> and <a class="xref" href="../../../api/Hi.Milling.Apts.IAptBeta.html">IAptBeta</a>, and emits null for a cast that fails.</p>
|
||||
<p>Taper APT is where the panel's table and the engine's types disagree. <a class="xref" href="../../../api/Hi.Milling.Apts.TaperApt.html">TaperApt</a> is declared over <code>IAptBased</code>, <code>IAptRz</code>, <code>IAptAlpha</code> and <code>IAptBeta</code> and carries no round radius, so the table's Rc entry gives a Taper profile a Round Radius box that the DTO fills with null — the field reads 0 — and the value the panel sends back is not read by the server's Taper branch, which builds the APT from Diameter, Rz, Alpha, Beta and Flute Height alone. Rc on a Taper APT is therefore inert in both directions.</p>
|
||||
<h3 id="wpf-layout">WPF Layout</h3>
|
||||
<ul>
|
||||
<li>APT Profile Panel
|
||||
<ul>
|
||||
<li>Diameter Input Field (mm)</li>
|
||||
<li>Round Radius Input Field (mm)
|
||||
Visible if <a class="xref" href="../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a> is <a class="xref" href="../../../api/Hi.Milling.Apts.IAptRc.html">IAptRc</a></li>
|
||||
<li>Round Ring Radius Input Field (mm)
|
||||
Visible if <a class="xref" href="../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a> is <a class="xref" href="../../../api/Hi.Milling.Apts.IAptRr.html">IAptRr</a></li>
|
||||
<li>Round Ring Height Input Field (mm)
|
||||
Visible if <a class="xref" href="../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a> is <a class="xref" href="../../../api/Hi.Milling.Apts.IAptRz.html">IAptRz</a></li>
|
||||
<li>Bottom Cone Angle Input Field (deg)
|
||||
Visible if <a class="xref" href="../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a> is <a class="xref" href="../../../api/Hi.Milling.Apts.IAptAlpha.html">IAptAlpha</a></li>
|
||||
<li>Top Cone Angle Input Field (deg)
|
||||
Visible if <a class="xref" href="../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a> is <a class="xref" href="../../../api/Hi.Milling.Apts.IAptBeta.html">IAptBeta</a></li>
|
||||
<li>Length of Cut Input Field (mm)</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="TIP">
|
||||
<h5>Tip</h5>
|
||||
<p>Keep field format <code>G4</code> on this client. The web fields apply no format: they show the value as stored and commit on blur or Enter.</p>
|
||||
</div>
|
||||
<h2 id="features">Features</h2>
|
||||
<p>Every edit re-sends the whole profile. Changing the type, or any one field, builds a fresh shaper-profile request carrying the type, Diameter, Length of Cut and only those of Rc / Rr / Rz / Alpha / Beta that the chosen type's table lists, and the server replaces the cutter's <a class="xref" href="../../../api/Hi.Milling.Cutters.AptProfile.html">AptProfile</a> with a newly constructed APT of that type. The panel then clears the tool cache so the canvas redraws.</p>
|
||||
<p>Clearing a field is ignored. The shared numeric input emits null for an empty box, and the panel returns on null instead of committing, so a blanked box keeps the previous value rather than writing 0.</p>
|
||||
<p>Because the profile changes the flute geometry, the server does more than drop the cutter's cached solids: it also re-aligns the tool's holder-to-cutter anchor transformer, so the cutter is re-placed under the holder at its new height instead of rendering with a wrong exposed length.</p>
|
||||
<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>
|
||||
<p>HiNC-2025-webservice (Quasar CLI SPA):</p>
|
||||
<ul>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/CutterSectionPanel.vue</code> — the shipped home of these fields: the Profile Type selector, Diameter, Length of Cut, the per-type field table, and the whole-profile commit.</li>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolHouseItemTypes.ts</code> — builds the <code>profile</code> section node this panel renders.</li>
|
||||
<li><code>wwwroot-src/src/router/treeRoutes.ts</code> — maps that node's role path onto the page's <code>:subtab</code> param.</li>
|
||||
<li><code>wwwroot-src/src/components/widgets/NumericInput.vue</code> — the numeric field behind every APT input: unit as a suffix, commit on blur or Enter, no <code>G4</code>.</li>
|
||||
<li><code>wwwroot-src/src/i18n/en/toolhouse.ts</code> — the exact labels: "Round Radius (Rc)", "Round Ring Radius (Rr)", "Round Ring Height (Rz)", "Bottom Cone Angle (Alpha)", "Top Cone Angle (Beta)", “Diameter”, “Length of Cut”, and the five APT type names.</li>
|
||||
<li><code>wwwroot-src/src/api/toolHouse.ts</code> — <code>setShaperProfile</code> and the shaper-profile DTO shape, which carries only the fields the selected APT type lists.</li>
|
||||
<li><code>Mech/CutterController.cs</code> — the shaper-profile endpoint: it builds a <code>ColumnApt</code>, <code>ConeApt</code>, <code>BallApt</code>, <code>TaperApt</code> or <code>GeneralApt</code> from the DTO, assigns a new <a class="xref" href="../../../api/Hi.Milling.Cutters.AptProfile.html">AptProfile</a>, and runs the cache-clear and re-align hook.</li>
|
||||
<li><code>Mech/CutterDtoBuilder.cs</code> — the read side that emits <code>aptType</code>, <code>diameter_mm</code>, <code>fluteHeight_mm</code> and the five interface-cast fields.</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>
|
||||
@@ -0,0 +1,192 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Cutter Panel | HiAPI-C# 2025 </title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="title" content="Cutter 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 "{query}"">
|
||||
<meta name="loc:searchNoResults" content="No results for "{query}"">
|
||||
<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-CutterPanel">
|
||||
<h1 id="cutter-panel">Cutter Panel</h1>
|
||||
|
||||
<h2 id="overview">Overview</h2>
|
||||
<p>The key component is <a class="xref" href="../../../api/Hi.Machining.ICutter.html">ICutter</a>. A tool carries at most one cutter, and two concrete types answer to that interface: <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html">MillingCutter</a> and <a class="xref" href="../../../api/Hi.Machining.FreeformRemover.html">FreeformRemover</a>. This panel is where the type is chosen, and it holds the cutter's own General fields.</p>
|
||||
<p>On the web client it is the Cutter tab of the <a class="xref" href="../index.html">Tool House Page</a>, reached at <code>/tool-house/:toolId/cutter</code> under the page route <code>/tool-house/:toolId?/:tab?/:subtab?</code>. It is the panel of the Control-Tree Cutter node under the selected tool — the node whose role path is <code>toolhouse/tool-<id>/cutter</code>. In the WPF client the same surface is the Cutter Management Panel embedded in the tool's editor.</p>
|
||||
<h2 id="layout">Layout</h2>
|
||||
<h3 id="web-layout">Web Layout</h3>
|
||||
<ul>
|
||||
<li>Cutter Node Panel
|
||||
<ul>
|
||||
<li>Title Label — Cutter</li>
|
||||
<li>Cutter Type Selector — Milling Cutter / Freeform Remover / None</li>
|
||||
<li>Milling Cutter branch, rendered only while the type is Milling Cutter
|
||||
<ul>
|
||||
<li>Shank Mass Input Field (g)</li>
|
||||
<li>Hone Radius Input Field (um)</li>
|
||||
<li>Relief Angle Input Field (deg)</li>
|
||||
<li>Sections Hint Caption — points at the section tabs below</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Freeform Remover branch — one caption, <code>toolhouse.cutter.freeformRemoverUnavailable</code>, sending the reader to the WPF client or HiNcRcl</li>
|
||||
<li>No-cutter branch — one hint, <code>toolhouse.cutter.noCutterHint</code>, inviting the reader to pick Milling Cutter</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>The three numeric fields are the cutter's General fields, and they sit here under the Metadata-on-container convention — a container's own General fields are edited on the container's panel instead of in a General child. They are plain, always-editable inputs: one label each, no label switching and no auto-computed mode, and all three commit together through the general endpoint, which accepts exactly <code>shankMass_g</code>, <code>honeRadius_um</code> and <code>reliefAngle_deg</code>. A blanked box commits nothing, so clearing a field never writes a zero.</p>
|
||||
<p>The type also decides what grows below the node. A Milling Cutter grows the cutter's section tabs — Material, Flute Profile, Flute Contours, Upper Beam, Optimization — as the nodes whose role paths end in <code>.../cutter/material</code>, <code>.../cutter/profile</code>, <code>.../cutter/contours</code>, <code>.../cutter/upper-beam</code> and <code>.../cutter/opt</code>; Material is the one gated behind the Advanced Physics preference. Selecting one replaces this panel with that section's own panel; see <a class="xref" href="milling-cutter-panel.html">Milling Cutter Panel</a>. A Freeform Remover or no cutter grows nothing, so the Cutter node is a leaf and the caption or hint is the whole surface; see <a class="xref" href="freeform-remover-panel.html">Freeform Remover Panel</a>.</p>
|
||||
<p>This panel carries no object management of its own. Object management for the tool library sits on the tool-house root node, where the <a class="xref" href="../../widget/object-management-menu-button.html">Object Management Menu Button</a> is bound to the whole <code>.MachiningToolHouse</code> file rather than to a per-cutter file.</p>
|
||||
<h3 id="wpf-layout">WPF Layout</h3>
|
||||
<ul>
|
||||
<li>Cutter Management Panel
|
||||
<ul>
|
||||
<li>Head Line
|
||||
<ul>
|
||||
<li><a class="xref" href="../../widget/object-management-menu-button.html">Object Management Menu Button</a>
|
||||
<ul>
|
||||
<li>File extension is <code>.Cutter</code>, load type <a class="xref" href="../../../api/Hi.Machining.ICutter.html">ICutter</a></li>
|
||||
<li>The pointed Editor Panel is the cutter content presenter below</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Title Label</li>
|
||||
<li>Cutter Type Selection Dropdown
|
||||
<ul>
|
||||
<li>Options: Milling Cutter, Freeform Remover, Unset</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Cutter Content Presenter
|
||||
Varies by the Cutter Type. It can be:
|
||||
<ul>
|
||||
<li><a class="xref" href="milling-cutter-panel.html">Milling Cutter Panel</a></li>
|
||||
<li><a class="xref" href="freeform-remover-panel.html">Freeform Remover Panel</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>The per-cutter <code>.Cutter</code> file is this client's, and so is the third option's Unset wording; the web selector's third option reads None.</p>
|
||||
<h2 id="features">Features</h2>
|
||||
<p>Committing a type on the web is one server call plus a cache clear. Milling Cutter calls <code>EnsureCutter</code>, which keeps the tool's existing MillingCutter and only creates one when the tool has none; None calls <code>ClearCutter</code>, which drops the tool's cutter altogether. The panel then clears the tool cache, re-reads the tool and emits a structure change for its own node, which is how the section tabs appear or disappear with the type.</p>
|
||||
<p>Cache clearing is not a step the user performs. <a class="xref" href="../../../api/Hi.Machining.ICutter.html">ICutter</a> implements <a class="xref" href="../../../api/Hi.Common.IClearCache.html">IClearCache</a>, and every cutter endpoint that changes a field or a geometry clears the cache server-side before it answers: the field endpoints call <code>ClearCache()</code> on the milling cutter directly, while the ones that change flute or beam geometry go through the controller's resync hook, which clears the cache <em>and</em> re-aligns the tool's holder-to-cutter anchor transformer so the cutter is re-placed under the holder at its new height. On top of that the panels call <code>clearToolCache(toolId)</code>, which clears the tool's cached solids and the holder's, so the tool canvas redraws.</p>
|
||||
<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>
|
||||
<p>HiNC-2025-webservice (Quasar CLI SPA):</p>
|
||||
<ul>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolCutterPanel.vue</code> — the Cutter node's panel: the Milling Cutter / Freeform Remover / None selector, the Shank Mass / Hone Radius / Relief Angle fields, the Freeform Remover caption and the no-cutter hint. Commits a type change through <code>ensureCutter</code> or <code>clearCutter</code> followed by <code>clearToolCache</code>.</li>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolHouseItemTypes.ts</code> — registers this panel as the <code>ToolCutter</code> item type; its cutter child builder grows the section tabs only for a MillingCutter, and gates Material on the Advanced Physics preference.</li>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/CutterSectionPanel.vue</code> and <code>wwwroot-src/src/components/controlTree/toolhouse/CutterContoursPanel.vue</code> — the panels those section nodes render.</li>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolHouseRootPanel.vue</code> — the tool-house root panel, which carries the Object Management Menu Button for the <code>.MachiningToolHouse</code> file.</li>
|
||||
<li><code>wwwroot-src/src/components/widgets/ObjectManagementMenuButton.vue</code> — the reused object-management dropdown that root panel mounts.</li>
|
||||
<li><code>wwwroot-src/src/components/widgets/NumericInput.vue</code> — the shared numeric field behind the three General inputs; it commits on blur or Enter and reverts an unparseable entry.</li>
|
||||
<li><code>wwwroot-src/src/pages/ToolHousePage.vue</code> — the routed page that hosts the tool list and the tab cascade this panel appears in; the route is <code>/tool-house/:toolId?/:tab?/:subtab?</code>.</li>
|
||||
<li><code>wwwroot-src/src/i18n/en/toolhouse.ts</code> — the <code>toolhouse.cutter.*</code> strings this panel renders: cutterType, shankMass, honeRadius, reliefAngle, sectionsHint, freeformRemoverUnavailable, noCutterHint, millingCutter, freeformRemover. The None option's label comes from <code>common.options.none</code> in <code>wwwroot-src/src/i18n/en/common.ts</code>.</li>
|
||||
<li><code>wwwroot-src/src/api/toolHouse.ts</code> — the typed wrapper: <code>/api/ToolHouse</code> for the house and the tool-level fields, <code>/api/Cutter</code> for every cutter mutation, plus <code>ensureCutter</code>, <code>clearCutter</code>, <code>setGeneral</code> and <code>clearToolCache</code>.</li>
|
||||
<li><code>Mech/CutterController.cs</code> — the cutter backend at <code>/api/Cutter</code>: <code>EnsureCutter</code> / <code>ClearCutter</code>, the shaper-profile, fluting, general and opt-limit endpoints, the upper-beam endpoints and the material and coating-layer endpoints. Every field and geometry mutator clears the cutter cache before it answers.</li>
|
||||
<li><code>Mech/CutterDtoBuilder.cs</code> — the single source of truth for the read-side cutter DTO (integralMode, general, shaperProfile, fluting, optLimit, material), shared by <code>CutterController</code> and the tool detail in <code>ToolHouseController</code>.</li>
|
||||
<li><code>Mech/ToolHouseController.cs</code> — the tool detail that embeds that cutter DTO and that this panel reads on mount, plus the tool-cache clear the panel calls after every commit.</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>
|
||||
@@ -0,0 +1,215 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Freeform Remover Panel | HiAPI-C# 2025 </title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="title" content="Freeform Remover 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 "{query}"">
|
||||
<meta name="loc:searchNoResults" content="No results for "{query}"">
|
||||
<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-FreeformRemoverPanel">
|
||||
<h1 id="freeform-remover-panel">Freeform Remover Panel</h1>
|
||||
|
||||
<p>The key model is <a class="xref" href="../../../api/Hi.Machining.FreeformRemover.html">FreeformRemover</a>: a cutter whose removal volume comes from two referenced geometries — a non-cutting strut and a cutting shaper — anchored to the holder buckle.</p>
|
||||
<p>The two clients divide this cutter between them. The WPF client owns the editing surface: both geometries, the anchor, the spinning flag and the identity fields. The web client offers the type in the Cutter Type selector and nothing more; there is no Freeform Remover editor on the web, and no freeform-remover endpoint in the backend, so a freeform remover is built and edited on the WPF client or through HiNcRcl.</p>
|
||||
<h2 id="layout">Layout</h2>
|
||||
<h3 id="wpf-layout">WPF Layout</h3>
|
||||
<ul>
|
||||
<li>Freeform Remover Panel
|
||||
<ul>
|
||||
<li>Tabs
|
||||
<ul>
|
||||
<li>Strut Geometry Tab
|
||||
<ul>
|
||||
<li><a class="xref" href="../../geom/geom-manage-control.html">Geometry Management Panel</a>
|
||||
<ul>
|
||||
<li>Manages <a class="xref" href="../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_StrutGeom">StrutGeom</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Shaper Geometry Tab
|
||||
<ul>
|
||||
<li><a class="xref" href="../../geom/geom-manage-control.html">Geometry Management Panel</a>
|
||||
<ul>
|
||||
<li>Manages <a class="xref" href="../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_ShaperGeom">ShaperGeom</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Anchor Tab
|
||||
<ul>
|
||||
<li>Label: Geometry Anchor To Holder Buckle</li>
|
||||
<li><a class="xref" href="../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_KeepHolderBuckleOnTop">KeepHolderBuckleOnTop</a> Checkbox</li>
|
||||
<li><a class="xref" href="../../geom/transformer-panel.html">Transformer Manage Panel</a>
|
||||
<ul>
|
||||
<li>Model is <a class="xref" href="../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_GeomToHolderTransformer">GeomToHolderTransformer</a></li>
|
||||
<li>Enabled if <a class="xref" href="../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_KeepHolderBuckleOnTop">KeepHolderBuckleOnTop</a> is true.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Property Tab
|
||||
<ul>
|
||||
<li>Is Spinning Cutter Checkbox
|
||||
<ul>
|
||||
<li>Controls <a class="xref" href="../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_IsSpinningCutter">IsSpinningCutter</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Info Tab
|
||||
<ul>
|
||||
<li>Name TextField (editable)</li>
|
||||
<li>AbstractNote TextField (readonly)</li>
|
||||
<li>Note TextField (editable)</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>This panel calls <a class="xref" href="../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_ClearCache">ClearCache()</a> itself after a geometry or anchor change, so the cached solids are dropped before the tool is redrawn.</p>
|
||||
<h3 id="web-layout">Web Layout</h3>
|
||||
<ul>
|
||||
<li>Cutter Node Panel, the Cutter tab of the <a class="xref" href="../index.html">Tool House Page</a> at <code>/tool-house/:toolId/cutter</code> — the Control-Tree node <code>toolhouse/tool-<id>/cutter</code>
|
||||
<ul>
|
||||
<li>Cutter Type Selector — its second option, Freeform Remover, is this cutter</li>
|
||||
<li>Freeform Remover Caption (<code>toolhouse.cutter.freeformRemoverUnavailable</code>) — the panel's whole body while that option is showing, directing the reader to the WPF client or HiNcRcl</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Nothing else on the web belongs to this cutter. The Shank Mass / Hone Radius / Relief Angle fields on that panel are gated to the Milling Cutter branch, and the cutter's child builder grows section tabs only for a MillingCutter, so the Cutter node is a leaf here: no Material, Flute Profile, Flute Contours, Upper Beam or Optimization section appears. See <a class="xref" href="cutter-panel.html">Cutter Panel</a> for the panel these live on.</p>
|
||||
<h2 id="geometry-definitions">Geometry Definitions</h2>
|
||||
<ul>
|
||||
<li><strong>Strut Geometry</strong> — The non-cutting portion (holder/shank)
|
||||
<ul>
|
||||
<li>Used for collision detection</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><strong>Shaper Geometry</strong> — The cutting portion
|
||||
<ul>
|
||||
<li>Defines cutting surfaces</li>
|
||||
<li>Used for material removal simulation</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h2 id="features">Features</h2>
|
||||
<p>Picking Freeform Remover on the web is a no-op that does not stick. The panel makes no API call for that option — it sets the selector locally, clears the tool cache, then re-reads the tool, and the re-read is what puts the selector back to Milling Cutter or None. The model on the tool is left exactly as it was.</p>
|
||||
<p>A tool that already carries a freeform remover reads as None. The tool detail casts the tool's cutter to a MillingCutter and reports both <code>hasCutter</code> and the embedded cutter DTO from that one cast, so a non-milling cutter comes back as no cutter at all, and the selector — which derives its value from those two fields — shows None. The Freeform Remover option is therefore reachable by the user's click but never by a load.</p>
|
||||
<p>That makes one sequence worth knowing before using the web page on such a tool: picking Milling Cutter calls <code>EnsureCutter</code>, which returns the tool's existing cutter only when it is already a MillingCutter and otherwise assigns a new one — so on a tool holding a freeform remover, that choice replaces it. Leaving the selector alone leaves the freeform remover intact, which is what a round trip through the web page does by default.</p>
|
||||
<p>Cache clearing needs no user action on either client. The WPF panel clears the remover's cache after each geometry or anchor edit; on the web there is nothing to clear for this cutter, since no endpoint mutates it, and the tool-cache clear the selector performs only drops the tool's and the holder's cached solids so the canvas redraws.</p>
|
||||
<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>
|
||||
<p>HiNC-2025-webservice (Quasar CLI SPA):</p>
|
||||
<ul>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolCutterPanel.vue</code> — the only web surface this cutter has: the selector option, the caption shown in its place, and the branch of the type handler that makes no call.</li>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolHouseItemTypes.ts</code> — its cutter child builder grows sections only for a MillingCutter, so this cutter's Cutter node is a leaf.</li>
|
||||
<li><code>wwwroot-src/src/i18n/en/toolhouse.ts</code> — <code>toolhouse.cutter.freeformRemover</code>, the option label, and <code>toolhouse.cutter.freeformRemoverUnavailable</code>, the caption; the zh-Hans and zh-Hant files carry the same keys.</li>
|
||||
<li><code>Mech/ToolHouseController.cs</code> — the tool detail, which casts the cutter to a MillingCutter and reports <code>hasCutter</code> from that cast; this is why the selector cannot come back showing Freeform Remover.</li>
|
||||
<li><code>Mech/CutterController.cs</code> — <code>EnsureCutter</code> / <code>ClearCutter</code> and every cutter mutation, all MillingCutter-only; the backend has no freeform-remover endpoint.</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>
|
||||
@@ -0,0 +1,133 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Cutter Tab | HiAPI-C# 2025 </title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="title" content="Cutter Tab | 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 "{query}"">
|
||||
<meta name="loc:searchNoResults" content="No results for "{query}"">
|
||||
<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-Cutter">
|
||||
<h1 id="cutter-tab">Cutter Tab</h1>
|
||||
|
||||
<p>The Cutter tab of the Tool House page, reached as <code>/tool-house/:toolId/cutter</code> and, for its inner
|
||||
editors, <code>/tool-house/:toolId/cutter/:subtab</code>. The tab's own panel chooses the cutter type and holds
|
||||
the identity fields every cutter has; the type chosen decides which editor grows below it.</p>
|
||||
<p>Ordered with the tab's own panel first, then one page per cutter type, then the profile editor the
|
||||
types share.</p>
|
||||
<h2 id="pages">Pages</h2>
|
||||
<ul>
|
||||
<li><a href="cutter-panel.html">Cutter Panel</a> — The tab itself: the cutter type selector and the fields common to every cutter</li>
|
||||
<li><a href="milling-cutter-panel.html">Milling Cutter Panel</a> — The shipped cutter type: material, profile, flute contours, upper beam and optimization limits</li>
|
||||
<li><a href="freeform-remover-panel.html">Freeform Remover Panel</a> — The freeform removal volume, and where it is edited</li>
|
||||
<li><a href="apt-profile-panel.html">APT Profile Panel</a> — The five APT profile types the shaper profile offers, shared by the cutter editors</li>
|
||||
</ul>
|
||||
<h2 id="see-also">See Also</h2>
|
||||
<ul>
|
||||
<li><a class="xref" href="../index.html">Tool House Page</a> — the page these tabs belong to</li>
|
||||
<li><a href="../holder/index.html">Holder Tab</a> — the sibling tab, and the other half of a tool</li>
|
||||
<li><a href="../stick-tool-panel.html">Stick Tool Panel</a> — the tool node whose tab cascade this tab belongs to</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>
|
||||
@@ -0,0 +1,394 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Milling Cutter Panel | HiAPI-C# 2025 </title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="title" content="Milling Cutter 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 "{query}"">
|
||||
<meta name="loc:searchNoResults" content="No results for "{query}"">
|
||||
<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-MillingCutterPanel">
|
||||
<h1 id="milling-cutter-panel">Milling Cutter Panel</h1>
|
||||
|
||||
<p>The key model is <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html">MillingCutter</a>, the cutter type both clients edit in full.</p>
|
||||
<p>On the web client this cutter is not one panel but the section tabs the <a class="xref" href="cutter-panel.html">Cutter Panel</a> grows once a Milling Cutter is assigned: the Control-Tree nodes under <code>toolhouse/tool-<id>/cutter</code>, reached at <code>/tool-house/:toolId/cutter/:subtab</code> under the page route <code>/tool-house/:toolId?/:tab?/:subtab?</code>. The five <code>:subtab</code> values are <code>material</code>, <code>profile</code>, <code>contours</code>, <code>upper-beam</code> and <code>opt</code>. The cutter's General fields — Shank Mass, Hone Radius, Relief Angle — are not among them: they sit on the Cutter node's own panel. In the WPF client the same cutter is one tab control, and it carries several groups the web does not offer.</p>
|
||||
<h2 id="layout">Layout</h2>
|
||||
<h3 id="web-layout">Web Layout</h3>
|
||||
<ul>
|
||||
<li>Cutter Section Tabs, in this order
|
||||
<ul>
|
||||
<li><a href="#material-section">Material Section</a> — grows only while the Advanced Physics preference is on</li>
|
||||
<li><a href="#flute-profile-section">Flute Profile Section</a></li>
|
||||
<li><a href="#flute-contours-section">Flute Contours Section</a></li>
|
||||
<li><a href="#upper-beam-section">Upper Beam Section</a></li>
|
||||
<li><a href="#optimization-section">Optimization Section</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Material is the only physics-gated section. Flute Profile, Flute Contours, Upper Beam and Optimization grow for every Milling Cutter. The preference behind the gate is the SPA's Advanced Physics option, held as <code>isShowPhysicsOptions</code> in the app-state store and read from the server's preference endpoint, which reports it as on only while the physics feature is licensed. <code>UserService.EnablePhysics</code> is the WPF client's name for the same preference.</p>
|
||||
<p>Integral mode is read-only on the web. The cutter DTO reports it, and the Material section reads it to decide whether the Shank Material picker applies, but no endpoint sets it; it is chosen on the WPF client's Property tab.</p>
|
||||
<h4 id="material-section">Material Section</h4>
|
||||
<ul>
|
||||
<li>Material Section (<code>.../cutter/material</code>)
|
||||
<ul>
|
||||
<li>Flute Material
|
||||
Applies <a class="xref" href="../../../api/Hi.Physics.CutterMaterial.html">CutterMaterial</a>
|
||||
<ul>
|
||||
<li>Intro caption naming the <code>.CutterMaterial</code> extension</li>
|
||||
<li>Material File Selector
|
||||
<ul>
|
||||
<li>Menu Dropdown — Browse Resource…, plus Clear once a file is picked</li>
|
||||
<li>Readonly path TextBox with the placeholder “No flute material selected”</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Name and note caption beneath the picker, the two joined on one line</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Shank Material, rendered only while the cutter's integral mode is Insert End
|
||||
Applies <a class="xref" href="../../../api/Hi.Physics.IStructureMaterial.html">IStructureMaterial</a>
|
||||
<ul>
|
||||
<li>Intro caption naming the <code>.xml</code> structure material and the <code>.CutterMaterial</code> alternative</li>
|
||||
<li>Material File Selector, filtered to <code>.xml</code> — same Browse Resource… menu, with the placeholder “Default: AlloySteel42CrMo”</li>
|
||||
<li>Name and note caption beneath the picker</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Solid-End Note, shown in place of that block for a solid-end cutter — the shank material mirrors the flute material, so it has no separate setting</li>
|
||||
<li>Coating Layers
|
||||
Manages <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_CoatingLayerList">CoatingLayerList</a>
|
||||
<ul>
|
||||
<li>Add Layer Button</li>
|
||||
<li>One sequence hint above the whole list: the sequence starts from the surface, <code>#0</code> is the outermost / air-exposing layer, and each layer is a <code>.CoatingMaterial</code> plus a thickness in um</li>
|
||||
<li>One row per <a class="xref" href="../../../api/Hi.Physics.ThermalLayer1D.html">ThermalLayer1D</a>, all controls on that one line
|
||||
<ul>
|
||||
<li>Index Badge <code>#i</code></li>
|
||||
<li>Coating Material File Selector — Browse Resource…, placeholder “No coating material”</li>
|
||||
<li>Thickness Input Field (um) — <a class="xref" href="../../../api/Hi.Physics.ThermalLayer1D.html#Hi_Physics_ThermalLayer1D_Length_um">Length_um</a></li>
|
||||
<li>Move Toward Surface Button, disabled on the first row</li>
|
||||
<li>Move Toward Body Button, disabled on the last row</li>
|
||||
<li>Delete Layer Button</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Empty state caption “No coating layers.”</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>All three pickers are resource-only, which is what leaves the dropdown with a single browse entry: the absolute Browse item is hidden and only Browse Resource… remains. The picked material's name and note are rendered as a caption line under the picker rather than as a tooltip on a readonly name box.</p>
|
||||
<p>The mirroring for a solid-end cutter is enforced server-side: loading a flute material onto a solid-end cutter assigns the same material as the shank material, and unsetting it clears both. For an insert-end cutter, unsetting the shank material resets it to the built-in AlloySteel42CrMo rather than to nothing.</p>
|
||||
<p>Every coating endpoint answers with the whole cutter DTO, so the row list re-renders from the server's own ordering after an add, a move or a delete.</p>
|
||||
<h5 id="default-resource">Default Resource</h5>
|
||||
<p>The default resources of Material live in the built-in <code>Resource</code> folder the server exposes as a named root of its own — not in the project folder. Each picker opens Browse Resource… into its own subfolder of that root:</p>
|
||||
<ul>
|
||||
<li><code>StructureMaterial</code> — the Shank Material picker</li>
|
||||
<li><code>CutterMaterial</code> — the Flute Material picker</li>
|
||||
<li><code>CoatingMaterial</code> — the coating rows' pickers</li>
|
||||
</ul>
|
||||
<h4 id="flute-profile-section">Flute Profile Section</h4>
|
||||
<ul>
|
||||
<li>Flute Profile Section (<code>.../cutter/profile</code>)
|
||||
<ul>
|
||||
<li>Profile Type Selection Dropdown
|
||||
<ul>
|
||||
<li>General APT (<a class="xref" href="../../../api/Hi.Milling.Apts.GeneralApt.html">GeneralApt</a>)</li>
|
||||
<li>Ball APT (<a class="xref" href="../../../api/Hi.Milling.Apts.BallApt.html">BallApt</a>)</li>
|
||||
<li>Column APT (<a class="xref" href="../../../api/Hi.Milling.Apts.ColumnApt.html">ColumnApt</a>)</li>
|
||||
<li>Cone APT (<a class="xref" href="../../../api/Hi.Milling.Apts.ConeApt.html">ConeApt</a>)</li>
|
||||
<li>Taper APT (<a class="xref" href="../../../api/Hi.Milling.Apts.TaperApt.html">TaperApt</a>)</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>The APT fields themselves, rendered inline in this same panel</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>The five types are all wrapped by <a class="xref" href="../../../api/Hi.Milling.Cutters.AptProfile.html">AptProfile</a>, with a different <a class="xref" href="../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a> assigned; which fields appear depends on the type. See <a class="xref" href="apt-profile-panel.html">APT Profile Panel</a> for the field list and the per-type table that drives it.</p>
|
||||
<p>See the <code>DemoBuildMachiningProject</code> sample in the <a class="xref" href="../../../technique/api-foundations/packages-and-samples.html">Hi.Sample repository</a> for creating the APT profile and setting it on the cutter.</p>
|
||||
<p><code>CustomSpinningProfile</code> is the WPF client's sixth profile type; the web offers the five APT types only.</p>
|
||||
<h4 id="flute-contours-section">Flute Contours Section</h4>
|
||||
<p>This part manages <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_Fluting">Fluting</a>. It is a stem, not a leaf: the section node carries only the type selector, and the fluting itself is a sub-tree of nodes below it.</p>
|
||||
<ul>
|
||||
<li>Flute Contours Section (<code>.../cutter/contours</code>)
|
||||
<ul>
|
||||
<li>Title Label — Fluting</li>
|
||||
<li>Fluting Type Selection Dropdown
|
||||
<ul>
|
||||
<li>Uniform (shared baseline) — <a class="xref" href="../../../api/Hi.Milling.FluteContours.UniformFluting.html">UniformFluting</a></li>
|
||||
<li>Free (per-flute) — <a class="xref" href="../../../api/Hi.Milling.FluteContours.FreeFluting.html">FreeFluting</a></li>
|
||||
<li><code>— unset —</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>A caption describing the chosen kind, or “Fluting unset.” while none is set</li>
|
||||
<li>Fluting Node, grown only once a fluting is set — labelled Uniform Fluting or Free Fluting
|
||||
<ul>
|
||||
<li>For a uniform fluting: Flute Number Input Field (minimum 1)</li>
|
||||
<li>For a free fluting: a “Flutes: n” caption and an Add Flute Button, with a “No flutes yet” hint while the list is empty</li>
|
||||
<li>Flute Contour Node(s)
|
||||
<ul>
|
||||
<li>One Baseline Contour node (<code>.../fluting/baseline</code>) for a uniform fluting; one Flute <em>n</em> node (<code>.../fluting/flute-{i}</code>) per flute for a free fluting</li>
|
||||
<li>Setup Angle Input Field (deg)</li>
|
||||
<li>Delete This Flute Button — free fluting only</li>
|
||||
<li>Side Contour Sub-Node (<code>.../baseline/side</code>, <code>.../flute-{i}/side</code>)
|
||||
<ul>
|
||||
<li>Kind Selector — Const Helix / Freeform / <code>— unset —</code></li>
|
||||
<li>Const Helix Side Contour form: Helix Angle (deg), Radial Rake Angle (deg), Radial Relief Angle (deg)</li>
|
||||
<li>Freeform Side Contour form: the span-position table, ordered by Z</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Bottom Contour Sub-Node (<code>.../baseline/bottom</code>, <code>.../flute-{i}/bottom</code>)
|
||||
<ul>
|
||||
<li>Kind Selector — Slide / Freeform / <code>— unset —</code></li>
|
||||
<li>Slide Bottom Contour form: Outer Radius (mm), Cutter Length on Bottom Projection (mm), Eccentric Angle (deg), Disk Angle (deg), Axial Rake Angle (deg)</li>
|
||||
<li>Freeform Bottom Contour form: the span-position table, ordered by R</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Both freeform forms share one span-position table: four numeric columns — R (mm), A (deg), Z (mm), R.Ang (deg) — one row per 4D span position, with an insert-next button that clones the row and a double-click to remove it. The header wording mirrors the CSV field order the wire format uses, and the R.Ang column carries a tooltip explaining that the radial angle feeds the bottom-surface loft.</p>
|
||||
<p>A flute contour is always committed as a whole. Editing a Setup Angle, a side contour or a bottom contour re-sends the entire contour: a uniform fluting re-sends the fluting with its current flute number, and a free fluting updates the slot at its index. Free flute node ids are positional, so adding or deleting a flute rebuilds the branch to re-point them.</p>
|
||||
<p>Picking <code>— unset —</code> in the Fluting Type selector is inert — the panel returns without a call, because the backend exposes no way to null a fluting. Picking <code>— unset —</code> on a Side or Bottom Contour, in contrast, does commit: it clears that contour on the flute.</p>
|
||||
<h4 id="upper-beam-section">Upper Beam Section</h4>
|
||||
<p>The upper beam is the cutter's shank / body above the flute.</p>
|
||||
<ul>
|
||||
<li>Upper Beam Section (<code>.../cutter/upper-beam</code>)
|
||||
<ul>
|
||||
<li>Intro caption</li>
|
||||
<li>Warnings Banner — one orange banner per geometry issue the backend reports, e.g. an ExtendedCylinder beam whose FullLength sits below the flute top</li>
|
||||
<li><a class="xref" href="../../geom/geom-manage-control.html">Geometry Management Control</a>, limited to the six <a class="xref" href="../../../api/Hi.Geom.IGetStl.html">IGetStl</a> kinds an upper beam can be
|
||||
<ul>
|
||||
<li><a class="xref" href="../../../api/Hi.Geom.Cylindroid.html">Cylindroid</a></li>
|
||||
<li><a class="xref" href="../../../api/Hi.Geom.ExtendedCylinder.html">ExtendedCylinder</a></li>
|
||||
<li><a class="xref" href="../../../api/Hi.Geom.TransformationGeom.html">TransformationGeom</a></li>
|
||||
<li><a class="xref" href="../../../api/Hi.Geom.StlFile.html">StlFile</a></li>
|
||||
<li><a class="xref" href="../../../api/Hi.Geom.Box3d.html">Box3d</a></li>
|
||||
<li><a class="xref" href="../../../api/Hi.Geom.GeomCombination.html">GeomCombination</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>The banner is persistent rather than a transient toast: the same unreasonable settings fail thermal physics at run time as configuration errors, so they are surfaced at edit time. Creating a geometry here is container-aware — the server builds it, sets it as the cutter's upper-beam geometry, auto-links an ExtendedCylinder to the flute with a valid seed length, and indexes it under the same key so the per-kind editor edits it in place. Each later edit resyncs the cutter and refreshes the warning list.</p>
|
||||
<h4 id="optimization-section">Optimization Section</h4>
|
||||
<p>This part manages <a class="xref" href="../../../api/Hi.NcOpt.MillingCutterOptOption.html">MillingCutterOptOption</a>.</p>
|
||||
<ul>
|
||||
<li>Optimization Section (<code>.../cutter/opt</code>)
|
||||
<ul>
|
||||
<li>Enable Optimization Checkbox
|
||||
<ul>
|
||||
<li>Controls whether the limits below are shown and active</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>When optimization is enabled:
|
||||
<ul>
|
||||
<li>Limit by Theoretical Minimum Feed Per Tooth Checkbox</li>
|
||||
<li>Limit by Relief Angle Checkbox</li>
|
||||
<li>Min Feed Per Tooth Input Field (mm)</li>
|
||||
<li>Max Feed Per Tooth Input Field (mm)</li>
|
||||
<li>Yielding Utilization Factor Input Field
|
||||
<ul>
|
||||
<li>The reciprocal of the Yielding Safety Factor the server stores; the panel converts in both directions</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Hint caption: typical values run 0.33 (conservative) to 1.0 (aggressive)</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Both checkboxes are plain labelled checkboxes — neither displays a computed value. The server's defaults when a limit set is written without them are a Yielding Safety Factor of 3 (a utilization factor of about 0.33), a Max Feed Per Tooth of 999, and both limit flags on.</p>
|
||||
<p>The minimum uncut chip thickness itself is not on this surface: no cutter endpoint returns it, and no field displays it. It is the WPF client's Optimization panel that computes it from the cutter and the project workpiece's cutting parameter and shows it beside the checkbox.</p>
|
||||
<h3 id="wpf-layout">WPF Layout</h3>
|
||||
<ul>
|
||||
<li>Milling Cutter Panel
|
||||
<ul>
|
||||
<li>Tabs
|
||||
<ul>
|
||||
<li>Flute-Profile Tab — the profile type dropdown plus the APT panel, and the <code>CustomSpinningProfile</code> option with its own geometry-management panel</li>
|
||||
<li>Upper-Beam Tab
|
||||
<ul>
|
||||
<li><a class="xref" href="../../geom/geom-manage-control.html">Geometry Management Control</a>, with the <a class="xref" href="../../../api/Hi.Geom.ExtendedCylinder.html">ExtendedCylinder</a> option enabled</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Property Tab
|
||||
<ul>
|
||||
<li>Integral Mode Selection Dropdown — Solid End / Insert End</li>
|
||||
<li>Cutter/Shank Mass Input Field (g), with an Auto Update CheckBox driven by <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_ShankMassAssignmentMode">ShankMassAssignmentMode</a>: when enabled the field turns readonly and shows the mass computed from the inner-beam and upper-beam volume and the density</li>
|
||||
<li>Hone Radius (um) and Relief Angle (deg) Input Fields</li>
|
||||
<li>Minimum Available Cutting Thickness (um), readonly, from <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_GetMinimumUncutChipThickness_um_Hi_MillingForces_Fittings_ICuttingPara_">GetMinimumUncutChipThickness_um(ICuttingPara)</a> with the project workpiece's <a class="xref" href="../../../api/Hi.NcMech.Workpieces.Workpiece.html#Hi_NcMech_Workpieces_Workpiece_CuttingPara">CuttingPara</a>, and a note label naming that cutting parameter</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Insert-Cutter Tab
|
||||
<ul>
|
||||
<li>Insert Number, Insert Mass (g) and Insert Thickness (mm) Input Fields; the thickness feeds heat transfer</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Material Tab</li>
|
||||
<li>Flute-Contours Tab</li>
|
||||
<li>Flute-Inner-Beam Tab
|
||||
<ul>
|
||||
<li>Profile Type Selection Dropdown for <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_InnerBeamProfile">InnerBeamProfile</a> — Flute Dependent Ratio (<a class="xref" href="../../../api/Hi.Milling.Cutters.FluteDependentRatioProfile.html">FluteDependentRatioProfile</a>), Const Ratio (<a class="xref" href="../../../api/Hi.Milling.Cutters.ConstRatioProfile.html">ConstRatioProfile</a>), Custom Spinning (<a class="xref" href="../../../api/Hi.Milling.Cutters.CustomSpinningProfile.html">CustomSpinningProfile</a>)</li>
|
||||
<li>For Flute Dependent Ratio: a readonly Radius Ratio field whose label also names the flute number it depends on</li>
|
||||
<li>For Const Ratio: an editable Radius Ratio field</li>
|
||||
<li>For Custom Spinning: a <a class="xref" href="../../geom/geom-manage-control.html">Geometry Management Control</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Optimization Tab — the same limits as the web section, plus the computed minimum uncut chip thickness beside the minimum-feed checkbox</li>
|
||||
<li>Info Tab
|
||||
<ul>
|
||||
<li>Name TextField (editable)</li>
|
||||
<li>AbstractNote TextField (readonly)</li>
|
||||
<li>Note TextField (editable)</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p><code>UserService.EnablePhysics</code> gates the Property, Material, Flute-Contours, Flute-Inner-Beam and Optimization tabs on this client; the Insert-Cutter tab additionally requires Insert End. Flute-Profile, Upper-Beam and Info are always visible. On the web only the Material section is gated, and the same preference is named <code>isShowPhysicsOptions</code>.</p>
|
||||
<p>Numeric fields on this client are formatted <code>G4</code>. The web's numeric field applies no format: it shows the value as stored and commits on blur or Enter.</p>
|
||||
<p>The cutter has no identity fields on the web. Tool ID, Note and the auto-derived Abstract Note belong to the tool, one level up, and are edited on the tool's own General tab; see <a class="xref" href="../index.html">Tool House Page</a>.</p>
|
||||
<h2 id="features">Features</h2>
|
||||
<p>Every web edit is a whole-object commit followed by a cache clear. The Flute Profile panel re-sends the entire shaper profile on any field change — only the fields the selected APT type carries are included — then clears the tool cache. The contour panels re-send the whole flute contour. The optimization panel re-sends the whole limit set. The material and coating endpoints each answer with the full cutter DTO, which the panels re-render from.</p>
|
||||
<p>A blanked numeric box commits nothing. The shared numeric field emits null for an empty entry, and every cutter panel returns on null rather than writing a zero, so clearing a field leaves the stored value alone.</p>
|
||||
<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>
|
||||
<p>HiNC-2025-webservice (Quasar CLI SPA):</p>
|
||||
<ul>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolHouseItemTypes.ts</code> — the item-type registry and the child builders: the cutter's five sections, the Material physics gate, and the fluting / flute / side / bottom sub-tree.</li>
|
||||
<li><code>wwwroot-src/src/router/treeRoutes.ts</code> — role-path to route translation; <code>CUTTER_SECTIONS</code> pins <code>material</code>, <code>profile</code>, <code>contours</code>, <code>upper-beam</code> and <code>opt</code>, and it also translates a <code>…/contours/tray…</code> id onto the <code>fluting</code> segment the node carries, so both spellings of the engine's Fluting type family resolve.</li>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolCutterPanel.vue</code> — the parent Cutter node: the type selector plus the cutter's General fields.</li>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/CutterSectionPanel.vue</code> — the one panel shared by the material / profile / upper-beam / opt sections, keyed off the node's last role segment. It renders the Flute Profile fields inline and delegates the other three.</li>
|
||||
<li><code>wwwroot-src/src/components/toolhouse/MaterialDiv.vue</code> — the Material section: flute material, the insert-end-only shank material, the solid-end note, and the coating list.</li>
|
||||
<li><code>wwwroot-src/src/components/toolhouse/CoatingLayersDiv.vue</code> — the coating rows: index badge, material picker, thickness, move toward surface / body, delete.</li>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/CutterContoursPanel.vue</code> — the Flute Contours stem: the Fluting Type selector.</li>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/FlutingPanel.vue</code> — the concrete fluting node: Flute Number for uniform, the flute count and Add Flute for free.</li>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/FluteContourPanel.vue</code> — one flute contour node: Setup Angle, and Delete This Flute for a free flute.</li>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/FluteSideContourPanel.vue</code> and <code>wwwroot-src/src/components/controlTree/toolhouse/FluteBottomContourPanel.vue</code> — the two sub-nodes: kind selector plus the matching form.</li>
|
||||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/fluteContourNode.ts</code> — the shared load and commit logic behind those three panels, and the rule that a contour is committed whole.</li>
|
||||
<li><code>wwwroot-src/src/components/toolhouse/fluting/ConstHelixSideContourDiv.vue</code>, <code>wwwroot-src/src/components/toolhouse/fluting/SlideBottomContourDiv.vue</code>, <code>wwwroot-src/src/components/toolhouse/fluting/FreeformSideContourDiv.vue</code> and <code>wwwroot-src/src/components/toolhouse/fluting/FreeformBottomContourDiv.vue</code> — the four contour parameter forms.</li>
|
||||
<li><code>wwwroot-src/src/components/toolhouse/fluting/SpanContourPosListDiv.vue</code> — the R / A / Z / R.Ang span-position table both freeform forms share.</li>
|
||||
<li><code>wwwroot-src/src/components/toolhouse/UpperBeamDiv.vue</code> — the Upper Beam section: the six allowed geometry kinds, the container-aware create, the resync-on-edit and the warnings banner.</li>
|
||||
<li><code>wwwroot-src/src/components/geom/GeometryEditor.vue</code> — the shared geometry editor that section reuses.</li>
|
||||
<li><code>wwwroot-src/src/components/toolhouse/MillingCutterOptLimitDiv.vue</code> — the Optimization section, including the Yielding Utilization Factor conversion.</li>
|
||||
<li><code>wwwroot-src/src/components/widgets/NumericInput.vue</code> — the numeric field every cutter form uses: no <code>G4</code>, commit on blur or Enter, revert on an unparseable entry.</li>
|
||||
<li><code>wwwroot-src/src/components/widgets/FilePathInput.vue</code> — the picker behind the material selectors; its resource-only mode hides the absolute Browse item and leaves Browse Resource….</li>
|
||||
<li><code>wwwroot-src/src/stores/appState.ts</code> — holds <code>isShowPhysicsOptions</code>, the Advanced Physics preference that gates the Material section.</li>
|
||||
<li><code>wwwroot-src/src/i18n/en/toolhouse.ts</code> — every label quoted above: <code>cutter.*</code>, <code>material.*</code>, <code>contour.*</code>, <code>fluting.*</code>, <code>upperBeam.*</code> and <code>opt.*</code>.</li>
|
||||
<li><code>wwwroot-src/src/api/toolHouse.ts</code> — the typed wrapper over <code>/api/Cutter</code>: shaper profile, fluting, the free-contour CRUD, the material and coating endpoints, the upper beam and the opt limit.</li>
|
||||
<li><code>Mech/CutterController.cs</code> — the cutter backend: the APT construction from the profile DTO, the fluting builders, the opt-limit defaults, the solid-end shank-material mirroring, and the cache clear every field and geometry mutator performs.</li>
|
||||
<li><code>Mech/CutterDtoBuilder.cs</code> — the read-side cutter DTO: integral mode, general, shaper profile, fluting, opt limit and material.</li>
|
||||
<li><code>Mech/ToolHouseController.cs</code> — the tool detail that embeds that DTO, which every cutter section refreshes from.</li>
|
||||
</ul>
|
||||
<h2 id="see-also">See Also</h2>
|
||||
<ul>
|
||||
<li><a class="xref" href="../../geom/extended-cylinder-panel.html">Extended Cylinder Panel</a> — the Upper Beam's kind that exists
|
||||
for this cutter, and the one surface that gives it a start section</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>
|
||||
@@ -0,0 +1,34 @@
|
||||
|
||||
<div id="sidetoggle">
|
||||
<div>
|
||||
<div class="sidefilter">
|
||||
<form class="toc-filter">
|
||||
<span class="glyphicon glyphicon-filter filter-icon"></span>
|
||||
<span class="glyphicon glyphicon-remove clear-icon" id="toc_filter_clear"></span>
|
||||
<input type="text" id="toc_filter_input" placeholder="Filter by title" onkeypress="if(event.keyCode==13) {return false;}">
|
||||
</form>
|
||||
</div>
|
||||
<div class="sidetoc">
|
||||
<div class="toc" id="toc">
|
||||
|
||||
<ul class="nav level1">
|
||||
<li>
|
||||
<a href="index.html" name="" title="Overview">Overview</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="cutter-panel.html" name="" title="Cutter Panel">Cutter Panel</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="milling-cutter-panel.html" name="" title="Milling Cutter Panel">Milling Cutter Panel</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="freeform-remover-panel.html" name="" title="Freeform Remover Panel">Freeform Remover Panel</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="apt-profile-panel.html" name="" title="APT Profile Panel">APT Profile Panel</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,2 @@
|
||||
|
||||
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Cutter Panel","href":"cutter-panel.html","topicHref":"cutter-panel.html"},{"name":"Milling Cutter Panel","href":"milling-cutter-panel.html","topicHref":"milling-cutter-panel.html"},{"name":"Freeform Remover Panel","href":"freeform-remover-panel.html","topicHref":"freeform-remover-panel.html"},{"name":"APT Profile Panel","href":"apt-profile-panel.html","topicHref":"apt-profile-panel.html"}]}
|
||||
Reference in New Issue
Block a user