Archived
249 lines
23 KiB
HTML
249 lines
23 KiB
HTML
<!DOCTYPE html>
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>Tool House Page | HiAPI-C# 2025 </title>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="title" content="Tool House Page | 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-ToolHousePage">
|
||
<h1 id="tool-house-page">Tool House Page</h1>
|
||
|
||
<p>The Tool House is a page of its own at <code>/tool-house/:toolId?/:tab?/:subtab?</code>, reached from the menu bar's <code>Page ▾</code> dropdown. In the WPF client it is a sub-window opened from the <a class="xref" href="../shell/main-panel.html">Main Panel</a>.</p>
|
||
<p>The key model is MachiningToolHouse.
|
||
The model <code>UserService</code> is per-client. On the web it is the server-side <code>Environments/UserService.cs</code>, which <code>Mech/ToolHouseDisplayController.cs</code> reads <code>EnablePhysics</code> from; the WPF client resolves its own <code>UserService</code> from the application's service provider.</p>
|
||
<h2 id="layout">Layout</h2>
|
||
<p>Three columns, left to right, in two nested resizable splitters — the tool house and its tool list, the selected tool's editor tabs, and the tool canvas. Creating a tool opens no window of its own: <strong>New Tool</strong> adds a default tool and the user sets it up in the editor tabs.</p>
|
||
<ul>
|
||
<li>Tool House Page
|
||
<ul>
|
||
<li>Tool List Column
|
||
<ul>
|
||
<li>Tool House Root Panel
|
||
<ul>
|
||
<li><a class="xref" href="../widget/object-management-menu-button.html">Object Management Menu Button</a>
|
||
<ul>
|
||
<li>file extension is <code>.MachiningToolHouse</code>, load type <code>Hi.Machining.MachiningToolHouse, HiMech</code></li>
|
||
<li>The managed object is the whole tool house, not one tool</li>
|
||
</ul>
|
||
</li>
|
||
<li>New Tool Button (disabled until the project has a tool house)</li>
|
||
<li>Ready / No-Project Badge</li>
|
||
<li>Tool-count caption with the pick hint — replaced, while the project has no tool house, by an empty-state block naming New Tool and the Object Management button's <code>.MachiningToolHouse</code> extension</li>
|
||
</ul>
|
||
</li>
|
||
<li>Tool List
|
||
<ul>
|
||
<li>one router-link row per tool: the Tool ID badge, then the tool's note — or the auto abstract note as an italic caption when the note is empty</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>Selected Tool Editor Column
|
||
<ul>
|
||
<li><a class="xref" href="stick-tool-panel.html">Stick Tool Panel</a> — the tool's five tabs: General, Cutter, Holder, Clamping, Int. Holder</li>
|
||
</ul>
|
||
</li>
|
||
<li>Viewer Column
|
||
<ul>
|
||
<li>Viewer ToolBar
|
||
<ul>
|
||
<li><a class="xref" href="../widget/renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a></li>
|
||
<li>Display Options Menu Dropdown — three flat groups, no submenus
|
||
<ul>
|
||
<li>Head Label: Cutter
|
||
<ul>
|
||
<li>Show Cutter CheckBox</li>
|
||
</ul>
|
||
</li>
|
||
<li>Head Label: Holder
|
||
<ul>
|
||
<li>Show Holder CheckBox</li>
|
||
<li>Show Geometry Anchor CheckBox</li>
|
||
<li>Show Spindle Buckle CheckBox</li>
|
||
<li>Show Cutter Buckle CheckBox</li>
|
||
</ul>
|
||
</li>
|
||
<li>Head Label: Holder Rendering Mode
|
||
<ul>
|
||
<li>Solid / Edge / Hide Radio Buttons</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>Selected-Tool Badge</li>
|
||
<li>Rendering-Connection Badge</li>
|
||
</ul>
|
||
</li>
|
||
<li>RenderingCanvas
|
||
<ul>
|
||
<li>The <a class="xref" href="../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a> is <a class="xref" href="../../api/Hi.Milling.MillingTools.MillingToolEditorDisplayee.html">MillingToolEditorDisplayee</a>.</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>The three anchor-and-buckle flags of <a class="xref" href="../../api/Hi.NcMech.Holders.HolderEditorDisplayee.html">HolderEditorDisplayee</a> and the Holder Rendering Mode radios are all disabled while Show Holder is off, so a child option is reachable only when its parent is on. The menu is one flat list of labelled groups rather than nested submenus, which is what keeps it one click deep.</p>
|
||
<p>The cutter's shape mode is not a control here. The server picks it when the canvas binds: <code>InitializeDisplay</code> sets <a class="xref" href="../../api/Hi.Milling.Cutters.MillingCutterEditorDisplayee.html#Hi_Milling_Cutters_MillingCutterEditorDisplayee_ShapeMode">ShapeMode</a> to Solid Bounding Shape whenever <code>UserService.EnablePhysics</code> is false, and the web Display Options dropdown offers no switch for it. The WPF page is the client whose Editor Displayee Options menu carries the Solid Bounding Shape / Detail Physics Shape radio submenu.</p>
|
||
<p>The left column is the other place the two clients differ. The WPF Tool House page lists its tools in a DataGrid with a checkbox column, an editable Tool ID column and a read-only Note column, and puts a Batch Actions menu above it — Select All, De-Select All, then Batch Duplicate and Batch Delete — with Duplicate and Delete also on the grid's context menu. On the web page Tool ID and Note are edited on the selected tool's General tab, where Duplicate and Delete are per-tool icon buttons, so the list itself stays a plain navigation column of router links.</p>
|
||
<p>The Tool ID can not be repeated. Create Tool takes the largest existing ID plus 1 (or 1 in an empty house), Duplicate Tool inserts the clone at the first free ID past both the source and the largest existing ID, and renaming a tool onto an ID the house already holds is refused as a conflict.</p>
|
||
<p>When the canvas first binds, <code>InitializeDisplay</code> attaches the <a class="xref" href="../../api/Hi.Milling.MillingTools.MillingToolEditorDisplayee.html">MillingToolEditorDisplayee</a> and snaps the camera to the isometric view. Each later tool selection re-points that displayee's <code>MillingToolGetter</code> at the chosen tool and calls the renderingCanvas.<a class="xref" href="../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToHomeView">SetViewToHomeView()</a>.</p>
|
||
<h3 id="duplication-button">Duplication Button</h3>
|
||
<p>Use <a class="xref" href="../../api/Hi.Milling.MillingTools.MillingTool.html#Hi_Milling_MillingTools_MillingTool_Duplicate_System_Object___">Duplicate(params object[])</a> to duplicate the tool; the clone joins the house under a fresh ID.</p>
|
||
<h3 id="tool-row-note">Tool Row Note</h3>
|
||
<p>A tool's row shows its note when the note exists and is not an empty string; otherwise it shows the <a class="xref" href="../../api/Hi.Milling.MillingTools.MillingTool.html#Hi_Milling_MillingTools_MillingTool_AbstractNote">AbstractNote</a>, set in an italic caption so the auto-derived text reads as a fallback.</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). The page is built on the shared Control Tree: the tool nodes on the left, the selected node's tab cascade in the middle, the canvas on the right.</p>
|
||
<ul>
|
||
<li><code>wwwroot-src/src/router/routes.ts</code> — declares the route itself: path <code>tool-house/:toolId(\d+)?/:tab?/:subtab?</code>, name <code>tool-house</code>.</li>
|
||
<li><code>wwwroot-src/src/components/AppMenuBar.vue</code> — the <code>Page ▾</code> dropdown; its first item targets the <code>tool-house</code> route.</li>
|
||
<li><code>wwwroot-src/src/router/treeRoutes.ts</code> — declares <code>TOOL_TABS</code>, <code>CUTTER_SECTIONS</code> and <code>HOLDER_SECTIONS</code>, and <code>routeForTreeId</code> / <code>migrateLegacyTreeId</code>, which map a Control-Tree id onto this page's tab params.</li>
|
||
<li><code>wwwroot-src/src/composables/useRouteTabs.ts</code> — the <code>:tab?</code> / <code>:subtab?</code> URL sync, defaulting to <code>general</code>, and to <code>profile</code> under Cutter / <code>geometry</code> under Holder.</li>
|
||
<li><code>wwwroot-src/src/composables/useToolHouse.ts</code> — the module-singleton state every tool-house panel and the canvas share: the tool list, the active tool, the tool-house key and the rendering connection id.</li>
|
||
<li><code>wwwroot-src/src/pages/ToolHousePage.vue</code> — routed page: <code>ToolHouseRootPanel</code> + tool list on the left, the tool's own five-tab strip in the middle, <code>ToolHouseSetupPanel</code> on the right, in two nested resizable <code><q-splitter></code> panes. Cutter and Holder grow a second, URL-synced sub-tab strip from the tab node's children, and <code>NodeTabCascade.vue</code> hosts the active tab's panel and the levels nested below it.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/NodeTabCascade.vue</code> — the nested-level host the page mounts inside the active tab.</li>
|
||
<li><code>wwwroot-src/src/components/toolhouse/ToolHouseSetupPanel.vue</code> — the canvas column: one RenderingCanvas bound server-side to <code>MillingToolEditorDisplayee</code>, following the page's selected tool, with the Display Options dropdown (Show Cutter / Show Holder + the 3 anchor-and-buckle flags + the Holder Rendering Mode radios).</li>
|
||
<li><code>wwwroot-src/src/components/widgets/DisplayOptionsMenu.vue</code> — the generic groups/items dropdown that panel feeds, which is why the menu is flat groups rather than nested submenus.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolHouseItemTypes.ts</code> — the tool house's ItemType registry: one tool node per tool, and each tool node's <code>…/cutter</code>, <code>…/holder</code>, <code>…/clamping</code>, <code>…/intelligent</code> children.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolHouseRootPanel.vue</code> — the tool-house root node: Object Management over the <code>MachiningToolHouse</code> + New Tool. The button's own entries are <strong>Load</strong>, <strong>Save As</strong>, <strong>Copy</strong>, <strong>Paste</strong> and <strong>XML</strong>; the <strong>Load Resource</strong> entry is conditional on a <code>resourceDirectory</code> prop this panel does not pass, so it is absent here.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolNodePanel.vue</code> — one tool's General tab: Tool ID / Note / auto Abstract Note + Duplicate / Delete. Mounting it points the tool canvas at that tool.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolCutterPanel.vue</code> — the Cutter stem: cutter type selector plus the MillingCutter identity fields (Shank Mass / Hone Radius / Relief Angle).</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/CutterSectionPanel.vue</code> — the cutter's inner tabs, keyed off the node's role path (<code>material</code> / <code>profile</code> / <code>upper-beam</code> / <code>opt</code>). Flute Profile is edited inline; the others dispatch to <code>wwwroot-src/src/components/toolhouse/MaterialDiv.vue</code> (which grows <code>CoatingLayersDiv.vue</code>), <code>wwwroot-src/src/components/toolhouse/UpperBeamDiv.vue</code> and <code>wwwroot-src/src/components/toolhouse/MillingCutterOptLimitDiv.vue</code>.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/CutterContoursPanel.vue</code> — the Flute Contours stem: the fluting <strong>type</strong> selector only. The selected fluting's editor grows below it.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/FlutingPanel.vue</code> — the concrete fluting node and its fluting-level fields; uniform fluting grows one Baseline Contour, free fluting one tab per flute.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/FluteContourPanel.vue</code> — one flute contour node (<code>baseline</code>, or <code>flute-<i></code> for a free fluting): hosts Setup Angle, with Side Contour and Bottom Contour as sub-tabs. <code>fluteContourNode.ts</code> carries the shared re-commit.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/FluteSideContourPanel.vue</code> / <code>FluteBottomContourPanel.vue</code> — kind selector + editor, dispatching to <code>wwwroot-src/src/components/toolhouse/fluting/ConstHelixSideContourDiv.vue</code>, <code>FreeformSideContourDiv.vue</code>, <code>SlideBottomContourDiv.vue</code> and <code>FreeformBottomContourDiv.vue</code>; the two freeform editors share <code>SpanContourPosListDiv.vue</code> for the per-flute position list.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolHolderPanel.vue</code> — the Holder stem: holder type selector plus the holder's Name / Note / auto Abstract Note, committed through the per-type holder controller.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/HolderSectionPanel.vue</code> — the Cylindroid holder's Geometry (the Z-R profile, via <code>wwwroot-src/src/components/geom/CylindroidEditor.vue</code>) and both holders' Resolution tabs; resyncs the Cylindroid holder (<code>UpdateByCylindroid()</code>) after each geometry edit. A Freeform holder's Geometry / Geom To Spindle / Geom To Cutter tabs are the generic <code>Geometry</code> / <code>Transformer</code> Control-Tree slots (<code>wwwroot-src/src/components/controlTree/GeometrySlotPanel.vue</code> / <code>TransformerSlotPanel.vue</code>), wired by <code>toolHouseItemTypes.ts</code> to <code>FreeformHolderController</code>'s keys and resync.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolClampingPanel.vue</code> — the Clamping tab: <code>ExposedCutterHeight</code> = <code>PreservedDistance</code> + <code>FluteHeight</code>; changing either field updates the other on the server.</li>
|
||
<li><code>wwwroot-src/src/components/controlTree/toolhouse/ToolIntelligentPanel.vue</code> — the Intelligent Holder tab; a thin wrapper over <code>wwwroot-src/src/components/toolhouse/IntelligentHolderDiv.vue</code> (Observation Location: <code>ObservationAnchorReference</code> dropdown + relative Z + ring radius).</li>
|
||
<li><code>wwwroot-src/src/api/toolHouse.ts</code> — typed wrapper over three server modules: <code>ToolHouseController</code> (<code>/api/ToolHouse</code>), <code>CutterController</code> (<code>/api/Cutter</code>) and <code>ToolHouseDisplayController</code> (<code>/api/mech/tool-house-display</code>).</li>
|
||
<li><code>wwwroot-src/src/api/cylindroidHolder.ts</code> / <code>wwwroot-src/src/api/freeformHolder.ts</code> — typed wrappers over <code>CylindroidHolderController</code> / <code>FreeformHolderController</code>.</li>
|
||
<li><code>Mech/ToolHouseController.cs</code> — the tool-house collection and the tool-level fields. REST endpoints: <code>GET /</code>, <code>GET /{id}</code>, <code>GET /GetHolder</code>, <code>GET/PUT /{id}/observation</code>, <code>PUT /{id}/note | exposed-height | preserved-distance</code>, <code>POST /Initialize | Update | SelectTool | CreateTool | DuplicateTool | RenameTool | SetHolderType | ClearToolCache</code>, <code>DELETE /DeleteTool</code>.</li>
|
||
<li><code>Mech/CutterController.cs</code> — cutter editing, the <code>/api/Cutter</code> sibling of <code>ToolHouseController</code>. REST endpoints at <code>/api/Cutter/*</code>: <code>POST EnsureCutter | ClearCutter</code>, <code>PUT /{id}/shaper-profile | fluting | general | opt-limit</code>, <code>FreeFluting</code> child CRUD at <code>/{id}/fluting/contours[/{index}]</code>, <code>GET/POST /{id}/upper-beam[/create | /resync]</code>, and the material endpoints <code>/{id}/flute-material/*</code>, <code>/{id}/shank-material/*</code>, <code>/{id}/coating-layers/*</code>.</li>
|
||
<li><code>Mech/ToolHouseDisplayController.cs</code> — REST endpoints at <code>/api/mech/tool-house-display/*</code> for display options (initialize, select-tool, show-cutter / show-holder / show-geom-anchor / show-spindle-buckle / show-cutter-buckle, holder-rendering-mode, cutter-shape-mode, clear-cache). <code>initialize</code> attaches the <code>MillingToolEditorDisplayee</code> and snaps to the isometric view; <code>select-tool</code> re-points the <code>MillingToolGetter</code> and snaps to the home view. It also reports <code>enablePhysics</code> from <code>UserService</code>.</li>
|
||
<li><code>Mech/CylindroidHolderController.cs</code> — holder-aware layer over a tool's <code>CylindroidHolder</code>. REST endpoints at <code>/api/CylindroidHolder/*</code>: <code>GET Get</code> (returns name / note / abstract note / resolution + indexes the holder's <code>Cylindroid</code>), <code>POST UpdateGeometryContent | SetName | SetNote | SetPolarResolution</code>. <code>UpdateGeometryContent</code> is the post-edit resync (<code>UpdateByCylindroid()</code> + <code>ClearCache()</code>) that the generic <code>CylindroidController</code> cannot perform.</li>
|
||
<li><code>Mech/FreeformHolderController.cs</code> — the Freeform counterpart. REST endpoints at <code>/api/FreeformHolder/*</code>: <code>GET Get</code> (name / note / abstract note / resolution + indexes the holder's geometry and two placement transformers under per-session keys), <code>POST CreateGeometry | UpdateGeometry | IndexCurrentGeometry | UpdateGeometryContent | UpdateGeomToSpindleTransformer | UpdateGeomToCutterTransformer | SetName | SetNote | SetPolarResolution</code>. Every shape edit ends in <code>UpdateByGeom()</code> + <code>ClearCache()</code> + <code>AlignAnchorByExposedCutterHeight()</code>, the resync the generic geometry and transformer controllers cannot perform.</li>
|
||
<li><code>Environments/UserService.cs</code> — the web client's own per-user service, living on the server; <code>ToolHouseDisplayController</code> reads <code>EnablePhysics</code> from it.</li>
|
||
</ul>
|
||
<div class="NOTE">
|
||
<h5>Note</h5>
|
||
<p>The fluting type is named loosely on the wire, and every spelling resolves. <code>PUT /{id}/fluting</code> accepts <code>UniformFluting</code> / <code>uniform</code> and <code>FreeFluting</code> / <code>free</code>, and equally <code>UniformContourTray</code> / <code>FreeContourTray</code>. A Control-Tree id whose cutter branch reads <code>…/contours/tray…</code> resolves to the <code>…/contours/fluting…</code> node.</p>
|
||
</div>
|
||
<p>One editor lives on the WPF client only, and the app says so where the type is chosen: the <strong>FreeformRemover</strong> cutter. Selecting that type on the web page keeps the existing model intact and shows a note pointing at the WPF client or HiNcRcl.</p>
|
||
<p>Three smaller surfaces are likewise the WPF client's: the InsertCutter and FluteInnerBeam physics groups, and the <code>CustomSpinningProfile</code> shaper-profile type — the web profile tab offers the five APT types (General / Ball / Column / Cone / Taper).</p>
|
||
<h2 id="see-also">See Also</h2>
|
||
<ul>
|
||
<li><a href="cutter/index.html">Cutter Tab</a> — the cutter half of a tool, and the editors each cutter type grows</li>
|
||
<li><a href="holder/index.html">Holder Tab</a> — the holder half, and the editors each holder type grows</li>
|
||
<li><a href="stick-tool-panel.html">Stick Tool Panel</a> — the selected tool’s tab cascade, which those two tabs belong to</li>
|
||
<li><a class="xref" href="../general-setup/index.html">General Setup Page</a> — the equipment these tools are mounted into</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>
|