This commit is contained in:
2026-09-09 17:35:23 +08:00
parent 2a98ae7556
commit 161af68fe3
1271 changed files with 58251 additions and 98639 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

@@ -1,186 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CAM Floating-Point Drift Triggers Floor-Contact Force Peaks | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="CAM Floating-Point Drift Triggers Floor-Contact Force Peaks | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="cam-floating-point-drift-triggers-floor-contact-force-peaks">CAM Floating-Point Drift Triggers Floor-Contact Force Peaks</h1>
<p>Layered (Z-stepped) cuts can produce force peaks that look like simulation bugs but reflect a real physical sensitivity: sub-micron contact between the cutter bottom face and the previous-layer floor produces a large force difference, and CAM-generated NC programs often drift between layers by similar amounts on whichever axis carries the repeated path. This coupling between CAM floating-point drift and sub-micron floor sensitivity is rarely recognized in typical workflows; HiNC surfaces and diagnoses it through smart-tool-holder validation and force-simulation comparison.</p>
<p>See also <a class="xref" href="nc-optimization-principles.html">NC Optimization</a> and <a href="corner-behavior.html">Corner Feedrate Behavior</a>.</p>
<h2 id="phenomenon">Phenomenon</h2>
<p>In a Z-stepped uniform cut, one or two specific layers occasionally show a sharp force spike. In the example below, the X-direction force peak reaches ~865 N where adjacent layers stay near a ~477 N steady level on a D16 mm cutter in aluminum. Users often interpret this as a simulation anomaly because the NC optimizer slows the feedrate dramatically at the spike.</p>
<p><img src="cam-floating-point-drift-img/layered-cut.png" alt="Layered cut schematic">
<em>Schematic of a Z-stepped layered cut. Each horizontal trace is one layer; sub-thousandth-mm in-plane drift between layers (Y in this example) shifts where each layer enters and exits the previous-layer floor.</em></p>
<p><img src="cam-floating-point-drift-img/spike-per-rev-force.png" alt="Per-revolution force on a spike layer">
<em>Spike layer that contacts the previous-layer ridge — X peaks reach ~865 N.</em></p>
<p><img src="cam-floating-point-drift-img/normal-per-rev-force.png" alt="Per-revolution force on a normal layer">
<em>Adjacent normal layer at the &ldquo;same&rdquo; XY — X stays near ~477 N.</em></p>
<h2 id="mechanism">Mechanism</h2>
<p>Smart-tool-holder measurements show that the cutter bottom face is sensitive to sub-micron contact with the previous-layer floor:</p>
<ul>
<li>A gap of less than 1 μm already produces a measurable force difference.</li>
<li>Below the minimum effective chip thickness — 7.5 μm in this example, and in general varying with workpiece material and cutter edge geometry — no chip is formed, but friction on the cutter's lower contact band still loads the spindle.</li>
<li>In simulation, modeling the cutter floor as lifted by 0.15 μm versus not lifted yields visibly different spindle-torque waveforms — and only the lifted version matches the real smart-holder torque shape.</li>
</ul>
<p>Simulation force peaks driven by floor contact therefore reflect a real sensitivity, not a numerical artifact.</p>
<h2 id="nc-side-trigger-layer-to-layer-drift">NC-Side Trigger: Layer-to-Layer Drift</h2>
<p>CAM-generated NC programs frequently drift by ~0.001 mm between consecutive Z layers when they traverse the &ldquo;same&rdquo; position. In the example below, the drift falls on Y; in other programs it may fall on X or any in-plane axis along the repeated path.</p>
<pre><code>N1000 G01 Y10.001 (layers 1..4)
N1100 G01 Y10.002 (layer 5)
N… G01 Y10.005 (last layer)
</code></pre>
<p>Each layer lands at a slightly different position relative to the previous floor. Some layers contact the leftover ridge from the layer above; others miss it. The contacting layers exhibit the peak.</p>
<h2 id="why-the-simulation-peak-is-real">Why the Simulation Peak Is Real</h2>
<p>The simulation force model simplifies how the cutter upper portion engages when the gap is below the minimum effective chip thickness, so the simulated peak may be slightly larger than the real peak. For ductile materials (aluminum being a representative case), friction dominates the cutting force, so the overestimate is small.</p>
<p>The actual machine has independent safety margins: the controller decelerates at corners (see <a href="corner-behavior.html">Corner Feedrate Behavior</a>), and cutter rotation provides a flute-level <a href="#probabilistic-peak-dodging">Probabilistic Peak Dodging</a> effect.</p>
<p>In the example above, the cutter remains inside its safe limits at the spike peak (~865 N versus the ~477 N baseline). Harder materials would be more prone to flute breakage at the same NC, but the fix is the same.</p>
<h2 id="probabilistic-peak-dodging">Probabilistic Peak Dodging</h2>
<p>For a multi-flute cutter, whether a contacting layer actually produces a peak depends on the flute phase at the contact moment. Force samples within one flute period typically split into:</p>
<ul>
<li>~6 samples in the high-force window (e.g., above ~500 N in the spike-layer chart above)</li>
<li>~3 samples low enough to &ldquo;miss&rdquo; the spike</li>
</ul>
<p>i.e., ~2/3 fall in the high-force window and ~1/3 miss it. This is why neighboring layers can give different results despite nominally identical geometry. It also explains why the issue is a yield problem rather than a deterministic failure — and why peaks still appear after fixing some, but not all, of the drifting NC lines.</p>
<h2 id="mitigation-fix-the-nc">Mitigation: Fix the NC</h2>
<p>Clean up the NC program rather than tune the simulation:</p>
<ul>
<li>Identify the drifting positions (typically a few dozen lines in a layered pocket) and snap the drifting coordinate to a consistent value across layers.</li>
<li>This restores a clean floor-to-floor relationship and removes the spurious peaks.</li>
</ul>
<p>Tuning the simulation around the peak would mask a signal that the controller and the cutter both feel in practice.</p>
<h2 id="when-the-nc-cannot-be-modified">When the NC Cannot Be Modified</h2>
<p>For mature client products the NC is often a frozen standard, and the floor-contact peaks have to be accepted on the simulation side. Two optimizer-side levers absorb the peaks without modifying the NC:</p>
<ul>
<li><p><strong><a class="xref" href="../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_MinFeedPerTooth_mm">MinFeedPerTooth_mm</a> (API)</strong> — a floor on the optimizer's chosen feed-per-tooth. Set it to a scaled fraction of the original feed so the optimizer cannot slow further at a single-revolution spike:</p>
<pre><code class="lang-csharp">MachiningStepBuilt += (preStep, curStep) =&gt;
{
curStep.UpdateNcOptOption(opt =&gt;
{
opt.MinFeedPerTooth_mm = FeedPerTooth_mm * scale;
});
};
</code></pre>
</li>
<li><p><strong><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptYieldingUtilizationFactor">OptYieldingUtilizationFactor</a> (API)</strong> — raise the acceptance threshold for the yield-stress ratio based on the observed stable extreme (e.g., if 150 % is routinely tolerated, set <code>1.5</code>). See <a href="nc-optimization-principles.html#tuning-peak-tolerance">Tuning Peak Tolerance</a> for the full set of per-metric factors and which can be relaxed.</p>
</li>
</ul>
<p>Prefer these over modifying cutting coefficients to suppress peaks. The coefficients describe material behaviour; tuning them away from physical values masks the real signal for every downstream calculation (force, moment, wear, thermal).</p>
<div class="NOTE">
<h5>Note</h5>
<p>The current API does not filter single-revolution spikes out of the optimization basis. If a client policy requires excluding such spikes, apply the levers above at the <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_MachiningStepBuilt">MachiningStepBuilt</a> (API) callback so per-step settings can be overridden without disturbing the global option.</p>
</div>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="probabilistic-peak-crack.html">Probabilistic Peak &amp; Cutter Crack</a> — The general statement of the probabilistic peak effect this section describes</li>
<li><a href="corner-behavior.html">Corner Feedrate Behavior</a> — Force-peak interaction with controller deceleration at corners</li>
<li><a href="smart-holder-training.html">Smart Holder Training</a> — Smart tool holder measurement that confirms sub-micron sensitivity</li>
<li><a href="relief-face-avoidance.html">Relief Face Avoidance</a> — Related geometry sensitivity on the relief side</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>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 561 KiB

@@ -1,184 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Optimized Feed Rate at Corners Is Lower Than Empirically Feasible | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Optimized Feed Rate at Corners Is Lower Than Empirically Feasible | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="optimized-feed-rate-at-corners-is-lower-than-empirically-feasible">Optimized Feed Rate at Corners Is Lower Than Empirically Feasible</h1>
<p>See also <a class="xref" href="nc-optimization-principles.html">NC Optimization</a> and the script command <a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a>.</p>
<h2 id="phenomenon">Phenomenon</h2>
<p>During NC feed rate optimization, corners often exhibit significant feed rate reductions — sometimes even lower than what is empirically known to be feasible. This puzzles users: actual machining at corners doesn't require such drastic reductions, so why does the optimization produce these results?</p>
<h2 id="controller-deceleration-at-corners">Controller Deceleration at Corners</h2>
<p>At corners, the controller <strong>automatically decelerates</strong> at high speeds. This is a built-in controller behavior as well as a hardware limitation, designed to ensure the machine can safely and accurately complete direction changes. The controller also provides parameters to adjust this acceleration/deceleration behavior.</p>
<h3 id="relationship-between-buffer-distance-and-speed">Relationship Between Buffer Distance and Speed</h3>
<p>The higher the speed, the longer the required buffer distance. The figure below shows machining conditions for several straight-line paths:</p>
<p><img src="corner-behavior-img/StraightLine-path.png" alt="Straight-line path machining conditions"></p>
<p>The figure labels the spindle speed (S) and feed rate (F) settings for different segments:</p>
<ul>
<li>through1/through2: S500, F200/F100</li>
<li>low1/low2/low3: S1200, F200/F400/F600</li>
<li>high1/high2/high3: S7200, F1200/F2400/F3600</li>
</ul>
<h2 id="why-corners-produce-force-peaks">Why Corners Produce Force Peaks</h2>
<p>Independently of feed-rate optimization, corners themselves generate force peaks that can be 34× the straight-line steady force. The mechanism is geometric:</p>
<ul>
<li><strong>Contact area grows at the corner.</strong> Two cut segments share the corner's swept volume, so during the turn the engaged arc on the cutter exceeds the steady-state arc.</li>
<li><strong>Friction force scales with contact area.</strong> For ductile materials (aluminum, nickel) friction is a large share of the cutting force, so the area increase translates directly into a torque/force peak. Both bending moment and torque feel it.</li>
<li><strong>CAM can amplify the contact area.</strong> Layer-to-layer drift or imperfect corner alignment in CAM-generated NC leaves residual ridges that increase the corner sweep on subsequent layers; the peak then reflects both the geometric corner effect and the CAM-side drift. See <a href="cam-floating-point-drift.html">CAM Floating-Point Drift</a> for the floor-contact mechanism that compounds with this.</li>
<li><strong>Peaks are expected, not artifacts.</strong> As long as the corner geometry is correctly aligned, peaks will appear in simulation; absent them, suspect a misalignment.</li>
</ul>
<p>A peak contained inside a single revolution is itself a partial safety margin — controller corner smoothing and spindle inertia together absorb a single-rev overshoot. Sustained peaks across multiple revolutions are a different story: they drag the spindle below commanded rpm and compound through feed-per-tooth growth. See <a href="nc-optimization-principles.html#tuning-peak-tolerance">Tuning Peak Tolerance</a> for which metrics can be relaxed in response and which cannot.</p>
<h2 id="force-simulation-error-analysis">Force Simulation Error Analysis</h2>
<p>The figure below shows the force simulation error after applying and comparing dynamometer data, with blue-to-red indicating error ratio from low to high:</p>
<p><img src="corner-behavior-img/corner-force-overview.png" alt="Corner force error overview"></p>
<h3 id="error-characteristics">Error Characteristics</h3>
<p>The following characteristics can be observed from the figure:</p>
<ol>
<li><strong>Errors increase closer to tool retraction (corners toward the Z direction)</strong></li>
<li><strong>Higher feed rates result in longer high-error intervals</strong></li>
</ol>
<h3 id="error-sources">Error Sources</h3>
<p>The errors mainly originate from <strong>controller deceleration</strong>. From the per-revolution waveform at the <code>F3600</code> corner in the lower part of the figure:</p>
<table>
<thead>
<tr>
<th>Data Source</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Left (simulated ideal force)</td>
<td>Ideal cutting force calculated based on the set feed rate</td>
</tr>
<tr>
<td>Right (dynamometer data)</td>
<td>Measured cutting force, approximately one-third of the ideal force</td>
</tr>
</tbody>
</table>
<p>The test material was S45C. At that location, <strong>the actual feed should be even lower than one-third of the ideal feed</strong>.</p>
<h2 id="why-is-the-optimized-value-lower-than-the-empirical-value">Why Is the Optimized Value Lower Than the Empirical Value?</h2>
<p>During NC feed rate optimization, corners often show significant feed rate reductions. Beyond the fact that corners typically produce higher cutting forces, the reason the optimized value is lower than the empirically feasible feed rate is:</p>
<blockquote>
<p><strong>The controller has already reduced the feed rate on its own; the optimization simply reveals this.</strong></p>
</blockquote>
<p>In other words, the optimization result reflects the feed rate actually executed by the controller, not the feed rate specified in the NC program. This &ldquo;excessively low&rdquo; optimized value is in fact the real machine behavior.</p>
<h2 id="conclusion">Conclusion</h2>
<p>When you find that the optimized feed rate at corners is unusually low, this is typically not a system error but rather:</p>
<ol>
<li>The controller has already automatically reduced the actual feed rate for safe cornering</li>
<li>The optimization function faithfully reflects this deceleration behavior</li>
<li>Even if you set the empirical value, the controller would still decelerate to a similar value during actual machining</li>
</ol>
<p>Understanding this phenomenon allows you to evaluate optimization results more rationally and adjust cornering strategies or machine parameters as needed.</p>
<h2 id="tracking-the-limiting-physical-quantity-per-step">Tracking the Limiting Physical Quantity per Step</h2>
<p>To find out which physical quantity limits the feed rate at each individual step, refer to the <a href="nc-optimization-principles.html#tracking-physical-quantity-constraints-of-individual-steps">Tracking Physical Quantity Constraints of Individual Steps</a> section in <a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a>.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 KiB

@@ -1,153 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CPU Usage During Simulation | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="CPU Usage During Simulation | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="cpu-usage-during-simulation">CPU Usage During Simulation</h1>
<h2 id="simulation-computation-threads">Simulation Computation Threads</h2>
<p>Time-series data is computed on a single thread (using only one CPU core at a time); other data can be computed in parallel.</p>
<h3 id="geometry-removal">Geometry Removal</h3>
<p>Geometry removal is single-threaded because sequential cutting is required to obtain the correct CWE (Cutter-Workpiece Engagement). The workpiece geometry surface after removal appears in light pink, which typically indicates that the physics for that region have not yet been computed.</p>
<h3 id="physics-computation">Physics Computation</h3>
<p>Cutting force computation begins after CWE is obtained. Since it is independent of computation order, it runs in multi-threaded mode under normal conditions. Torque and other physical quantities are also computed in parallel during this stage.</p>
<p>Temperature computation must follow time-series order, so it converges back to a single thread.</p>
<p>The entire machining simulation alternates between these modes. Once a step is fully computed, it is colored according to the designated indicator.</p>
<h2 id="two-independent-cost-drivers">Two Independent Cost Drivers</h2>
<p>Total simulation time comes from two largely independent parts:</p>
<ul>
<li><strong>Per-step physics</strong> (force, torque, power, temperature, wear) — computed once per <strong>step</strong>. The total physics cost scales with the <strong>number of steps</strong>, which is set by the <a href="../../workflows/basic-simulation.html#33-machining-motion-resolution">machining motion resolution</a> together with the spindle revolutions along the toolpath. It does <strong>not</strong> depend on the mesh resolution, and it does <strong>not</strong> depend on the overall workpiece size.</li>
<li><strong>Geometry removal</strong> (voxel subtraction) — its cost is set by the mesh resolution (<a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_MachiningResolution_mm">MachiningResolution_mm</a>). A finer mesh (smaller value) is more expensive; a coarser mesh (larger value) is cheaper. Removal work is localized to the toolworkpiece contact region, so it is roughly area-scaled and, again, largely independent of the bulk workpiece size.</li>
</ul>
<p><code>MachiningResolution_mm</code> genuinely controls the removal resolution — it is <strong>not</strong> clamped away or ignored. But because removal and physics run concurrently, the <strong>larger</strong> of the two costs governs wall-clock time:</p>
<ul>
<li>When geometry removal dominates — <strong>the common case at the fine resolutions real NC machining needs</strong> — a finer mesh is much slower, and a coarser mesh reduces total time.</li>
<li>When the mesh is coarse enough that geometry removal is already cheap, several <strong>fixed per-step costs</strong> (physics, thermal/wear, per-step bookkeeping) dominate instead. Coarsening further — e.g. raising <code>MachiningResolution_mm</code> from 1.0 to 2.0 mm — then barely changes total time; to speed up, <strong>reduce the number of steps</strong> with a coarser motion resolution. (Note: 12 mm is already very coarse for NC machining.)</li>
</ul>
<h2 id="cpu-usage">CPU Usage</h2>
<h3 id="coarse-mesh--physics-bound">Coarse Mesh — Physics-Bound</h3>
<p>When the mesh is coarse (a large <code>MachiningResolution_mm</code>), geometry removal is faster than physics computation, so a large area of light pink follows behind the tool during simulation. There is a cap on the number of unfinished steps; geometry removal only proceeds when the count is within that limit. When physics computation cannot keep up with geometry removal, the number of pink steps stays constant.</p>
<p>In this scenario, the workload is primarily multi-core (physics computation), and you are more likely to see high multi-core CPU utilization. Making the mesh even coarser will not reduce total time — the step count (physics) is the limit.</p>
<p><img src="cpu-usage-img/geom-quick.png" alt="Coarse mesh: geometry removal outruns physics, leaving a large pink trail"></p>
<h3 id="fine-mesh--geometry-bound">Fine Mesh — Geometry-Bound</h3>
<p>When the mesh is fine (a small <code>MachiningResolution_mm</code>), geometry removal is slower than physics computation, so the light pink area is barely visible.</p>
<p>In this scenario, the workload is primarily single-core (geometry computation), and a coarser mesh will reduce total time.</p>
<p><img src="cpu-usage-img/geom-slow.png" alt="Fine mesh: physics keeps up with geometry removal, almost no pink trail"></p>
<h3 id="balanced-state">Balanced State</h3>
<p>If the geometry resolution is such that geometry and physics computation do not bottleneck each other, the light pink area appears and fluctuates within a certain range. In this case, physics computation does not hold back geometry computation, and geometry computation is typically the performance bottleneck.</p>
<h3 id="cpu-not-fully-utilized">CPU Not Fully Utilized</h3>
<p>Possible reasons why the CPU is not fully utilized include:</p>
<ul>
<li>The operating system reserves headroom to ensure the GUI remains responsive. For example, Windows desktop applications (such as WPF) lower the priority of non-GUI threads by one level.</li>
<li>The software/hardware throughput has reached its limit for the process.
The reported CPU usage may not reach 100%, but other resources such as cache and bus bandwidth may be saturated. System-level factors like branch misprediction are also not reflected in the reported CPU usage.</li>
</ul>
<p>There is currently no solution for this.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -1,134 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Cutter Adjustment Levers for Force Reduction | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Cutter Adjustment Levers for Force Reduction | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="cutter-adjustment-levers-for-force-reduction">Cutter Adjustment Levers for Force Reduction</h1>
<p>When force peaks push close to or beyond tool limits, three cutter-side levers reduce peaks without changing the NC or the toolpath.</p>
<h2 id="shorten-tool-overhang">Shorten Tool Overhang</h2>
<p>The unsupported tool length above the cut multiplies bending stress. A common installation leaves 15 mm or more above the flute start; reducing this exposure toward ~5 mm typically produces a large drop in the yield-stress ratio for the same NC.</p>
<p>Process documents may fix the overhang for procedural reasons. If the engineering envelope allows, shortening the overhang is the cheapest mitigation before tuning anything else.</p>
<h2 id="adjust-core-radius">Adjust Core Radius</h2>
<p>Heavy-cut cutters narrow the chip-evacuation flute to thicken the cutter core, raising bending strength. The exact core radius cannot be measured externally; it is an empirical input.</p>
<p>The HiNC default is <code>0.6</code> (cutter-core radius as a fraction of cutter radius) for 4-flute end mills. If the cutter routinely tolerates yield-stress ratios around 200 % without breakage, the actual core is thicker than the default — raise the value in steps (e.g., <code>0.7</code>) until the simulated ratio aligns with the observed safety margin.</p>
<h2 id="upgrade-cutter-material">Upgrade Cutter Material</h2>
<p>The default <code>WC-Co6-800nm</code> is a low-cost grade. Finer-grain or coated grades have higher yielding stress and better thermal tolerance:</p>
<ul>
<li><strong><code>WC-Co6-TiC-400nm</code></strong> — finer grain with TiC. A reasonable upgrade when the cutter quality is unknown but suspected better than the baseline.</li>
</ul>
<p>For a known cutter, configure the matching material file under <code>Resource/CutterMaterial/</code> rather than guessing the grade.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="machinability.html">Evaluating Process Machinability</a> — Reading the yield-stress ratio and the spindle ratios</li>
<li><a href="nc-optimization-principles.html#tuning-peak-tolerance">Tuning Peak Tolerance</a> — Per-metric utilization factors and when each is safe to relax</li>
<li><a href="wear.html">Tool Life &amp; Wear</a> — Wear modes affected by material grade</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>
@@ -1,142 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Analysis | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Analysis | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="analysis">Analysis</h1>
<p>Theory, principles, and evaluation techniques for interpreting simulation results and understanding machining physics.</p>
<h2 id="physics-and-coordinates">Physics and Coordinates</h2>
<ul>
<li><a href="milling-physics-coordinates.html">Milling Physics Coordinates</a> — Coordinate systems used in milling physics</li>
</ul>
<h2 id="tool-behavior-and-wear">Tool Behavior and Wear</h2>
<ul>
<li><a href="machinability.html">Process Machinability</a> — Evaluating process machinability</li>
<li><a href="wear.html">Tool Life &amp; Wear</a> — Tool life and wear modes</li>
<li><a href="cutter-adjustment-levers.html">Cutter Adjustment Levers</a> — Overhang, core radius, and material-grade levers for reducing force peaks without changing the NC</li>
<li><a href="relief-face-avoidance.html">Relief Face Avoidance</a> — Minimum relief angle and clearance</li>
<li><a href="radial-angle-measurement.html">Radial Angle Measurement</a> — Measuring radial rake and relief angles</li>
<li><a href="cam-floating-point-drift.html">CAM Floating-Point Drift</a> — A subtle CAM-NC issue that most workflows miss: sub-thousandth-mm drift between layers triggers floor-contact force peaks. HiNC detects and diagnoses it.</li>
<li><a href="probabilistic-peak-crack.html">Probabilistic Peak &amp; Cutter Crack</a> — Why the same cut passes most of the time and only occasionally cracks the cutter: a narrow high-contact window sampled by discrete flutes</li>
</ul>
<h2 id="simulation-performance">Simulation Performance</h2>
<ul>
<li><a href="cpu-usage.html">CPU Usage in Simulation</a> — CPU utilization during simulation</li>
<li><a href="corner-behavior.html">Corner Feedrate Behavior</a> — Why optimized feed rates are lower at corners</li>
</ul>
<h2 id="advanced-topics">Advanced Topics</h2>
<ul>
<li><a href="smart-holder-training.html">Smart Holder Training</a> — Smart tool holder coefficient training</li>
<li><a href="spindle-capability.html">Spindle Capability</a> — Boundary curves, thermal envelope, and the four torque/power ratios</li>
<li><a href="spindle-power-evaluation.html">Spindle Power Evaluation</a> — Spindle power accuracy validation</li>
<li><a href="nc-optimization-principles.html">NC Optimization Principles</a> — Optimization objectives and tracking</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>
@@ -1,148 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Evaluating Process Machinability | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Evaluating Process Machinability | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="evaluating-process-machinability">Evaluating Process Machinability</h1>
<p>The <strong>machinability time-series chart</strong> can be used to evaluate tool breakage risk during machining.</p>
<p>Tool breakage occurs when any of the following exceeds 100% and persists for longer than one simulation step: <strong>Yielding Stress Ratio</strong> <small>[<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_YieldingStressRatio">YieldingStressRatio</a> (API)]</small>, <strong>Max Spindle Torque Ratio</strong> <small>[<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_MaxSpindleTorqueRatio">MaxSpindleTorqueRatio</a> (API)]</small>, or <strong>Max Spindle Power Ratio</strong> <small>[<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_MaxSpindlePowerRatio">MaxSpindlePowerRatio</a> (API)]</small>.
If the value significantly exceeds 100% — roughly speaking, above 200% — tool breakage can occur even without sustained duration.</p>
<blockquote>
<p><strong>Note</strong>: The default simulation uses per-revolution milling mode, where one simulation step equals one spindle revolution.</p>
</blockquote>
<p><strong>Yielding Stress Ratio</strong> is a percentage indicator with the tool material's breakage force as the denominator. The numerator is the simulation step's absolute force <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_MaxAbsForce_N">MaxAbsForce_N</a><small>(API)</small>. Compared to using the absolute force value directly as a limit, the ratio incorporates tool material mechanics and more accurately reflects the tool's actual safety margin. The optimization target force <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptPreferedForce_N">OptPreferedForce_N</a><small>(API)</small> represents the desired MaxAbsForce_N after optimization.</p>
<p>For small tools, breakage is typically caused by insufficient tool force capacity, and breakage is based on the <strong>Yielding Stress Ratio</strong>.</p>
<p>For small-to-medium tools, breakage is typically caused by insufficient spindle performance, and breakage is based on the <strong>Max Spindle Torque Ratio</strong> or <strong>Max Spindle Power Ratio</strong>.
When cutting resistance exceeds spindle performance, the machine feed rate remains constant but the spindle speed continuously decreases, causing the feed per tooth to continuously increase, which drives cutting forces to spike until tool breakage or machine stoppage.
For the underlying boundary curves and how each ratio's denominator is computed at the current rpm, see <a href="spindle-capability.html">Spindle Capability</a>.</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Tool Breakage Solutions</strong></p>
<p>Modify the toolpath to reduce cutting width/depth, or use HiNC's optimization feature to adjust feed rates, bringing the <strong>Yielding Stress Ratio</strong>, <strong>Max Spindle Torque Ratio</strong>, and <strong>Max Spindle Power Ratio</strong> below 100%.</p>
</div>
<h2 id="ripple-on-curved-and-tilted-cuts-mesh-quantization">Ripple on Curved and Tilted Cuts (Mesh Quantization)</h2>
<p>On a nominally constant-engagement cut that is <strong>curved or tilted</strong> — arc or helical hole milling, ramping, or 5-axis moves — the <strong>Yielding Stress Ratio</strong> (and the underlying <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_MaxAbsForce_N">MaxAbsForce_N</a><small>(API)</small>) can show a small step-to-step ripple even though the theoretical engagement is steady. This is a discretization artifact, not a bug.</p>
<p><strong>Cause.</strong> The workpiece is represented by an axis-aligned cubic voxel mesh (see <a href="../../workflows/basic-simulation.html#31-workpiece-entity-resolution">Workpiece Entity Resolution</a>). Orthogonal cubes cannot represent a circle or an inclined face smoothly, so the removed volume and the contact engagement area quantize against the grid from step to step. That quantization shows up as ripple in the per-step peak force, and therefore in the ratio.</p>
<p><strong>What helps.</strong> A <strong>finer</strong> <code>MachiningResolution_mm</code> makes the quantization step smaller, so the ripple amplitude shrinks — at the cost of slower geometry removal (see <a href="cpu-usage.html">CPU Usage During Simulation</a>).</p>
<p><strong>What does <em>not</em> help.</strong> Switching to <strong>fixed-pace / sweeping</strong> motion resolution (<code>FixedPace</code>) does not remove this ripple. The ripple comes from the spatial cubic grid, not from the spacing between steps, so changing the step spacing leaves it essentially unchanged.</p>
<p><strong>Getting a smooth curve.</strong> There is no built-in filter that smooths step-series curves. If a smooth curve is needed for a report, post-process the exported CSV (<a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_WriteStepFiles_">WriteStepFiles</a><small>(API)</small>) yourself — e.g. a moving average. Note that the Yielding Stress Ratio is defined on the per-revolution <strong>peak</strong> force only (there is no averaged variant); the averaged force fields (<code>Avg…</code>) are inherently smoother when a trend, rather than the breakage peak, is what you need to read.</p>
<h2 id="thermal-plastic-deformation-of-cutting-edge">Thermal Plastic Deformation of Cutting Edge</h2>
<p>If the <strong>Thermal Yield Ratio</strong> <small>[<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_ThermalYieldRatio">ThermalYieldRatio</a> (API)]</small> exceeds 100%, thermal plastic deformation of the cutting edge occurs, accelerating wear.
Unlike the Yielding Stress Ratio, Max Spindle Torque Ratio, and Max Spindle Power Ratio, this is a long-term indicator — exceeding 100% does not cause immediate effects.</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Thermal Plastic Deformation Solutions</strong></p>
<p>After addressing tool breakage issues, reduce the spindle speed to allow sufficient time for the cutting edge to dissipate heat.</p>
<p>Note that whether the coolant is properly directed at the cutting edge has a significant impact. If the coolant is not aimed at the cutting edge, it effectively reduces the heat dissipation coefficient.</p>
</div>
<p>Tool manufacturers typically provide recommended machining conditions, and the Thermal Yield Ratio obtained by simulating under those conditions usually exceeds 100%. This is because the manufacturing formulations of tool materials differ from HiNC's conservatively set default values.
If you consider machining conditions with a Thermal Yield Ratio above 100% to be reasonable, you can adjust the thermal properties of the tool material so that the calculated Thermal Yield Ratio approaches 100%.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

@@ -1,133 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Milling Physics Coordinate Systems | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Milling Physics Coordinate Systems | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Milling-Physics-Coordinates">
<h1 id="milling-physics-coordinate-systems">Milling Physics Coordinate Systems</h1>
<p>Physical properties such as milling forces, milling torques, and deformations can be represented in different coordinate systems. Sensor raw data also corresponds to different coordinate systems.</p>
<p>When viewing physical simulation data in HiNC, you will often see coordinate system notations. This chapter explains the three coordinate systems shown in the figure below.</p>
<div class="NOTE">
<h5>Note</h5>
<p><img src="milling-physics-coordinates-img/Machining-3-Coordinate.png" alt="Machining-3-Coordinate"></p>
</div>
<h2 id="workpiece-coordinate-system">Workpiece Coordinate System</h2>
<p>Workpiece Coordinate System, abbreviated as <code>[W]</code>.</p>
<p>Usually the program origin coordinate system.</p>
<p>The workpiece coordinate system is consistent with the dynamometer coordinate system.</p>
<h2 id="tool-running-coordinate-system">Tool Running Coordinate System</h2>
<p>Tool Running Coordinate System, abbreviated as <code>[TR]</code>.</p>
<p>Takes the tool running direction excluding tool normal movement as +X, tool normal vector as +Z, and defines +Y by the right-hand rule. For climb milling, +Y direction is away from the wall.</p>
<p>The tool running coordinate system is suitable for understanding machining conditions.</p>
<h2 id="spindle-rotation-coordinate-system">Spindle Rotation Coordinate System</h2>
<p>Spindle Rotation Coordinate System, abbreviated as <code>[SR]</code>.</p>
<p>The tool running coordinate system rotated around the Z axis by spindle motion angle <span class="math">\(\theta\)</span> becomes the spindle rotation coordinate system.</p>
<p>The spindle rotation coordinate system is consistent with the smart tool holder coordinate system, as the smart tool holder sensor rotates with the spindle.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -1,196 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>NC Optimization | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="NC Optimization | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="NcOptimization">
<h1 id="nc-optimization">NC Optimization</h1>
<p>Also refer to the script commands section <a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a>.</p>
<h2 id="optimization-objective">Optimization Objective</h2>
<p>Optimization aims to make the physical quantities during machining as close to the target values as possible.</p>
<p>Since the optimization uses a conservative feed rate strategy, the physical quantities in the optimized NC code will be as close to <strong>equal to or less than</strong> the target values as possible.</p>
<h3 id="factors-determining-the-optimized-feed-rate">Factors Determining the Optimized Feed Rate</h3>
<p>The optimized feed rate is determined by:</p>
<ol>
<li><strong>Physical quantity constraints of individual <a class="xref" href="../runtime/step.html">steps</a></strong>: Feed rate limits calculated for each step based on target force, yielding stress, spindle torque, etc. For detailed descriptions of indicators such as yielding stress ratio and spindle torque ratio, refer to &quot;<a href="machinability.html">Evaluating Process Machinability</a>&quot;.</li>
<li><strong>Inter-step smoothing</strong>: Interactions such as acceleration/deceleration limits and extended distances.</li>
</ol>
<h2 id="differences-in-simulation-results-after-optimization">Differences in Simulation Results After Optimization</h2>
<p>Simulation with modified feed rates produces different interpolation points than before, resulting in:</p>
<ol>
<li>Different simulation mesh errors</li>
<li>Surface morphology changes at the surface roughness level</li>
</ol>
<p>Therefore, the simulated physical quantities after optimization may not always be equal to or below the target values — they may also be slightly above.</p>
<p>The influence of interpolation point density on surface morphology is greater at rounded corners than on straight lines, so this effect may be more pronounced at corners.</p>
<div class="TIP">
<h5>Tip</h5>
<p>For abnormally low optimized feed rates at corners, refer to <a href="corner-behavior.html">Corner Feed Rate Optimization</a>.</p>
</div>
<h2 id="velocity-smoothing">Velocity Smoothing</h2>
<p>The smoothing range terminates at macro commands or line commands with unresolvable paths.</p>
<p><em>Velocity smoothing</em> applies acceleration/deceleration limits based on the path length traversed by the current line command.
Therefore, <em>velocity smoothing</em> is effective for <em>re-interpolatable</em> regions;
however, for non-re-interpolatable regions, although acceleration/deceleration limits still apply, the excessively long path length of a single line may render them impractical in actual use.</p>
<h2 id="impact-of-geometric-errors">Impact of Geometric Errors</h2>
<p>Current NC optimization is based on an ideal geometric model. If the workpiece is a casting or has installation errors, a conservatively larger workpiece geometry should be configured in the system to prevent the system from misidentifying cutting regions as non-cutting regions, which could cause tool crashes.</p>
<h2 id="tool-breakage-solutions">Tool Breakage Solutions</h2>
<p>Modify the toolpath to reduce cutting width/depth, or use HiNC's optimization feature to adjust feed rates, bringing the <strong>yielding stress ratio</strong>, <strong>max spindle torque ratio</strong>, and <strong>max spindle power ratio</strong> below 100%.</p>
<p>For detailed descriptions of these indicators and tool breakage criteria, refer to &quot;<a href="machinability.html">Evaluating Process Machinability</a>&quot;.</p>
<h2 id="tuning-peak-tolerance">Tuning Peak Tolerance</h2>
<p>Optimization defaults treat the 100 % line on every ratio as a hard ceiling. In practice some metrics tolerate routine excursions and others don't. The per-metric <code>Opt*UtilizationFactor</code> levers let the optimizer accept higher peaks where physically safe.</p>
<table>
<thead>
<tr>
<th>Metric</th>
<th>Factor (API)</th>
<th>When to raise</th>
</tr>
</thead>
<tbody>
<tr>
<td>Yielding stress</td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptYieldingUtilizationFactor">OptYieldingUtilizationFactor</a></td>
<td><strong>Per-instant.</strong> Safe to raise. If 150 % is routinely tolerated without breakage, set <code>1.5</code>. Controller corner smoothing and spindle inertia absorb a single-revolution overshoot.</td>
</tr>
<tr>
<td>Spindle torque</td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptSpindleTorqueUtilizationFactor">OptSpindleTorqueUtilizationFactor</a></td>
<td><strong>Cumulative.</strong> Keep at 1. Sustained excursions stall the spindle: feed continues, rpm drops, feed-per-tooth grows, forces spike further.</td>
</tr>
<tr>
<td>Spindle power</td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptSpindlePowerUtilizationFactor">OptSpindlePowerUtilizationFactor</a></td>
<td><strong>Cumulative.</strong> Keep at 1. Same reason as torque.</td>
</tr>
<tr>
<td>Thermal yield</td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptThermalYieldUtilizationFactor">OptThermalYieldUtilizationFactor</a></td>
<td><strong>Long-term.</strong> Can be raised modestly if the calibrated tool material is more thermally tolerant than the conservative defaults — see <a href="machinability.html#thermal-plastic-deformation-of-cutting-edge">Thermal Plastic Deformation of Cutting Edge</a>.</td>
</tr>
</tbody>
</table>
<p>Rule of thumb: relax per-instant per-step metrics based on observed stable extremes; never relax cumulative metrics.</p>
<p>For a complementary feed-rate floor lever — useful when the NC cannot be modified to remove single-revolution peaks — see <a class="xref" href="../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_MinFeedPerTooth_mm">MinFeedPerTooth_mm</a> (API) and <a href="cam-floating-point-drift.html#when-the-nc-cannot-be-modified">When the NC Cannot Be Modified</a>.</p>
<h2 id="thermal-edge-chipping-solutions">Thermal Edge Chipping Solutions</h2>
<p>After addressing tool breakage issues, reduce the spindle speed to allow sufficient time for the cutting edge to dissipate heat.</p>
<p>Note that whether the coolant is properly directed at the cutting edge has a significant impact.</p>
<h2 id="tracking-physical-quantity-constraints-of-individual-steps">Tracking Physical Quantity Constraints of Individual Steps</h2>
<p>To determine which physical quantity limits the feed rate for an individual step, first disable smoothing-related settings, then enable logging:</p>
<pre><code class="lang-csharp">OptMaxAcceleration_mmds2 = double.PositiveInfinity;
OptFeedrateAssignmentRatio = 0;
OptExtendedPreDistance_mm = 0;
OptExtendedPostDistance_mm = 0;
EnableIndividualStepAdjustmentLog = true;
EmbeddedLogMode = NcOptimizationEmbeddedLogMode.FullLog;
</code></pre>
<p>After running the optimization, inspect the <code>.IndependentStepAdjustment.log</code> file to view the independent optimization calculation results for each step and identify which physical quantity limited the feed rate.</p>
<p>For detailed field descriptions of the log file, refer to the <a href="../../workflows/nc-optimization.html#optimization-logs">Optimization Logs</a> section in the <a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a> workflow.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

@@ -1,144 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Probabilistic Peak: Why a Cut Passes Most of the Time and Occasionally Cracks the Cutter | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Probabilistic Peak: Why a Cut Passes Most of the Time and Occasionally Cracks the Cutter | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="probabilistic-peak-why-a-cut-passes-most-of-the-time-and-occasionally-cracks-the-cutter">Probabilistic Peak: Why a Cut Passes Most of the Time and Occasionally Cracks the Cutter</h1>
<p><img src="probabilistic-peak-crack-img/dartboard-engagement.png" alt="Spindle-moment dartboard and the matching 3D engagement for one spindle revolution">
<em>Left — spindle-moment dartboard. The <code>(Mx, My)</code> moment-vector tip is drawn as a closed
locus over one spindle revolution, coloured by the axial moment <code>Mz</code>; the concentric rings
are moment magnitude (Nm). For most of the revolution the locus stays near the centre —
small fluteworkpiece contact length, small moment. One narrow lobe stretches out to the
outer rings: the angle where the contact length spikes and produces the large force that
can crack the flute. Right — the 3D engagement at that high-load phase, showing the flute
deeply engaged with the workpiece.</em></p>
<h2 id="the-mechanism">The Mechanism</h2>
<p>The fluteworkpiece contact length is small for most spindle angles and spikes only inside
one <strong>narrow angular window</strong>. The large force — and the crack risk — exists only inside
that window.</p>
<p>The cutter's flutes are <strong>discrete</strong>. Whether a cutting flute actually lands inside the
narrow high-contact window is a matter of flute phase, not a certainty:</p>
<ul>
<li><strong>High probability</strong> — the flutes fall in the wide low-contact region and step over the
window. The pass completes safely.</li>
<li><strong>Low probability</strong> — a flute lands inside the narrow window, takes the full contact
length, and sees the large force. The flute can crack.</li>
</ul>
<p>This is why a cut with a clear high-contact window still passes most of the time and only
occasionally breaks the cutter, and why nominally identical geometry can pass on one pass
and crack on another. It is the same effect documented under
<a href="cam-floating-point-drift.html#probabilistic-peak-dodging">Probabilistic Peak Dodging</a>.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="cam-floating-point-drift.html">CAM Floating-Point Drift</a> — a concrete case of the same
probabilistic peak effect, triggered by sub-micron floor contact.</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>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

@@ -1,142 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Primary Relief Angle Clearance | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Primary Relief Angle Clearance | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="primary-relief-angle-clearance">Primary Relief Angle Clearance</h1>
<p>All relief angles discussed in this article refer to the primary relief angle — the relief angle closest to the cutting zone. Also known as the clearance angle.</p>
<p>During cutting, the milling cutter edge follows a trochoidal motion, shown as the red trochoid in the figure below. The blue circle is the tool envelope circle.</p>
<p>The region inside the red trochoid (toward the center of the envelope circle) is the already-cut area; the region outside the red trochoid is the uncut area. If the relief face falls in that region, it will collide with the uncut material.
Therefore, <strong>the angle marked RA (abbreviation for Relief Angle) represents the minimum required relief angle.</strong></p>
<p><img src="relief-face-avoidance-img/relief-angle.png" alt="relief-angle.png"></p>
<p>If the actual tool relief angle is smaller than the minimum required relief angle, the clearance face will press against the uncut workpiece, increasing forces on both the tool and the workpiece. This leads to greater tool vibration, workpiece surface springback, a sharp rise in surface roughness, and reduced tool life.</p>
<h2 id="minimum-required-relief-angle-calculation">Minimum Required Relief Angle Calculation</h2>
<p>For fixed-axis machining, the minimum required relief angle can be calculated from the feed rate, spindle speed, and tool radius. For simultaneous multi-axis machining, it must be computed in batch for each contact point along the program path.</p>
<p>The following outlines the calculation for fixed-axis machining.</p>
<p><span class="math">\(\vec r_p = \left(t\cdot v-R\cdot\sin\left(t\cdot w\right),R-R\cdot\cos\left(t\cdot w\right)\right)\)</span></p>
<p><span class="math">\(\vec r_b = \left(a\cdot v-R\cdot\cos\left(s\right),R-R\cdot\sin\left(s\right)\right)\)</span></p>
<p>Where:
<span class="math">\(\vec r_p\)</span> is the position vector of the red trochoid;
<span class="math">\(\vec r_b\)</span> is the position vector of the blue circle;
<span class="math">\(R\)</span> is the tool radius (mm);
<span class="math">\(w\)</span> is the spindle speed (rad/s);
<span class="math">\(v\)</span> is the feed rate (mm/s);
<span class="math">\(t\)</span> is time;
<span class="math">\(s = t\cdot w\)</span>;
<span class="math">\(a\)</span> is a specified time, used as a constant.</p>
<p>Let the velocity vectors be</p>
<div class="math">
\[
\vec v_p = \frac{d\vec r_p}{dt} ,
\vec v_b = \frac{d\vec r_b}{ds}
\]</div>
<p>The angle between <span class="math">\(\vec v_p\)</span> and <span class="math">\(\vec v_b\)</span> is the minimum required relief angle.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 KiB

@@ -1,46 +0,0 @@
%
G40 G17 G49 G54 G80
G91 G28 Z0.0
T01 M06
S1500 M03
G43 Z10. H01
G01 G90 X2. Y-20. M08
G01 Z-1. F600.
G01 Y16.
Z10.
G01 X14. Y-20.
G01 Z-1. F600.
G01 Y16.
Z10.
G01 X26. Y-20.
G01 Z-1. F600.
G01 Y16.
Z10.
G00 G90 X-20. Y10.
G17 G01 Z-1. F600.
S50 M03
;@MachiningResolution_mm=0.0625;
;@SetNcResolutionFeedPerTooth();
X13. F20. ;@LineSelection("lineA",AnchorMode.FirstTouch,AnchorMode.LastTouch);
X25. F10. ;@LineSelection("lineB",AnchorMode.FirstTouch,AnchorMode.LastTouch);
S1500 M03
Z10. F600.
G91 G28 Z0.
T02 M06
S50 M03
G43 Z10. H02
G01 G90 X10. Y30. M08
G01 Z-4. F20. ;@LineSelection("drillA",AnchorMode.FirstTouch,AnchorMode.LastTouch);
Z10.
X20.
G01 Z-4. F10. ;@LineSelection("drillB",AnchorMode.FirstTouch,AnchorMode.LastTouch);
Z10.
M09
M05
G91 G28 Z0.0
M30
%
Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

@@ -1,224 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Spindle Capability | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Spindle Capability | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="spindle-capability">Spindle Capability</h1>
<p><a class="xref" href="../../api/Hi.Milling.SpindleCapability.html">SpindleCapability</a> <small>(API)</small> describes the energy, torque, power, and thermal envelope of a machine spindle. It is loaded as XML (<code>.SpindleCapability</code> files under <code>Resource/SpindleCapability/</code>) and lives on <a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_SpindleCapability">SpindleCapability</a> <small>(API)</small> as part of the project equipment. This page explains what the model represents physically and how the per-step ratios on a machining step are derived.</p>
<p>For editing values interactively, see <a href="../../app-anatomy/mech/spindle-capability-page.html">Spindle Capability Page</a>. For empirical validation of the resulting power numbers against Fanuc ServoGuide, see <a href="spindle-power-evaluation.html">Spindle Power Evaluation</a>.</p>
<h2 id="boundary-curves-continuous-vs-instantaneous">Boundary curves: continuous vs instantaneous</h2>
<p><img src="spindle-capability-img/fanuc-at12-12000i.jpg" alt="Power and torque vs spindle speed for a FANUC aT12/12000i spindle"></p>
<p><em>A typical spindle datasheet chart (FANUC aT12/12000i, shipped as <code>FANUC-aT12-12000i.SpindleCapability</code>): torque (N-m) and power (kW) plotted against spindle speed. The <strong>S1 Cont.</strong> curves are the continuous boundary; the <strong>S3 60%</strong> curves are a short-duration rating. HiNC stores exactly these curves, keyed by workable duration.</em></p>
<p>The capability stores <strong>two dictionaries keyed by workable duration (in minutes)</strong>, mapping spindle speed to the maximum power or torque the spindle can deliver for that duration:</p>
<ul>
<li><a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_WorkableDurationToSpindleSpeedPowerContoursDictionary_min_cycleDs_kW">WorkableDurationToSpindleSpeedPowerContoursDictionary_min_cycleDs_kW</a> <small>(API)</small></li>
<li><a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_WorkableDurationToSpindleSpeedTorqueContoursDictionary_min_cycleDs_Nm">WorkableDurationToSpindleSpeedTorqueContoursDictionary_min_cycleDs_Nm</a> <small>(API)</small></li>
</ul>
<p>Two duration keys are special:</p>
<ul>
<li><strong><code>PositiveInfinity</code></strong> — the <strong>continuous boundary</strong>. The spindle can run at any (speed, value) point on this curve forever without overheating. Industry usage often calls this the S1 rating.</li>
<li><strong>The smallest finite key</strong> (e.g. <code>15</code>) — the <strong>instantaneous boundary</strong>. The spindle can run at any (speed, value) point on this curve only for that workable duration before the temperature ceiling is reached.</li>
</ul>
<p>A capability typically also has intermediate keys (e.g. <code>60</code> minutes) which document the spindle's published rating curve.</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Why duration-keyed and not just two curves?</strong></p>
<p>The duration key serves two roles. The contour values give peak load capability (used by the ratio computation, see below). The duration values implicitly encode the thermal time constants (used by the thermal envelope, see further below). One family of curves drives both.</p>
</div>
<p>If <a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_GearShiftSpindleSpeed_rpm">GearShiftSpindleSpeed_rpm</a> <small>(API)</small> is set, each contour is treated as two segments split at that speed; only the segment for the current spindle speed is used for interpolation. Outside the segment, interpolation uses nearest-neighbour clamping rather than extrapolation.</p>
<h2 id="how-the-four-ratios-are-computed">How the four ratios are computed</h2>
<p>For every machining step where the spindle speed changes, <a class="xref" href="../../api/Hi.MachiningProcs.SpindleSpeedCache.html">SpindleSpeedCache</a> <small>(API)</small> interpolates each of the four contour-based curves at the current spindle speed and stores four scalar boundaries:</p>
<table>
<thead>
<tr>
<th>Boundary (denominator)</th>
<th>Source contour</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>MinInsistentRatioSpindleTorqueBoundary_Nm</code></td>
<td>smallest-key entry of the torque dictionary, interpolated at current rpm</td>
</tr>
<tr>
<td><code>InfInsistentRatioSpindleTorqueBoundary_Nm</code></td>
<td><code></code>-key entry of the torque dictionary, interpolated at current rpm</td>
</tr>
<tr>
<td><code>MinInsistentRatioSpindlePowerBoundary_W</code></td>
<td>smallest-key entry of the power dictionary, interpolated at current rpm</td>
</tr>
<tr>
<td><code>InfInsistentRatioSpindlePowerBoundary_W</code></td>
<td><code></code>-key entry of the power dictionary, interpolated at current rpm</td>
</tr>
</tbody>
</table>
<p>The four <code>MachiningStep</code> ratios are then divisions:</p>
<div class="math">
\[
\begin{aligned}
\text{MaxSpindleTorqueRatio} &amp;= \frac{\text{MaxAxialTorque\_Nm}}{\text{MinInsistentRatioSpindleTorqueBoundary\_Nm}} \\[6pt]
\text{ContinueSpindleTorqueRatio} &amp;= \frac{\text{MaxAxialTorque\_Nm}}{\text{InfInsistentRatioSpindleTorqueBoundary\_Nm}} \\[6pt]
\text{MaxSpindlePowerRatio} &amp;= \frac{\text{inputPower\_W}}{\text{MinInsistentRatioSpindlePowerBoundary\_W}} \\[6pt]
\text{ContinueSpindlePowerRatio} &amp;= \frac{\text{inputPower\_W}}{\text{InfInsistentRatioSpindlePowerBoundary\_W}}
\end{aligned}
\]</div>
<p>Because the continuous boundary is always lower than (or equal to) the short-duration boundary, the corresponding <code>Continue-</code> ratio is always greater than (or equal to) its <code>Max-</code> counterpart for the same load:</p>
<ul>
<li>A <strong><code>Max-</code> ratio above 100%</strong> means the spindle is overdriven instantaneously and will trip thermal protection within the rated short duration. This is the criterion <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_MaxSpindleTorqueRatio">MaxSpindleTorqueRatio</a> <small>(API)</small> and <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_MaxSpindlePowerRatio">MaxSpindlePowerRatio</a> <small>(API)</small> use to flag tool breakage on <a href="machinability.html">Process Machinability</a>.</li>
<li>A <strong><code>Continue-</code> ratio above 100%</strong> means the spindle cannot sustain this load forever — short bursts may still be safe. Useful for pacing long operations rather than predicting immediate failure.</li>
</ul>
<h2 id="input-power-vs-output-power">Input power vs output power</h2>
<p>The power numerator above is <strong>input power</strong> (energy entering the spindle), not output power (energy reaching the cutting end). They are related by the spindle's energy efficiency:</p>
<p><span class="math">\(\text{inputPower\_W} = \frac{\text{AbsAxialPower\_W}}{\text{EnergyEfficiency}}\)</span></p>
<p>— where <code>EnergyEfficiency</code> is <a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_EnergyEfficiency">EnergyEfficiency</a> <small>(API)</small> and <code>AbsAxialPower_W</code> is what the cutting actually demands. The lost fraction <span class="math">\((1 - \text{EnergyEfficiency})\)</span> becomes heat that the thermal envelope has to dissipate.</p>
<p><a href="spindle-power-evaluation.html">Spindle Power Evaluation</a> documents the empirical justification for this conversion against measured Fanuc ServoGuide TCMD data.</p>
<h2 id="dry-run-idle-power">Dry-run idle power</h2>
<p>Even when the cutter is in air, a rotating spindle dissipates power as bearing friction and aerodynamic windage. HiNC models this as a sum of a linear-in-rpm term (bearing friction) and a higher-order term (windage), parameterised by:</p>
<ul>
<li><a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_DryRunFrictionPowerCoefficient_mWdrpm">DryRunFrictionPowerCoefficient_mWdrpm</a> <small>(API)</small> — friction term coefficient</li>
<li><a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_DryRunWindagePowerCoefficient_pWdrpm3">DryRunWindagePowerCoefficient_pWdrpm3</a> <small>(API)</small> — windage term coefficient</li>
</ul>
<p>The friction term dominates at low rpm; the windage term takes over at high rpm. The thermal envelope (next section) uses the larger of the dry-run idle power and the cutting-induced heat, so the spindle keeps warming up even during air moves.</p>
<h2 id="thermal-envelope">Thermal envelope</h2>
<p>The same <code>SpindleCapability</code> also drives a thermal model of the spindle body. <strong>You do not set heat capacity or convection directly</strong> — the thermal model is auto-calibrated from your existing inputs.</p>
<ul>
<li>The <strong>continuous (<code></code>-key) curve</strong> plus <a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_WorkingTemperatureUpperBoundary_C">WorkingTemperatureUpperBoundary_C</a> <small>(API)</small> together determine how fast the spindle dumps heat at steady state. Physically: the continuous rating is, by definition, the load the spindle can hold forever without exceeding the working-temperature ceiling — so HiNC infers the steady-state heat-loss capacity from this constraint.</li>
<li>The <strong>shortest-duration curve</strong> plus its duration key together determine how much heat the spindle can absorb before reaching the ceiling. Physically: the short-duration rating is, by definition, the load that brings the spindle to the ceiling exactly within that workable time — so HiNC infers the body's effective thermal mass from this constraint.</li>
</ul>
<p><strong>What this means for you</strong>: refining the contour data (more accurate (speed, power/torque) points, better matched duration keys) automatically improves both load-capacity prediction and thermal-response speed. There is no separate thermal parameter to tune.</p>
<h3 id="per-step-temperature-outputs">Per-step temperature outputs</h3>
<p>At each step the body temperature evolves under whatever heat input is currently applied (cutting losses or dry-run, whichever is larger), approaching the steady-state temperature implied by that heat input. The two outputs published per step are:</p>
<ul>
<li><a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_SpindleTemperature_C">SpindleTemperature_C</a> <small>(API)</small> — current body temperature</li>
<li><a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_SpindleWorkingTemperatureRatio">SpindleWorkingTemperatureRatio</a> <small>(API)</small> — body temperature normalised so that ambient is <code>0</code> and the working-temperature ceiling is <code>1</code>. A value approaching <code>1.0</code> means the spindle is near its thermal limit.</li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p><code>SpindleWorkingTemperatureRatio</code> describes the <strong>spindle housing</strong> as a whole. It is <strong>not</strong> the same as the cutter-edge thermal failure tracked by <code>ThermalYieldRatio</code> in <a href="machinability.html">Process Machinability</a>, which is a localized cutting-edge phenomenon.</p>
</div>
<h2 id="editing-and-file-io">Editing and file IO</h2>
<p>Capabilities are persisted as XML (<code>.SpindleCapability</code> files). Three pre-built spindles ship in <code>Resource/SpindleCapability/</code>:</p>
<ul>
<li><code>FANUC-aT12-12000i.SpindleCapability</code></li>
<li><code>TMV-720A-STD-8000RPM.SpindleCapability</code></li>
<li><code>VP-8--Fanuc-10000RPM.SpindleCapability</code></li>
</ul>
<p>To edit values interactively, see <a href="../../app-anatomy/mech/spindle-capability-page.html">Spindle Capability Page</a> in the Quasar webservice. The desktop WPF app does not yet have a dedicated editor; load capabilities through the equipment's <code>ObjectManagementMenuButton</code> instead.</p>
<h2 id="related-pages">Related pages</h2>
<ul>
<li><a href="machinability.html">Process Machinability</a> — uses <code>MaxSpindleTorqueRatio</code> / <code>MaxSpindlePowerRatio</code> for tool-breakage prediction</li>
<li><a href="spindle-power-evaluation.html">Spindle Power Evaluation</a> — empirical validation of HiNC spindle power against Fanuc ServoGuide measurements</li>
<li><a href="../runtime/step-fields.html">Step Field Reference</a> — full list of per-step physics outputs</li>
<li><a href="../../app-anatomy/mech/spindle-capability-page.html">Spindle Capability Page</a> — UI editor walkthrough</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>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 911 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 360 KiB

@@ -1,213 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Spindle Power Evaluation | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Spindle Power Evaluation | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="spindle-power-evaluation">Spindle Power Evaluation</h1>
<p>For the spindle capability model itself (boundary curves, thermal envelope, and the four torque/power ratios), see <a href="spindle-capability.html">Spindle Capability</a>. This page focuses on <strong>empirical validation</strong> of HiNC's spindle-power evaluation against measured data.</p>
<h2 id="the-role-of-spindle-power-for-energy-cost-of-milling">The role of spindle power for energy cost of Milling</h2>
<p>The energy distribution can be referenced from Heidenhain's published measurements<a id="fnref:1" href="#fn:1" class="footnote-ref"><sup>1</sup></a>. The total machine power splits into two main flows:</p>
<ul>
<li><strong>External processing</strong> — Cooling lubricant and Compressed air, typically supplied by facility infrastructure.</li>
<li><strong>Electrical power of the machine</strong> — The machine's own electrical consumption, further split into Auxiliary components and CNC control (which contains Spindle and Feed drives).</li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Case A: Mean power requirement for manufacturing a housing part — Roughing (13 kW)</strong></p>
<pre><code class="lang-mermaid">sankey-beta
Total power (13 kW),External processing,6.4
External processing,Cooling lubricant,5.1
External processing,Compressed air,1.3
Total power (13 kW),Electrical power of the machine,6.6
Electrical power of the machine,Auxiliary components,3.1
Electrical power of the machine,CNC control,3.5
CNC control,Spindle,3.25
CNC control,Feed drives,0.25
</code></pre>
</div>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Case A: Mean power requirement for manufacturing a housing part — Finishing (7.4 kW)</strong></p>
<pre><code class="lang-mermaid">sankey-beta
Total power (7.4 kW),External processing,2.8
External processing,Cooling lubricant,1.5
External processing,Compressed air,1.3
Total power (7.4 kW),Electrical power of the machine,4.6
Electrical power of the machine,Auxiliary components,2.8
Electrical power of the machine,CNC control,1.8
CNC control,Spindle,1.55
CNC control,Feed drives,0.25
</code></pre>
</div>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Case B: Mean power consumption of the drives during rough facing</strong></p>
<p>Face-milling cutter D = 60 mm, speed 4 100 rpm, infeed depth 4 mm.</p>
<pre><code class="lang-mermaid">xychart-beta
title &quot;Mean power consumption of the drives (kW)&quot;
x-axis [&quot;Spindle&quot;, &quot;Feed axes&quot;]
y-axis &quot;Mean power (kW)&quot; 0 --&gt; 20
bar [18.5, 0.3]
</code></pre>
</div>
<p>In Case A roughing, the workpiece material seems like Al6061. CNC control (Spindle + Feed drives) takes about 27% of the total power (3.5 / 13 ≈ 26.9%).</p>
<p>From HiNC spindle power evaluation:</p>
<ul>
<li>Milling S45C cost 200% energy compare to Al6061T6.</li>
<li>Milling Inconel718 cost 800% energy compare to Al6061T6</li>
</ul>
<p>i.e.,</p>
<ul>
<li>Spindle power of milling S45C occupies 42% of total power.</li>
<li>Spindle power of milling Inconel718 occupies 75% of total power.</li>
</ul>
<p>Conclusion: Spindle Power matters for not easy-working materials for computing the energy cost of milling.</p>
<h2 id="verification-of-hinc-spindle-power-evaluation">Verification of HiNC Spindle Power Evaluation</h2>
<p>HiNC Spindle Power Evaluation is verified by comparison of the gathering Data based on the following setting.</p>
<h3 id="setting">Setting</h3>
<ul>
<li><p>Machine Tool: YCM NDV102A</p>
</li>
<li><p>Max Spindle Power: 22.4 kW</p>
</li>
<li><p>Controller: Fanuc 31i-Model A</p>
</li>
<li><p>Sampling: 1ms</p>
</li>
<li><p>Total Spindle Expended Energy: 0.412 kWh</p>
<p>The total spindle expended energy is rearranged from Fanuc ServoGuide TCMD data.</p>
</li>
<li><p>Work Time: 8min 30s</p>
</li>
</ul>
<h3 id="comparison">Comparison</h3>
<p>The following figures are spindle power based on Controller and the spindle power evaluated by HiNC.</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>The spindle power by Fanuc ServoGuide TCMD(%) * MaxSpindlePower</strong></p>
<p><img src="spindle-power-evaluation-img/Fanuc_Spindle_Power.png" alt="Fanuc_Spindle_Power"></p>
</div>
<div class="NOTE">
<h5>Note</h5>
<p><strong>The evaluated spindle power by HiNC Milling Power * Energy Conversion Efficiency (here is 0.4)</strong></p>
<p><img src="spindle-power-evaluation-img/HiNC_Spindle_Power.png" alt="HiNC_Spindle_Power"></p>
</div>
<div class="footnotes">
<hr>
<ol>
<li id="fn:1">
<p>Data summarized from Heidenhain, <em>Technical Information: Aspects of Energy Efficiency in Machine Tools</em>, November 2010.<a href="#fnref:1" class="footnote-back-ref">&#8617;</a></p>
</li>
</ol>
</div>
</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>
@@ -1,64 +0,0 @@
<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="milling-physics-coordinates.html" name="" title="Milling Physics Coordinates">Milling Physics Coordinates</a>
</li>
<li>
<a href="machinability.html" name="" title="Process Machinability">Process Machinability</a>
</li>
<li>
<a href="wear.html" name="" title="Tool Life &amp; Wear">Tool Life &amp; Wear</a>
</li>
<li>
<a href="cutter-adjustment-levers.html" name="" title="Cutter Adjustment Levers">Cutter Adjustment Levers</a>
</li>
<li>
<a href="relief-face-avoidance.html" name="" title="Relief Face Avoidance">Relief Face Avoidance</a>
</li>
<li>
<a href="radial-angle-measurement.html" name="" title="Radial Angle Measurement">Radial Angle Measurement</a>
</li>
<li>
<a href="cam-floating-point-drift.html" name="" title="CAM Floating-Point Drift">CAM Floating-Point Drift</a>
</li>
<li>
<a href="probabilistic-peak-crack.html" name="" title="Probabilistic Peak &amp; Cutter Crack">Probabilistic Peak &amp; Cutter Crack</a>
</li>
<li>
<a href="cpu-usage.html" name="" title="CPU Usage in Simulation">CPU Usage in Simulation</a>
</li>
<li>
<a href="corner-behavior.html" name="" title="Corner Feedrate Behavior">Corner Feedrate Behavior</a>
</li>
<li>
<a href="smart-holder-training.html" name="" title="Smart Holder Training">Smart Holder Training</a>
</li>
<li>
<a href="spindle-capability.html" name="" title="Spindle Capability">Spindle Capability</a>
</li>
<li>
<a href="spindle-power-evaluation.html" name="" title="Spindle Power Evaluation">Spindle Power Evaluation</a>
</li>
<li>
<a href="nc-optimization-principles.html" name="" title="NC Optimization Principles">NC Optimization Principles</a>
</li>
</ul>
</div>
</div>
</div>
</div>
@@ -1,2 +0,0 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Milling Physics Coordinates","href":"milling-physics-coordinates.html","topicHref":"milling-physics-coordinates.html"},{"name":"Process Machinability","href":"machinability.html","topicHref":"machinability.html"},{"name":"Tool Life & Wear","href":"wear.html","topicHref":"wear.html"},{"name":"Cutter Adjustment Levers","href":"cutter-adjustment-levers.html","topicHref":"cutter-adjustment-levers.html"},{"name":"Relief Face Avoidance","href":"relief-face-avoidance.html","topicHref":"relief-face-avoidance.html"},{"name":"Radial Angle Measurement","href":"radial-angle-measurement.html","topicHref":"radial-angle-measurement.html"},{"name":"CAM Floating-Point Drift","href":"cam-floating-point-drift.html","topicHref":"cam-floating-point-drift.html"},{"name":"Probabilistic Peak & Cutter Crack","href":"probabilistic-peak-crack.html","topicHref":"probabilistic-peak-crack.html"},{"name":"CPU Usage in Simulation","href":"cpu-usage.html","topicHref":"cpu-usage.html"},{"name":"Corner Feedrate Behavior","href":"corner-behavior.html","topicHref":"corner-behavior.html"},{"name":"Smart Holder Training","href":"smart-holder-training.html","topicHref":"smart-holder-training.html"},{"name":"Spindle Capability","href":"spindle-capability.html","topicHref":"spindle-capability.html"},{"name":"Spindle Power Evaluation","href":"spindle-power-evaluation.html","topicHref":"spindle-power-evaluation.html"},{"name":"NC Optimization Principles","href":"nc-optimization-principles.html","topicHref":"nc-optimization-principles.html"}]}
@@ -1,137 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Tool Life and Wear | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Tool Life and Wear | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Wear">
<h1 id="tool-life-and-wear">Tool Life and Wear</h1>
<p>There are many modes of cutting edge damage, which can be attributed to instantaneous failure modes, including tool breakage and thermal cracking, see <a href="machinability.html">this article</a>; while for modes attributed to long-term consumption failure, <u>it is recommended to use <strong>flank wear</strong> as the target for evaluating tool life</u>.</p>
<p>HiNC adopts the wear model<a id="fnref:1" href="#fn:1" class="footnote-ref"><sup>1</sup></a>:</p>
<p><span class="math">\(W(T) = \frac{k(T) L P}{H(T)}\)</span></p>
<p>where W is wear amount, k is wear coefficient, L is contact length, P is pressure, H is hardness, T is temperature.</p>
<p>HiNC calculates wear including:</p>
<ul>
<li>Crater Wear</li>
<li>Flank Wear Width</li>
<li>Flank Wear Depth</li>
</ul>
<p>Here crater wear refers to crater wear depth.</p>
<p>Flank wear width is most commonly used as an evaluation target in papers because it has measurement standards. In planar motion, tools will wear at the cutting peak first then the flank, so flank wear width can be used to evaluate total wear in laboratory settings.</p>
<p>However, if the tool has up and down motion during milling, the flank will experience random collisions before the cutting peak is worn out, in which case flank wear width loses its value for evaluating total wear.</p>
<p>The flank wear width calculated by HiNC assumes no random flank collisions and is only applicable to planar cutting. HiNC retains this value for research purposes.</p>
<div class="footnotes">
<hr>
<ol>
<li id="fn:1">
<p>Lee, R. S, and J. L Jou. &ldquo;Application of Numerical Simulation for Wear Analysis of Warm Forging Die.&rdquo; Journal of Materials Processing Technology, Proceedings of the 6th Asia Pacific Conference on materials Processing, 140, no. 1 (September 22, 2003): 4348.<a href="#fnref:1" class="footnote-back-ref">&#8617;</a></p>
</li>
</ol>
</div>
</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

@@ -0,0 +1,313 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Finding Your Way | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Finding Your Way | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="finding-your-way">Finding Your Way</h1>
<p>The application is a handful of screens, and most of what a job configures lives inside a tree on
two of them. The <strong>Page</strong> menu reaches six of those screens, and it is not all of them. Every node
of a tree has an address of its own, so a place in the application can be linked to rather than
described.</p>
<h2 id="the-screens">The screens</h2>
<p>The <strong>Page</strong> dropdown on the menu bar carries six entries in three groups. The first group is the
job, in the order a job uses it:</p>
<ul>
<li><strong>Tool House</strong> — the tools, one editor per tool</li>
<li><strong>General Setup</strong> — the equipment: the machine tool, the spindle capability, the background and
coolant conditions, the fixture, the workpiece and the controller</li>
<li><strong>Execution</strong> — the run: the mission that is executed, the program as it was played, and what the
run reports</li>
</ul>
<p>Below a separator, the two utilities:</p>
<ul>
<li><strong>File Explorer</strong> — browsing the files under the roots the service exposes</li>
<li><strong>Mechanism Builder</strong> — authoring a kinematic chain</li>
</ul>
<p>Below a second separator, one more:</p>
<ul>
<li><strong>Legacy-Controller</strong> — the controller settings that the General Setup tree's Controller branch
has no editor for. The page it opens is titled <em>Controller</em>.</li>
</ul>
<p>No entry is ever greyed out. All six are selectable with no project open; what they lead to is what
changes.</p>
<p>Three screens have no entry in this menu:</p>
<ul>
<li><strong>Machine Tool</strong>, at <code>/machine-tool</code>, reached by address only. It shows the machine chain beside a
folder button whose tooltip reads <strong>Browse</strong> and a GUI / XML view switch, so it is more than a
look at the chain — and it needs a project open.</li>
<li><strong>Log Viewer</strong>, reached from the <strong>Show Log</strong> button near the right-hand end of the menu bar. Its
address is <code>/preference/log</code>.</li>
<li>The sign-in page, which the service raises on its own when it wants one.</li>
</ul>
<h2 id="selecting-inside-a-tree">Selecting inside a tree</h2>
<p>General Setup and Execution each carry a Control Tree in their left dock, under a header reading
<strong>Control Tree</strong>, with the selected node's editor in the row beneath it. That editor row is titled
with the path of the selection — <em>General Setup / Workpiece / Anchor / Geom To Fixture</em> — which is
also how these pages name a place in prose.</p>
<p>General Setup's tree has one root, <strong>General Setup</strong>, holding <strong>Machine Tool</strong>, <strong>Spindle
Capability</strong>, <strong>Background</strong>, <strong>Coolant</strong>, <strong>Fixture</strong>, <strong>Workpiece</strong> and <strong>Controller</strong>, in that
order. With a project open, a <strong>CSV Controller</strong> and a <strong>CL Controller</strong> node follow, each behind
its own Preference checkbox — as siblings of Controller at the same level, not as children of it.
With no project open neither node is built, whatever the preferences say. Execution's tree has one
root, <strong>Execution</strong>, holding <strong>Mission</strong> above <strong>Program</strong>.</p>
<p>General Setup's middle column belongs to the Spindle Capability branch: its items put their power
and torque charts there. Every other selection leaves the column reading <em>The selected item has no
expanded content.</em> That is the column's resting state rather than a fault.</p>
<p>General Setup at <code>/general-setup?tree=equipment/workpiece/anchor/geom-to-fixture</code>, with the
Workpiece branch's <strong>Anchor</strong> group expanded and <strong>Geom To Fixture</strong> selected. Its editor is the row
below the tree, the middle column carries the empty-content message, and the canvas on the right
draws the workpiece with its anchor labels.</p>
<p><img src="finding-your-way-img/general-setup-tree.en.png" alt="The General Setup Control Tree with Geom To Fixture selected under Workpiece and Anchor, the middle column reading that the selected item has no expanded content, and the workpiece on the canvas"></p>
<h2 id="linking-to-a-node">Linking to a node</h2>
<p>The selection rides in the address as a <code>?tree=</code> value, so the address bar is already the link:
copying it copies the node, not just the page.</p>
<ol>
<li>To take a link from the tree instead, right-click a node's label. Every label is a real link to
that node's address, so the browser's own copy-link and open-in-new-tab entries both apply to
it.</li>
<li>Ctrl-click, Cmd-click or Shift-click a label to open that node in a new tab. The current tab's
selection stays where it is.</li>
<li>A plain left click selects the node in place, without navigating.</li>
<li>Paste a <code>?tree=</code> value belonging to the other tree page and it redirects to the page that owns
it, so a link does not have to name the right screen to reach the right node.</li>
</ol>
<p>Tool House has no <code>?tree=</code> at all — its address already names the selection, as
<code>/tool-house/&lt;tool&gt;/&lt;tab&gt;/&lt;sub-tab&gt;</code>, so <code>/tool-house/1/cutter/material</code> is a link to one tool's
Material sub-tab.</p>
<p>Arriving at a tree page with no <code>?tree=</code> still lands on a selected node — the last selection this
browser made there, or the tree's root — and the address takes that node's <code>?tree=</code> value on as soon
as the tree is built, so the address bar is a whole link from then on.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p>An address for a node its Preference checkbox is currently hiding — a <strong>CSV Controller</strong> or <strong>CL
Controller</strong> node — is honoured only when the tree is built while that address is the current
one, and it reveals nothing without a project open. In practice that means a full page load:
pasting the link into a new tab, or reloading on it. Jumping to it from a screen that has already
shown General Setup for the current project does not rebuild that tree, so the address is dropped
in silence with the selection left where it was.</p>
</div>
<p>The same page at <code>/general-setup?tree=equipment/controller-csv</code>, loaded fresh on that address with
the CSV Controller preference still off — the address alone is what puts the node in the tree.
<strong>CSV Controller</strong> sits below <strong>Controller</strong> at the same indent — a sibling of it — and its editor
describes the fields as column tags matched against the CSV header line: <strong>Machine coordinate
prefix</strong> <code>MC.</code>, <strong>Cutter location prefix</strong> <code>CL.</code> and <strong>Tool id column</strong> <code>ToolId</code>.</p>
<p><img src="finding-your-way-img/controller-csv-revealed.en.png" alt="The General Setup Control Tree with a CSV Controller node at the same indent as Controller, a sibling rather than a child of it, and the CSV column-tag editor below the tree"></p>
<h2 id="the-addresses">The addresses</h2>
<p>Nine addresses render a screen of their own. The bracketed segments are optional, so the bare
address resolves too and the screen fills them in from its own state; File Explorer's trailing path
carries as many segments as the browsed folder is deep.</p>
<table>
<thead>
<tr>
<th>Address</th>
<th>Screen</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/execution</code></td>
<td>Execution</td>
</tr>
<tr>
<td><code>/general-setup</code></td>
<td>General Setup</td>
</tr>
<tr>
<td><code>/tool-house/&lt;tool&gt;/&lt;tab&gt;/&lt;sub-tab&gt;</code></td>
<td>Tool House</td>
</tr>
<tr>
<td><code>/machine-tool</code></td>
<td>Machine Tool</td>
</tr>
<tr>
<td><code>/controller/&lt;tab&gt;</code></td>
<td>Controller</td>
</tr>
<tr>
<td><code>/util/file-explorer/&lt;root&gt;/&lt;path&gt;</code></td>
<td>File Explorer</td>
</tr>
<tr>
<td><code>/util/mech-builder</code></td>
<td>Mechanism Builder</td>
</tr>
<tr>
<td><code>/preference/log</code></td>
<td>Log Viewer</td>
</tr>
<tr>
<td><code>/login</code></td>
<td>the sign-in page</td>
</tr>
</tbody>
</table>
<p><code>/</code> lands on Execution. Six further addresses render nothing of their own and redirect into a tree
page's node instead:</p>
<table>
<thead>
<tr>
<th>Address</th>
<th>Lands on</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/spindle-capability/&lt;tab&gt;</code></td>
<td>General Setup, the Spindle Capability branch — on that tab's item when the segment names one, on the branch itself otherwise</td>
</tr>
<tr>
<td><code>/equipment/spindle</code></td>
<td>General Setup, the Spindle Capability branch</td>
</tr>
<tr>
<td><code>/fixture</code>, and anything below it</td>
<td>General Setup, the Fixture branch</td>
</tr>
<tr>
<td><code>/workpiece</code>, and anything below it</td>
<td>General Setup, the Workpiece branch</td>
</tr>
<tr>
<td><code>/equipment/background-coolant</code></td>
<td>General Setup, the Background item</td>
</tr>
<tr>
<td><code>/mission</code></td>
<td>Execution, the Mission branch</td>
</tr>
</tbody>
</table>
<p>An address matching none of these lands on the application's own <strong>404 Not Found</strong> page, which
prints the address it could not match and offers <strong>Back to Execution</strong>. A <code>?tree=</code> value naming no
node of the built tree is ignored instead: the page opens with nothing selected, and the editor row
reads <em>Select an item in the Control Tree to edit it here.</em></p>
<div class="WARNING">
<h5>Warning</h5>
<p>Tree ids are not promised to survive a version change. An old link keeps resolving because the
application migrates known older ids, but nothing should be built on an id staying the same.</p>
</div>
<h2 id="if-the-tree-is-not-there">If the tree is not there</h2>
<p>The left dock is one of the column toggles at the right-hand end of the menu bar, left of the page
title — three of them on General Setup, one per column — and its title is <em>Toggle the Control Tree /
editor dock</em>. Switching it off removes the dock whole, tree and editor together, and the browser
remembers the choice, so the dock is still gone after a reload. The same button switches it back
on. General Setup's middle column has a toggle of its own beside it, which is the other way that
page can arrive looking short of a column.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Basics</a> — the rest of what is true on every screen</li>
<li><a href="the-app-window.html">The Application Window</a> — the menu bar the Page dropdown sits on, and what keeps a visited screen alive between visits</li>
<li><a href="signing-in.html">Signing In</a> — the screen that has no menu entry because the service raises it</li>
<li><a href="projects.html">Projects</a> — what a project change does to a tree, and to the node an address selects</li>
<li><a href="preferences.html">Preferences</a> — the two checkboxes behind the controller nodes, and the setting that changes what a tree carries</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>
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Radial Rake Angle and Radial Relief Angle Measurement on the Cutting Plane | HiAPI-C# 2025 </title>
<title>Basics | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Radial Rake Angle and Radial Relief Angle Measurement on the Cutting Plane | HiAPI-C# 2025 ">
<meta name="title" content="Basics | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,24 +85,31 @@
</div>
<article data-uid="">
<h1 id="radial-rake-angle-and-radial-relief-angle-measurement-on-the-cutting-plane">Radial Rake Angle and Radial Relief Angle Measurement on the Cutting Plane</h1>
<h1 id="basics">Basics</h1>
<p>The method for measuring angles on the tool cutting plane scan is illustrated below:</p>
<p><img src="radial-angle-measurement-img/clip-cutter-angle-scheme.jpg" alt="Tool angle measurement"></p>
<h2 id="radial-rake-angle-α">Radial Rake Angle (α)</h2>
<ol>
<li>Sweep along the tool rotation direction to find the trailing point A of the cutting edge</li>
<li>Connect point A to the center O</li>
<li>The angle ∠OAA' between line OA and the first polyline endpoint A' on the cutting side of the edge is the rake angle α</li>
</ol>
<h2 id="radial-relief-angle-β">Radial Relief Angle (β)</h2>
<ol>
<li>Find the contact point B between the tool and the envelope circle</li>
<li>Construct the tangent line Lt to the envelope circle at point B</li>
<li>BB' is the first line segment on the relief side of the tool</li>
<li>Pick an arbitrary point B'' on Lt in the relief direction</li>
<li>The angle ∠B'BB'' between BB' and Lt is the relief angle β</li>
</ol>
<p>This section covers the sign-in gate in front of the application and what is true on every screen
behind it: the frame that stays put while the page area changes, the project the rest of the
application is configured against, the ways one screen leads to another, and the surfaces that
report what the service is doing. The task sections build on it rather than restating it. The pages
below are ordered as the application presents them: the gate, the frame, the project, the screens,
the settings, the messages.</p>
<p>For a first end-to-end run rather than a reference, start with
<a href="../../workflows/basic-simulation.html">Basic Machining Simulation</a>.</p>
<h2 id="pages">Pages</h2>
<ul>
<li><a href="signing-in.html">Signing In</a> — Whether the service asks for a sign-in, what to do when it does, and what happens when it cannot answer</li>
<li><a href="the-app-window.html">The Application Window</a> — The menu bar, the page area and the footer, and what a project change does to them</li>
<li><a href="projects.html">Projects</a> — Creating, opening, saving and closing a project, and what Save As does and does not copy</li>
<li><a href="finding-your-way.html">Finding Your Way</a> — The screens the Page menu reaches and the ones it does not, selecting inside a tree, and linking to a node</li>
<li><a href="preferences.html">Preferences</a> — The settings the service keeps for everyone on it, and the ones the browser keeps for the device it is sitting at</li>
<li><a href="messages-and-logs.html">Messages and Logs</a> — The footer's three channels, the four session message tabs and the service log, and which answers which question</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="../setup/index.html">Setup</a> — configuring the equipment, once a project is open</li>
<li><a href="../run/index.html">Running a Simulation</a> — building a mission and playing it, once the equipment is set up</li>
<li><a href="../utilities/index.html">Utilities</a> — the supporting screens beside these tasks</li>
</ul>
</article>
Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

@@ -0,0 +1,341 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Messages and Logs | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Messages and Logs | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="messages-and-logs">Messages and Logs</h1>
<p>Where a message lands decides how long it lasts and who else can see it, and that is usually more
useful than what it said at the time. The toasts and the footer belong to one browser and are gone
at its next reload; the four session message lists and the day's log file are held by the service.
Picking the right surface is most of the difference between a specific question and a vague one.</p>
<h2 id="where-a-message-can-land">Where a message can land</h2>
<p>The application has several places to put a message, and they do not carry the same things.</p>
<ul>
<li><strong>A toast</strong> — bottom right, for a few seconds, then gone. The only surface that interrupts, and
the only one that keeps nothing itself.</li>
<li><strong>The footer's latest line, and the recent list behind it</strong> — every toast that carried any text is
copied here before it is shown, so this list is the toast's afterlife. Only a toast with neither
message nor caption is skipped, and a small number of status lines are written straight here and
never toast at all.</li>
<li><strong>The footer's session strip</strong> — the middle of the bar, drawn once a run has produced something
and empty until then.</li>
<li><strong>The footer's background zone</strong> — the right end, drawn only while a project file operation is in
flight, naming the operation and the path it is working on.</li>
<li><strong>The Session Messages panel</strong> — on the Execution page, four lists kept by the service.</li>
<li><strong>The Log Viewer</strong> — the file the service itself writes for the current day.</li>
</ul>
<p>The footer summarises; it does not hold. Everything a run reports also goes into one of the panel's
four lists, and the panel is where it stays.</p>
<h2 id="messages-a-project-load-raises">Messages a project load raises</h2>
<p>Opening or re-reading a project can report holes in it — a referenced STL missing from disk, or a
mesh-geometry <code>.wct</code> file a raw geometry names but that is not there. <strong>None of these fail the load.</strong>
The project opens, the body that needed the missing file simply comes up without its geometry, and
the action still reports success. The message is the only thing that says otherwise.</p>
<p>These messages then take a path of their own, and it has a consequence worth knowing before you rely
on it. A project file operation runs outside any session, so the panel's four lists — which belong to
the service, and are where everything a <em>run</em> reports stays — never see them. Instead the first five
errors and warnings are toasted, anything past that goes straight to the footer's recent list, and
one more toast says how many did not get their own. Anything milder than a warning is not surfaced in
the window at all.</p>
<p>That leaves the footer's recent list holding the only copy in the window, and that list is the
browser's: <strong>a reload empties it</strong>. So read the messages when a project opens with pieces missing, or
read <a href="#the-service-log">the service log</a>, which has them either way. The Session Messages panel will
not.</p>
<h2 id="the-footer">The footer</h2>
<p>The left region is this browser's own record and nothing else's. The list behind the latest line is
newest first, capped at a hundred entries, emptied by its <strong>Clear</strong> button and by a reload, and
written down nowhere — nothing about it survives closing the tab. Each entry keeps the wording it
was raised in, so switching the language leaves the list as a mixture while the panel's lists
re-render at once. The frame page describes the regions themselves: see
<a href="the-app-window.html">The Application Window</a>.</p>
<p><strong>Nothing marks the list as having something new in it.</strong> The button carries no badge and no dot,
deliberately, because a toast has already drawn attention once. The consequence is the failure this
page exists to prevent: a message raised while another screen was open, or while the window was
behind something else, is invisible until that menu is opened by hand. Opening it after an action
that seemed to do nothing is the cheapest check available.</p>
<p>The middle strip is the other way round — the service pushes it, so every connected browser sees the
same run activity, and each browser keeps its own short ring of the last entries behind it. What it
last showed stays on the bar after the run has ended; a project change is what empties the ring and
takes the strip away with it. A cursor line carries <code>Sn</code> and the sentence index it sits on; a
message line carries whatever anchor the message supplies. Two limits are worth knowing: the strip
mirrors the newest message across three of the four lists — nothing from <strong>NC Manipulation</strong> reaches
it — and it is sampled rather than recorded, so messages arriving faster than it refreshes never
appear on it at all. The lists on the service drop nothing.</p>
<h2 id="the-session-message-panel">The session message panel</h2>
<p>The panel sits on the Execution page, in the middle column, below the 3D Rendering Canvas. Its
header row reads <strong>Session Messages</strong> and stays visible when the panel is collapsed, so a grey strip
with that name on it is the panel, shut.</p>
<p><strong>The whole column can be switched off, and nothing on the page says so.</strong> The column quick-toggles
in the middle of the menu bar include one whose tooltip reads <em>Toggle the Execution canvas &amp;
messages column</em>; with it off, neither the panel nor its header row is drawn, and the page simply
looks like it has fewer parts. That choice is the browser's and survives a reload. The expanded or
collapsed state of the panel itself is not: it is kept by the service, and is therefore the same for
every browser that opens the page afterwards.</p>
<p>Four tabs, each a separate list:</p>
<table>
<thead>
<tr>
<th>Tab</th>
<th>What it holds</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Shell</strong></td>
<td>The session's own lifecycle and routine progress — what began, what finished, what was refused. It is empty outside a session, because the list is created with the session.</td>
</tr>
<tr>
<td><strong>NC Diagnostics</strong></td>
<td>What the NC pipeline reported while playing a program.</td>
</tr>
<tr>
<td><strong>Step Diagnostics</strong></td>
<td>What was reported against a machining step rather than against program text.</td>
</tr>
<tr>
<td><strong>NC Manipulation</strong></td>
<td>What converting a played program to NC, or optimising one, reported. Each such run clears the list before it starts filling it again.</td>
</tr>
</tbody>
</table>
<p>A tab shows a small count badge only once its list has something in it, so an empty sink is a tab
with nothing beside its name.</p>
<p>Where a message carries a position, the row shows it in a monospaced anchor column: a step
diagnostic names its step, and its block as well when it has one; an NC diagnostic names the block's
position in execution order, and its tooltip adds the source file and line where the diagnostic
carries them. <strong>Not every NC diagnostic has one</strong> — a complaint about the pipeline rather than about
a particular block has no anchor to show, and shell messages never have one. A run of consecutive
identical messages arrives already folded into a single row with a multiplier badge. A row with more
behind its one line carries a chevron; clicking it opens what the message brought with it, with a
<strong>Copy</strong> of its own.</p>
<p>Each tab filters independently: a <strong>Severity</strong> list, a <strong>Category</strong> list, a <em>Filter text…</em> box, and
a <strong>Reset</strong>. The badge at the right of that toolbar reads two numbers separated by a slash, and they
count different things — rows currently shown on the left, raw messages on the right, so folding
alone makes them differ, and on a long session the left number stops at the most recent thousand
while the right goes on counting. That badge is also the tab's connection indicator: it is outlined
green only while the connection behind that list is up, and its tooltip names the state. <strong>Export</strong>
writes the tab's filtered rows to a CSV file.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p>Two different controls on this screen answer to <strong>Reset</strong>, and only one of them is labelled with
it. The labelled one sits in each tab's filter toolbar and clears that tab's three filters and
nothing else. The other is the transport group's eject button, which carries no text at all and
reads <strong>Reset</strong> only in its tooltip; it ends the session and empties three of the four lists —
<strong>Shell</strong>, <strong>NC Diagnostics</strong> and <strong>Step Diagnostics</strong>. Only <strong>NC Manipulation</strong> is left standing,
and the same is true of a project change: opening, reloading, creating or closing a project
empties the same three and leaves that one alone. It is the list to read for what the last
conversion or optimisation said, long after the run that produced it has been reset away.</p>
</div>
<p><strong>The lists are the service's, not the browser's.</strong> They survive a reload, a move to another screen
and a second tab opened on the same service, and two browsers watching the same run read the same
four lists.</p>
<p>That is also what makes collapsing the panel harmless. Collapsing it takes it down entirely rather
than hiding it, and all four connections drop with it. Nothing is lost, because nothing was being
held here. What does not come back is the arrangement: re-expanding builds the panel fresh, on the
first tab, with every tab's severity, category and text filters back at their defaults.</p>
<h2 id="the-service-log">The service log</h2>
<p><strong>Show Log</strong>, near the right-hand end of the menu bar, opens the Log Viewer at <code>/preference/log</code>.
Its tooltip reads <em>View the application log</em>, and the page it opens is titled <strong>Log Viewer</strong>.</p>
<p>The viewer shows one file: the one the service is writing for the current day. There is no way to
reach an earlier day's file from this page.</p>
<ol>
<li>Read the header row for what is on screen — the day the file covers, the time it was last
fetched, and how many lines came back. The pane opens at the end of the file, which is where the
newest lines are, and stays at the end through later fetches unless it has been scrolled away
from the bottom.</li>
<li>Press <strong>Refresh</strong> for a fresh copy, or switch <strong>Auto</strong> on and choose an interval — two, five, ten
or thirty seconds — to have it re-fetched on its own.</li>
<li>Take the text with <strong>Copy</strong>, or the whole file with <strong>Download</strong>. Both are unavailable while
there is nothing loaded.</li>
</ol>
<p><strong>Switch Auto off before leaving the page.</strong> Moving to another screen does not stop it: the page is
kept alive behind the one on screen and goes on re-fetching at its interval. Reloading the browser
stops it, and so does a project change, because both rebuild the page area from scratch.</p>
<p>An empty file and a missing file look almost alike and are not the same thing. Both show <em>No log
file for today.</em>, and both hide the line count entirely — no count is drawn at all rather than one
reading zero, so the caption simply being absent is itself the signal that nothing came back. The
day badge is what separates them: when the file exists, the day comes from the service's own clock;
when there is no file at all, it comes from the browser's clock in UTC, which need not name the same
day.</p>
<p>A fetch that fails replaces the pane with the reason and a <strong>Retry</strong> button, and posts the reason to
the footer under the viewer's own name — one of the few lines that reaches the footer without ever
having been a toast.</p>
<p>The Log Viewer at <code>/preference/log</code>, on a service that has been running for a while. The header
carries the page name, the day the file covers, when it was last loaded and its line count, then the
<strong>Auto</strong> toggle — off here — beside its interval, and <strong>Refresh</strong>, <strong>Copy</strong> and <strong>Download</strong>. The
lines in view are the service's own connection traffic for a whole screen: everything a page
connects — the four message tabs among them — arrives in one block and leaves in another once the
page is left, and most of what lies between is the rendering canvas being set up and reporting
frames.</p>
<p><img src="messages-and-logs-img/log-viewer.en.png" alt="The Log Viewer: a header row with a day badge, a last-loaded time, a line count, an Auto toggle switched off beside a 5 s interval, and Refresh, Copy and Download at the right; below it a dark monospaced pane, scrolled to the end of the file, whose lines record a screen's connections arriving together, the four message lists among them, then a stretch of canvas rendering and frame compression, then the same connections leaving together"></p>
<p>This is the log of the <strong>service</strong>, not of the browser. A message seen in the footer reaches it only
if the service also recorded it, and much of what it holds was never shown anywhere in the
application.</p>
<h2 id="which-surface-answers-which-question">Which surface answers which question</h2>
<table>
<thead>
<tr>
<th>To find out</th>
<th>Read</th>
</tr>
</thead>
<tbody>
<tr>
<td>what the last action reported</td>
<td>the footer's latest line</td>
</tr>
<tr>
<td>what was reported while another screen was open</td>
<td>the recent list behind it — nothing else will mention it</td>
</tr>
<tr>
<td>where a run has got to</td>
<td>the footer's session strip</td>
</tr>
<tr>
<td>whether a project file operation is still running</td>
<td>the footer's background zone</td>
</tr>
<tr>
<td>what the session itself started, finished or refused</td>
<td>the <strong>Shell</strong> tab</td>
</tr>
<tr>
<td>why a program did not do what its text says</td>
<td>the <strong>NC Diagnostics</strong> tab</td>
</tr>
<tr>
<td>why a move behaved the way it did</td>
<td>the <strong>Step Diagnostics</strong> tab</td>
</tr>
<tr>
<td>what the last conversion or optimisation reported</td>
<td>the <strong>NC Manipulation</strong> tab, which a reset does not clear</td>
</tr>
<tr>
<td>why a project opened with pieces missing</td>
<td>the toasts it raised, or the Log Viewer — <strong>not</strong> the Session Messages panel</td>
</tr>
<tr>
<td>what the service recorded, shown or not</td>
<td>the Log Viewer</td>
</tr>
</tbody>
</table>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Basics</a> — the rest of what is true on every screen</li>
<li><a href="the-app-window.html">The Application Window</a> — the footer's three regions, and the menu bar Show Log sits on</li>
<li><a href="preferences.html">Preferences</a> — the Preference menu that Show Log is not an entry of, and what else the service keeps for everyone on it</li>
<li><a href="projects.html">Projects</a> — the actions behind the footer's background zone, and what a project change clears</li>
<li><a href="../run/when-something-goes-wrong.html">When Something Goes Wrong</a> — using these lists on a run that did not do what was expected</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

@@ -0,0 +1,222 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Preferences | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Preferences | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="preferences">Preferences</h1>
<p>The settings that follow the application rather than the project are kept on two sides: the service,
where one value serves every browser signed in to it, and the browser, for the device it is sitting
at. The <strong>Preference</strong> menu is where most of them are set, and the rest are reached from the panel
each one belongs to. Which side keeps a setting is the thing worth knowing about it, because that is
what decides who else sees the change.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The <strong>Preference</strong> dropdown on the menu bar, after <strong>Project</strong> and <strong>Page</strong>. It carries no OK and no
Cancel: every control commits the moment it is pressed. Picking a language closes the language
submenu and leaves the dropdown itself open, exactly as the checkboxes do; nothing in the dropdown
commits on a close. A setting the service refuses is rolled back in the menu, so the dropdown never
shows a value that did not take — the refusal arrives separately, as a message naming what failed.</p>
<h2 id="what-the-dropdown-carries">What the dropdown carries</h2>
<p><strong>Language</strong> opens a submenu of the codes the service offers, each row carrying a language's own name
over the code that names it — <em>English</em> over <code>en</code>, and the two Chinese scripts over <code>zh-Hans</code> and
<code>zh-Hant</code>. The caption on the parent row is the language in force. Picking one re-resolves the
interface immediately and without navigating, which is why the confirmation message already reads in
the language just chosen. The service keeps this one.</p>
<p><strong>Show Physics Options</strong> reveals the physics-only parts of two editors, named under <em>Making a physics
change take</em> below, and switches the cutter drawn on the Tool House canvas and on the
Execution page's <strong>CWE</strong> canvas from a plain bounding shape to its detailed flute geometry. The
service reports whether the physics feature is licensed alongside the setting itself, and without
that licence the checkbox is drawn disabled and clear, with nothing in the menu saying more about
why. Where the licence is present the setting starts on: a service that has never had a preference
saved reports it as on. The service keeps this one too.</p>
<p><strong>CSV Controller</strong> and <strong>CL Controller</strong> each add a node of their own to the General Setup tree once
a project is open — with no project open neither node is built, whatever the boxes say. Both are
kept by the browser, are clear by default, and are never sent to the service. The caption under each
box says whether the open project actually plays that kind — <em>This project plays CSV</em>, or <em>Not used
by this project</em> — and is blank when no project is open and when the service cannot say; it is read
when the menu opens, so it answers for whatever project is open at that moment.</p>
<h2 id="what-is-kept-where">What is kept where</h2>
<p><strong>One service holds one set of values.</strong> There is nothing per account: two people signed in under
different names read and write the same language, the same physics setting, the same everything else
on this side. A change one browser makes is what the next browser to ask will be told. What the
service keeps this way is the language, the physics setting, the properties the Execution page lists
for a selected step, which of that page's charts, its <strong>Session Messages</strong> panel and its <strong>Step
Properties</strong> panel are switched on, the General Setup canvas's display options including the work
coordinate its marker draws, and the graphic cache budget.</p>
<p><strong>The browser keeps the arrangement of the screen in front of it.</strong> That is the two tree pages'
layout — which columns are shown, how wide the docks are, which tree nodes are left unfolded and
which node each tree page reopens on — together with the two controller checkboxes above, and the
File Explorer's editor pane, its split and its sort order. Three of the Execution page's panels sit
on this side rather than with that page's others: the <strong>3D Rendering Canvas</strong>, <strong>CWE</strong> and
<strong>Sentence Syntax</strong>. The browser also holds a copy of the language, used only to paint the first
frame before the service can be asked; the service's value wins every disagreement, so a language
changed from another browser shows up here immediately after that first frame.</p>
<p><strong>The graphic cache budget is the exception on the service side.</strong> A new budget takes effect at once
and applies to every browser on that service, exactly like the rest — but the write stops there. It
reaches the service's preference file only when some later preference save writes that file out, so a
service stopped before any such save comes back on the budget it had before.</p>
<h2 id="making-a-physics-change-take">Making a physics change take</h2>
<p><strong>Show Physics Options</strong> is read while a tree or a tab row is being built, not while one is on screen,
so the four routes below are what the tree and the tab row need; the two canvases pick the change up
on their own next draw instead. Ticking it therefore changes nothing already built: the tree does
not grow the nodes it gates, and the Tool House tab row does not grow the tab, until something
builds them again. Folding a branch shut and opening it again is not a rebuild.</p>
<p>Four things do rebuild one:</p>
<ol>
<li>Reload the browser. That rebuilds the whole application, every tree included.</li>
<li>The project under the session changes — <strong>New</strong>, <strong>Load</strong>, <strong>Close Project</strong>, or a <strong>Save As</strong> to a
location other than the one already open. Every screen the session has built is discarded and
built again, and <strong>ReLoad</strong> does the same on the path already open.</li>
<li>On Tool House, select a different tool in the left column and come back. The tab row is built for
whichever tool is being shown, so moving between two tools rebuilds it twice.</li>
<li>Edit the structure of a branch and that branch alone is rebuilt — adding, removing or re-kinding a
mission command, or installing a different tool house — so a branch being worked on picks the
setting up without being asked.</li>
</ol>
<p>What appears once one of those has happened: in the Execution tree's Mission branch, the <strong>Shot Files
Output</strong> and <strong>Optimization Output</strong> blocks under a <strong>Post-Execution</strong> command; and in Tool House, the
cutter's <strong>Material</strong> section tab.</p>
<p>Tool House at <code>/tool-house/1/cutter/material</code>, with the setting on. The tab row above the editor —
<strong>General</strong>, <strong>Cutter</strong>, <strong>Holder</strong>, <strong>Clamping</strong>, <strong>Int. Holder</strong> — belongs to the tool; the section
tabs below the Cutter fields belong to the cutter, and <strong>Material</strong> leads that row only while the
physics setting is on. With it off the row starts at <strong>Flute Profile</strong> and the address is left alone,
so a link naming the Material tab opens a complete, plausible-looking panel that is not the one it
named.</p>
<p><img src="preferences-img/physics-material-tab.en.png" alt="The Tool House Cutter tab: a Cutter Type selector reading Milling Cutter above Shank Mass, Hone Radius and Relief Angle, then a row of section tabs reading Material, Flute Profile, Flute Contours, Upper Beam and Optimization with Material selected, showing a Flute Material picker with the chosen material's description under it and a Coating Layers group reading no coating layers, and the cutter drawn on the canvas at the right"></p>
<h2 id="settings-that-live-elsewhere">Settings that live elsewhere</h2>
<p><strong>Show Log</strong> is a button on the menu bar, not an entry of this dropdown.</p>
<p><strong>Step Present</strong> — which properties the Execution page lists for the selected step — opens from the
title bar of that page's <strong>Step Properties</strong> panel, in the Step Info column; the small button there is
titled <em>Step Present — choose which properties are displayed</em>. Its <strong>Clear</strong> and its <strong>Reset</strong> each ask
for confirmation before they act, and its lists of keys are fetched again every time it opens and again
whenever the language changes.</p>
<p><strong>Graphic Cache</strong> is reached through a panel rather than through the menu bar. On the Execution page,
with the canvas-and-messages column shown and the <strong>3D Rendering Canvas</strong> panel expanded, that panel's
title bar carries a toolbar; its <strong>Meshed Geom</strong> dropdown holds <strong>Graphic Cache</strong>, which opens the
<strong>Graphic Cache (MB)</strong> panel — a <em>Lower</em> and an <em>Upper</em> field bounding a <em>Current</em> field and its
slider. The toolbar belongs to the canvas and is only lent to the title bar, so collapsing the panel
takes the whole toolbar away with it, Graphic Cache included.</p>
<h2 id="taking-settings-to-another-machine">Taking settings to another machine</h2>
<p>Nothing carries a preference from one installation to another. A second service starts on the built-in
defaults — English, and the physics options on wherever the licence allows them — and has no
preference file at all until something is saved on it, so an installation that has never had a
preference changed has nothing to carry in the first place.</p>
<p>What the browser keeps travels less far still. It belongs to one browser profile on one device, so the
same person at a second machine, or in a private window on the same one, finds the tree pages laid out
as they come and both controller checkboxes clear.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Basics</a> — the rest of what is true on every screen</li>
<li><a href="the-app-window.html">The Application Window</a> — the menu bar this dropdown sits on, and what a language switch does to the footer</li>
<li><a href="messages-and-logs.html">Messages and Logs</a> — where the Show Log button goes, since it is not an entry here</li>
<li><a href="signing-in.html">Signing In</a> — why one language setting serves everyone on the service</li>
<li><a href="finding-your-way.html">Finding Your Way</a> — the tree nodes the two controller checkboxes add, and the branch the physics setting changes</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

@@ -0,0 +1,264 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Projects | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Projects | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="projects">Projects</h1>
<p>A project is the whole of what a simulation runs against: the machine tool, the spindle capability,
the background and coolant conditions, the fixture, the workpiece, the tool house, the controller and
the NC programs a mission plays. It is a project file together with the folder that file sits in, and
the <strong>Project</strong> dropdown on the menu bar is where one is created, opened, saved and closed. The
equipment and mission screens are editors on whichever project is open, so a change of project
reaches all of them at once.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The <strong>Project</strong> dropdown, at the left of the menu bar beside <strong>Page</strong> and <strong>Preference</strong>. Its first
row is a read-only field holding the path of the open project — selectable, so it can be copied — and
reading <em>No Project Loaded</em> until one is open. The path is written relative to the admin directory
the service was started against rather than as a location on the machine running it.</p>
<p>That row is the only place the path stays put; everywhere else it is transient — a line drawn while
something is happening, or a record of something that has. While a project action is running, the
footer's background zone names the action and the path together, as <em>Loading project: …</em> and its
equivalents for the other entries. The toast that reports the finished action carries the path as
its caption, and that line outlives the toast in the footer's <strong>Recent messages</strong> list. The service
holds one open project rather than one per browser, so every browser connected to it is working on
the same project.</p>
<h2 id="what-each-entry-does">What each entry does</h2>
<table>
<thead>
<tr>
<th>Entry</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>New</strong></td>
<td>Creates a project at a chosen path and opens it, refusing a path that already holds a file</td>
</tr>
<tr>
<td><strong>Load</strong></td>
<td>Opens an existing project file</td>
</tr>
<tr>
<td><strong>ReLoad</strong></td>
<td>Re-reads the open project from its own path, discarding anything unsaved</td>
</tr>
<tr>
<td><strong>Save</strong></td>
<td>Writes the open project back to its own path</td>
</tr>
<tr>
<td><strong>Save As</strong></td>
<td>Writes it to a chosen path, which then becomes the open project</td>
</tr>
<tr>
<td><strong>Close Project</strong></td>
<td>Closes it, leaving the application with no project</td>
</tr>
</tbody>
</table>
<p><strong>ReLoad, Save, Save As and Close Project are greyed out until a project is open.</strong> New and Load are
always selectable.</p>
<p>The three entries that need a path — New, Load and Save As — open the shared file browser as a
picker, filtered to <strong>HiNC Project (*.hincproj)</strong>. It never offers the <strong>Resource</strong> root: the
<strong>Admin</strong> root is always there, and the <strong>Project</strong> root beside it only while a project is open. It
opens at the Admin root — in the folder the open project sits in, when there is one. Saving forces
the extension, so a name typed without one still gets it.</p>
<h2 id="what-a-project-actually-is">What a project actually is</h2>
<p>The project file is an XML document of references. Values that mean nothing outside this one project
are written into it directly, while the pieces that are shared, large or edited on their own — the
machine chain, the spindle capability, the workpiece and cutter materials, the cutting parameters,
the mesh geometry — are held as references to files beside it, each named by a path relative to the
project file's own folder. Opening the project file in a text editor shows those references rather
than what they point at.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p><strong>A reference that points at nothing does not stop the project opening.</strong> Load and ReLoad read what
they can and report what they could not — a missing STL, or a mesh-geometry <code>.wct</code> file a raw
geometry names — and the project comes up with that body simply having no geometry, the action
still reporting success. The message is the only thing that says otherwise, and it is not kept
where a run's messages are kept: see
<a href="messages-and-logs.html#messages-a-project-load-raises">Messages a project load raises</a>.</p>
</div>
<p>A project is therefore a folder at least as much as a file. Copying one to another machine, archiving
one, or handing one to somebody else means taking the folder.</p>
<p>The demo project's own folder, at <code>/util/file-explorer/Project</code>. The File Explorer's root switcher,
beside the page name, is set to <strong>Project</strong> — the root that exists only while a project is open, and
that resolves to the folder holding the open project file — and the path field reads <code>.</code>, the root
folder itself. Three folders sit at the top, <strong>MachineTool</strong>, <strong>NC</strong> and <strong>Output</strong>, and five files
below them: the cutting parameters and the workpiece material, the project file itself at about
135 KB, the spindle capability, and a cutter material. The right-hand pane is the explorer's text
editor, waiting on a file to be given to it.</p>
<p><img src="projects-img/project-folder.en.png" alt="The File Explorer showing the open project's folder under the Project root: the folders MachineTool, NC and Output above five files with their sizes, among them the project file at 135.2 KB and four side files named for a cutting parameter set, a workpiece material, a spindle capability and a cutter material, with the empty text editor pane on the right"></p>
<div class="WARNING">
<h5>Warning</h5>
<p><strong>A Save As into a new folder can produce a project that finds none of its programs.</strong> Save As
writes out every side file the project file holds as a reference, into the new folder and at the
same relative place, and nothing it does not. What it leaves behind is whatever the project names
as a plain path instead of as a reference — and the NC programs a mission plays are named that
way. Nothing rewrites those paths either, so the saved project still asks for <code>NC/…</code>, now
underneath the new folder, where nothing has put it. The programs have to be brought across by
hand, or the Save As aimed at a folder that already holds them.</p>
</div>
<p>The folder a run writes its output into is named the same way, and it is not a dependency of the same
kind: nothing has to put it there, because the writers create it on demand under the folder the open
project was read from. A Save As does not move it — a run still writes beside the folder the project
came from, until that project is opened at its new path.</p>
<h2 id="what-a-project-change-does-to-the-rest-of-the-window">What a project change does to the rest of the window</h2>
<p>What decides a rebuild is the path changing, not the entry chosen. New, a Load that picks a different
project, Close Project and a Save As to a location other than the one already open all change it,
and each throws away every screen the browser has built and rebuilds against whatever the project is
afterwards — which is what stops one screen showing values from a project that is not open any more.
ReLoad always rebuilds as well, being the entry meant for re-reading the same path. A Load that
picks the project already open rebuilds nothing: the file is read again on the service, but the
screens keep what they were showing. <a href="the-app-window.html">The Application Window</a> states the same
rule from the frame's side, and covers what a rebuild costs a screen carrying unsaved state.</p>
<p>How far a change travels beyond the browser that made it is not the same for every entry. The three
that change which project the service holds open are announced to every browser connected to it, so
all of them follow. ReLoad
re-reads the same path: the browser that asked for it rebuilds, while a second browser — whose path
did not change — carries on with what it was showing.</p>
<p><strong>Save As announces nothing at all.</strong> The service moves onto the new path, and only the browser that
performed the Save As is told, in the reply to its own request. Every other browser goes on
displaying the old path in its <strong>Project</strong> dropdown, although the service is working with the new one
underneath — so a Save from any of them writes to the new path. A stale row corrects itself the next
time the service reports its state to that browser: a reload, another project change, or a run being
started, paused, finished or reset from any browser.</p>
<p>New, Load, ReLoad, Save and Save As take a turn each. A second one asked for while the first is still
running is refused rather than queued, and the refusal arrives as a warning reading <em>Another project
operation is in progress. Please try again.</em> Close Project takes no part in that turn-taking: it
neither waits for a running operation nor holds one off, and it never raises the warning.</p>
<h2 id="losing-work">Losing work</h2>
<p>Nothing keeps track of whether the open project has unsaved changes. No marker in the menu bar or in
the path row says the project has been edited, there is no prompt in front of <strong>ReLoad</strong> or <strong>Close
Project</strong>, and nothing at all stands in the way of a browser tab being closed or reloaded. Both
ReLoad and Close Project discard what the service is holding and has not written, in silence and at
once; a <strong>Save</strong> beforehand is the only thing that keeps it.</p>
<p><strong>Save As</strong> asks nothing either. Its dialog opens on the open project's own folder with the open
project's own file name already filled in, and nothing checks whether a file is already at the path
chosen: confirming writes over whatever is there. Confirming on the name as it arrives therefore
overwrites the project that is open — which is harmless, being what Save does — but the same
confirmation one folder away overwrites a different project just as quietly. <strong>New</strong> is the one entry
that refuses: it will not create a project where a file already exists, and reports that as an error
whose message can carry the location in full.</p>
<h2 id="before-one-is-built">Before one is built</h2>
<p>The data to collect from the machine owner before a project can be built is a checklist of its own:
<a class="xref" href="../../workflows/project-data-checklist.html">Project Data Checklist</a>. The order the pieces then go together in
is <a href="../../workflows/project-construction.html">Project Construction</a>.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Basics</a> — the rest of what is true on every screen</li>
<li><a href="the-app-window.html">The Application Window</a> — the menu bar this dropdown sits on, and the page rebuild a project change triggers</li>
<li><a href="finding-your-way.html">Finding Your Way</a> — the screens a project change rebuilds, and what happens to a selection in one</li>
<li><a href="messages-and-logs.html">Messages and Logs</a> — the footer's background zone and the toasts a project action raises, and where they can be read afterwards</li>
<li><a href="../utilities/file-explorer.html">File Explorer</a> — the browser these entries open as a picker, and the Project root that is this folder</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

@@ -0,0 +1,217 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Signing In | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Signing In | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="signing-in">Signing In</h1>
<p>The sign-in card is the <code>/login</code> route, and whether anyone ever reaches it is the service's decision
rather than the browser's. With the gate on, the service's data and its live updates stay closed
until a browser has signed in; with it off, the route sends every visitor straight back into the
application. A sign-in buys admission and nothing more — the service matches a name and a password
once, then carries the name only to label the sign-out button, and nothing it does afterwards
depends on which account was used.</p>
<h2 id="whether-the-gate-is-on">Whether the gate is on</h2>
<p>The <code>Auth</code> section of the service's configuration decides it, through its <code>Enabled</code> flag. The flag
falls back to off when nothing sets it, so a service whose configuration carries no <code>Auth</code> section,
or carries one with the flag off, runs with no login at all. The configuration as shipped turns the
flag on and supplies one account, so a service started from it asks for a sign-in.</p>
<p>The accounts are the <code>Users</code> list in that same section — username and password pairs, read once when
the service starts. Every entry grants exactly the same access: there are no roles, no group
memberships, and nothing at all is kept per account. There is also no way to create an account,
change a password or recover one from inside the application. All three are edits to the service's
configuration, made by whoever runs the service, and they take effect at its next restart.</p>
<p>What the gate closes is the service's own surface: the requests each screen makes for data, and the
live channels that keep those screens current. It does not close the page. The application shell,
the brand image and the sign-in card itself are served before authorization is consulted, which is
what lets the card be drawn for a browser that holds no session.</p>
<h2 id="signing-in-1">Signing in</h2>
<p>The card asks for one pair of credentials, under the prompt <em>Please sign in to continue</em>.</p>
<ol>
<li>Type the account name into <strong>Username</strong> and the password into <strong>Password</strong>. The username field
already holds the focus when the card appears, and the eye icon at the right of the password
field toggles the typing visible.</li>
<li>Submit with the <strong>Sign In</strong> button, or by pressing Enter in either field.</li>
<li>Neither field is checked in the browser, so whatever is entered — an empty pair included — goes
to the service, and a refusal comes from there rather than from the form. It arrives as one red
line under the password field, <em>Incorrect username or password</em>, and the card stays as it is.</li>
</ol>
<p>A successful sign-in reloads the application at the screen that was wanted. When the browser was
sent to the card while trying to reach a particular screen, that address travels with it in the
card's <code>redirect</code> query argument — <code>?tree=</code> selection included — and is where the sign-in returns
to. A browser that came to the card on its own lands on the Execution page.</p>
<p>Two smaller things the card carries. The grey line below the name is a version mark, the same
version the menu bar shows from inside. And the card's own language is whichever this browser last
used, or the browser's own language on a first visit, because the language setting belongs to the
service and is behind the gate like everything else there; after signing in, the interface follows
that setting — one value for everyone on the service — chosen in the <strong>Preference</strong> menu's language
submenu (see <a href="preferences.html">Preferences</a>).</p>
<p>The sign-in card at <code>/login</code>, in a browser holding no session. The card is all the screen holds —
none of the application frame is drawn behind it — with the version mark and the prompt under the
name, the focus already in <strong>Username</strong>, and the eye toggle at the right of <strong>Password</strong>.</p>
<p><img src="signing-in-img/login-card.en.png" alt="A plain grey page holding one white card: the HiNC brand mark and name above a version mark and the prompt Please sign in to continue, an empty Username field holding the focus, a Password field with an eye toggle, and a Sign In button at the lower right"></p>
<h2 id="when-the-sign-in-page-does-not-appear">When the sign-in page does not appear</h2>
<p>Three situations account for it, in the order they are likely.</p>
<p><strong>The gate is off.</strong> With no <code>Auth</code> section, or with <code>Enabled</code> off, the <code>/login</code> route redirects
every visitor back into the application instead of showing a form. From inside, the quickest tell is
the menu bar: a service with no gate carries no sign-out button.</p>
<p><strong>The browser is already signed in.</strong> Its session cookie is still good, so the card is skipped and
the screen that was asked for opens directly.</p>
<p><strong>The service could not say.</strong> The application asks the service once, on its first navigation,
whether a gate exists and whether this browser has passed it. If that question fails to get an
answer, the application assumes there is no gate and lets the browser through — it fails open. On a
service whose gate is in fact on, the result is a window that opens on the screen that was asked for
and can then load nothing: no project, panels that never fill, and requests the service is refusing
behind them. The menu bar is the giveaway — no version mark beside the brand image, and no sign-out
button at the right end, because both are filled in from the answer that never arrived. In this
state nothing offers a sign-in card and nothing redirects to one. Reloading the page puts the
question again; it is re-asked on every navigation until it is answered, and once the service
answers, the browser reaches the card in the ordinary way.</p>
<h2 id="signing-out">Signing out</h2>
<p>The sign-out button sits at the right end of the menu bar, after <strong>Show Log</strong>. It is labelled with
the signed-in user name — or with <strong>Logout</strong> when the service reported no name — and its tooltip
reads <strong>Log out</strong>. It is drawn only while the gate is on and this browser is signed in.</p>
<p>Press it to end this browser's session. The page is torn down and rebuilt at the sign-in card. If
the request to the service did not get through, the service still holds this browser as signed in, so
the card sends it straight back into the application — press the button again.</p>
<p>What ends is one browser's admission. Another browser signed in under the same account is untouched
and carries on working: the service keeps no register of who is connected, so there is no notice
that an account is in use elsewhere, and no limit on how many browsers may hold it.</p>
<h2 id="when-a-session-ends-on-its-own">When a session ends on its own</h2>
<p>A sign-in belongs to the browser session, so closing the browser ends it whatever the configuration
says. While the browser stays open it lasts up to the number of hours in the <code>Auth</code> section's
<code>SessionHours</code> setting — eight in the configuration as shipped, and never less than one whatever the
setting says. Sliding expiration is on by default, and the service describes that setting as
refreshing the expiry with activity.</p>
<p>Nothing announces that the end is near. There is no countdown, no prompt and no way to extend. The
first sign is the sign-in card, which arrives the moment a screen next asks the service for
something and is refused.</p>
<p>Recovery is a second sign-in. The screen that was open travels in the <code>redirect</code> argument, so
signing in comes straight back to it; what does not come back is anything entered or arranged on
that screen and not yet saved, because a sign-in reloads the application from scratch. The session
is the browser's admission and nothing else — ending it changes what that browser may ask for, not
what the service is holding.</p>
<h2 id="locked-out">Locked out</h2>
<p>A gate that is on over an empty account list admits nobody, and it looks exactly like a mistyped
password — the same single red line, for every name tried, in every browser. Nothing counts
attempts and nothing locks after a bad one, so a refusal that repeats for every account anyone can
think of is the symptom to read as a configuration problem rather than a credential one.</p>
<p>The way out is one entry. Add a username and password pair to the <code>Users</code> list in the <code>Auth</code> section
of the service's configuration, then restart the service — that list is read once at startup.</p>
<p>The state is neither permanent nor damaging. The service runs normally the whole time it is turning
browsers away; it simply has no credential to match one against.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Basics</a> — the rest of what is true on every screen</li>
<li><a href="the-app-window.html">The Application Window</a> — the menu bar the sign-out button sits at the end of</li>
<li><a href="finding-your-way.html">Finding Your Way</a> — the screens a sign-in returns to, and the addresses that name them</li>
<li><a href="preferences.html">Preferences</a> — the settings the service keeps for everyone on it, the language among them</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

@@ -0,0 +1,230 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>The Application Window | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="The Application Window | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="the-application-window">The Application Window</h1>
<p>One frame surrounds every screen: a menu bar across the top, the current page between, and a footer
along the bottom. The frame is built once and stays mounted for the whole session, so everything
described here is present on every page. A project change is the one event that reaches into it and
rebuilds what the middle holds.</p>
<p>The whole frame at <code>/execution</code>, with the demo project open. Only the column quick-toggles and the
connection badge, in the middle of the bar, are there because of the page underneath them — the logo,
the three dropdowns, the page title and <strong>Show Log</strong> sit on the bar whatever page is open, and the
sign-out button turns on whether a sign-in is asked for rather than on the page. The strip along the
very bottom is the footer, reading <strong>Ready</strong> because nothing has been reported yet.</p>
<p><img src="the-app-window-img/app-window.en.png" alt="The Execution page inside the application frame: a menu bar carrying a version badge and the Project, Page and Preference menus, a Control Tree dock and transport buttons down the left, the 3D Rendering Canvas above the Session Messages tabs in the centre, strip charts and step panels on the right, and a one-line footer reading Ready"></p>
<h2 id="the-menu-bar">The menu bar</h2>
<p>From the left: the brand logo, a version badge, and the <strong>Project</strong>, <strong>Page</strong> and <strong>Preference</strong>
dropdowns. The badge is filled from the service's own reply about itself rather than from anything in
a project, so it carries a version before a project is open. It is drawn only when that reply carried
one, so a service that cannot answer its own status probe leaves the space empty. The bar is not drawn
on the sign-in screen at all — the same version appears under the logo on the sign-in card instead.</p>
<p>The rest of the bar is pushed to the right, and renders in this order:</p>
<ul>
<li><strong>The column quick-toggles</strong> — one button per column the current page actually has: four on
Execution (the dock, the canvas-and-messages column, the Strip Charts column, the Step Info
column), three on General Setup. Each glyph is a small map of the page with its own column filled,
and each tooltip names the column it toggles. Tool House lays itself out with draggable splitters
and gets no buttons here.</li>
<li><strong>The connection badge</strong> — the Execution page only. See below.</li>
<li><strong>The current page's title</strong> — the destination's own title, which is where two controls read
differently from where they land: the Page menu's <strong>Legacy-Controller</strong> entry opens the page titled
<strong>Controller</strong>, and <strong>Show Log</strong> opens the page titled <strong>Log Viewer</strong>.</li>
<li><strong>Show Log</strong> — present on every page.</li>
<li><strong>The sign-out button</strong> — labelled with the signed-in user name, or <strong>Logout</strong> when the service has
no name for it. It is there only while the service asks for a sign-in.</li>
</ul>
<h2 id="the-page-area">The page area</h2>
<p>Everything between the bars is the current page, and every page reached during a session stays built:
there is no cap and nothing is excluded. Coming back to one finds its component state, an edit left
half-finished and an established rendering connection exactly as they were.</p>
<p>Two things it does not carry over. Nothing restores a scroll position inside a panel: coming back to a
page finds its panels scrolled to where a fresh mount would put them. And a browser reload is not a
navigation — it rebuilds the whole application and empties the cache; what survives it is what lives
outside the page area, namely the address (a <code>?tree=</code> selection in it included) and the layout the
browser keeps for itself.</p>
<p><strong>F5 to F8 belong to the Execution page.</strong> They drive its transport — F5 starts or resumes, F6
pauses, F7 runs one NC line, F8 runs one machining step — and they are bound only while that page is
the one on screen, so on every other screen F5 is the browser's own reload. A key whose button is not
available at that moment, or that is pressed with the focus in a text field, is handed back to the
browser instead. That matters most for F5: while a run is in progress the start button is
unavailable, so the key reloads the page and takes the session with it.</p>
<h2 id="what-a-project-change-does">What a project change does</h2>
<p><strong>New</strong>, <strong>Load</strong>, <strong>ReLoad</strong> and <strong>Close Project</strong> discard every page the session has built and
rebuild it against whatever the project is afterwards — nothing at all, after <strong>Close Project</strong>.
That is what stops a screen showing values from a project that is not open any more, and it is also
why in-page state that was never saved does not survive one.</p>
<p>What decides a rebuild is the path changing, not the action. A plain <strong>Save</strong> never rebuilds.
<strong>Save As</strong> back to the path already open behaves exactly like Save and rebuilds nothing, while
<strong>Save As</strong> to a different location moves the window onto that path and everything rebuilds. For the
same reason, picking the already-open project out of the <strong>Load</strong> browser rebuilds nothing either —
the file is read again on the service, but the screens keep what they were showing. <strong>ReLoad</strong> is the
entry to use for that, and it is the one that always rebuilds.</p>
<p>The same rebuild runs once at startup, with nobody having done anything: a browser reaching a service
that already has a project open receives that path as its first project change and builds on it.</p>
<p><strong>New</strong>, <strong>Load</strong>, <strong>ReLoad</strong>, <strong>Save</strong> and <strong>Save As</strong> run one at a time. A second one started while
the first is still running is refused rather than queued, and the refusal arrives as a warning reading
<strong>Another project operation is in progress. Please try again.</strong> Nothing is rebuilt and nothing is
lost. <strong>Close Project</strong> takes no part in that turn-taking and never raises the warning.</p>
<h2 id="the-footer">The footer</h2>
<p>A 29-pixel strip holding three regions, each independent of the other two.</p>
<p><strong>Left — the latest reported line, with the recent ones behind it.</strong> The text is the most recent
message the application has raised, or <strong>Ready</strong> before there has been one, and its tooltip carries
the full text with whatever caption came with it. The icon in front decodes the severity: a grey
information mark for a plain status line, a green tick for a success, an amber triangle for a warning,
a red mark for a failure. The clock button beside it opens <strong>Recent messages</strong> — newest first, capped
at a hundred, each row repeating its severity as a coloured strip down the left edge and carrying the
time it arrived. That list belongs to this browser and this session: <strong>Clear</strong> empties it, a reload
empties it, and it is written down nowhere.</p>
<p><strong>Middle — the session strip.</strong> It is drawn only while a run has produced something, and the space is
simply empty the rest of the time. A glyph leads each line — a locator mark on a cursor tick, the
message's own severity mark otherwise — and an anchor follows it in a monospaced prefix wherever the
entry carries one: a cursor line carries <code>Sn</code> and the sentence index it sits on, a message line the
anchor the message itself supplies. Hovering opens the recent activity behind it; clicking pins that
list open.</p>
<p><strong>Right — the background zone.</strong> It appears only while a project file operation is in flight, names
the operation and the path it is working on, and vanishes when the operation ends.</p>
<p>Switching the language re-resolves the interface at once and without navigating: the menus, the page
title in the bar and the browser tab title all change. The two message regions do not follow. Each
line in the recent list and in the session strip keeps the language it was raised in, so a footer read
after a language switch is a mixture by design.</p>
<h2 id="the-connection-badge">The connection badge</h2>
<p>The badge on the menu bar belongs to the Execution page alone; the other canvases carry their own
badge inside their panel. It aggregates that page's rendering connection with the service connections
behind its panels, and reads a green <strong>connected</strong> only while every connection in the set is up —
orange while any of them is (re)connecting, and red only once none is connecting and one is still
down.</p>
<p>The set is not fixed. The rendering connection is always folded in on that page, but a service
connection joins only while something is actually using it — an open panel, or the frame itself. One
that nothing is consuming is left out rather than forced to connect. <code>ExecutionStatus</code> has a consumer
for the whole session and is therefore always in the set; the rest come and go, which is why opening
and collapsing panels changes what the badge reports. A green badge means every connection in use is
healthy rather than every connection that exists.</p>
<p>Only the two problem states carry a tooltip — when everything is connected there is nothing to
explain and none appears. The tooltip lists one row per connection, <code>Rendering</code>, <code>Shell</code>, <code>NcDiag</code> and
the rest, and those names are identifiers rather than interface text: in a translated session only the
state beside each name changes language.</p>
<p>The buttons that hide those panels' columns are remembered per page. The two tree pages each keep
their own column choices, while the dock widths and the list of unfolded tree nodes are single
settings both of them share — widening the dock on Execution widens it on General Setup too.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Basics</a> — the rest of what is true on every screen</li>
<li><a href="signing-in.html">Signing In</a> — what puts the sign-out button on this bar in the first place</li>
<li><a href="projects.html">Projects</a> — the Project menu, and what each of its entries does</li>
<li><a href="finding-your-way.html">Finding Your Way</a> — the Page menu and the screens behind it</li>
<li><a href="preferences.html">Preferences</a> — the Preference menu, and the settings that are not in it</li>
<li><a href="messages-and-logs.html">Messages and Logs</a> — the surfaces the footer summarises, and the log behind Show Log</li>
<li><a href="../run/running-a-simulation.html">Starting and Stepping</a> — the transport those F5F8 keys drive, and the connection the bar's badge reports on</li>
<li><a href="../run/watching-the-run.html">Watching the Run</a> — the two columns the quick-toggles show and hide</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>
@@ -16,22 +16,22 @@
<a href="index.html" name="" title="Overview">Overview</a>
</li>
<li>
<a href="script-command.html" name="" title="Script Command">Script Command</a>
<a href="signing-in.html" name="" title="Signing In">Signing In</a>
</li>
<li>
<a href="session-shell.html" name="" title="SessionShell Reference">SessionShell Reference</a>
<a href="the-app-window.html" name="" title="The Application Window">The Application Window</a>
</li>
<li>
<a href="cutter-location-playback.html" name="" title="Cutter-Location (CL) Playback">Cutter-Location (CL) Playback</a>
<a href="projects.html" name="" title="Projects">Projects</a>
</li>
<li>
<a href="step.html" name="" title="Step — Concept &amp; Output">Step — Concept &amp; Output</a>
<a href="finding-your-way.html" name="" title="Finding Your Way">Finding Your Way</a>
</li>
<li>
<a href="step-fields.html" name="" title="Step Field Reference">Step Field Reference</a>
<a href="preferences.html" name="" title="Preferences">Preferences</a>
</li>
<li>
<a href="shell-progress.html" name="" title="ShellProgress">ShellProgress</a>
<a href="messages-and-logs.html" name="" title="Messages and Logs">Messages and Logs</a>
</li>
</ul>
</div>
@@ -0,0 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Signing In","href":"signing-in.html","topicHref":"signing-in.html"},{"name":"The Application Window","href":"the-app-window.html","topicHref":"the-app-window.html"},{"name":"Projects","href":"projects.html","topicHref":"projects.html"},{"name":"Finding Your Way","href":"finding-your-way.html","topicHref":"finding-your-way.html"},{"name":"Preferences","href":"preferences.html","topicHref":"preferences.html"},{"name":"Messages and Logs","href":"messages-and-logs.html","topicHref":"messages-and-logs.html"}]}
@@ -2,18 +2,18 @@
<html>
<head>
<meta charset="utf-8">
<title>Insert Cutter | HiAPI-C# 2025 </title>
<title>Manual | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Insert Cutter | HiAPI-C# 2025 ">
<meta name="title" content="Manual | 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">
<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="docfx:rel" content="../">
@@ -30,7 +30,7 @@
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script type="module" src="./../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
@@ -43,8 +43,8 @@
<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 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">
@@ -85,65 +85,29 @@
</div>
<article data-uid="">
<h1 id="insert-cutter">Insert Cutter</h1>
<h1 id="manual">Manual</h1>
<p>Insert cutters can be modeled in the virtual environment. See the examples below.</p>
<p><img src="insert-cutter-img/insert-cut-mark.png" alt="demo-real-insert-cutter"></p>
<p><img src="insert-cutter-img/demo-virtual-insert-cutter.png" alt="demo-virtual-insert-cutter"></p>
<table>
<thead>
<tr>
<th>Z</th>
<th>R</th>
<th>S.Ang.</th>
<th>R.Ang.</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>8</td>
<td>1</td>
<td>3</td>
</tr>
<tr>
<td>0.2</td>
<td>8</td>
<td>0.5</td>
<td>3</td>
</tr>
<tr>
<td>0.4</td>
<td>8</td>
<td>0</td>
<td>3</td>
</tr>
<tr>
<td>0.5</td>
<td>8</td>
<td>0</td>
<td>3</td>
</tr>
<tr>
<td>3</td>
<td>8</td>
<td>3</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>8</td>
<td>4</td>
<td>3</td>
</tr>
<tr>
<td>8</td>
<td>8</td>
<td>4</td>
<td>3</td>
</tr>
</tbody>
</table>
<p>How to operate the HiNC web application: what is true on every screen, the equipment a simulation
runs against, the run itself, and the supporting screens beside it. This section is reference
knowledge looked up on demand — it describes the application as it is, screen by screen, rather
than carrying a job from end to end.</p>
<p>Ordered as a job goes: learn the frame, build the setup, run it, and reach for a utility when the
job needs one.</p>
<p>For a first end-to-end run rather than a reference, start with
<a href="../workflows/basic-simulation.html">Basic Machining Simulation</a>.</p>
<h2 id="chapters">Chapters</h2>
<ul>
<li><a href="basics/index.html">Basics</a> — The sign-in gate and what is true behind it: the window frame, the project the rest of the application is configured against, the ways one screen leads to another, the preferences, and the surfaces that report what the service is doing</li>
<li><a href="setup/index.html">Setup</a> — The machine tool, spindle, fixture, workpiece and controller a simulation runs against, where each is placed relative to the machine, and the tool house and coolant around them</li>
<li><a href="run/index.html">Running a Simulation</a> — The command list a run executes, playing it, watching it, reading a single step, and diagnosing what went wrong</li>
<li><a href="utilities/index.html">Utilities</a> — The supporting screens the Page menu lists below its first separator: the server's file explorer, the mechanism builder, and the legacy controller settings</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../technique/index.html">Technique</a> — the durable knowledge behind what these screens compute</li>
<li><a class="xref" href="../anatomy/index.html">App Anatomy</a> — the same screens broken down component by component, with the source behind each</li>
<li><a href="../workflows/index.html">Workflows</a> — end-to-end task guides that put these chapters together</li>
</ul>
</article>
@@ -0,0 +1,294 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>A Mission That Resumes | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="A Mission That Resumes | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="a-mission-that-resumes">A Mission That Resumes</h1>
<p>A mission written as one Script runs, and tells you nothing. The same run written as commands reads
as values, switches a row at a time, and — with two Record Meshed Geometry entries around the
program — restarts from where the last run got to instead of from the stock.</p>
<p>This page is the layout that gets you all three. It is a recommendation, not a rule: every command
is placeable anywhere, and <a href="building-a-mission.html">Building a Mission</a> is the mechanics.</p>
<h2 id="the-shape">The shape</h2>
<table>
<thead>
<tr>
<th>#</th>
<th>Command</th>
<th>Category</th>
<th>Why it is there</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td><strong>Physics</strong></td>
<td>Setup</td>
<td>the run's switches, above everything they govern</td>
</tr>
<tr>
<td>2</td>
<td><strong>Machining Resolution</strong></td>
<td>Setup</td>
<td>must precede the first record — see below</td>
</tr>
<tr>
<td>3</td>
<td><strong>Collision Detection</strong></td>
<td>Setup</td>
<td></td>
</tr>
<tr>
<td>4</td>
<td><strong>Script</strong></td>
<td>Program</td>
<td>only what no command covers</td>
</tr>
<tr>
<td>5</td>
<td><strong>Record Meshed Geometry</strong></td>
<td>Output</td>
<td><code>Cache/&lt;stage&gt;-init.wct</code> — the stock, meshed once; drop this row where the stock is already a recorded mesh</td>
</tr>
<tr>
<td>6</td>
<td><strong>Program File</strong></td>
<td>Program</td>
<td>the stage</td>
</tr>
<tr>
<td>7</td>
<td><strong>Record Meshed Geometry</strong></td>
<td>Output</td>
<td><code>Cache/&lt;stage&gt;-done.wct</code> — the result of the stage; the next stage's stock</td>
</tr>
<tr>
<td>8</td>
<td><strong>Post-Execution</strong></td>
<td>Output</td>
<td>what the run writes out</td>
</tr>
</tbody>
</table>
<p>Every entry keeps its own checkbox, so any of them can be switched off without being deleted and
without its settings being lost.</p>
<h2 id="why-commands-rather-than-one-script">Why commands rather than one script</h2>
<p>A script sets the same values, and that is the whole of its advantage. Against it:</p>
<ul>
<li><strong>A row states its value.</strong> <code>Machining Resolution [0.125 mm]</code>, <code>Physics [On]</code>,
<code>Program File [NC/facing.ptp]</code> — the mission is legible without opening anything.</li>
<li><strong>A checkbox replaces commenting-out.</strong> A commented line is invisible in the tree and survives
into the saved project as text nobody reads. A cleared checkbox greys the row and says so.</li>
<li><strong>The fields are typed.</strong> A resolution is a number field with a unit, not a line that has to
compile.</li>
<li><strong>The order is the run.</strong> Moving a setting above or below a program is a drag, not an edit.</li>
</ul>
<p>Leave in the Script only what no command covers, and title it for what it is.</p>
<h2 id="resolution-before-the-first-record">Resolution before the first record</h2>
<p><strong>Machining Resolution has to sit above the first Record Meshed Geometry entry.</strong> The record writes
the workpiece as a meshed geometry, and the mesh is built at whatever resolution is in force when it
runs. Put the resolution command below it and the cached mesh is built at the previous value —
which the next run then reads back, silently, as if it were the one you asked for.</p>
<p>The same holds for anything else that changes what the geometry is: the Setup commands go first.</p>
<h2 id="what-read-on-first-or-write-does">What Read On First Or Write does</h2>
<p>Record Meshed Geometry has four actions, and the fourth is the one that makes a mission resumable:</p>
<table>
<thead>
<tr>
<th>Action</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>No Action</strong></td>
<td>nothing; the entry is a placeholder</td>
</tr>
<tr>
<td><strong>Read</strong></td>
<td>always loads the file into the session</td>
</tr>
<tr>
<td><strong>Write</strong></td>
<td>always writes the session's geometry to the file</td>
</tr>
<tr>
<td><strong>Read On First Or Write</strong></td>
<td>reads the file if it exists <strong>and no machining step has been produced yet this run</strong>; otherwise writes</td>
</tr>
</tbody>
</table>
<p>The condition is a property of the run, not of the entry — there is no per-entry counter. It is
also about steps, not about cutting: a pass that only positions the tool still produces steps, so a
program that removed no material still counts as having played, and the next record writes rather
than reads. Only a program that produced no steps at all — no tool selected, no motion, or a file
that was not found — leaves the run in its opening state.</p>
<p>So in the layout above:</p>
<ul>
<li><strong>First run.</strong> Neither file exists. Entry 5 writes the meshed stock; the program plays; entry 7
writes the result.</li>
<li><strong>Every run after.</strong> Entry 5 finds its file and nothing has played, so it <strong>reads</strong> — the stock is
not re-meshed. The program plays, so by entry 7 something has played, and it <strong>writes</strong> the fresh
result.</li>
<li><strong>Re-running one stage.</strong> Clear the checkbox on the stages you do not want. The first record entry
that is still ticked becomes the first thing to run, so it reads its cache, and the run picks up
from there.</li>
</ul>
<p>That last line is the point of the layout. The cost of getting back to the middle of a long job is
one file read.</p>
<h2 id="the-stage-0-cache-goes-stale-silently">The stage-0 cache goes stale, silently</h2>
<p>This is the price of the layout, and it is worth stating on its own.</p>
<p>The record above the program caches the <strong>stock</strong>, meshed. From the second run onward that cache is
what the run starts from — so <strong>changing the workpiece geometry, its initial resolution, or the
Machining Resolution has no effect until the cache is cleared.</strong> Nothing warns you: the run simply
reproduces the previous one. After changing any of those three, Reset the stage-0 record (or delete
its file) before reading anything into the result.</p>
<p><strong>Give a stage a stage-0 record only when the stock costs real time to mesh</strong> — a large mesh or a
solid the kernel has to build. Where a stage's stock is itself a recorded mesh, as it is for the
second operation in a chained pair, a stage-0 record buys no time at all and freezes the chain: the
upstream stage can be re-run all it likes and this one keeps reading the copy it took the first
time. There, the previous stage's own end-of-stage file is already the cache, and the stage needs
no record above its program.</p>
<h2 id="one-record-per-stage">One record per stage</h2>
<p>A mission with several Program File entries gets a record after each, plus the stage-0 record where
that one earns its place. Name each file after the stage it ends, not after the program that wrote
it, so the file that a stage <em>reads</em> is the one named for the stage before it.</p>
<p>Do not split one control file into several Program File entries to get finer stages. A program's
modal state — units, plane, work offset, absolute or incremental — is established in its header and
carried forward; cutting it in half hands the second half to a runner that never saw the header. The
stage boundary is a file boundary.</p>
<h2 id="what-stays-in-a-script">What stays in a Script</h2>
<p>Two things belong there and little else:</p>
<ol>
<li><strong>Process-wide settings with no command of their own.</strong> <code>MillingCycleDivisionNum</code> is the standing
example: it is process-wide, it survives a runtime reset and a project switch, and a training
script that raised it leaks into every project loaded afterwards. Pinning it in the mission is a
guard, not a setting.</li>
<li><strong>Genuinely one-off session work</strong> — see the Script section of
<a href="the-other-commands.html">The Other Commands</a>.</li>
</ol>
<p>Anything with a command belongs in the command. A script line that duplicates a command's default is
worse than nothing: it reads as a decision when it is a leftover.</p>
<h2 id="the-cache-is-a-by-product">The cache is a by-product</h2>
<p><code>Cache/</code> holds rebuildable artifacts, which is why the record command defaults there. A meshed
workpiece is large — hundreds of megabytes at a fine resolution is ordinary — and it is derived
entirely from the stock geometry, the resolution and the programs above it. Keep it out of version
control, and delete it whenever you want the run rebuilt from the stock: the record command's own
<strong>Reset</strong> clears the file it points at.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="building-a-mission.html">Building a Mission</a> — adding, ordering, ticking and grouping the entries</li>
<li><a href="the-other-commands.html">The Other Commands</a> — what each command kind holds</li>
<li><a href="playing-a-program.html">Playing a Program</a> — the two commands that put NC code into a run</li>
<li><a href="running-a-simulation.html">Starting and Stepping</a> — the transport that plays the list</li>
<li><a href="../basics/projects.html">Projects</a> — what a project folder holds</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

@@ -0,0 +1,247 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Building a Mission | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Building a Mission | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="building-a-mission">Building a Mission</h1>
<p>A mission is the list of commands a run executes, in order. Nothing plays until there is one, and
what plays is exactly what the list says — including which entries are ticked and which are not.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The Execution page at <code>/execution</code>, <strong>Mission</strong> branch of the Control Tree; <code>/mission</code> lands on the
same place. This is the page the application opens on.</p>
<p>The branch root is the list editor: it is where the list is assembled and rearranged. A command's
own settings are edited one level in, on that command's node.</p>
<h2 id="add-a-command">Add a command</h2>
<p><strong>Add Command</strong> opens a search-first picker. Type to narrow it: the search matches a command's
display name, its internal kind key and the aliases it declares, and an alias matches both by its
English key and by its word in the interface language. Arrow keys walk the results and
<kbd>Enter</kbd> takes the highlighted one.</p>
<p>Results are grouped by category. Thirteen kinds ship:</p>
<table>
<thead>
<tr>
<th>Category</th>
<th>Commands</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Setup</strong></td>
<td>Machining Resolution, Machining Motion Resolution, Collision Detection, Pause on Failure, Physics</td>
</tr>
<tr>
<td><strong>Program</strong></td>
<td>Program File, NC Code, Script</td>
</tr>
<tr>
<td><strong>Optimization</strong></td>
<td>NC Optimization Config</td>
</tr>
<tr>
<td><strong>Output</strong></td>
<td>Post-Execution, Record Meshed Geometry, Export Meshed Geometry (STL)</td>
</tr>
<tr>
<td><strong>Flow</strong></td>
<td>List</td>
</tr>
</tbody>
</table>
<p>What you pick is appended to the <strong>end</strong> of the list you added it to, and the selection stays on the
list rather than jumping into the new command. Nothing is pinned to a position: the order is
entirely yours, and every command is placeable anywhere.</p>
<p><strong>Add Command is disabled until a project is open.</strong> With nothing open the list reads <em>No project
loaded</em>; with a project and an empty mission it reads <em>No commands yet</em> and names the button.</p>
<p>The set on offer is served by the application rather than built into the interface, so a command
kind can appear in this dialog before this manual has a page for it.</p>
<p>The picker over the demo mission, at <code>/execution?tree=execution/mission</code> with <strong>Add Command</strong>
pressed. The five category headings are the grouping in the table above, the search box at the top
is what narrows them, and the first result is highlighted ready for <kbd>Enter</kbd>.</p>
<p><img src="building-a-mission-img/add-command.en.png" alt="The Add Command dialog open over the Execution page: a Search commands box above thirteen entries under five headings — Setup with Machining Resolution, Machining Motion Resolution, Collision Detection, Pause on Failure and Physics; Program with Program File, NC Code and Script; Optimization with NC Optimization Config; Output with Post-Execution, Record Meshed Geometry and Export Meshed Geometry STL; and Flow with List"></p>
<h2 id="read-a-row">Read a row</h2>
<p>Each row shows the command's kind followed by the detail that identifies it, in brackets. Where you
can name a command that detail is the title you typed, so a row still says what it is after it has
been named: <code>List [Roughing]</code>, <code>NC Code [Face check]</code>. Where you cannot, the command brackets what
it holds instead — <code>Program File [NC/facing.ptp]</code>, <code>Machining Resolution [0.25 mm]</code>,
<code>Collision Detection [On]</code> — so a mission is readable without opening anything.</p>
<p>Beside the label sit four buttons — <strong>up</strong>, <strong>down</strong>, <strong>duplicate</strong> and <strong>delete</strong>. Up and down are
disabled at the ends of the list. Delete asks first, in a dialog naming the command. Duplicate is a
deep copy: a group copies with everything inside it, and the copy lands directly after the original.</p>
<p>Clicking a row anywhere but on a button selects that command's node and opens its editor.</p>
<h2 id="tick-what-runs">Tick what runs</h2>
<p><strong>The checkbox is on the tree item, not in the row, and it is the only thing that decides whether a
command runs.</strong> Clearing it greys the row and the tree node; the editor stays open and fully
editable. Clearing the box on a group greys the whole group, and the run skips the group together
with everything nested inside it.</p>
<p>Leaving a command in place with its box cleared is how you skip a step without losing its settings,
which is what you want while you narrow down a problem.</p>
<h2 id="group-with-a-list">Group with a list</h2>
<p><strong>List</strong> is an ordinary command in the Flow category, and adding one grows a sub-tree: its children
are its own entries, edited by the same list editor one level down. That nests to any depth, so a
mission can be grouped by operation rather than left flat.</p>
<p>A list carries an optional title, entered on its own node above the embedded editor. The row reads
<code>List</code> while the title is empty and <code>List [title]</code> once it says something; a title of nothing but
spaces counts as unset. The Mission root is the one list with no title field — it reads <strong>Mission</strong>.</p>
<p>The demo mission at <code>/execution?tree=execution/mission</code>: three groups and four loose entries. The
tree above shows <strong>List [Setup]</strong> opened, with the three settings commands inside it bracketing
their values; the editor below shows the same seven entries as rows. The greyed <strong>Script</strong> row is an
entry left in place with its checkbox cleared — part of the mission, and not run.</p>
<p><img src="building-a-mission-img/grouped-mission.en.png" alt="The Mission branch of the Control Tree with List Setup expanded over Machining Resolution 0.25 mm, Collision Detection On and Physics On, then NC Optimization Config, List Roughing, List Finishing, NC Code Face check, Post-Execution and a greyed Script Export result row with its checkbox cleared; below it the list editor shows the same seven entries, each with up, down, duplicate and delete buttons, above the line reading that commands run top-down"></p>
<h2 id="reorder-and-move-in-and-out">Reorder, and move in and out</h2>
<p>Up and down move an entry within its own list and never change which list owns it. Dragging does
more, and where you drop decides which:</p>
<table>
<thead>
<tr>
<th>Drop it on</th>
<th>What happens</th>
</tr>
</thead>
<tbody>
<tr>
<td>Another row</td>
<td>Reorder within this list. A row splits at its midline into <em>before</em> and <em>after</em>.</td>
</tr>
<tr>
<td>The middle band of a <strong>List</strong> row</td>
<td>Move the entry <strong>into</strong> that list. The row's outer quarters still reorder around it.</td>
</tr>
<tr>
<td>The drop-out zone below a nested list's entries</td>
<td>Move the entry <strong>out</strong>, landing directly after the list it came from.</td>
</tr>
</tbody>
</table>
<p>The drop-out zone belongs to a nested list's editor and appears only while a row inside it is being
dragged. Moving a list into itself, or into one of its own groups, is refused.</p>
<p>Dragging serves rearrangement only — dropping text or files on the list does nothing. To bring
several programs in at once, use one Program File command's picker and select them together; see
<a href="playing-a-program.html">Playing a Program</a>.</p>
<h2 id="edit-one-command">Edit one command</h2>
<p>Select a command's node. Its editor opens below a control bar carrying the same up, down, duplicate
and delete operations the row has, and a note while the command is switched off.</p>
<p>A command with one job — Program File, NC Code, Script — puts its whole editor on that one node.
A command with several cards spreads them: the general settings stay on the command node and each
remaining card becomes a <strong>child node</strong> beneath it, so a long command is read by walking down the
tree rather than by scrolling one panel. Where a card had its own <em>Enable</em> switch, that switch is
the child node's own checkbox. Which commands do that, and what each card holds, is
<a href="the-other-commands.html">The Other Commands</a>.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Running a Simulation</a> — the rest of running a job</li>
<li><a href="playing-a-program.html">Playing a Program</a> — the two commands that put NC code into a run</li>
<li><a href="the-other-commands.html">The Other Commands</a> — what the rest of the command kinds are for</li>
<li><a href="a-mission-that-resumes.html">A Mission That Resumes</a> — a layout that reads as values and restarts mid-job</li>
<li><a href="running-a-simulation.html">Starting and Stepping</a> — the transport that plays the list built here</li>
<li><a class="xref" href="../../anatomy/execution/mission/mission-root-panel.html">Mission Root Panel</a> — the component behind this branch: the list editor, the picker and the three drag landings</li>
<li><a class="xref" href="../../anatomy/execution/mission/ListCommand-panel.html">List Command Panel</a> — the component behind a group: what nesting costs, and what a disabled list skips</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>
@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Smart Tool Holder Coefficient Training | HiAPI-C# 2025 </title>
<title>Running a Simulation | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Smart Tool Holder Coefficient Training | HiAPI-C# 2025 ">
<meta name="title" content="Running a Simulation | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,41 +85,28 @@
</div>
<article data-uid="">
<h1 id="smart-tool-holder-coefficient-training">Smart Tool Holder Coefficient Training</h1>
<h1 id="running-a-simulation">Running a Simulation</h1>
<p>By cutting the following shapes and collecting three-direction torques with a smart tool holder, you can train milling coefficients through HiNC projects.</p>
<h2 id="overview">Overview</h2>
<p><img src="smart-holder-training-img/training-path-diagram.png" alt="Smart Tool Holder Coefficient Training Path Diagram"></p>
<p>Everything that happens after the equipment is set up: writing the list of commands a run executes,
playing it, watching it, and reading what it did.</p>
<p>The Execution page at <code>/execution</code> is where all of it happens — it is also where the application
opens.</p>
<p>Ordered as a run goes: build the list, play it, watch it, read it, and diagnose it.</p>
<h2 id="pages">Pages</h2>
<ul>
<li>T1 End mill D10 4 flutes</li>
<li>T2 Drill bit, diameter unrestricted</li>
<li><a href="building-a-mission.html">Building a Mission</a> — The command list a run executes, and the checkbox on each command that decides whether it runs</li>
<li><a href="playing-a-program.html">Playing a Program</a> — The two commands that put NC code into a run, and which to use when</li>
<li><a href="the-other-commands.html">The Other Commands</a> — The settings, optimizer and output kinds, and the script command: what each is for and where in the list it belongs</li>
<li><a href="running-a-simulation.html">Starting and Stepping</a> — The transport controls, the F5F8 keys, and why one line is not one step</li>
<li><a href="watching-the-run.html">Watching the Run</a> — The canvas, and the three charts that show the whole mission at once</li>
<li><a href="inspecting-a-step.html">Inspecting a Step</a> — The Step Info column: the sentence, the step, the engagement and the per-revolution charts</li>
<li><a href="the-program-branch.html">The Program Branch</a> — The files a run read, the passes it made over each and what every line produced</li>
<li><a href="when-something-goes-wrong.html">When Something Goes Wrong</a> — Which of the four message lists answers which question, why a row is not an occurrence, and three things that look like faults and are not</li>
</ul>
<p>Click to download <a href="smart-holder-training-img/train.nc">NC code</a>.</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Adjusting Machining Method</strong></p>
<h2 id="see-also">See Also</h2>
<ul>
<li>Speed and feed can be changed according to material conditions, but feed per tooth must be in multiples.</li>
<li>Slower spindle speed allows the smart tool holder to collect more data per unit time.</li>
<li>The wall thickness between the two slots in <a href="#shape-i">Shape I</a> needs to be thin enough so that <a href="#shape-ii">Shape II</a> cutting is discontinuous per revolution.</li>
</ul>
</div>
<h2 id="shape-i">Shape I</h2>
<p>Shape I consists of three red slots, which are preparatory shapes, no need to collect smart tool holder data.</p>
<ul>
<li>ae10; ap1; S1500; F600</li>
</ul>
<h2 id="shape-ii">Shape II</h2>
<p>Shape II penetrates through the thin walls between the three red slots, need to collect smart tool holder data.</p>
<ul>
<li>lineA: T1; ap1; S50; F20 (frt0.1)</li>
<li>lineB: T1; ap1; S50; F10 (frt0.05)</li>
</ul>
<h2 id="shape-iii">Shape III</h2>
<p>Shape III is drilling, need to collect smart tool holder data.</p>
<ul>
<li>drillA: T2; dp4; S50; F20</li>
<li>drillB: T2; dp4; S50; F10</li>
<li><a href="../setup/index.html">Setup</a> — the equipment a run needs before any of this</li>
<li><a href="../basics/index.html">Basics</a> — the window, the project and the messages every screen shares</li>
</ul>
</article>
Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

@@ -0,0 +1,232 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Inspecting a Step | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Inspecting a Step | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="inspecting-a-step">Inspecting a Step</h1>
<p>Once a strip chart has told you <em>where</em>, the Step Info column tells you <em>what</em>. Every panel in it is
a view of the one selected step — except the panel at the top, which deliberately is not, and the
reason for that exception is worth knowing before you read the column.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The Execution page at <code>/execution</code>, rightmost column, switched on and off from the quick-toggles on
the menu bar. Most of it stays empty until a step is selected, and selecting one is a click on a
strip chart or on the tool path in the 3D canvas.</p>
<h2 id="sentence-syntax-and-why-it-sits-outside">Sentence Syntax, and why it sits outside</h2>
<p>The top panel is the odd one out, and it is placed outside the step group on purpose: <strong>a line of NC
need not produce a machining step at all</strong>. A tool change, a coordinate selection or a comment is a
sentence with no motion under it, so a panel that reads sentences cannot be a member of a group
keyed on steps.</p>
<p>It shows the sentence's own text and the reading the interpreter made of it, with a badge naming the
file, the line and the sentence, and a button that copies the parsed form.</p>
<p>Its two empty messages say different things, and the difference matters:</p>
<ul>
<li><strong>No sentence selected</strong> — nothing is picked yet.</li>
<li><strong>This line has no executed SyntaxPiece</strong> — a line <em>is</em> picked, and it did not run in this session.
That is an answer, not a gap: the line was skipped, or it belongs to a pass the run never reached,
or the session has been reset since.</li>
</ul>
<p>The sentence it follows comes from two directions: selecting a step brings its sentence here, and so
does clicking a line in a Program file panel. That is the bridge between reading the program and
reading the run.</p>
<h2 id="the-rest-of-the-column">The rest of the column</h2>
<p>Below the group bar every panel is a view of the same selected step.</p>
<table>
<thead>
<tr>
<th>Panel</th>
<th>What it shows</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Step Properties</strong></td>
<td>The step's values, for the fields you have chosen</td>
</tr>
<tr>
<td><strong>CWE</strong></td>
<td>The cutterworkpiece engagement — what the cutter was actually touching</td>
</tr>
<tr>
<td><strong>Sim Cutting Force Cycle</strong></td>
<td>Simulated cutting force through one spindle revolution</td>
</tr>
<tr>
<td><strong>Sim Spindle Moment Cycle</strong></td>
<td>Simulated spindle moment through the same revolution</td>
</tr>
<tr>
<td><strong>Sensor Cutting Force Cycle</strong></td>
<td>The same force as measured by a dynamometer, against time</td>
</tr>
<tr>
<td><strong>Sensor Spindle Moment Cycle</strong></td>
<td>The same moment as measured, against time</td>
</tr>
</tbody>
</table>
<p>The group bar above them carries the step number as a badge, or <strong>No step selected</strong>. That badge is
the only place the step index is shown — Step Properties leaves that row out rather than repeat it,
which is why the list you configure and the list you see differ by one row.</p>
<p><strong>Step Properties shows short names.</strong> Hovering a name gives the full one, and the unit follows the
value. A field with nothing in it reads <code>-</code>.</p>
<p><strong>CWE is a footprint, not a solid.</strong> It is a small 3D view of its own, drawing the contact contours
the step left behind rather than the volume it swept, because contours are what a step stores. It has
its own view controls and a contour-grid toggle, and it reads <strong>No cut in this step</strong> for a step that
removed nothing — a rapid, or a move in air.</p>
<h2 id="two-scales-and-the-join-between-them">Two scales, and the join between them</h2>
<p>The strip charts beside this column and the cycle charts inside it are the same measurements at two
scales: the strip charts span the whole mission, the cycle charts span <strong>one revolution of one
step</strong>. Changing the selection on a strip chart re-reads every cycle chart, so scrubbing the mission
scrubs the detail with it.</p>
<p>The two simulated charts plot against <strong>spindle angle in degrees</strong>; the two sensor charts plot
against <strong>time in seconds</strong>, because measured data arrives on a clock rather than on a phase. Both
sensor charts need measurement data attached to the project; with none, they read <strong>No data for
step</strong> while the simulated pair beside them is full.</p>
<p>Each cycle chart's header carries a <strong>value boundary</strong><em>Auto</em>, or a fixed ± bound that pins the
scale so two steps can be compared without the axis moving under you — and a reload. The two spindle
moment charts carry one more: a <strong>Line / Dartboard</strong> switch, where Dartboard replots the same cycle
as a locus in the plane instead of three channels against the cycle parameter.</p>
<p><strong>Clicking a point in a cycle chart marks that point for its whole group.</strong> The two simulated charts
share one mark in spindle angle; the two sensor charts share another in seconds. The mark survives a
switch between Line and Dartboard and a change of selected step. It also reaches the CWE panel: the
cutter in that view rotates to the angle you clicked, so &ldquo;the force peaked here&rdquo; and &ldquo;this is what
the cutter was touching there&rdquo; become one picture rather than two.</p>
<p>The column with the demo mission paused and a step selected: Sentence Syntax at the top, the step
badge on the bar below it, then Step Properties, CWE and the two simulated cycle charts. The two sensor charts are folded away at the bottom — this project carries no measured data,
so nothing is lost by leaving them shut.</p>
<p><img src="inspecting-a-step-img/step-info.en.png" alt="The Execution page's Step Info column filled: a Sentence Syntax panel showing an NC block and its parsed form, a group bar carrying a step number badge, a Step Properties list of named values, a CWE panel showing the cut footprint in a small 3D view, and two cycle charts plotting force and moment against spindle angle"></p>
<h2 id="choosing-what-step-properties-shows">Choosing what Step Properties shows</h2>
<p>Step Properties does not show everything a step carries — it shows what you asked for, out of a much
longer list. The small button on that panel's header opens the chooser, beside the list it
configures.</p>
<p>Candidates are on the left, grouped into categories; a category header ticks or unticks the whole
group, and <strong>Add Selected</strong> moves what you ticked across. Anything already displayed is greyed with a
tick beside it, so the left side never offers you a duplicate. The displayed list is on the right, in
the order it will appear: drag a row, or use its up and down buttons, and remove one row at a time or
<strong>Clear</strong> the lot. <strong>Reset</strong> empties the list entirely.</p>
<p><strong>There is no Save button, and that is not an omission.</strong> Every add, removal and reorder is written
as you make it, and the header reports the write — so the way to undo an experiment is to put the
rows back, not to close the dialog.</p>
<p>The chooser open over the column, at <code>/execution</code>. The counts in its header are this account's
displayed list against everything the run can offer; the green ticks down the candidate side are the
rows already on the right.</p>
<p><img src="inspecting-a-step-img/step-present.en.png" alt="The Step Present Preference dialog open over the Execution page: a header counting displayed against available keys with Reset and close, a Candidate Keys panel on the left with collapsible categories and an Add Selected button, and a Displayed Keys panel on the right listing the chosen properties with up, down and remove buttons and a Clear action"></p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Running a Simulation</a> — the rest of running a job</li>
<li><a href="watching-the-run.html">Watching the Run</a> — the mission-wide charts whose selection fills this column</li>
<li><a href="running-a-simulation.html">Starting and Stepping</a> — stepping the run to land on the step you want to read</li>
<li><a href="the-program-branch.html">The Program Branch</a> — the file panels whose line clicks steer the Sentence Syntax panel</li>
<li><a class="xref" href="../../anatomy/execution/selected-step-info-panel.html">Selected-Step Info Panel</a> — the component behind Step Properties, and where its values come from</li>
<li><a class="xref" href="../../anatomy/execution/cycle-line-charts.html">Cycle-Line Charts</a> — the components behind the four cycle charts, and the shared cursor mark</li>
<li><a class="xref" href="../../anatomy/execution/step-present-dialog.html">Step Present Dialog</a> — the component behind the chooser: its categories, its labels and how it persists</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

@@ -0,0 +1,252 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Playing a Program | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Playing a Program | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="playing-a-program">Playing a Program</h1>
<p>Two commands put a program into a mission, and the difference between them is where the program
lives rather than what it does: <strong>Program File</strong> references a file on disk, <strong>NC Code</strong> carries the
text inside the project.</p>
<h2 id="where-they-are">Where they are</h2>
<p>The Execution page's <strong>Mission</strong> branch. Both sit in the <strong>Program</strong> category of <strong>Add Command</strong>,
and both are placed like any other command — see <a href="building-a-mission.html">Building a Mission</a>.</p>
<h2 id="which-one-to-use">Which one to use</h2>
<ul>
<li><strong>Program File</strong> — the program stays a file, and the project stores the path. Editing the file
changes what plays next time, so this is what a CAM system's output belongs in.</li>
<li><strong>NC Code</strong> — the program text is written into the project itself. Nothing outside is referenced,
so the project travels complete. Use it for a short probe, a hand-written test, or anything you
want to keep with the project rather than beside it.</li>
</ul>
<p><strong>They do not necessarily feed the same reader.</strong> NC Code is always brand NC text. Program File
plays brand NC, NX-CL or CSV, and which one it uses is a setting on the command.</p>
<h2 id="program-file">Program File</h2>
<h3 id="point-it-at-a-program">Point it at a program</h3>
<p>Type the path, or press <strong>Browse</strong>. Both forms are accepted: a path relative to the project folder,
which is what browsing produces, or an absolute path on the server.</p>
<p>Browse opens the server's file explorer on the project folder and offers no other root, so anything
picked there is project-relative by construction. A program that lives outside the project folder is
reached by typing its absolute path into the field instead.</p>
<p>The dialog filters in four groups rather than one:</p>
<table>
<thead>
<tr>
<th>Group</th>
<th>Extensions</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>NC Files</strong></td>
<td><code>.nc</code>, <code>.anc</code>, <code>.tap</code>, <code>.eia</code>, <code>.mpf</code>, <code>.spf</code>, <code>.cnc</code>, <code>.ptp</code>, <code>.h</code> — the common brand extensions, not all of them</td>
</tr>
<tr>
<td><strong>CL Files</strong></td>
<td><code>.cl</code>, <code>.cls</code>, <code>.clsf</code></td>
</tr>
<tr>
<td><strong>CSV Files</strong></td>
<td><code>.csv</code></td>
</tr>
<tr>
<td><strong>All Files</strong></td>
<td>everything, and the backstop for a brand extension the first group does not name</td>
</tr>
</tbody>
</table>
<p><strong>The picker takes more than one file.</strong> The first goes on the command you opened it from; every
further pick becomes a <strong>new Program File command</strong> placed directly after it, in the order you
picked them, inside the same list — including inside a group. That is the quick way to bring a
folder of CAM output into a mission.</p>
<h3 id="choose-the-reader">Choose the reader</h3>
<p><strong>Play As</strong> decides which reader plays the file:</p>
<table>
<thead>
<tr>
<th>Choice</th>
<th>What plays it</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Auto (by extension)</strong></td>
<td>Picked from the extension: <code>.cl</code>, <code>.cls</code> and <code>.clsf</code> play as CL, <code>.csv</code> as CSV, and every other extension as brand NC</td>
</tr>
<tr>
<td><strong>Brand NC</strong></td>
<td>The controller brand's own reader</td>
</tr>
<tr>
<td><strong>CL (CLSF)</strong></td>
<td>The NX-CL reader</td>
</tr>
<tr>
<td><strong>CSV</strong></td>
<td>The CSV reader</td>
</tr>
</tbody>
</table>
<p>Auto is the default and is right almost always. Pin one of the other three when the extension would
route the file to the wrong reader — a CL file saved as <code>.txt</code>, say.</p>
<p>For brand NC, <em>which</em> brand is not this command's business: it is the controller set on the project,
and what its words mean is <a href="../../technique/nc-dialects/index.html">NC Dialects</a>.</p>
<h3 id="read-the-banner">Read the banner</h3>
<p>Once the field holds a path, a banner below it reports what the <strong>server</strong> can see:</p>
<ul>
<li><strong>Found</strong> — a green banner with the file's size, its modified time and its line count, and a
<strong>Preview</strong> button that shows the first 100 lines read-only.</li>
<li><strong>Not found</strong> — an orange banner saying so, and no Preview button.</li>
</ul>
<p>Typing saves the path as you type; the banner refreshes when you leave the field or press
<kbd>Enter</kbd>. An orange banner is worth trusting: it means the path does not resolve on the
machine that will play it, which is not always the machine you are typing on.</p>
<p>The first Program File in the demo mission's <strong>Roughing</strong> group, at
<code>/execution?tree=execution/mission/2/0</code>. The path field carries a project-relative path, <strong>Play As</strong>
reads <em>Auto</em>, and the green banner below reports the file's size, modified time and line count with
<strong>Preview</strong> beside it. The row and the tree label both read <code>Program File</code> followed by the path,
which is how a mission of several programs stays readable.</p>
<p><img src="playing-a-program-img/program-file.en.png" alt="The Program File command panel in the Control Tree dock: a program file path field with a Browse button, a Play As select reading Auto, and a green file information banner giving size, modified time and line count with a Preview button"></p>
<h2 id="nc-code">NC Code</h2>
<h3 id="name-it">Name it</h3>
<p><strong>Title</strong> is optional in the sense that the field may be cleared, but it is not decoration: it is
the program name the run reports under, and it is the detail the mission row brackets. A new command
arrives with <code>NC Code</code> already in the field; rename it and both the log and the row follow.</p>
<h3 id="write-it">Write it</h3>
<p>The editor is a plain monospace area — no line numbers and no syntax highlighting, because this is
NC text, not a program in a language the application parses while you type. Line and character
counts sit below it and follow what you type.</p>
<p>Two buttons act on the whole text, and both are disabled while it is empty:</p>
<ul>
<li><strong>Trim Blank Lines</strong> — trims every line and drops the ones left empty.</li>
<li><strong>Clear</strong> — empties the text, after asking.</li>
</ul>
<p>Typing saves on its own, shortly after you stop; the two buttons save at once.</p>
<p><strong>Nothing is checked while you type.</strong> The text is stored exactly as written, and a mistake in it
surfaces when the mission plays it — in <strong>NC Diagnostics</strong>, see
<a href="when-something-goes-wrong.html">When Something Goes Wrong</a>.</p>
<p>The demo mission's short hand-written pass, at <code>/execution?tree=execution/mission/4</code>. The title
above the editor is what the row brackets, and the line and character counts below it are the whole
of the feedback this editor gives.</p>
<p><img src="playing-a-program-img/nc-code.en.png" alt="The NC Code command panel: a Title field reading Face check above a monospace text area holding a short NC program, with line and character counts and the Trim Blank Lines and Clear buttons below it"></p>
<h2 id="after-it-has-played">After it has played</h2>
<p>Every program a session read appears under the <strong>Program</strong> branch, with the passes that went over it
and the marks the run left on each line. That is where you see what happened to a line, as opposed
to what the mission asked for — see <a href="the-program-branch.html">The Program Branch</a>.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Running a Simulation</a> — the rest of running a job</li>
<li><a href="building-a-mission.html">Building a Mission</a> — the list these two commands go into</li>
<li><a href="the-program-branch.html">The Program Branch</a> — what the run recorded against each line</li>
<li><a href="the-other-commands.html">The Other Commands</a> — the rest of the command kinds, including the script that drives a session without NC</li>
<li><a class="xref" href="../../anatomy/execution/mission/NcFileCommand-panel.html">NcFileCommand Panel</a> — the component behind Program File: its fields, its picker and the endpoints behind the banner</li>
<li><a class="xref" href="../../anatomy/execution/mission/NcCodeCommand-panel.html">NcCodeCommand Panel</a> — the component behind NC Code: its editor, its stats row and how it saves</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

@@ -0,0 +1,256 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Starting and Stepping | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Starting and Stepping | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="starting-and-stepping">Starting and Stepping</h1>
<p>Six buttons and four keys drive a run. What each of them does is short to say; <strong>which of them you
can press at a given moment is the part worth learning</strong>, because the availability of a button is
what tells you where the run actually is.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The Execution page at <code>/execution</code>. The transport sits along the top of the editor panel in the left
dock, and it is mounted for the <strong>Execution</strong> root and every node beneath it — so it stays reachable
while you are editing a Mission command one level in. There is exactly one of it on the page, and it
is the thing that binds <kbd>F5</kbd> to <kbd>F8</kbd>.</p>
<h2 id="the-six-controls">The six controls</h2>
<table>
<thead>
<tr>
<th>Control</th>
<th>Key</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Start</strong> / <strong>Resume</strong></td>
<td><kbd>F5</kbd></td>
<td>Starts the run, or resumes a paused one</td>
</tr>
<tr>
<td><strong>Pause</strong></td>
<td><kbd>F6</kbd></td>
<td>Holds the run where it is</td>
</tr>
<tr>
<td><strong>Run one NC line</strong></td>
<td><kbd>F7</kbd></td>
<td>Advances by one line of the program</td>
</tr>
<tr>
<td><strong>Run one machining step</strong></td>
<td><kbd>F8</kbd></td>
<td>Advances by one machining step</td>
</tr>
<tr>
<td><strong>Stop</strong></td>
<td></td>
<td>Ends the run</td>
</tr>
<tr>
<td><strong>Reset</strong></td>
<td></td>
<td>Unwinds the session back to the start</td>
</tr>
</tbody>
</table>
<p>Start and Resume are the same button, not two: it reads <strong>Start</strong> from the beginning and <strong>Resume</strong>
once the run is paused. The two single-advance buttons share one icon and are told apart by a small
letter in the corner — <strong>L</strong> for a line, <strong>S</strong> for a step. Stop and Reset carry no key.</p>
<p>Reset unwinds in the background: the button shows a spinner while it works and the rest of the
application stays usable.</p>
<h2 id="one-line-is-not-one-step">One line is not one step</h2>
<p>The two single-advance buttons exist because the two units do not line up. One line of program can
produce many machining steps — a long move at a fine machining resolution is dozens of them — while
another line produces none at all, because a tool change or a coordinate selection is a sentence with
no motion under it. So advancing by one line and advancing by one step land in different places.</p>
<p>Use <strong>Run one NC line</strong> when you are following the program: it stops where the next line begins,
which is where the program text you are reading changes. Use <strong>Run one machining step</strong> when you are
following the cut: it stops at the next thing the machine did, which is the unit the Step Info column
and the strip charts are keyed on. Stepping by step through a single long move is how you watch one
cut develop; stepping by line skips straight past it.</p>
<h2 id="what-you-can-press-and-when">What you can press, and when</h2>
<p>The whole bar is dead until two things are true: <strong>a project is open</strong>, and <strong>the page's 3D canvas
has connected to the service</strong>. The second one is easy to miss — the connection is what binds the
run engine to this page, so a canvas that has dropped its connection leaves every transport button
greyed even though the project is plainly loaded. The connection badge on the menu bar is where you
check that.</p>
<p>With both in place, availability follows the run state:</p>
<table>
<thead>
<tr>
<th>Control</th>
<th>Available while the run is</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Start</strong> / <strong>Resume</strong></td>
<td>ready, or paused</td>
</tr>
<tr>
<td><strong>Pause</strong></td>
<td>running</td>
</tr>
<tr>
<td><strong>Run one NC line</strong> / <strong>Run one machining step</strong></td>
<td>ready, or paused</td>
</tr>
<tr>
<td><strong>Stop</strong></td>
<td>running, paused, or finished</td>
</tr>
<tr>
<td><strong>Reset</strong></td>
<td>any time a project is open</td>
</tr>
</tbody>
</table>
<p><strong>Nothing steps a moving run.</strong> Both single-advance buttons are unavailable while the run is going,
so the way to step through something you are already watching is to pause first and then step. That
is the single most useful thing in the table: the buttons are not refusing you, they are telling you
the run has not stopped yet.</p>
<p>The bar at rest, with the demo project open and nothing run yet, at <code>/execution</code>. Start, the two
single-advance buttons and Reset are live; Pause and Stop are greyed, because there is no run to hold
or to end — and the two single-advance buttons carry the <strong>L</strong> and the <strong>S</strong> that tell them apart. The
badge on the <strong>Execution</strong> tree item reads <em>ready</em>, and the block on the canvas is uncut.</p>
<p><img src="running-a-simulation-img/transport-ready.en.png" alt="The Execution page with the Control Tree on the left showing the Mission and Program branches, a green ready badge on the Execution item, the transport row above the editor panel with the pause and stop buttons greyed, and the 3D canvas showing an uncut rectangular aluminium block on its fixture"></p>
<h2 id="reading-the-run-state">Reading the run state</h2>
<p>The state rides the <strong>Execution</strong> item in the Control Tree as a coloured badge — <em>ready</em>, <em>running</em>,
<em>paused</em>, <em>finished</em> — so it is readable from wherever you are in the tree rather than only from the
transport. The footer along the bottom of the window carries the session's own messages beside it.</p>
<p>The same page with the mission paused part way through. The badge now reads <em>paused</em> in orange, Pause
has gone grey, and Stop has joined the live ones — so the bar alone tells you a run is open and held.
On the canvas the tool path the run has laid down so far is now drawn over the block, and the tabs
under it are counting what the run has reported: this mission trips the collision check, which is
what the red line in the footer and the number on <strong>Step Diagnostics</strong> are saying.</p>
<p><img src="running-a-simulation-img/transport-paused.en.png" alt="The Execution page with the Control Tree on the left, its Execution item carrying an orange paused badge, the transport row above the editor panel with the pause button greyed and the rest live, the 3D canvas showing the block with the covered tool path drawn over it, and a footer line reporting a collision"></p>
<h2 id="the-keys-and-where-they-stop">The keys, and where they stop</h2>
<p><kbd>F5</kbd> to <kbd>F8</kbd> are bound only while the Execution page is the one on screen. On every
other page <kbd>F5</kbd> is the browser's own reload, and the same is true here in two cases: when
the button a key drives is unavailable at that moment, and when the focus is inside a text field.</p>
<div class="WARNING">
<h5>Warning</h5>
<p>That exception bites hardest on <kbd>F5</kbd> during a run. Start is unavailable while the run is
going, so the key falls through to the browser, the page reloads, and the session goes with it.
Pause with <kbd>F6</kbd> first.</p>
</div>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Running a Simulation</a> — the rest of running a job</li>
<li><a href="building-a-mission.html">Building a Mission</a> — the command list this transport plays</li>
<li><a href="watching-the-run.html">Watching the Run</a> — the canvas and the charts that fill while this plays</li>
<li><a href="inspecting-a-step.html">Inspecting a Step</a> — the column that reads whichever step you stopped on</li>
<li><a href="when-something-goes-wrong.html">When Something Goes Wrong</a> — what to read when the run does not do what you expected</li>
<li><a href="../basics/the-app-window.html">The Application Window</a> — the menu bar's connection badge, and the footer this page's state is reported in</li>
<li><a class="xref" href="../../anatomy/execution/execution-tool-bar.html">Execution Tool Bar</a> — the component behind these buttons: the enable rules, the status feed and the key bindings</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

@@ -0,0 +1,367 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>The Other Commands | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="The Other Commands | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="the-other-commands">The Other Commands</h1>
<p>Beyond putting a program into a run, a mission can change the session's settings part-way through,
steer the optimizer, write out what the run produced, and drive the session from a script.</p>
<h2 id="where-they-are">Where they are</h2>
<p>The Execution page's <strong>Mission</strong> branch, all from the same <strong>Add Command</strong>. The Program category's
other two commands are on <a href="playing-a-program.html">Playing a Program</a>, and the Flow category's one
command is on <a href="building-a-mission.html">Building a Mission</a>.</p>
<h2 id="settings-one-per-command">Settings, one per command</h2>
<p>The <strong>Setup</strong> category holds five commands, each carrying one setting:</p>
<table>
<thead>
<tr>
<th>Command</th>
<th>What it sets</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Machining Resolution</strong></td>
<td>the meshing resolution of material removal, in mm</td>
<td>0.125 mm</td>
</tr>
<tr>
<td><strong>Machining Motion Resolution</strong></td>
<td>how a motion is sampled into steps</td>
<td>Feed Per Cycle</td>
</tr>
<tr>
<td><strong>Collision Detection</strong></td>
<td>whether collisions are detected</td>
<td>on</td>
</tr>
<tr>
<td><strong>Pause on Failure</strong></td>
<td>whether the run stops at a failure</td>
<td>off</td>
</tr>
<tr>
<td><strong>Physics</strong></td>
<td>whether physics is simulated</td>
<td>on, where the advanced-physics licence is held</td>
</tr>
</tbody>
</table>
<p><strong>Each takes effect from its own position in the list onward.</strong> A program above one plays under
whatever was in force before it; programs below it play under the new value, until something further
down changes the session again.</p>
<p>That is the reason these are commands rather than project-wide settings, and it is worth using: put
a coarse machining resolution above the roughing programs and a fine one above the finishing
programs, and one run does both at the resolution each deserves.</p>
<p>Four of the five are a single field or checkbox. <strong>Machining Motion Resolution</strong> has more to say and
carries its own editor: a type — <em>Feed Per Cycle</em>, <em>Feed Per Tooth</em> or <em>Fixed</em> — and, for Fixed, a
linear resolution in mm and a rotary one in degrees.</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>General Config is not on the menu, and it is not missing.</strong> It was one command carrying all five
of these settings at once, and the five above replace it. A project that still stores one loads as
those five commands in its place — preceded by a Record Meshed Geometry command where the bundle
also read a meshed geometry file — and saving from then on writes the five. There is nothing to
add and nothing to look for.</p>
</div>
<h2 id="the-optimizer-as-a-step">The optimizer, as a step</h2>
<p><strong>NC Optimization Config</strong> is the Optimization category's one command, and it exists so the
optimizer's settings sit at a point in the run rather than over all of it. Everything played below
it optimizes under those values, and a second one further down re-points them mid-mission.</p>
<p>Its own node carries four switches — <strong>Enable Optimization</strong>, <strong>Enable Feedrate Optimization</strong>,
<strong>Enable Depth Splition</strong> and <strong>Enable Interpolation</strong> — and the values live on five child nodes
beneath it:</p>
<table>
<thead>
<tr>
<th>Child node</th>
<th>What is on it</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Distances</strong></td>
<td>the extended pre- and post-distances, in mm</td>
</tr>
<tr>
<td><strong>Feedrate</strong></td>
<td>the feedrate floor and ceiling, the rapid feed, the feed-per-tooth bounds and the assignment ratio</td>
</tr>
<tr>
<td><strong>Motion Dynamics</strong></td>
<td>maximum acceleration and jerk</td>
</tr>
<tr>
<td><strong>Force &amp; Safety</strong></td>
<td>the preferred cutting force and the yielding, thermal-yield, spindle-torque and spindle-power safety factors</td>
</tr>
<tr>
<td><strong>Compensation</strong></td>
<td>the forward, side and depth compensation switches</td>
</tr>
</tbody>
</table>
<p>None of the five child nodes carries a checkbox of its own. The command's own checkbox is the only
one, and like every command's it decides whether the mission runs this command — not whether the
optimizer is on, which is the first switch on its panel.</p>
<p>The command takes no title: its row always reads <strong>NC Optimization Config</strong>. What each quantity
means, and why an optimized result can look wrong, is
<a href="../../technique/nc-optimization/index.html">NC Optimization</a>.</p>
<p>The demo mission's optimizer command, at <code>/execution?tree=execution/mission/1</code>, sitting above the
two program groups it governs. The four switches are on the command's own panel; the five value
nodes are indented under it in the tree.</p>
<p><img src="the-other-commands-img/nc-optimization-config.en.png" alt="The NC Optimization Config command selected in the Mission branch, with Distances, Feedrate, Motion Dynamics, Force and Safety and Compensation child nodes listed beneath it, and the panel below showing the Enable Optimization, Enable Feedrate Optimization, Enable Depth Splition and Enable Interpolation checkboxes"></p>
<h2 id="writing-out-what-the-run-produced">Writing out what the run produced</h2>
<p>The <strong>Output</strong> category holds three commands: <strong>Post-Execution</strong>, <strong>Record Meshed Geometry</strong> and
<strong>Export Meshed Geometry (STL)</strong>.</p>
<p><strong>Post-Execution's name says what it consumes, not where it goes.</strong> It is an ordinary entry in the
list, not an end-of-run hook, and everything it writes is derived from what the session has played
<em>above</em> it. Put it after two programs and it covers both; put a second one halfway down the list and
it writes an interim snapshot of the same accumulating run. <strong>Its placement is the whole question.</strong></p>
<p>Five outputs hang off it, each a child node whose own checkbox switches that output on:</p>
<table>
<thead>
<tr>
<th>Output</th>
<th>What it writes</th>
<th>Default template</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Step Files Output</strong></td>
<td>the step-series data of what has played</td>
<td><code>Output/[NcName].step.csv</code></td>
</tr>
<tr>
<td><strong>Shot Files Output</strong></td>
<td>time-sampled series at a period you set</td>
<td><code>Output/[NcName].shot.csv</code></td>
</tr>
<tr>
<td><strong>Optimization Output</strong></td>
<td>the optimized programs</td>
<td><code>Output/Opt-[NcName]</code></td>
</tr>
<tr>
<td><strong>CL → NC Writeback</strong></td>
<td>brand NC re-synthesized from what was played</td>
<td><code>Output/[NcName].nc</code></td>
</tr>
<tr>
<td><strong>Geometry Difference Detection</strong></td>
<td>a comparison of the workpiece geometry at a radius you set</td>
<td></td>
</tr>
</tbody>
</table>
<p><code>[NcName]</code> in a template is replaced by the source program's name.</p>
<p>Three things to know before switching them on:</p>
<ol>
<li><strong>Two of the five are visible only while Show Physics Options is on</strong> in the Preference menu —
Shot Files Output and Optimization Output. See <a href="../basics/preferences.html">Preferences</a>.</li>
<li><strong>The shot file's time resolution is a sampling period, not the machining resolution</strong>, and it
sets the accuracy ceiling of that data. A fine period makes a large file: a six-cut program
writes about 13 MB at the default 1 ms and about 128 MB at 0.1 ms.</li>
<li><strong>The CL → NC writeback needs the CL played on an XYZABC chain</strong>, so the Program File command
that plays it goes above this command. It re-serializes every control file the session played,
so an NC play is written back too, and the converted files appear on the <strong>Program</strong> branch as
their own nodes — see <a href="the-program-branch.html">The Program Branch</a>.</li>
</ol>
<p>Every field stays editable whether or not its checkbox is ticked: the checkbox decides what runs,
not what can be prepared. The outputs are written in an order of the command's own — shot files,
step files, optimization, the writeback, then the geometry difference — which is not the order the
tree lists them in, and which matters only if you are reading their timestamps.</p>
<p>The demo mission's Post-Execution command with <strong>Step Files Output</strong> selected, at
<code>/execution?tree=execution/mission/5/step-files</code>. Each output is a child node with its own
checkbox — that tick is what switches the output on — and the template field for the selected one
sits in the panel below.</p>
<p><img src="the-other-commands-img/post-execution.en.png" alt="The Post-Execution command in the Mission branch with its five child nodes, each carrying its own checkbox, and the Step File Template field in the panel below"></p>
<h2 id="keeping-the-workpiece-between-runs">Keeping the workpiece between runs</h2>
<p>The Output category's other two commands both take the workpiece as it stands at their own point in
the list. <strong>Record Meshed Geometry</strong> stores it in the application's mesh format so a later run can
pick it back up; <strong>Export Meshed Geometry (STL)</strong> writes an STL for something outside the
application to read.</p>
<p>Record Meshed Geometry carries a path — <code>Cache/Workpiece.wct</code> by default, because a recorded mesh is
a rebuildable by-product of a run rather than a project asset — and one of four actions:</p>
<table>
<thead>
<tr>
<th>Action</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>No Action</strong></td>
<td>nothing; the entry is a placeholder</td>
</tr>
<tr>
<td><strong>Read</strong></td>
<td>always loads the file into the session</td>
</tr>
<tr>
<td><strong>Write</strong></td>
<td>always writes the session's geometry to the file</td>
</tr>
<tr>
<td><strong>Read On First Or Write</strong></td>
<td>reads the file if it exists <strong>and nothing has played yet this session</strong>; otherwise writes</td>
</tr>
</tbody>
</table>
<p>The condition on the fourth is what makes the command usable more than once in one mission: the
first such entry reads, and every one below a program writes. Building a mission around that is
<a href="a-mission-that-resumes.html">A Mission That Resumes</a>.</p>
<p><strong>Writing builds the mesh, at the resolution in force where the command sits</strong> — so a Machining
Resolution command belongs above it. A missing file is not an error: writing it is what a run does.
<strong>Reset</strong> on the command's panel deletes the file it points at, so the next run records afresh.</p>
<p>Export Meshed Geometry (STL) takes a path — <code>Output/MeshedGeom.stl</code> by default, since an export is
something you asked for rather than a cache — and a resolution in millimetres; leave it at 0 for the
default. It also builds the mesh, so the same placement rule applies.</p>
<h2 id="driving-the-session-from-a-script">Driving the session from a script</h2>
<p><strong>Script</strong> is the Program category's third command: C# evaluated against the running session, for
anything the other command kinds do not cover. Where the script returns a sequence of actions, that
sequence is played as part of the run.</p>
<p>The editor completes against the very API the run will compile the script with, so what it offers is
what the run accepts, and a member's signature and summary show beside the suggestion. Picking a
method inserts the call with each argument as a stop, so <kbd>Tab</kbd> walks the parameters.</p>
<p><strong>There is no Save button.</strong> Typing saves shortly after you stop, and the pill beside the title
reports where the text is: <em>Idle</em>, <em>Dirty</em>, <em>Staging…</em>, <em>Staged</em>, or <em>Error</em> with the reason in its
tooltip. <strong>Staged means the service is holding the script, not that the project has been saved</strong>
save the project to keep it.</p>
<p>Two prompts guard the edges, and neither is a yes/no question, so each has three buttons:</p>
<ul>
<li><strong>Unsaved Changes</strong>, when you select another node while a save is still pending — <em>Save &amp; switch</em>
flushes it first, <em>Discard</em> drops it, <em>Cancel</em> leaves the selection where it is.</li>
<li><strong>Script changed elsewhere</strong>, when the command changed underneath you — another tab, or a project
reload.</li>
</ul>
<p>Like NC Code, the title is optional and is what the row brackets.</p>
<h2 id="the-list-is-not-closed">The list is not closed</h2>
<p>What <strong>Add Command</strong> offers is whatever the application knows about, not a menu built into the
interface. A kind with no editor of its own is served by a generic one built from the settings that
kind declares — which is how <strong>Machining Resolution</strong>, <strong>Collision Detection</strong>, <strong>Pause on Failure</strong>
and <strong>Physics</strong> are edited. So a command kind can be addable, and fully editable, before this manual
has a page for it.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Running a Simulation</a> — the rest of running a job</li>
<li><a href="building-a-mission.html">Building a Mission</a> — the list these commands go into</li>
<li><a href="a-mission-that-resumes.html">A Mission That Resumes</a> — the layout these commands fall into, and what it buys</li>
<li><a href="playing-a-program.html">Playing a Program</a> — the two commands that put NC code into a run</li>
<li><a class="xref" href="../../anatomy/execution/mission/PreSettingCommand-panel.html">PreSettingCommand Panel</a> — the component behind General Config, and what a stored bundle expands into</li>
<li><a class="xref" href="../../anatomy/execution/mission/NcOptOption-panel.html">NC Optimization Option Panel</a> — the component behind NC Optimization Config, field by field</li>
<li><a class="xref" href="../../anatomy/execution/mission/PostExecutionCommand-panel.html">PostExecutionCommand Panel</a> — the component behind Post-Execution: its five sections and what each writes</li>
<li><a class="xref" href="../../anatomy/execution/mission/script-command-panel.html">Script Command Panel</a> — the component behind Script: its editor, its completion and its save states</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

@@ -0,0 +1,192 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>The Program Branch | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="The Program Branch | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="the-program-branch">The Program Branch</h1>
<p>What the run actually read, line by line, as opposed to what the mission asked for.</p>
<p>The Execution page's Control Tree carries two branches: <strong>Mission</strong> above, <strong>Program</strong> below, at
Control-Tree path <code>execution/program</code>. Program is read-only — every node on it is either a file the
mission points at or a pass a run made over one — and the transport bar stays pinned above its
panels, so a run can be started, stepped and reset without leaving the branch.</p>
<h2 id="before-anything-runs">Before anything runs</h2>
<p>The branch is not empty before a run. The service seeds it from the mission: one node per distinct
NC file a <strong>Program File</strong> command names, and one per <strong>NC Code</strong> command, taken in the order the
mission lists them and reaching into nested groups. Those nodes are placeholders — a file the run
has not opened yet — and the branch panel says so, badging itself <em>not run yet</em> beside the file
count.</p>
<p>Three things decide what is seeded, and each of them is visible in the screenshot below:</p>
<ul>
<li><strong>A disabled command seeds nothing.</strong> The mission's greyed <em>Program File</em> entry names an NC file
that never reaches the branch, and nothing beneath a disabled group reaches it either.</li>
<li><strong>Two commands naming one file seed one node.</strong> Paths are compared with case and slash direction
ignored, so a file played twice appears once.</li>
<li><strong>An NC Code command is seeded under its own title</strong>, not under a file name, because it has no
file — its text lives in the mission. The branch marks it <code>(inline)</code>.</li>
</ul>
<p><img src="the-program-branch-img/program-before-run.en.png" alt="The Execution page before a run: the Control Tree shows the Mission branch with nine commands — two of them greyed out and unticked — over the Program branch, whose five nodes are circle.ptp, drill_slot.ptp, side.ptp, slide.ptp and (inline) Inline finishing pass. The branch panel below the transport bar is badged not run yet beside 5 files, and the four Session Messages tabs are empty"></p>
<p><em>The Program branch at <code>/execution?tree=execution/program</code>, on a project that has not been played.
The disabled <code>Program File</code> entry in Mission has no node under Program; the enabled <code>NC Code</code>
command has one, under its title.</em></p>
<h2 id="after-a-run">After a run</h2>
<p>Playing the mission fills the same nodes in and adds any file the run reached that the mission did
not name — a subprogram call nests its callee under the caller. The panel's badge changes from
<em>not run yet</em> to <em>run data</em>, and a file the run made more than one pass over takes a <code>×</code> and a
count in its tree label.</p>
<p><img src="the-program-branch-img/program-after-run.en.png" alt="The same page after the run has finished: the Execution root badge reads finished, the first Program node now reads circle.ptp ×2, the branch panel is badged run data beside 5 files, and the Session Messages tabs carry counts — Shell 10 and NC Diagnostics 7, with Step Diagnostics and NC Manipulation still unbadged"></p>
<p><em>The same deep link once the run has finished. <code>circle.ptp ×2</code> is one node holding two passes,
because two Program File commands named the same file.</em></p>
<div class="IMPORTANT">
<h5>Important</h5>
<p>The branch is rebuilt when the run <strong>changes state</strong> — starting, finishing, being reset — and not
while it is playing. During a long run the nodes on screen are the ones the last transition left
there, so a file the run has since opened may not be listed yet. Pausing brings it up to date.</p>
</div>
<h2 id="reading-one-file">Reading one file</h2>
<p>Selecting a node opens the file as the run saw it: the path it was read from, a selector for the
passes made over it, and the text with what each line produced beside it.</p>
<p><img src="the-program-branch-img/program-file-passes.en.png" alt="The Program branch with circle.ptp ×2 selected: the breadcrumb reads Execution / Program / circle.ptp ×2, the path caption NC/circle.ptp, a pass selector reading Pass (2) and #2 · re-entry beside a Follow toggle, then twenty-one numbered lines of NC with a step range printed to the right of thirteen of them, and a footer reading 21 lines · 21 executed lines"></p>
<p><em>One file node at <code>/execution?tree=execution/program/0</code>, with the canvas column switched off so the
line viewer has the width. The pass selector names the pass and why it was entered.</em></p>
<ul>
<li><strong>The pass selector</strong> carries one entry per pass, labelled with how that pass was entered — the
first arrival at the top of the file, a re-entry when the mission came back to it, or the call
that reached it from another file.</li>
<li><strong>The step range</strong> beside a line is what that line produced. A line with no range beside it ran
and produced no motion: <code>G</code> and <code>M</code> words that set state, and the tape marks, all execute without
cutting anything.</li>
<li><strong>A line missing from the marks altogether did not run in that pass.</strong> That is the difference the
branch exists to show, and it is per pass — the same line can be greyed in one pass and marked in
the next.</li>
<li><strong>Follow</strong> keeps the viewer on the line the run is executing; with it off the view stays where it
was put.</li>
</ul>
<h2 id="what-the-branch-does-not-hold">What the branch does not hold</h2>
<ul>
<li><strong>The writeback files are not inside the file nodes.</strong> Converting a played program back to NC
makes its own node at the top of the branch, beside the file nodes rather than under them, and
clicking a line on either side jumps to its twin on the other. That conversion is the CL-to-NC
writeback, so a mission that plays brand NC produces none, and the branch shows only source files.</li>
<li><strong>Node addresses are positions, not files.</strong> A node is <code>execution/program</code> followed by its index,
so a deep link into the branch survives only as long as the branch has the same shape. Link to the
branch, not into it.</li>
<li><strong>A skipped line is not only recorded here.</strong> A line suppressed by block skip is also announced in
the <strong>NC Diagnostics</strong> list while the run is playing — see
<a href="when-something-goes-wrong.html">When Something Goes Wrong</a>.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Running a Simulation</a> — the rest of running a job</li>
<li><a href="playing-a-program.html">Playing a Program</a> — the two commands that put the sources here</li>
<li><a href="when-something-goes-wrong.html">When Something Goes Wrong</a> — reading this branch as part of a diagnosis</li>
<li><a href="inspecting-a-step.html">Inspecting a Step</a> — the Sentence Syntax panel that a line click on one of these file panels steers</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,49 @@
<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="building-a-mission.html" name="" title="Building a Mission">Building a Mission</a>
</li>
<li>
<a href="playing-a-program.html" name="" title="Playing a Program">Playing a Program</a>
</li>
<li>
<a href="the-other-commands.html" name="" title="The Other Commands">The Other Commands</a>
</li>
<li>
<a href="a-mission-that-resumes.html" name="" title="A Mission That Resumes">A Mission That Resumes</a>
</li>
<li>
<a href="running-a-simulation.html" name="" title="Starting and Stepping">Starting and Stepping</a>
</li>
<li>
<a href="watching-the-run.html" name="" title="Watching the Run">Watching the Run</a>
</li>
<li>
<a href="inspecting-a-step.html" name="" title="Inspecting a Step">Inspecting a Step</a>
</li>
<li>
<a href="the-program-branch.html" name="" title="The Program Branch">The Program Branch</a>
</li>
<li>
<a href="when-something-goes-wrong.html" name="" title="When Something Goes Wrong">When Something Goes Wrong</a>
</li>
</ul>
</div>
</div>
</div>
</div>
@@ -0,0 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Building a Mission","href":"building-a-mission.html","topicHref":"building-a-mission.html"},{"name":"Playing a Program","href":"playing-a-program.html","topicHref":"playing-a-program.html"},{"name":"The Other Commands","href":"the-other-commands.html","topicHref":"the-other-commands.html"},{"name":"A Mission That Resumes","href":"a-mission-that-resumes.html","topicHref":"a-mission-that-resumes.html"},{"name":"Starting and Stepping","href":"running-a-simulation.html","topicHref":"running-a-simulation.html"},{"name":"Watching the Run","href":"watching-the-run.html","topicHref":"watching-the-run.html"},{"name":"Inspecting a Step","href":"inspecting-a-step.html","topicHref":"inspecting-a-step.html"},{"name":"The Program Branch","href":"the-program-branch.html","topicHref":"the-program-branch.html"},{"name":"When Something Goes Wrong","href":"when-something-goes-wrong.html","topicHref":"when-something-goes-wrong.html"}]}
Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

@@ -0,0 +1,305 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Watching the Run | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Watching the Run | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="watching-the-run">Watching the Run</h1>
<p>A run shows itself two ways at once, and they answer different questions. The canvas shows what is
happening now. The strip charts show the <strong>whole mission</strong> as one picture, so they are where you find
out <em>where</em> the interesting part is. Use the charts to choose a moment; use the canvas and the Step
Info column to look at it.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The Execution page at <code>/execution</code>, in the two middle columns: the 3D canvas with the Session
Messages panel beneath it, and the <strong>Strip Charts</strong> column beside it. Both columns are switched on
and off from the quick-toggles on the menu bar, and every panel inside them folds to its own header.</p>
<h2 id="the-canvas">The canvas</h2>
<p><strong>What the canvas draws is a choice, not a fixed set.</strong> It opens showing the workpiece, the fixture,
the dimension bar and the tool path. The machine and the tool are <em>not</em> drawn until you ask for
them — which is usually what you want, because a five-axis machine at home position fills the frame
and hides the cut you came to watch.</p>
<p>The panel header carries the generic camera control — a <strong>View</strong> menu of seven presets: Isometric,
Front, Back, Right, Left, Top and Bottom — and beside it the four that belong to a run:</p>
<table>
<thead>
<tr>
<th>Control</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Tool Path</strong></td>
<td>Shows or hides the tool path through the whole program</td>
</tr>
<tr>
<td><strong>Path Points</strong></td>
<td>Adds the per-position dot markers along it. Editable only while Tool Path is on</td>
</tr>
<tr>
<td><strong>Scene ▾</strong></td>
<td>Which elements are drawn, in three groups</td>
</tr>
<tr>
<td><strong>Meshed Geom ▾</strong></td>
<td>The workpiece's rendering-cache budget, and the ideal-versus-actual difference display</td>
</tr>
</tbody>
</table>
<p>The <strong>Scene</strong> menu groups its checkboxes the way the renderer groups them: <strong>Solid</strong> — Machine, Tool,
Workpiece, Fixture; <strong>Coordinate</strong> — Program Zero, ISO Coordinate, and Heidenhain Coordinate on a
Heidenhain project only; <strong>Display Aids</strong> — Dimension Bar, Color Scale Bar. The tool path is
deliberately not in this menu: its own button owns it, and Path Points hangs off that.</p>
<p>Under <strong>Meshed Geom</strong> sit two rows, each opening a panel of its own: <em>Graphic Cache</em>, the memory
budget for the workpiece's rendering cache, and <em>Diff Visual Radius</em>, which displays the difference
between the ideal geometry and the actual one. The second carries a badge reading <strong>None</strong> or
<strong>Diff</strong>, so the menu answers &ldquo;did this run leave a difference?&rdquo; without your opening the row.</p>
<p>Collapsing the canvas does not disconnect it. The panel keeps it mounted and simply stops it drawing,
so re-expanding is instant rather than a fresh connection.</p>
<p>The <strong>Scene</strong> menu open over the canvas at <code>/execution</code>, with the Strip Charts column beside it. The
three groups are the ones listed above, and the ticked boxes are the set the page opens with —
Workpiece, Fixture and Dimension Bar — with Machine and Tool unticked.</p>
<p><img src="watching-the-run-img/scene-menu.en.png" alt="The Execution page with the Scene dropdown open over the 3D canvas, showing Solid with Machine, Tool, Workpiece and Fixture, Coordinate with Program Zero and ISO Coordinate, and Display Aids with Dimension Bar and Color Scale Bar; Workpiece, Fixture and Dimension Bar are ticked, and the Strip Charts column stands to the right"></p>
<h2 id="the-three-strip-charts">The three strip charts</h2>
<p>One group bar drives three charts, and each of them plots <strong>the whole mission rather than the current
moment</strong>:</p>
<table>
<thead>
<tr>
<th>Chart</th>
<th>What it plots</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Availability Chart</strong></td>
<td>Five ratios: yielding stress, max spindle torque, max spindle power, spindle working temperature, thermal yield</td>
</tr>
<tr>
<td><strong>Surface Roughness Chart</strong></td>
<td>Re-cut depth, program-side cusp, and tip deflection in X / Y / Z, in µm</td>
</tr>
<tr>
<td><strong>Color Index Time Chart</strong></td>
<td>One property you pick, from every step property the run can quantify</td>
</tr>
</tbody>
</table>
<p>Each series is drawn as a <strong>band between its minimum and its maximum</strong>, not as a line through
samples: the window is downsampled to the width it has on screen, so what you are reading is the
shape of the run — where the spindle is loaded, where surface quality degrades, where thermal limits
are approached — rather than individual values. The values themselves are in the legend panel down
the side of each chart, which follows the cursor and can be dragged wider.</p>
<p>All three carry a <strong>Y-axis range</strong> editor in their header — <em>Fit</em> to the data, <em>Lock</em> to a minimum
and maximum you type, or <em>Symmetric</em> about zero with a bound; locking one is how you compare two
parts of a run without the axis moving under you. The
Color Index chart adds two more: the property picker, which is a type-to-filter list of every
quantifiable step property, and <strong>Colors</strong>, which edits the colour guide. Colors is worth
understanding before you touch it: it drives the <strong>colour of the workpiece in the 3D scene</strong> and the
colour scale bar, not the line in the chart.</p>
<h3 id="the-group-bar">The group bar</h3>
<table>
<thead>
<tr>
<th>Control</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td>Range chip</td>
<td>The slice of the mission currently shown, against its total step count</td>
</tr>
<tr>
<td>Cursor readout</td>
<td>The x-value under the pointer, shared by all three charts</td>
</tr>
<tr>
<td><strong>X-axis mode</strong></td>
<td><em>Time (s)</em> or <em>Step index</em>, applied to all three at once</td>
</tr>
<tr>
<td><strong>Fit view</strong></td>
<td>Fits the 3D canvas to the tool path — the one control here that acts on the canvas</td>
</tr>
<tr>
<td><strong>Stick to live end</strong></td>
<td>Keeps the window's right edge pinned to the running end of the mission</td>
</tr>
<tr>
<td><strong>Reset display range</strong></td>
<td>Back to the whole mission, and re-arms stick-to-end</td>
</tr>
<tr>
<td><strong>Reload</strong></td>
<td>Re-fetches all three charts</td>
</tr>
</tbody>
</table>
<p>Stick-to-end turns itself <strong>off</strong> the moment you pan or zoom, because both of those set a definite
right edge. That is the behaviour you want while a run is going — you can look at something without
being dragged back to the live end — and <em>Reset display range</em> is how you re-arm it.</p>
<h2 id="reading-a-chart-with-the-pointer">Reading a chart with the pointer</h2>
<p>The three charts share one window and one selection, so a gesture on any of them moves all three.</p>
<table>
<thead>
<tr>
<th>Gesture</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td>Click</td>
<td>Selects that step — this is what fills the Step Info column</td>
</tr>
<tr>
<td>Drag left or right</td>
<td>Sweeps a range and zooms to it on release</td>
</tr>
<tr>
<td>Right-drag or middle-drag</td>
<td>Pans</td>
</tr>
<tr>
<td>Wheel</td>
<td>Zooms about the pointer</td>
</tr>
<tr>
<td>Hover</td>
<td>Puts that x-value in the group bar's cursor readout</td>
</tr>
<tr>
<td>One finger / two fingers</td>
<td>Pans / pinch-zooms, on a touch screen</td>
</tr>
</tbody>
</table>
<p>A left drag shorter than a few pixels counts as a click, so selecting a step does not need a steady
hand.</p>
<p>Before anything has run, all three read <strong>No mission data</strong>. A chart that has data but no physics
behind it reads <strong>No physics data</strong> instead — that is what the Availability chart looks like when
the run produced no physics results.</p>
<p>The three charts with the demo mission paused part way through and a step selected. The vertical rule
crossing all three at the same place is that selection; the range chip on the group bar names the
window, the x-axis is in seconds, and each chart's legend stands down its right side with one entry
per series — five on each of the first two, one on the Color Index chart, which plots the single
property named in its header.</p>
<p><img src="watching-the-run-img/strip-charts.en.png" alt="The Execution page's Strip Charts column filled from a paused run: an Availability Chart, a Surface Roughness Chart and a Color Index Time Chart stacked under one group bar, each showing banded series across the mission timeline with a legend listing its series down the right side, and the 3D canvas showing the part-machined block to the left"></p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Running a Simulation</a> — the rest of running a job</li>
<li><a href="running-a-simulation.html">Starting and Stepping</a> — the transport that makes these fill</li>
<li><a href="inspecting-a-step.html">Inspecting a Step</a> — the per-step detail a click on these charts opens</li>
<li><a href="../basics/the-app-window.html">The Application Window</a> — the column quick-toggles that show and hide these two columns</li>
<li><a class="xref" href="../../anatomy/execution/strip-charts.html">Strip Charts</a> — the components behind this column: the shared window, the pointer contract and the data behind each series</li>
<li><a class="xref" href="../../anatomy/execution/execution-extended-renderingcanvas-tool-bar.html">Execution Extended RenderingCanvas Tool Bar</a> — the component behind the canvas header's run controls</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

@@ -0,0 +1,244 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>When Something Goes Wrong | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="When Something Goes Wrong | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="when-something-goes-wrong">When Something Goes Wrong</h1>
<p>A run that does not do what was expected has usually already said why, somewhere. This page is about
which <em>somewhere</em> — the four lists on the Execution page at <code>/execution</code>, the Program branch at
Control-Tree path <code>execution/program</code>, and the service's own log.</p>
<h2 id="start-with-the-right-list">Start with the right list</h2>
<p>The <strong>Session Messages</strong> panel, below the canvas, splits the session's messages across four lists,
and picking the right one is most of the diagnosis. A tab carries a count only once its list has
something in it, so a tab with no number beside its name is a sink nothing has reached.</p>
<ul>
<li><strong>Shell</strong> — the session's own account of itself: what started, what finished, what it built, and
the verdicts it reaches at the end of a play. A conversion or an optimization reports itself here
too, stage by stage and file by file, from its opening row to its closing count. These rows carry
no anchor, because there is nothing
in the program to anchor them to. <strong>This is the list a run that appears to have done nothing is
diagnosed from</strong>: a play that ends with no step having touched the workpiece is reported here, and
the message names the usual causes — an incremental header with no <code>G90</code> after it, a work offset
or program zero that puts the program somewhere else, stock that is not where the program expects
it.</li>
<li><strong>NC Diagnostics</strong> — everything the NC pipeline said while playing, which is not only complaints.
It opens each file with the line count it found, and a row about one sentence carries an anchor
naming it. This is the list to read when the program did not do what its text says.</li>
<li><strong>Step Diagnostics</strong> — anchored to a machining step rather than to a position in the text. Most of
it is about motion, but not all: an NC-embedded script that fails to compile is reported here too,
against the step it was reached from.</li>
<li><strong>NC Manipulation</strong> — what the writeback found in the program while converting it to NC files or
optimizing it: a block whose words it would not rewrite, an edit that matched no piece in the
stream, a block the optimizer would not re-interpolate and optimized whole instead, a split arc
whose written fragments no longer share one radius. It holds findings and nothing else, so a
conversion or an optimization with nothing to complain about leaves this list empty; the run's own
account of itself is on <strong>Shell</strong>.</li>
</ul>
<p>A message about a <code>G</code> word and a message about a move are different problems, and they never share a
list. Looking in the wrong one reads as silence.</p>
<h2 id="reading-a-row">Reading a row</h2>
<p><img src="when-something-goes-wrong-img/nc-diagnostics.en.png" alt="The Execution page with the left and right columns switched off: the canvas above, and below it the Session Messages panel with the NC Diagnostics tab selected. The tab row shows Shell badged 10 and NC Diagnostics badged 7, with Step Diagnostics and NC Manipulation carrying no badge at all. Under a filter toolbar of Severity, Category, a text box, Reset and Export, seven rows are listed: six System rows reading Sys-Init&ndash;FileLines with each file and its line count, and one warning row whose anchor column reads Sn 2105, category Unsupported, id Parsing&ndash;Unconsumed, text Unconsumed Parsing entries: G02"></p>
<p><em>The four lists at <code>/execution</code>, with NC Diagnostics selected. Two of the four tabs carry no badge,
which is how an empty sink looks.</em></p>
<p>A row carries, left to right, the position it is about, the category, the message's own id, and its
text. The position is the anchor: <code>Sn</code> and a number for a sentence, <code>S</code> and a number for a step. Not
every row has one — a complaint about the pipeline rather than about a particular sentence has
nothing to anchor to, and neither has anything on <strong>Shell</strong>.</p>
<p>The id is worth reading. It is stable across languages and releases, so it is the thing to quote
when asking someone else about a message, and the thing to filter on when one message is repeating.
The <strong>Filter text…</strong> box, the <strong>Severity</strong> and <strong>Category</strong> lists and <strong>Export</strong> are described with
the rest of the panel in <a href="../basics/messages-and-logs.html">Messages and Logs</a>.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p><strong>On the two NC lists, a row is not an occurrence.</strong> <strong>NC Diagnostics</strong> folds across a play and
<strong>NC Manipulation</strong> across one conversion or optimization run; <strong>Shell</strong> and <strong>Step Diagnostics</strong>
fold nothing, and every report they take becomes a row of its own. Where it applies, the pipeline
keeps one entry per
distinct message — same id, same wording — and drops every repeat instead of listing it. When the
program ends, each message that occurred more than once gets one summary row reading <em>repeated N
times in this run, first at</em> the sentence it was first seen on. So a diagnostic raised on forty
different sentences leaves two rows for that program: the first occurrence, and the summary.</p>
<p>Two consequences are worth holding on to. The count is only in that summary sentence — the
multiplier badge that marks consecutive identical messages is a different mechanism and does not
appear on these. And <strong>the summary row's anchor is the last occurrence while its text names the
first</strong>, so jumping from it lands at the end of the run of repeats, not at the beginning.
Everything between the two rows has no anchor at all: to find those positions, fix the first one
and play again.</p>
</div>
<h2 id="then-the-runs-own-record">Then the run's own record</h2>
<p>The <strong>Program</strong> branch holds what the run did to each line — the passes it made and the marks each
one left. A line that was expected to cut and was not marked was not executed in that pass. See
<a href="the-program-branch.html">The Program Branch</a>.</p>
<p>The two records answer different questions and are worth reading together: <strong>NC Diagnostics</strong> says
what the pipeline thought of a sentence while it was playing, the <strong>Program</strong> branch says what that
sentence produced.</p>
<h2 id="then-the-service-log">Then the service log</h2>
<p><strong>Show Log</strong> on the menu bar opens the log the service is writing for the current day, with a
<strong>Download</strong> for sending it to someone else. It holds things the four lists never carry — the
exception behind a failure, and the engine's own start-up account of itself — and it is the only
one of these surfaces that outlives the session. What it does not hold is the four lists: those are
pushed to the browser and are never written to the file, so a message seen in a list is not
findable there. The viewer itself is described in
<a href="../basics/messages-and-logs.html">Messages and Logs</a>.</p>
<h2 id="while-an-optimization-is-running">While an optimization is running</h2>
<p>An optimization reports itself on <strong>Shell</strong>, stage by stage. It opens with <em>Start NC optimization.</em>
and ends with <em>Total N files optimized.</em> and <em>optimization cache cleared.</em>, and between them every
stage announces itself as it begins: <em>Computing Optimized Feed by indivisual step..</em>, closed by
<em>Optimization Feedrate built.</em> once the per-step feeds are solved, then <em>Constrain feedrate By
expaneded segment..</em>, <em>Constrain Feedrate By Acceleration..</em>, <em>Build Compensation..</em> and <em>Regenerate
NC commands..</em>, with one <em>File optimized:</em> row naming each output file as it is finished.</p>
<p>Two of those stages count aloud, and they are the only way to tell a slow optimization from a
stopped one. While the per-step feeds are being solved, every thousandth step adds another
<em>Computing Optimized Feed by indivisual step..</em> row carrying the source file and line it has
reached; while the optimized text is being written, every thousandth line adds a <em>Now optimizing
to:</em> row carrying the same two numbers. <strong>Shell appends every one of them and folds nothing</strong>, so
its newest row is where the run has got to: numbers that keep advancing are a run still working, and
a list that has stopped growing on a stage whose successor has not been announced is a run that is
not.</p>
<p>The counting rows are the instrument, not the stage rows. A stage with fewer than a thousand steps
to solve, or fewer than a thousand lines to write, announces its start and then says nothing until
it ends — so a short program crosses the whole ladder in near-silence, and that silence means
nothing on its own.</p>
<p><strong>A Stop ends an optimization on a success row.</strong> Stop reaches the optimizer between steps and
between output files rather than only at the end, and what it leaves on <strong>Shell</strong> is <em>optimization
canceled.</em> followed immediately by <em>Total N files optimized.</em> in success green — even <em>Total 0 files
optimized.</em> arrives as a success. The count is of the files the run had opened, so a file the Stop
landed part-way through is counted with the rest and is left on disk short. The complete ones are
those whose own <em>File optimized:</em> row appeared before the cancel.</p>
<h2 id="three-things-that-look-like-faults-and-are-not">Three things that look like faults and are not</h2>
<p><strong>An English message in a translated interface is the safe answer, not a bug.</strong> Engine messages
arrive with an id and their English text, and the interface substitutes its own translation only
when its copy of that message matches the one the engine sent. An engine built against a different
message set, or a message the interface has no copy of, leaves the original English in place rather
than rendering text that might say something else. The English is the accurate text.</p>
<p><strong>An action refused because a run is playing is a guard, not a fault.</strong> Switching the NC runner and
switching the controller brand are both refused while a program is playing, rather than swapping the
parser underneath it; the refusal names the reason and asks for the run to be paused or finished
first. It arrives on the action itself — no row is added to any of the four lists, so there is
nothing to go looking for afterwards.</p>
<p><strong>An empty Step Diagnostics list is not proof that nothing was wrong.</strong> Collision detection is off
unless the mission turns it on, and the physics-dependent warnings — the cutter geometry checks
raised at tool change among them — are not raised at all when physics is off. A quiet list on a run
with those switched off says only that nothing was being watched for.</p>
<h2 id="if-it-is-a-configuration-problem-rather-than-a-run-problem">If it is a configuration problem rather than a run problem</h2>
<p>Some failures are the setup answering late. A cutter whose upper beam is shorter than its flute
cannot build its thermal shell. The Upper Beam editor flags it while the tool is being edited, and a
run that equips that tool reports it again at tool change, in <strong>Step Diagnostics</strong> — provided
physics is on, which is what makes that check run. See
<a class="xref" href="../../technique/milling-physics/cutter-geometry.html">Cutter Geometry</a>.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="index.html">Running a Simulation</a> — the rest of running a job</li>
<li><a href="running-a-simulation.html">Starting and Stepping</a> — the transport, and the run state this page reads</li>
<li><a href="the-program-branch.html">The Program Branch</a> — what the run recorded against each line</li>
<li><a href="../basics/messages-and-logs.html">Messages and Logs</a> — the panel these four lists live in, the footer, and the service's log viewer</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>
@@ -1,227 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Cutter-Location (CL) Playback | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Cutter-Location (CL) Playback | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="CutterLocation-Playback">
<h1 id="cutter-location-cl-playback">Cutter-Location (CL) Playback</h1>
<p><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayClFile_">PlayClFile</a> replays a <strong>CAM cutter-location file</strong> — an NX CLSF (<code>.cls</code>) / APT-source toolpath — directly as tool motion, without a post-processor. Use it to verify the <em>programmed</em> toolpath itself (gouge, overcut, engagement) <strong>before</strong> it is post-processed for any particular machine.</p>
<p>The same file can also be played onto a real machine-tool chain, and a played CL program can be written back out as Fanuc NC — see <a href="#two-chains-two-questions">Two chains, two questions</a> and <a href="#converting-cl-to-nc">Converting CL to NC</a>.</p>
<h2 id="cl-vs-nc--two-different-inputs">CL vs. NC — two different inputs</h2>
<table>
<thead>
<tr>
<th></th>
<th><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayNcFile_">PlayNcFile</a> (NC / G-code)</th>
<th><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayClFile_">PlayClFile</a> (CL / CLSF)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Source</td>
<td>Post-processed G-code for <strong>one specific machine</strong></td>
<td>CAM cutter-location output, <strong>before</strong> post-processing, machine-independent</td>
</tr>
<tr>
<td>Content</td>
<td>Axis moves (<code>G01 X.. Y.. Z..</code>), work offsets, canned cycles</td>
<td>Cutter locations (<code>GOTO</code>), arcs (<code>CIRCLE</code>), tool axis vectors</td>
</tr>
<tr>
<td>Drives</td>
<td>A <strong>machine-tool chain</strong> (X/Y/Z/A/B/C axes) through kinematics</td>
<td>Either chain — see below</td>
</tr>
<tr>
<td>Answers</td>
<td>&ldquo;What does <em>this machine</em> do with this program?&rdquo;</td>
<td>&ldquo;Is the <em>programmed path</em> correct?&rdquo; — or, on a machine chain, both questions at once</td>
</tr>
</tbody>
</table>
<p>A cutter location is a <strong>point plus a tool-axis direction</strong> in workpiece coordinates. <code>PlayClFile</code> places the tool at each location in turn and sweeps the removed material between them.</p>
<h2 id="two-chains-two-questions">Two chains, two questions</h2>
<p>The chain configured in project setup decides what a CL play means.</p>
<p><strong>On a <a class="xref" href="../../api/HiMachining.Milling.ClMillingDevice.html">ClMillingDevice</a></strong> the cutter location is applied straight to the tool: no inverse kinematics, no work-coordinate offsets, no controller dialect. This is the machine-independent check — it answers whether the CAM output itself is correct, and it is the right chain when you do not yet know which machine will run the job.</p>
<p><strong>On a machine-tool chain</strong> every CLSF motion endpoint is inverse-solved at parse time and expressed in the same program-to-machine transform vocabulary the NC pipeline uses — a tool-height entry from the active tool, a pivot entry anchored to the workpiece frame, and the solved rotary axes — so the shared machine-coordinate and rotary-wrap handling is reused unchanged. This answers what a <em>particular</em> machine would do with the path, including reach and rotary behaviour, without a post-processor in between.</p>
<div class="NOTE">
<h5>Note</h5>
<p>A machine-chain play needs the project's kinematics to resolve to a live solver. Where an endpoint cannot be solved, the motion is reported rather than silently dropped — watch for <code>ClToMc--EndpointIkFailed</code> and <code>ClToMc--NoToolOffset</code> in the diagnostics.</p>
</div>
<h2 id="converting-cl-to-nc">Converting CL to NC</h2>
<p><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ConvertClToNcFiles_">ConvertClToNcFiles</a> writes a played CL program back out as Fanuc NC, one file per source file, template-substituting <code>[NcName]</code> (default <code>Output/[NcName].nc</code>). It requires a prior play <strong>on a machine chain</strong> — a <code>ClMillingDevice</code> leaves no machine-solved data to serialize — and reports <code>ConvertClToNc--NoPlay</code> otherwise. A mission can declare the writeback through <a class="xref" href="../../api/Hi.SessionCommands.PostExecutionCommand.html#Hi_SessionCommands_PostExecutionCommand_EnableConvertClToNcFiles">EnableConvertClToNcFiles</a> and <a class="xref" href="../../api/Hi.SessionCommands.PostExecutionCommand.html#Hi_SessionCommands_PostExecutionCommand_ClToNcFileTemplate">ClToNcFileTemplate</a>.</p>
<h2 id="file-format">File format</h2>
<p>The reader parses <strong>NX CLSF</strong> records (the APT-source language):</p>
<table>
<thead>
<tr>
<th>Record</th>
<th>Effect</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>GOTO</code></td>
<td>Cutter location — first one positions the tool (rapid teleport); subsequent ones cut a straight CL path</td>
</tr>
<tr>
<td><code>CIRCLE</code> / <code>MOVARC</code></td>
<td>Arms an arc; the following <code>GOTO</code> closes it into a true circular CL path</td>
</tr>
<tr>
<td><code>RAPID</code></td>
<td>Marks the next move as a non-cutting rapid</td>
</tr>
<tr>
<td><code>FEDRAT</code></td>
<td>Feed rate (<code>MMPM</code> / <code>IPM</code>)</td>
</tr>
<tr>
<td><code>SPINDL</code></td>
<td>Spindle speed and direction</td>
</tr>
<tr>
<td><code>COOLNT</code></td>
<td>Coolant mode (<code>ON</code> / <code>FLOOD</code> / <code>MIST</code> / <code>OFF</code>)</td>
</tr>
<tr>
<td><code>TLDATA</code></td>
<td>Tool geometry (diameter, corner radius, length, angles)</td>
</tr>
<tr>
<td><code>LOAD/TOOL</code></td>
<td>Tool change to a tool id</td>
</tr>
</tbody>
</table>
<p>Comments (<code>$$</code> to end of line) and line continuation (trailing <code>$</code>) are honored. Records outside this set (<code>PAINT</code>, <code>TOOLNO</code>, <code>TOOL PATH</code>, …) are skipped.</p>
<div class="NOTE">
<h5>Note</h5>
<p>&ldquo;APT&rdquo; here means the APT <strong>toolpath language</strong> (<code>GOTO</code>, <code>CIRCLE</code>, …). This is a different use of the word from the <a class="xref" href="../setup/apt.html">APT Tool</a> page, which defines cutter <strong>geometry</strong>. A CL file's <code>TLDATA</code> feeds that same tool-geometry model — see below.</p>
</div>
<p>The dialect parsed is Siemens NX (<code>.cls</code>). Other CAM systems emit the same APT record family under different names (CATIA APTSOURCE, Creo CL files); those dialects are not yet parsed.</p>
<h2 id="tools-from-the-file">Tools from the file</h2>
<p>A CL file usually carries its own tool definitions. On <code>LOAD/TOOL,&lt;id&gt;</code>, if the tool house has no matching id, the preceding <code>TLDATA</code> geometry is used to create the tool automatically. An id <strong>already present</strong> in the tool house keeps its configured tool — so you can pre-configure tools for accuracy, or let simple files be self-contained.</p>
<h2 id="example">Example</h2>
<pre><code class="lang-csharp">// The machining chain must be a ClMillingDevice (set in project setup).
MachiningResolution_mm = 0.125;
EnablePhysics = false; // geometry-only check first
PlayClFile(&quot;CL/part-op10.cls&quot;); // replay the CAM cutter-location file
Diff(&quot;target/part-op10.stl&quot;); // compare the cut against the design target
</code></pre>
<p>The project keeps a dedicated CL runner suit (<a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html#Hi_MachiningProcs_MachiningProject_ClsfRunnerSuit">ClsfRunnerSuit</a>) alongside its NC and CSV suits; the parser itself is the <a class="xref" href="../../api/Hi.Numerical.ClsfParsers.NxClRunner.html">NxClRunner</a> preset.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayClFile_">PlayClFile</a> — the script command</li>
<li><a class="xref" href="../../api/HiMachining.Milling.ClMillingDevice.html">ClMillingDevice</a> — the cutter-location-driven chain</li>
<li><a class="xref" href="../setup/apt.html">APT Tool</a> — cutter geometry (the other meaning of &ldquo;APT&rdquo;)</li>
<li><a class="xref" href="script-command.html">Glossary: Script Commands</a> — what is a script command</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>
@@ -1,233 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Glossary: Script Commands | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Glossary: Script Commands | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Glossary-ScriptCommand">
<h1 id="glossary-script-commands">Glossary: Script Commands</h1>
<h2 id="what-is-a-script-command">What Is a Script Command?</h2>
<p>A <strong>script command</strong> is a C# statement executed by the HiNC scripting engine. Scripts directly reference members and methods of <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html">SessionShell</a>, which serves as the global scope — no explicit object reference is needed.</p>
<pre><code class="lang-csharp">// These are all SessionShell members used directly as globals
EnablePhysics = true;
MachiningResolution_mm = 0.125;
PlayNcFile(&quot;NC/file1.nc&quot;);
Message(&quot;Done&quot;);
</code></pre>
<h2 id="script-syntax-basics">Script Syntax Basics</h2>
<p>Scripts use <strong>native C#</strong> syntax:</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Syntax</th>
</tr>
</thead>
<tbody>
<tr>
<td>Statement terminator</td>
<td><code>;</code></td>
</tr>
<tr>
<td>End-of-line comment</td>
<td><code>// comment</code></td>
</tr>
<tr>
<td>String interpolation</td>
<td><code>$&quot;Value is {variable}&quot;</code></td>
</tr>
<tr>
<td>Positive infinity</td>
<td><code>double.PositiveInfinity</code></td>
</tr>
<tr>
<td>Negative infinity</td>
<td><code>double.NegativeInfinity</code></td>
</tr>
<tr>
<td>Bitwise OR (for flags)</td>
<td><code>Fx|Fy|Fz</code></td>
</tr>
</tbody>
</table>
<p>All standard C# language features (variables, loops, conditionals, LINQ, etc.) are available.</p>
<hr>
<h2 id="script-task-page">Script Task Page</h2>
<p>In the HiNC GUI, the <strong>Task</strong> page contains one or more script panels. Each panel has:</p>
<ul>
<li><strong>Order</strong>: Execution order (left to right, top to bottom)</li>
<li><strong>Enabled</strong>: Whether the script runs (unchecked = skipped)</li>
<li><strong>Title</strong>: A label for human reference only — has no functional effect</li>
</ul>
<hr>
<h2 id="execution-model">Execution Model</h2>
<h3 id="session-lifecycle">Session Lifecycle</h3>
<ol>
<li>Scripts execute in order on the <strong>Task</strong> page</li>
<li>A <a class="xref" href="../../api/Hi.Common.PacePlayer.html">PacePlayer</a><small>(API)</small> controls playback — script commands like <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayNcFile_">PlayNcFile</a><small>(API)</small> block until the NC program completes</li>
<li>Player control commands (<a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Pace">Pace()</a><small>(API)</small>, <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Pause">Pause()</a><small>(API)</small>, <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Reset">Reset()</a><small>(API)</small>) interact with the <a class="xref" href="../../api/Hi.Common.PacePlayer.html">PacePlayer</a><small>(API)</small></li>
<li><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ResetRuntime_">ResetRuntime</a><small>(API)</small> clears event handlers, buffers, and runtime state</li>
</ol>
<h3 id="event-driven-execution">Event-Driven Execution</h3>
<p>Events like <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SessionStepBuilt">SessionStepBuilt</a><small>(API)</small> fire during simulation and allow per-step logic:</p>
<pre><code class="lang-csharp">SessionStepBuilt += (preStep, curStep) =&gt; {
if (curStep != null)
Message($&quot;Step: ToolId={curStep.ToolId}&quot;);
};
PlayNcFile(&quot;NC/file1.nc&quot;);
</code></pre>
<p>Events are cleared by <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ResetRuntime_">ResetRuntime</a>.</p>
<hr>
<h2 id="script-commands-in-nc-code">Script Commands in NC Code</h2>
<p>Script commands can be embedded inside NC code comments. Lines starting with <code>;@</code> execute before that NC line runs:</p>
<pre><code>T01 M06 (;@MachiningResolution_mm=0.03125;)
S1270 M03
G43 Z10. H01
</code></pre>
<p>For controllers that do not support <code>;</code> as a comment character (e.g., FANUC), wrap in a comment block:</p>
<pre><code>T01 M06 (;@MachiningResolution_mm=0.03125;)
</code></pre>
<hr>
<h2 id="file-path-templates">File Path Templates</h2>
<p>Commands that output files support the <code>[NcName]</code> token, which is replaced with each NC file name:</p>
<pre><code class="lang-csharp">PlayNcFile(&quot;NC/file1.nc&quot;);
PlayNcFile(&quot;NC/file2.nc&quot;);
WriteShotFiles(&quot;Output/[NcName].shot.csv&quot;, 1);
// Produces: Output/file1.nc.shot.csv, Output/file2.nc.shot.csv
</code></pre>
<p>All file paths are relative to the <strong>project directory</strong> unless an absolute path is given.</p>
<hr>
<h2 id="important-warnings">Important Warnings</h2>
<p>The following operations can corrupt simulation state or produce incorrect results:</p>
<ul>
<li><strong>Do not save the project during simulation.</strong> System-internal configuration (e.g., training-specific resolution overrides) may overwrite your settings.</li>
<li><strong>Do not reset the player during milling coefficient training.</strong> Close the project instead of pressing the reset button to avoid unexpected errors.</li>
<li><strong>Do not modify resolution, tool, or controller settings during training.</strong> Changing these mid-training invalidates the results.</li>
<li><strong>Do not combine <code>UpdateNcOptOption</code> in <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SessionStepBuilt">SessionStepBuilt</a><small>(API)</small> with NC-embedded optimization commands.</strong> Parallel computation may cause undefined behavior.</li>
</ul>
<hr>
<h2 id="global-variables">Global Variables</h2>
<p><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Global">Global</a> provides a key-value dictionary for sharing data across scripts:</p>
<pre><code class="lang-csharp">Global[&quot;material&quot;] = &quot;Steel&quot;;
var material = Global[&quot;material&quot;];
</code></pre>
<hr>
<h2 id="full-api-reference">Full API Reference</h2>
<p>For the complete list of available commands, properties, and events, see:</p>
<ul>
<li><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html">SessionShell</a> — full API documentation</li>
<li><a class="xref" href="session-shell.html">Glossary: SessionShell Quick-Reference</a> — categorized quick-reference table</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="session-shell.html">Glossary: SessionShell Quick-Reference</a> — SessionShell quick-reference</li>
<li><a class="xref" href="step.html">Step</a> — machining step data model</li>
<li><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a> — using scripts in a simulation workflow</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>
@@ -1,734 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Glossary: SessionShell Quick-Reference | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Glossary: SessionShell Quick-Reference | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Glossary-SessionShell">
<h1 id="glossary-sessionshell-quick-reference">Glossary: SessionShell Quick-Reference</h1>
<p><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html">SessionShell</a> is the global scope for all HiNC script commands. This page organizes every command by category with a one-line description and links to the workflow where each is typically used.</p>
<hr>
<h2 id="simulation-control">Simulation Control</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayNcFile_">PlayNcFile</a></td>
<td>Execute an NC file</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayNc_">PlayNc</a></td>
<td>Execute NC code from a string</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayCsvFile_">PlayCsvFile</a></td>
<td>Drive simulation from a CSV file</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a>, <a class="xref" href="../../workflows/sensor-mapping.html">Workflow: Sensor Data Mapping</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayClFile_">PlayClFile</a></td>
<td>Replay a cutter-location (CL / APT) toolpath file</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_RunNcFile_">RunNcFile</a></td>
<td>Parse NC file and return action sequence (no auto-pacing)</td>
<td></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_RunNc_">RunNc</a></td>
<td>Parse NC string and return action sequence (no auto-pacing)</td>
<td></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Pace_">Pace</a></td>
<td>Insert a pausable checkpoint during playback</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Pause_">Pause</a></td>
<td>Pause player execution</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Reset_">Reset</a></td>
<td>Reset player state</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayAct_">PlayAct</a></td>
<td>Execute a custom action object</td>
<td></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayToolingTeleport_">PlayToolingTeleport</a></td>
<td>Teleport a tool to a new position</td>
<td></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayClTeleport_">PlayClTeleport</a></td>
<td>Teleport tool to a specified CL position and orientation</td>
<td></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="configuration--resolution">Configuration — Resolution</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_MachiningResolution_mm">MachiningResolution_mm</a></td>
<td>Set workpiece entity resolution (power-of-2 cube width in mm)</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_DispCache_Mb">DispCache_Mb</a></td>
<td>Set display cache size (Mb)</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_MachiningMotionResolution">MachiningMotionResolution</a></td>
<td>Set machining motion resolution mode</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="configuration--physics">Configuration — Physics</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnablePhysics">EnablePhysics</a></td>
<td>Enable/disable milling force evaluation</td>
<td><a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a>, <a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableWearEffect">EnableWearEffect</a></td>
<td>Enable/disable tool wear effects</td>
<td></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_MillingForceCycleDivisionNum">MillingForceCycleDivisionNum</a></td>
<td>Divisions per revolution for force calculation</td>
<td><a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_InitSpindleTemperature_C">InitSpindleTemperature_C</a></td>
<td>Initial spindle temperature (°C)</td>
<td></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnablePauseOnFailure">EnablePauseOnFailure</a></td>
<td>Pause execution on failure</td>
<td><a class="xref" href="../../workflows/geometry-validation.html">Workflow: Geometry Validation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableCollisionDetection">EnableCollisionDetection</a></td>
<td>Enable collision detection</td>
<td><a class="xref" href="../../workflows/geometry-validation.html">Workflow: Geometry Validation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnablePauseOnCollision">EnablePauseOnCollision</a></td>
<td>Pause on collision</td>
<td><a class="xref" href="../../workflows/geometry-validation.html">Workflow: Geometry Validation</a></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="data-export">Data Export</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_WriteShotFiles_">WriteShotFiles</a></td>
<td>Export waveform (shot) data CSV at given time resolution</td>
<td><a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_WriteStepFiles_">WriteStepFiles</a></td>
<td>Export step-level data CSV</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a>, <a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="data-mapping">Data Mapping</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_MapSingleByCsvFile_">MapSingleByCsvFile</a></td>
<td>One-to-one time-interpolation mapping from CSV</td>
<td><a class="xref" href="../../workflows/sensor-mapping.html">Workflow: Sensor Data Mapping</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_MapSeriesByCsvFile_">MapSeriesByCsvFile</a></td>
<td>One-to-many series mapping from CSV (via ActualTime)</td>
<td><a class="xref" href="../../workflows/sensor-mapping.html">Workflow: Sensor Data Mapping</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_AddTimeDataByFile_">AddTimeDataByFile</a></td>
<td>Specify input data with time range for local mapping</td>
<td><a class="xref" href="../../workflows/sensor-mapping.html">Workflow: Sensor Data Mapping</a>, <a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ClearTimeMappingData_">ClearTimeMappingData</a></td>
<td>Clear all mapping data</td>
<td><a class="xref" href="../../workflows/sensor-mapping.html">Workflow: Sensor Data Mapping</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_BeginSelection_">BeginSelection</a></td>
<td>Set range mapping start point (in NC comments)</td>
<td><a class="xref" href="../../workflows/sensor-mapping.html">Workflow: Sensor Data Mapping</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EndSelection_">EndSelection</a></td>
<td>Set range mapping end point (in NC comments)</td>
<td><a class="xref" href="../../workflows/sensor-mapping.html">Workflow: Sensor Data Mapping</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_LineSelection_">LineSelection</a></td>
<td>Single-line data mapping (in NC comments)</td>
<td><a class="xref" href="../../workflows/sensor-mapping.html">Workflow: Sensor Data Mapping</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableMapOnSelectionEnd">EnableMapOnSelectionEnd</a></td>
<td>Auto-trigger mapping when selection ends (default: true)</td>
<td><a class="xref" href="../../workflows/sensor-mapping.html">Workflow: Sensor Data Mapping</a></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="training">Training</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_TrainMillingPara_">TrainMillingPara</a></td>
<td>Train new milling coefficients from mapped data</td>
<td><a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ReTrainMillingPara_">ReTrainMillingPara</a></td>
<td>Calibrate existing milling coefficients (10% original / 90% new)</td>
<td><a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_LoadCuttingParaByFile_">LoadCuttingParaByFile</a></td>
<td>Load cutting parameters from file into workpiece</td>
<td><a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_MillingCycleDivisionNum">MillingCycleDivisionNum</a></td>
<td>Angular divisions per revolution — default 36 suits normal simulation; raise (e.g. 180) for training only. Process-wide: not saved per project, survives <code>ResetRuntime()</code></td>
<td><a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="optimization">Optimization</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptimizeToFiles_">OptimizeToFiles</a></td>
<td>Output optimized NC files</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptEnableFeedrate">OptEnableFeedrate</a></td>
<td>Enable sequential feed rate optimization</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptEnableInterpolation">OptEnableInterpolation</a></td>
<td>Enable re-interpolation</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptFeedrateAssignmentRatio">OptFeedrateAssignmentRatio</a></td>
<td>Feed rate assignment ratio for re-interpolation</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptRapidFeed_mmdmin">OptRapidFeed_mmdmin</a></td>
<td>Non-cutting region feed rate (mm/min)</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptMinFeedrate_mmdmin">OptMinFeedrate_mmdmin</a></td>
<td>Minimum cutting feed rate (mm/min)</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptMaxFeedrate_mmdmin">OptMaxFeedrate_mmdmin</a></td>
<td>Maximum cutting feed rate (mm/min)</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptMaxAcceleration_mmds2">OptMaxAcceleration_mmds2</a></td>
<td>Acceleration/deceleration limit (mm/s²)</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptExtendedPreDistance_mm">OptExtendedPreDistance_mm</a></td>
<td>Pre-distance for cutting region calculation (mm)</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptExtendedPostDistance_mm">OptExtendedPostDistance_mm</a></td>
<td>Post-distance for cutting region calculation (mm)</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptSpindlePowerSafetyFactor">OptSpindlePowerSafetyFactor</a></td>
<td>Spindle power safety factor</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptSpindleTorqueSafetyFactor">OptSpindleTorqueSafetyFactor</a></td>
<td>Spindle torque safety factor</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptThermalYieldSafetyFactor">OptThermalYieldSafetyFactor</a></td>
<td>Thermal yield safety factor</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_OptPreferedForce_N">OptPreferedForce_N</a></td>
<td>Target cutting force (N)</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Preserve_">Preserve</a></td>
<td>Disable optimization for a single NC line</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_BeginPreserve_">BeginPreserve</a></td>
<td>Begin optimization-disabled range</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EndPreserve_">EndPreserve</a></td>
<td>End optimization-disabled range</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableIndividualStepAdjustmentLog_">EnableIndividualStepAdjustmentLog</a></td>
<td>Enable per-step optimization log file</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EmbeddedLogMode_">EmbeddedLogMode</a></td>
<td>Set embedded log verbosity (None / SimpleLog / FullLog)</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="geometry">Geometry</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_WriteMeshedGeom_">WriteMeshedGeom</a></td>
<td>Save meshed geometry to file</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ReadMeshedGeom_">ReadMeshedGeom</a></td>
<td>Load meshed geometry from file</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ExportMeshedGeomToStl_">ExportMeshedGeomToStl</a></td>
<td>Export meshed geometry to STL</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ExportMeshedGeomToObj_">ExportMeshedGeomToObj</a></td>
<td>Export meshed geometry to Wavefront OBJ (per-vertex RGB)</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ExportMeshedGeomToPly_">ExportMeshedGeomToPly</a></td>
<td>Export meshed geometry to binary PLY (per-vertex RGB)</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Diff_">Diff</a></td>
<td>Compare simulated geometry against target</td>
<td><a class="xref" href="../../workflows/geometry-validation.html">Workflow: Geometry Validation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_RemoveFlyPiece_">RemoveFlyPiece</a></td>
<td>Remove disconnected residual material</td>
<td><a class="xref" href="../../workflows/geometry-validation.html">Workflow: Geometry Validation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ScanMeshedGeomInfDefect_">ScanMeshedGeomInfDefect</a></td>
<td>Scan for infinite edge cut defects</td>
<td><a class="xref" href="../../workflows/geometry-validation.html">Workflow: Geometry Validation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ClearDefectDisplayee_">ClearDefectDisplayee</a></td>
<td>Clear defect visualization markers</td>
<td><a class="xref" href="../../workflows/geometry-validation.html">Workflow: Geometry Validation</a></td>
</tr>
</tbody>
</table>
<div class="NOTE">
<h5>Note</h5>
<p>These geometry commands were named <code>WriteRuntimeGeom</code> / <code>ReadRuntimeGeom</code> / <code>ExportRuntimeGeomToStl|Obj|Ply</code> / <code>ScanRuntimeGeomInfDefect</code> before the meshed-geom rename. The old names still run in existing player scripts as hidden legacy aliases; new scripts should use the <code>MeshedGeom</code> names.</p>
</div>
<hr>
<h2 id="events">Events</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SessionStepBuilt">SessionStepBuilt</a></td>
<td>Fired when a machining step is built</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SessionStepSelected">SessionStepSelected</a></td>
<td>Fired when a machining step is selected</td>
<td></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="messages">Messages</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Message_">Message</a></td>
<td>Display a general message</td>
<td>All workflows</td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ProgressMessage_">ProgressMessage</a></td>
<td>Display a progress message</td>
<td>All workflows</td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_WarningMessage_">WarningMessage</a></td>
<td>Display a warning message</td>
<td>All workflows</td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ErrorMessage_">ErrorMessage</a></td>
<td>Display an error message</td>
<td>All workflows</td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_AppendMessagesToFile_">AppendMessagesToFile</a></td>
<td>Export messages to file (optional tag filter)</td>
<td>All workflows</td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ShellProgress">ShellProgress</a></td>
<td>Session message host object</td>
<td><a class="xref" href="shell-progress.html">Glossary: Shell Progress (Messages)</a></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="step-data-access">Step Data Access</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_GetMillingStep_">GetMillingStep</a></td>
<td>Get step by index</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_StepCount">StepCount</a></td>
<td>Total step count</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_RegisterStepVariable_">RegisterStepVariable</a></td>
<td>Register a custom step variable</td>
<td><a class="xref" href="step.html">Step</a></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="runtime-management">Runtime Management</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ResetRuntime_">ResetRuntime</a></td>
<td>Clear event handlers, buffers, and runtime state</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_MachiningSession">MachiningSession</a></td>
<td>Get the current machining session object</td>
<td></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="properties--workpiece-and-fixture">Properties — Workpiece and Fixture</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Workpiece">Workpiece</a></td>
<td>Get/set the workpiece object</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Fixture">Fixture</a></td>
<td>Get/set the fixture object</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Global">Global</a></td>
<td>Global variable dictionary for cross-script data sharing</td>
<td><a class="xref" href="script-command.html">Glossary: Script Commands</a></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="tool-setup">Tool Setup</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Used In</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_GetUniformFlutingShiftAngle_deg_">GetUniformFlutingShiftAngle_deg</a></td>
<td>Get tool contour shift angle (deg)</td>
<td></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SetUniformFlutingShiftAngle_deg_">SetUniformFlutingShiftAngle_deg</a></td>
<td>Set tool contour shift angle (deg)</td>
<td></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_GetStickMachiningToolObservationHeight_mm_">GetStickMachiningToolObservationHeight_mm</a></td>
<td>Get smart tool holder observation height (mm)</td>
<td></td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SetStickMachiningToolObservationHeight_mm_">SetStickMachiningToolObservationHeight_mm</a></td>
<td>Set smart tool holder observation height (mm)</td>
<td></td>
</tr>
</tbody>
</table>
<div class="NOTE">
<h5>Note</h5>
<p>Tool setup commands are for dynamic adjustment when actual installation conditions differ from defaults. Typically, configure these in the tool configuration file instead.</p>
</div>
<hr>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html">SessionShell</a> — full API documentation</li>
<li><a class="xref" href="script-command.html">Glossary: Script Commands</a> — what is a script command</li>
<li><a class="xref" href="step.html">Step</a> — step data model</li>
<li><a class="xref" href="shell-progress.html">Glossary: Shell Progress (Messages)</a> — message system</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>
@@ -1,238 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Glossary: Shell Progress (Messages) | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Glossary: Shell Progress (Messages) | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Glossary-ShellProgress">
<h1 id="glossary-shell-progress-messages">Glossary: Shell Progress (Messages)</h1>
<h2 id="what-is-shellprogress">What Is ShellProgress?</h2>
<p><strong>ShellProgress</strong> (<a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ShellProgress">ShellProgress</a>) is the message host object that manages all messages generated during a HiNC scripting session. It serves as the central hub for logging, filtering, and exporting diagnostic information.</p>
<div class="NOTE">
<h5>Note</h5>
<p>This host was previously named <code>SessionProgress</code> (and earlier <code>SessionMessageHost</code>); those names are superseded by <code>ShellProgress</code>.</p>
</div>
<hr>
<h2 id="message-types">Message Types</h2>
<p>HiNC provides four message types, each with a distinct severity and typical display behavior:</p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Command</th>
<th>Description</th>
<th>Typical Display</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Message</strong></td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_Message_">Message</a></td>
<td>General informational message</td>
<td>Message panel</td>
</tr>
<tr>
<td><strong>ProgressMessage</strong></td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ProgressMessage_">ProgressMessage</a></td>
<td>Progress-related status update</td>
<td>Progress bar / status area</td>
</tr>
<tr>
<td><strong>WarningMessage</strong></td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_WarningMessage_">WarningMessage</a></td>
<td>Warning (does not interrupt execution)</td>
<td>Message panel (yellow)</td>
</tr>
<tr>
<td><strong>ErrorMessage</strong></td>
<td><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ErrorMessage_">ErrorMessage</a></td>
<td>Error (may affect execution flow)</td>
<td>Message panel (red)</td>
</tr>
</tbody>
</table>
<h3 id="usage-examples">Usage Examples</h3>
<pre><code class="lang-csharp">Message(&quot;Starting simulation&quot;);
ProgressMessage(&quot;Loading workpiece...&quot;);
WarningMessage(&quot;No cutting engagement detected in this segment&quot;);
ErrorMessage(&quot;Workpiece does not exist&quot;);
</code></pre>
<hr>
<h2 id="message-tags">Message Tags</h2>
<p>Messages can be tagged for filtering. Standard tags include <code>&quot;Error&quot;</code> and <code>&quot;Warning&quot;</code>. When exporting messages, you can filter by one or more tags.</p>
<hr>
<h2 id="displaying-messages">Displaying Messages</h2>
<p>All messages are automatically recorded in the session message host and appear in the HiNC UI <strong>message panel</strong>. Progress messages additionally update the <strong>progress bar</strong>.</p>
<h3 id="accessing-the-message-host">Accessing the Message Host</h3>
<pre><code class="lang-csharp">var messageHost = ShellProgress;
</code></pre>
<hr>
<h2 id="exporting-messages">Exporting Messages</h2>
<p><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_AppendMessagesToFile_">AppendMessagesToFile</a> writes messages to a text file, with optional tag-based filtering:</p>
<pre><code class="lang-csharp">// Export all messages
AppendMessagesToFile(&quot;Output/messages.txt&quot;);
// Export only errors and warnings
AppendMessagesToFile(&quot;Output/errors.txt&quot;, &quot;Error&quot;, &quot;Warning&quot;);
</code></pre>
<div class="TIP">
<h5>Tip</h5>
<p>Export messages after simulation to create a persistent log for debugging or reporting.</p>
</div>
<hr>
<h2 id="common-patterns">Common Patterns</h2>
<h3 id="logging-simulation-progress">Logging Simulation Progress</h3>
<pre><code class="lang-csharp">Message(&quot;Simulation started&quot;);
PlayNcFile(&quot;NC/file1.nc&quot;);
Message($&quot;Simulation complete. Total steps: {StepCount}&quot;);
AppendMessagesToFile(&quot;Output/log.txt&quot;);
</code></pre>
<h3 id="conditional-warnings">Conditional Warnings</h3>
<pre><code class="lang-csharp">if (StepCount == 0)
{
WarningMessage(&quot;No steps were executed&quot;);
}
</code></pre>
<h3 id="error-guard">Error Guard</h3>
<pre><code class="lang-csharp">if (Workpiece == null)
{
ErrorMessage(&quot;Workpiece does not exist&quot;);
return;
}
</code></pre>
<h3 id="per-step-logging-via-events">Per-Step Logging via Events</h3>
<pre><code class="lang-csharp">SessionStepBuilt += (preStep, curStep) =&gt; {
if (curStep != null)
Message($&quot;Step {curStep.StepIndex}: ToolId={curStep.ToolId}&quot;);
};
PlayNcFile(&quot;NC/file1.nc&quot;);
</code></pre>
<h3 id="step-selection-logging">Step Selection Logging</h3>
<pre><code class="lang-csharp">MachiningStepSelected += (step) =&gt; {
if (step != null &amp;&amp; step.ToolId == 1)
ProgressMessage($&quot;Tool 1 step selected at line {step.LineNo}&quot;);
};
</code></pre>
<hr>
<h2 id="message-lifecycle">Message Lifecycle</h2>
<ol>
<li>Messages are generated during script execution via the four message commands</li>
<li>All messages are stored in the <code>ShellProgress</code> host object</li>
<li>Messages persist until the session ends or the runtime is reset</li>
<li><code>ResetRuntime()</code> clears event handlers but does <strong>not</strong> clear previously recorded messages</li>
<li>Messages can be exported at any point using <code>AppendMessagesToFile</code></li>
</ol>
<hr>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="script-command.html">Glossary: Script Commands</a> — script command basics</li>
<li><a class="xref" href="session-shell.html">Glossary: SessionShell Quick-Reference</a> — SessionShell quick-reference</li>
<li><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a> — using messages in a simulation workflow</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>
@@ -1,189 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Step Field Reference | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Step Field Reference | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Doc-Step-Fields">
<h1 id="step-field-reference">Step Field Reference</h1>
<blockquote>
<p>For the complete and up-to-date field reference, see <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a>.</p>
<p>To assess the risk of tool breakage, also refer to &quot;<a href="../analysis/machinability.html">Evaluating Process Machinability</a>&quot;.</p>
</blockquote>
<p>This page summarizes the main output data for each simulation <a class="xref" href="step.html">step</a>, covering source line, kinematics, load, force/torque, power, thermal, and wear information to help quickly understand the machining state at each step.</p>
<p>Step data contains information for the time interval between two consecutive steps (i.e., from the previous step to the current step). Many fields are therefore simplified representations over that period. Common prefixes based on the simplification method include Average (Avg), Extremes (Min, Max), Range (Delta), and Maximum Absolute Value (MaxAbs).</p>
<h2 id="basic-source-information">Basic Source Information</h2>
<ul>
<li>FileNo / LineNo / FilePath / LineText / FlagsText: File/line information and flags of the corresponding source NC command.</li>
<li>StepIndex: Step sequence index.</li>
<li>ToolId: ID of the currently active tool.</li>
</ul>
<h2 id="time-and-motion">Time and Motion</h2>
<ul>
<li>EndTimecode: Simulated end-of-step timecode (formerly <code>AccumulatedTime</code>; step CSVs written with the legacy header are still read).</li>
<li>StepDuration: Duration of this step (default per-revolution mode: one step equals one spindle revolution).</li>
<li>BeginSpindleAngle_deg: Spindle angular displacement at the start of this step.</li>
<li>Cl (Cutter Location): Cutter location point (including IJK normal).</li>
<li>MC (X, Y, Z, A, B, C): Machine coordinates.</li>
<li>MoveOnProgramCoordinate, MovingLength_mm: Displacement vector and length in the program coordinate system.</li>
<li>Feedrate_mmdmin / SpindleSpeed_rpm / CuttingSpeed_mmds: Feed rate, spindle speed, and cutting speed.</li>
<li>FeedPerTooth_mm / FeedPerCycle_mm / ToothArcDuration_s / SpindleCyclePeriod_s: Feed per tooth/per cycle, tooth arc duration, and spindle cycle period.</li>
</ul>
<h2 id="cutting-engagement-and-material-removal-rate">Cutting Engagement and Material Removal Rate</h2>
<ul>
<li>IsTouched: Whether cutting engagement occurred.</li>
<li>CuttingWidth_mm (ae) / CuttingDepth_mm (ap): Cutting width / cutting depth.</li>
<li>Mrr_mm3ds: Material removal rate.</li>
<li>ProgramSideCusp_um, SideCuspList_um: Side cusp height and distribution estimated from program feed and radius.
<blockquote>
<p><strong>Reading tip — a <code>ProgramSideCusp_um</code> spike usually flags a rapid-move (G00) collision, not a finish result.</strong> The program-side cusp is computed from the <em>ideal program feedrate</em> while the cutter is engaged with the workpiece. A rapid traverse is not meant to touch material; when it does, the cusp formula is fed the (very high) rapid feedrate, so the value spikes far above any real cutting cusp. Treat an isolated cusp peak at a rapid/G00 line as a likely gouge/collision to investigate. The same engagement-during-rapid usually shows up alongside it as spikes in the availability ratios (yielding-stress / spindle-torque / spindle-power).</p>
</blockquote>
</li>
</ul>
<h2 id="chip">Chip</h2>
<ul>
<li>ChipThickness_mm (/um): Chip thickness.</li>
<li>ChipVolume_mm3: Chip volume.</li>
<li>ChipMass_mg: Chip mass.</li>
</ul>
<h2 id="force-and-torque-including-mapping-comparison">Force and Torque (Including Mapping Comparison)</h2>
<ul>
<li>Coordinate system note: Most fields in this section indicate their coordinate system (e.g., <code>[W]</code> workpiece, <code>[TR]</code> tool running, <code>[SR]</code> spindle rotation). For coordinate system definitions and diagrams, see &quot;<a href="../analysis/milling-physics-coordinates.html">Milling Physics Coordinate Systems</a>&quot;.</li>
<li>AvgForceToToolOnToolRunningCoordinate_N, MaxAbsForce_N: Average/maximum force.</li>
<li>Various average/maximum torques (about tool tip, about sensor point; in tool running / spindle rotation / workpiece program coordinate systems).</li>
<li>AvgAbsTorque_Nm: Average absolute torque.</li>
<li>Mapping comparison: AvgMomentXyByMapping_Nm, AvgAbsTorqueByMapping_Nm, error ratios, and symbolic error correlation metrics.</li>
</ul>
<h2 id="power-torque-and-energy-consumption">Power, Torque, and Energy Consumption</h2>
<ul>
<li>SpindleInputPower_W (input power): Energy entering the spindle.</li>
<li>SpindleOutputPower_W (output power): Energy acting on the cutting end after spindle energy losses — i.e., the energy causing workpiece and chip deformation and temperature change. Output power is typically proportional to input power, with the ratio being the energy efficiency set in the spindle configuration <a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_EnergyEfficiency">EnergyEfficiency</a><small>(API)</small>.</li>
<li>MaxSpindlePowerRatio (maximum spindle power ratio): Input power / instantaneous maximum power based on spindle capability.</li>
<li>ContinueSpindlePowerRatio (continuous spindle power ratio): Input power / unlimited-duration maximum power based on spindle capability.</li>
<li>AccumulatedSpindleEnergyConsumption_kWh: Accumulated spindle energy consumption.</li>
<li>Max/Continue Spindle Torque Ratio: Instantaneous/continuous spindle torque ratios.
<blockquote>
<p><strong>Reading tip — a power / torque ratio over 100% means the spindle cannot supply the demanded load at the commanded rpm</strong>, so it droops: with feed held, rpm drops, feed-per-tooth rises, and forces climb further — a runaway loop that, left unchecked, grows the chip until the cutter breaks and the spindle/drive is overstressed and damaged — load damage, not a tool-vs-workpiece collision (see <a href="../analysis/nc-optimization-principles.html">NC optimization</a>). Read it by <em>duration</em>, not just height: a one-revolution (single-cycle) overshoot usually still completes the pass — it just leaves a slightly insufficient cut there — whereas a ratio that stays above 100% across many consecutive spindle revolutions is a genuine overload to fix. A high-load step typically also shows large cutterworkpiece engagement (CWE), large tip deflection, and more vibration/noise. Because the ratio is normalized by the spindle-capability curve, a placeholder/guessed spindle skews it — confirm against the real spindle's speedpower/torque curve before calling it overloaded.</p>
</blockquote>
</li>
</ul>
<h2 id="thermal-and-temperature">Thermal and Temperature</h2>
<ul>
<li>CutterBodyTemperature_C / CutterDermisTemperature_C / WorkpieceDermisTemperature_C / ChipTemperature_C: Cutter body, cutter surface, workpiece surface, and chip temperatures.</li>
<li>GetCutterDermisTemperature_C(depth_mm) / GetCutterDermisAvgTemperature_C(depth_mm): Cutter subsurface temperature / average temperature at a given depth.</li>
<li>ThermalStress_MPa / ThermalYieldRatio: Thermal stress and thermal yield ratio. For tool breakage risk assessment based on thermal yield ratio, see &quot;<a href="../analysis/machinability.html">Evaluating Process Machinability</a>&quot;.</li>
</ul>
<h2 id="wear-and-deflection">Wear and Deflection</h2>
<p>For wear models, evaluation metrics, and applicable scenarios, see &quot;<a href="../analysis/wear.html">Tool Life and Wear</a>&quot;.</p>
<ul>
<li>InstantCraterWear_um / AccumulatedCraterWear_um: Instantaneous/accumulated crater wear.</li>
<li>AccumulatedFlankWearDepth_um / AccumulatedFlankWearWidth_um: Accumulated flank wear depth/width.</li>
<li>Tip/Edge Deflection (um): Tool tip and bottom edge deflection (including maximum and delta values), as well as ReCutDepth_um (re-cut depth).</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>
@@ -1,206 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Step | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Step | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Glossary-Step">
<h1 id="step">Step</h1>
<h2 id="what-is-a-step">What Is a Step?</h2>
<p>A <strong>MachiningStep</strong> (<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a>) is a single computation unit in the HiNC simulation. By default, one step corresponds to one spindle revolution, but this interval is configurable via the <a href="../../workflows/basic-simulation.html">Basic Simulation</a> workflow.</p>
<p>Each step contains data for the <strong>time interval</strong> between two consecutive steps (from the previous step to the current step). Since this represents a period rather than an instant, many fields are simplified representations using prefixes like Average (Avg), Extremes (Min, Max), Range (Delta), and Maximum Absolute Value (MaxAbs).</p>
<hr>
<h2 id="registering-custom-step-variables">Registering Custom Step Variables</h2>
<p>Beyond default properties, you can register custom step variables using <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_RegisterStepVariable_">RegisterStepVariable</a>:</p>
<pre><code class="lang-csharp">RegisterStepVariable(
&quot;ChipVolume&quot;, // key
&quot;Chip Volume&quot;, // display name
&quot;mm3&quot;, // unit
&quot;F2&quot;, // format string
(step) =&gt; step.ChipVolume_mm3 // value function
);
PlayNcFile(&quot;NC/file1.nc&quot;);
</code></pre>
<p>Parameters:</p>
<ul>
<li><strong>key</strong>: Unique identifier</li>
<li><strong>name</strong>: Display name (shown in UI)</li>
<li><strong>unit</strong>: Physical unit (can be null)</li>
<li><strong>formatString</strong>: .NET numeric format string (can be null)</li>
<li><strong>variableFunction</strong>: Lambda that computes the value from a step (can be null)</li>
</ul>
<p>Registered variables appear in the UI and in output files from <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_WriteStepFiles_">WriteStepFiles</a>.</p>
<h3 id="indexer-access">Indexer Access</h3>
<p>Use the <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_Item_System_String_">this[string]</a> indexer to read/write custom data on a step:</p>
<pre><code class="lang-csharp">SessionStepBuilt += (preStep, curStep) =&gt; {
if (curStep != null)
curStep[&quot;MyCustomField&quot;] = someCalculation();
};
</code></pre>
<hr>
<h2 id="accessing-step-data">Accessing Step Data</h2>
<h3 id="getmillingstep">GetMillingStep</h3>
<p><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_GetMillingStep_">GetMillingStep</a> retrieves a step by index:</p>
<pre><code class="lang-csharp">var step = GetMillingStep(100);
if (step != null)
{
Message($&quot;ToolId={step.ToolId}, Force={step.MaxAbsForce_N} N&quot;);
}
</code></pre>
<h3 id="stepcount">StepCount</h3>
<p><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_StepCount">StepCount</a> returns the total number of steps:</p>
<pre><code class="lang-csharp">Message($&quot;Total steps: {StepCount}&quot;);
</code></pre>
<h3 id="iterating-all-steps">Iterating All Steps</h3>
<pre><code class="lang-csharp">for (int i = 0; i &lt; StepCount; i++)
{
var step = GetMillingStep(i);
// process step...
}
</code></pre>
<hr>
<h2 id="step-output-files">Step Output Files</h2>
<p>Steps can be exported to CSV using <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_WriteStepFiles_">WriteStepFiles</a>:</p>
<pre><code class="lang-csharp">WriteStepFiles(&quot;Output/[NcName].step.csv&quot;);
</code></pre>
<p>The CSV contains all default properties plus any registered custom variables. The file can be read back with <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayCsvFile_">PlayCsvFile</a>.</p>
<p>For waveform-level data (sub-step time resolution), use <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_WriteShotFiles_">WriteShotFiles</a>:</p>
<pre><code class="lang-csharp">WriteShotFiles(&quot;Output/[NcName].shot.csv&quot;, 1); // 1 ms time resolution
</code></pre>
<hr>
<h2 id="dynamically-registered-variables-training">Dynamically Registered Variables (Training)</h2>
<p>After executing <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_TrainMillingPara_">TrainMillingPara</a> or <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ReTrainMillingPara_">ReTrainMillingPara</a>, two additional step variables are automatically registered for steps within the training region:</p>
<table>
<thead>
<tr>
<th>Variable</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>TrainingErrRatio</code></td>
<td>Error metric between simulation and measurement for each step</td>
</tr>
<tr>
<td><code>AngleOffset</code></td>
<td>Cutter rotation phase difference between measured and simulated data</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="step-fields.html">Step Field Reference</a> — complete field reference</li>
<li><a class="xref" href="session-shell.html">Glossary: SessionShell Quick-Reference</a> — SessionShell quick-reference</li>
<li><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a> — simulation workflow producing steps</li>
<li><a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a> — training workflow that adds step variables</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>
@@ -1,2 +0,0 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Script Command","href":"script-command.html","topicHref":"script-command.html"},{"name":"SessionShell Reference","href":"session-shell.html","topicHref":"session-shell.html"},{"name":"Cutter-Location (CL) Playback","href":"cutter-location-playback.html","topicHref":"cutter-location-playback.html"},{"name":"Step — Concept & Output","href":"step.html","topicHref":"step.html"},{"name":"Step Field Reference","href":"step-fields.html","topicHref":"step-fields.html"},{"name":"ShellProgress","href":"shell-progress.html","topicHref":"shell-progress.html"}]}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Component Assembly and Anchors | HiAPI-C# 2025 </title>
<title>Anchor | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Component Assembly and Anchors | HiAPI-C# 2025 ">
<meta name="title" content="Anchor | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,29 +85,125 @@
</div>
<article data-uid="">
<h1 id="component-assembly-and-anchors">Component Assembly and Anchors</h1>
<h1 id="anchor">Anchor</h1>
<p><strong>Anchors</strong> are used for assembly purposes. When anchors between geometries coincide, assembly is completed.</p>
<p>Strictly speaking, an <strong>Anchor</strong> is not a point, but a coordinate system. For two coordinate systems to be equal, their origins must coincide and their rotation directions must be the same.</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Anchor Assembly Example</strong></p>
<p>As shown in the figure below, there are two components, each with two anchors, {<code>AnchorA</code>,<code>AnchorB</code>} and {<code>AnchorC</code>,<code>AnchorD</code>} respectively.
The two components are assembled by making <code>AnchorB</code> and <code>AnchorC</code> coincide.</p>
<p><img src="anchor-img/Anchor%20for%20contact.png" alt="anc-contact"></p>
</div>
<h2 id="worktable-anchor-and-workpiece-anchor">Worktable Anchor and Workpiece Anchor</h2>
<p>Both workpiece and fixture have a workpiece anchor (<code>WorkpieceBuckle</code>), and both machine tool and fixture have a worktable anchor (<code>TableBuckle</code>), used to assemble workpiece, fixture, and machine tool.</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Workpiece Fixture Assembly Example</strong></p>
<p>Workpiece and fixture are assembled by making their workpiece anchors (<code>WorkpieceBuckle</code>) coincide.</p>
<p><img src="anchor-img/Anchor%20for%20contact%20workpiece%20and%20fixture.png" alt=""></p>
</div>
<p>If no fixture is set, the workpiece will be assembled with the machine tool through the workpiece anchor and the machine tool through the worktable anchor.</p>
<h2 id="spindle-anchor-and-tool-holder-anchor">Spindle Anchor and Tool Holder Anchor</h2>
<p>Both tool holder and machine tool have a spindle anchor (<code>SpindleBuckle</code>), and both tool holder and tool head have a tool holder anchor (<code>HolderBuckle</code>), used to assemble tool head, tool holder, and machine tool.</p>
<p>If no tool holder is set, the tool head will be assembled with the machine tool through the tool holder anchor and the machine tool through the spindle anchor.</p>
<p>Placing the workpiece, the fixture and the tool relative to the machine. Each of them carries named
anchors, and the setup task is to give each geometry the transform that puts its anchor where it
belongs — four transforms in all, on two branches of the Control Tree.</p>
<p>What an anchor is — a coordinate system rather than a point — and which named buckles hold the scene
together is <a class="xref" href="../../technique/mechanism/assembly-anchors.html">Assembly Anchors</a>. This page is where they are set.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The General Setup page, at <code>/general-setup</code>. The transforms hang from the two branches that own the
geometry being placed, each under an <strong>Anchor</strong> group:</p>
<table>
<thead>
<tr>
<th>Branch</th>
<th>Node</th>
<th>What it places</th>
</tr>
</thead>
<tbody>
<tr>
<td>Fixture</td>
<td><strong>Geom To Table</strong><br><code>equipment/fixture/geom-to-table</code></td>
<td>The fixture geometry onto the machine's table buckle</td>
</tr>
<tr>
<td>Fixture</td>
<td><strong>Geom To Workpiece</strong><br><code>equipment/fixture/geom-to-workpiece</code></td>
<td>The workpiece buckle — the place the workpiece attaches — relative to the fixture geometry</td>
</tr>
<tr>
<td>Workpiece</td>
<td><strong>Geom To Fixture</strong><br><code>equipment/workpiece/anchor/geom-to-fixture</code></td>
<td>The workpiece geometry onto that workpiece buckle</td>
</tr>
<tr>
<td>Workpiece</td>
<td><strong>Geom To Program Zero</strong><br><code>equipment/workpiece/anchor/geom-to-program-zero</code></td>
<td>Program zero, the NC origin, relative to the workpiece geometry</td>
</tr>
</tbody>
</table>
<p>The tool is not placed here. It arrives on the spindle through the tool house, and how far it stands
out of the holder is part of the tool itself — see <a href="cutter.html">Cutter</a>.</p>
<h2 id="the-order-to-work-in">The order to work in</h2>
<ol>
<li><strong>Attach a machine tool first.</strong> The table buckle the fixture is placed against belongs to the
machine chain, so there is nothing to place against until one is loaded —
<a href="machine-tool.html">Machine Tool</a>.</li>
<li><strong>Place the fixture on the table</strong> with Geom To Table.</li>
<li><strong>Place the workpiece on the fixture</strong> — Geom To Workpiece on the fixture side, then Geom To
Fixture on the workpiece side. A project carrying no fixture skips both: the workpiece is then
assembled onto the machine's table buckle directly.</li>
<li><strong>Set program zero last</strong>, once the workpiece is where it belongs. Which direction to align it,
and what to align it against, are <a href="program-zero-alignment.html">Program Zero Alignment</a>.</li>
</ol>
<h2 id="the-numbers-are-on-the-child-node">The numbers are on the child node</h2>
<p>Each of the four nodes is a <strong>kind picker and nothing else</strong>. Its panel offers one field,
<strong>Transformer type</strong>, and the editor holding the actual numbers is the <strong>child</strong> node underneath it —
which is why a node that looks empty has an expand arrow beside it.</p>
<p><strong>Geom To Program Zero</strong> selected on a demo project, at
<code>/general-setup?tree=equipment/workpiece/anchor/geom-to-program-zero</code>. The panel under the tree
carries only <strong>Transformer type</strong>, reading <em>Static Translation</em>; the node's own child, one level
deeper in the tree, is where that translation's values are typed.</p>
<p><img src="anchor-img/geom-to-program-zero.en.png" alt="The Workpiece branch of the Control Tree fully expanded, showing Raw Geometry, Target Geometry, an Anchor group holding Geom To Fixture and Geom To Program Zero, Mesh, and a Material group; Geom To Program Zero is selected and its panel below the tree shows a single Transformer type field reading Static Translation"></p>
<p>Seven kinds are offered on all four nodes:</p>
<table>
<thead>
<tr>
<th>Kind</th>
<th>Use it for</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Static Translation</strong></td>
<td>A fixed offset. The usual answer for all four.</td>
</tr>
<tr>
<td><strong>Static Rotation</strong></td>
<td>A fixed turn — stock clamped at an angle, a fixture mounted rotated.</td>
</tr>
<tr>
<td><strong>Static Freeform</strong></td>
<td>A fixed transform given as a matrix.</td>
</tr>
<tr>
<td><strong>General Transform</strong></td>
<td>Several transforms composed into one.</td>
</tr>
<tr>
<td><strong>Dynamic Translation</strong> / <strong>Dynamic Rotation</strong></td>
<td>A value that moves at run time. These are what a machine's own axes carry; a setup placement is not one of them.</td>
</tr>
<tr>
<td><strong>No Transform</strong></td>
<td>No offset at all — the two things coincide.</td>
</tr>
</tbody>
</table>
<p>Changing the kind replaces the editor beneath it, so a value typed under one kind does not carry
over to another.</p>
<h2 id="checking-the-result">Checking the result</h2>
<p>The <strong>Scene</strong> dropdown above the canvas has an <strong>Anchors</strong> group that draws what has just been
placed: <strong>Fixture Geometry Anchor</strong>, <strong>Workpiece Buckle</strong>, <strong>Table Buckle</strong>, <strong>Workpiece Geometry
Anchor</strong> and <strong>Program-Zero Anchor</strong>. Turning on the two ends of a transform you have just set is the
quickest way to see whether it landed where you meant — a workpiece sitting a plate's thickness
below the fixture is obvious as soon as both buckles are drawn.</p>
<p>The same dropdown's <strong>Solid</strong> group has a <strong>Machine</strong> checkbox, cleared to begin with, which brings
the machine chain into the same scene so the assembly can be checked against the table it is
supposed to be sitting on.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../technique/mechanism/assembly-anchors.html">Assembly Anchors</a> — what an anchor is, and the named buckles the scene is assembled at</li>
<li><a href="program-zero-alignment.html">Program Zero Alignment</a> — aligning the program origin once the workpiece is placed</li>
<li><a href="machine-tool.html">Machine Tool</a> — the chain that carries the table and spindle anchors</li>
<li><a href="fixture.html">Fixture</a> — the branch carrying the two fixture transforms named above</li>
<li><a href="workpiece.html">Workpiece</a> — the branch carrying the two workpiece transforms named above, and the rest of the workpiece setup</li>
<li><a href="index.html">Setup</a> — the rest of the pre-simulation configuration</li>
</ul>
</article>
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

@@ -1,129 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>APT Tool Definition | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="APT Tool Definition | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="MillingTool-APT">
<h1 id="apt-tool-definition">APT Tool Definition</h1>
<p>APT (Automatically Programmed Tool) is a universal tool definition. Refer to the APT parameter diagram:</p>
<div class="NOTE">
<h5>Note</h5>
<p><img src="apt-img/APT.svg" alt="APT"></p>
</div>
<p>APT parameter description:</p>
<ul>
<li><code>D</code>: Diameter</li>
<li><code>Rc</code>: Corner radius</li>
<li><code>Rr</code>: Distance from corner center to tool centerline</li>
<li><code>Rz</code>: Distance from corner center to tool tip horizontal plane</li>
<li><code>Alpha</code>: Angle between horizontal plane and tool tip cone surface</li>
<li><code>Beta</code>: Angle between tool centerline and tool wall cone surface</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>
@@ -1,353 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Heidenhain Controller Support | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Heidenhain Controller Support | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Controllers/HeidenhainSupport">
<h1 id="heidenhain-controller-support">Heidenhain Controller Support</h1>
<p>Heidenhain programs run on a single controller preset that reads <strong>both</strong> dialects — TNC klartext
(TNC 640 / TNC 530 conversational) and Heidenhain <strong>DIN/ISO</strong>. There is no separate selection to
make: pick Heidenhain as the project's controller and the program is read in whichever dialect it is
written in.</p>
<p>Coverage is stated in the same three states as
<a href="controller-iso.html#how-to-read-this-page">General NC Code Support</a> — supported, recognized but not
simulated, and not supported. <em>Recognized but not simulated</em> is a deliberate state: the construct is
consumed and reported under its own message id, so it can never be silently misread as something
else. A <code>PLANE AXIAL B+45</code> will never be mistaken for a rotary-axis command.</p>
<h2 id="program-format">Program format</h2>
<h3 id="separators-are-optional">Separators are optional</h3>
<p>Klartext is normally written with spaces between the letter instructions, and that is what the
control shows. Some post-processors emit the same program with no separators at all. <strong>Both forms
parse</strong>, and so does the detached feed spelling.</p>
<blockquote>
<p>Equivalent, all parsed:</p>
<ul>
<li><code>L X-26.3 Y+43.1 Z+100.3 A-90.0 C+13.123 FQ3</code> and <code>LX-26.3Y+43.1Z+100.3A-90.0C+13.123FQ3</code></li>
<li><code>L X+0 Y+0 R0 FMAX</code> and <code>LX+0Y+0R0FMAX</code></li>
<li><code>FMAX M03 M08</code> and <code>FMAXM03M08</code></li>
<li><code>F20000</code> and <code>F 20000</code></li>
</ul>
</blockquote>
<h3 id="multi-line-blocks">Multi-line blocks</h3>
<p>A statement broken across lines with the tilde continuation — the usual shape of a <code>CYCL DEF</code> body or
a long <code>PLANE</code> statement — is joined back into one block before parsing, so it is read as the single
statement it is.</p>
<h2 id="motion">Motion</h2>
<table>
<thead>
<tr>
<th>Construct</th>
<th>Support</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>L</code></td>
<td>Straight-line motion with its axis words.</td>
</tr>
<tr>
<td><code>FMAX</code></td>
<td>Rapid traverse.</td>
</tr>
<tr>
<td><code>CC</code> / <code>C</code></td>
<td>Circular motion — <code>CC</code> sets the pole, <code>C</code> states the end point. <code>DR-</code> is clockwise and <code>DR+</code> counter-clockwise, the centre may be left implicit, and an arc that closes on its start point is a full circle.</td>
</tr>
<tr>
<td><code>RL</code> / <code>RR</code> / <code>R0</code></td>
<td>Radius compensation left / right / off.</td>
</tr>
<tr>
<td><code>M91</code></td>
<td>One-shot machine-coordinate move for that block.</td>
</tr>
<tr>
<td><code>M126</code> / <code>M127</code></td>
<td>Shortest-path rotary traverse on / off. With neither stated, shortest path is the default.</td>
</tr>
<tr>
<td><code>M140 MB+n</code> / <code>M140 MB MAX</code></td>
<td>Tool-axis retract — by <code>n</code> mm, or to the positive Z stroke limit. Without a configured stroke limit, <code>MB MAX</code> reports <code>M140--NoStrokeLimit</code> and is skipped. The statement's own <code>F</code> drives the retract without entering the modal feedrate.</td>
</tr>
<tr>
<td><code>STOP</code></td>
<td>Program stop, alongside <code>M00</code> / <code>M01</code>.</td>
</tr>
<tr>
<td><code>CYCL DEF 32 TOLERANCE</code></td>
<td>Path-smoothing tolerance.</td>
</tr>
<tr>
<td><code>BLK FORM</code></td>
<td>Recorded as a stock declaration. It does <strong>not</strong> replace the workpiece configured in the project.</td>
</tr>
</tbody>
</table>
<h2 id="tools">Tools</h2>
<p><code>TOOL CALL</code> performs the tool change on its own — klartext has no separate <code>M06</code> trigger. A tool
number or a quoted tool name is accepted.</p>
<blockquote>
<p>Parsed:</p>
<ul>
<li><code>TOOL CALL 1 Z S5000</code></li>
<li><code>TOOL CALL &quot;1&quot; Z S5000</code></li>
<li><code>TOOL CALL &quot;B40R&quot; Z S3000 DL+0.5</code></li>
</ul>
</blockquote>
<ul>
<li>The spindle speed <code>S</code> is recorded modally.</li>
<li><code>DL</code> is a length delta — the effective tool height is the tool-table height <strong>plus</strong> <code>DL</code>.</li>
<li><code>DR</code> is read and recorded but <strong>not applied</strong>: radius compensation uses the tool-table radius as-is,
and the block reports <code>ToolChange--DeltaUnsupported</code>.</li>
<li>A tool axis other than <code>Z</code> reports <code>ToolChange--AxisUnsupported</code>.</li>
<li>A <code>TOOL CALL</code> whose tool number could not be captured — an unevaluated variable, for example —
reports <code>ToolChange--MissingToolId</code>.</li>
</ul>
<h2 id="datums">Datums</h2>
<p><code>CYCL DEF 247</code> sets the datum preset and <code>CYCL DEF 7</code> is an <strong>additive</strong> shift on top of it, which is
the TNC semantic. The two compose as separate entries in the coordinate chain instead of replacing
each other.</p>
<blockquote>
<p>Parsed:</p>
<pre><code>CYCL DEF 247 Q339=+1
</code></pre>
<pre><code>CYCL DEF 7.0 DATUM SHIFT
CYCL DEF 7.1 X10.123
CYCL DEF 7.2 Y22.223
CYCL DEF 7.3 Z32.97
</code></pre>
</blockquote>
<h2 id="q-parameters-and-fn">Q parameters and FN</h2>
<p><code>Q</code>, <code>QR</code>, <code>QL</code> and <code>QS</code> parameters are read wherever a value is expected, so <code>FQ1</code> reaches the
feedrate, <code>L X+Q2</code> reaches the program position and <code>TOOL CALL SQ3</code> reaches the spindle speed. <code>Q0</code><code>Q99</code>
free parameters and <code>QR0</code><code>QR499</code> permanent parameters are held as per-project data and saved with
the project.</p>
<table>
<thead>
<tr>
<th>Construct</th>
<th>Support</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>FN 0</code><code>FN 5</code></td>
<td>Assignment and arithmetic, including the <code>DIV</code> keyword of FN 4 and the prefix <code>SQRT</code> of FN 5.</td>
</tr>
<tr>
<td><code>FN 9</code><code>FN 12</code></td>
<td>Conditional jumps — <strong>executed</strong>, with a per-label iteration cap so a corrupt or hostile program cannot spin forever.</td>
</tr>
<tr>
<td>Other <code>FN</code> opcodes (<code>FN 14</code>, <code>FN 16</code>, <code>FN 18 SYSREAD</code>, …)</td>
<td>Recognized, not simulated. The statement is claimed and reported, so its target parameter stays empty instead of taking a fabricated value.</td>
</tr>
</tbody>
</table>
<blockquote>
<p>Parsed:</p>
<ul>
<li><code>Q1 = 5000</code></li>
<li><code>FN0: Q1 = 5000</code></li>
<li><code>FN1: Q1 = -Q2 + -5</code></li>
<li><code>FN2: Q1 = +10 - +5</code></li>
<li><code>FN3: Q2 = +3 * +3</code></li>
</ul>
</blockquote>
<h2 id="tilted-planes-and-rtcp">Tilted planes and RTCP</h2>
<table>
<thead>
<tr>
<th>Construct</th>
<th>Support</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>PLANE SPATIAL</code></td>
<td>Fully composed, including <code>SEQ+</code> / <code>SEQ-</code>, <code>COORD ROT</code> / <code>TABLE ROT</code>, and the <code>STAY</code> / <code>MOVE</code> / <code>TURN</code> positioning behaviours.</td>
</tr>
<tr>
<td><code>PLANE RESET</code></td>
<td>Cancels the tilt.</td>
</tr>
<tr>
<td><code>PLANE VECTOR</code></td>
<td>Structurally captured, not simulated.</td>
</tr>
<tr>
<td><code>PLANE EULER</code> / <code>POINTS</code> / <code>RELATIV</code> / <code>AXIAL</code> / <code>PROJECTED</code></td>
<td>Recognized, not simulated — consumed and reported as <code>HeidenhainPlane--Unsupported</code>, with the previous tilt retained.</td>
</tr>
<tr>
<td><code>FUNCTION TCPM</code></td>
<td>Supported.</td>
</tr>
<tr>
<td><code>M128</code> / <code>M129</code></td>
<td>Tool centre point control on / off — real RTCP, the Heidenhain sibling of ISO <code>G43.4</code> and Siemens <code>TRAORI</code>.</td>
</tr>
</tbody>
</table>
<blockquote>
<p>Parsed:</p>
<ul>
<li><code>PLANE SPATIAL SPA-60.3 SPB+0 SPC-19.88 STAY SEQ- TABLE ROT</code></li>
<li><code>PLANE RESET STAY</code></li>
</ul>
</blockquote>
<h2 id="cycles-and-calls">Cycles and calls</h2>
<ul>
<li><strong><code>CYCL DEF 2xx</code></strong> bodies are read with their <code>Q</code> parameters mirrored into the block. Cycles <strong>200</strong>,
<strong>232</strong>, <strong>251</strong>, <strong>252</strong> and <strong>253</strong> are mapped onto the shared drilling machinery and simulated;
the mapping follows the cycle's own <code>Q</code> values, so a <code>Q202</code> peck increment routes to peck drilling
and a <code>Q211</code> bottom dwell to dwell drilling.</li>
<li>A <code>CYCL DEF</code> body that is not one of those is recognized, not simulated — reported as
<code>HeidenhainCycl--Unsupported</code>.</li>
<li><strong><code>CYCL CALL</code></strong> and <strong><code>CYCL CALL POS</code></strong> fire the cycle once; <code>M99</code> fires once and <code>M89</code> arms modal
firing.</li>
<li><strong><code>CALL LBL n</code></strong> inlines the label body up to <code>LBL 0</code>; <strong><code>CALL LBL n REP m</code></strong> repeats that section
<code>m</code> times.</li>
<li><strong><code>CALL PGM</code></strong> resolves the called program by file name.</li>
<li><strong>Mirror image</strong> in both spellings — the klartext <code>CYCL DEF 8</code> form and the DIN/ISO <code>G28</code> form.</li>
</ul>
<h2 id="diniso-dialect">DIN/ISO dialect</h2>
<p>The same preset, with nothing to switch.</p>
<ul>
<li><code>%</code> tape header and <code>N</code> block numbers.</li>
<li><code>T</code> plus <code>M06</code> tool change.</li>
<li><strong>Arc centres <code>I</code> / <code>J</code> / <code>K</code> are absolute pole coordinates</strong>, not incremental offsets from the
start point. This is the Heidenhain reading, and the pole carries forward modally.</li>
<li>The ISO label family — <code>G98 L&lt;n&gt;</code> definitions, and the head-anchored <code>L&lt;n&gt;,&lt;m&gt;</code> call whose comma
count maps onto the repeat count.</li>
<li><code>G247 Q339</code> stamps the same datum preset as <code>CYCL DEF 247</code>.</li>
<li><code>G54</code> with axis words is read as a datum-shift declaration.</li>
<li><code>G70</code> / <code>G71</code> units.</li>
</ul>
<div class="WARNING">
<h5>Warning</h5>
<p><strong><code>G28</code> on Heidenhain is MIRROR IMAGE, not a reference-point return.</strong> The Fanuc reading of <code>G28</code>
is deliberately absent from the Heidenhain preset. Select the Heidenhain controller for a
Heidenhain DIN/ISO file — read as Fanuc, every mirror statement becomes a home move.</p>
</div>
<h2 id="not-supported">Not supported</h2>
<p><code>TOOL DEF</code>, <code>FK</code> free-contour programming, <code>SL</code> cycles, <code>PATTERN DEF</code>, and <code>TCH PROBE</code>. These are left
unconsumed, and the block that carried them reports <code>Parsing--Unconsumed</code> naming the words.</p>
<p>Machine-specific M-codes that are not part of the Heidenhain vocabulary above are declared on the
machine rather than built in — see the M-code note on
<a href="controller-iso.html#m-codes">General NC Code Support</a>.</p>
<h2 id="see-also">See also</h2>
<ul>
<li><a href="controller-iso.html">General NC Code Support</a> — Fanuc, Syntec, Mazak and Siemens SINUMERIK.</li>
<li><a href="../../fundamentals/nc-parsing/index.html">NC Parsing Engine</a> — the pipeline behind these constructs, the
brand-by-brand support matrix in one table, and how a machine's own vocabulary is added without
changing HiNC.</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

@@ -1,489 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>General NC Code Support | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="General NC Code Support | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="general-nc-code-support">General NC Code Support</h1>
<p>The vocabulary HiNC interprets is decided by the controller brand selected for the project. This page
covers the ISO-family presets — <strong>Fanuc</strong>, <strong>Syntec</strong> and <strong>Mazak</strong> — and <strong>Siemens SINUMERIK</strong>.
Heidenhain is a different language and has its own page: <a href="controller-heidenhain.html">Heidenhain Support</a>.</p>
<h2 id="how-to-read-this-page">How to read this page</h2>
<p>Coverage is stated in three states.</p>
<table>
<thead>
<tr>
<th>State</th>
<th>What happens when the construct appears in your program</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Supported</strong></td>
<td>interpreted, and its effect is simulated.</td>
</tr>
<tr>
<td><strong>Recognized, not simulated</strong></td>
<td>consumed on purpose and reported under its own message id. The block keeps running and the construct's effect does not apply — but it can never be silently misread as something else.</td>
</tr>
<tr>
<td><strong>Not supported</strong></td>
<td>the words are left over, and the block reports <code>Parsing--Unconsumed</code> naming them.</td>
</tr>
</tbody>
</table>
<div class="TIP">
<h5>Tip</h5>
<p>The message list a run produces is the coverage report for <strong>your</strong> program. Every word the
interpreter could not use is named on the block that carried it, so you never have to infer
coverage from the simulated result. An unknown code does not stop the run — it is reported and
skipped.</p>
</div>
<h2 id="iso-core">ISO core</h2>
<p>Fanuc, Syntec and Mazak share the vocabulary below. Siemens spells most of it the same way and adds
its own for the rest — see <a href="#siemens-sinumerik">Siemens SINUMERIK</a>.</p>
<h3 id="motion">Motion</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>G00</code></td>
<td>Rapid positioning.</td>
</tr>
<tr>
<td><code>G01</code></td>
<td>Linear interpolation at the programmed feedrate.</td>
</tr>
<tr>
<td><code>G02</code> / <code>G03</code></td>
<td>Circular interpolation, clockwise / counter-clockwise. The centre may be given as <code>I</code> / <code>J</code> / <code>K</code> offsets or as a radius <code>R</code>.</td>
</tr>
<tr>
<td><code>G04</code></td>
<td>Dwell. <code>X</code> / <code>U</code> are seconds, <code>P</code> is milliseconds, <code>S</code> is spindle revolutions. Both the <code>G4</code> and <code>G04</code> spellings are read.</td>
</tr>
<tr>
<td><code>G28</code></td>
<td>Reference-point (home) return through an intermediate point.</td>
</tr>
<tr>
<td><code>G53</code></td>
<td>One-shot machine-coordinate move — work offsets are bypassed for that block only.</td>
</tr>
</tbody>
</table>
<h3 id="plane-units-and-positioning-mode">Plane, units and positioning mode</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>G17</code> / <code>G18</code> / <code>G19</code></td>
<td>Plane selection — XY / ZX / YZ. Arcs and canned cycles follow the active plane.</td>
</tr>
<tr>
<td><code>G21</code></td>
<td>Metric. This is the HiNC default.</td>
</tr>
<tr>
<td><code>G20</code></td>
<td>Inch — <strong>not supported</strong>. The block reports <code>Unit--InchNotSupported</code>; post the program in metric.</td>
</tr>
<tr>
<td><code>G90</code> / <code>G91</code></td>
<td>Absolute / incremental positioning.</td>
</tr>
<tr>
<td><code>G94</code> / <code>G95</code></td>
<td>Feed per minute / feed per revolution.</td>
</tr>
</tbody>
</table>
<h3 id="work-coordinates">Work coordinates</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>G54</code><code>G59</code></td>
<td>Standard work coordinate systems.</td>
</tr>
<tr>
<td><code>G59.1</code><code>G59.9</code></td>
<td>Extended work coordinate systems.</td>
</tr>
<tr>
<td><code>G54.1 P1</code><code>P48</code></td>
<td>Fanuc extended work offset table.</td>
</tr>
<tr>
<td><code>G52</code></td>
<td>Local coordinate offset, applied on top of the active work coordinate system.</td>
</tr>
</tbody>
</table>
<h3 id="tool-compensation">Tool compensation</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>G43</code> / <code>G44</code> / <code>G49</code></td>
<td>Tool length compensation, positive / negative / cancel. <code>H</code> selects the offset row.</td>
</tr>
<tr>
<td><code>G41</code> / <code>G42</code> / <code>G40</code></td>
<td>Cutter radius compensation, left / right / cancel. <code>D</code> selects the offset row.</td>
</tr>
</tbody>
</table>
<h3 id="rotation-tilted-planes-and-five-axis">Rotation, tilted planes and five-axis</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>G68</code></td>
<td>Coordinate rotation in the active plane, around a centre point by angle <code>R</code>.</td>
</tr>
<tr>
<td><code>G68.2</code></td>
<td>Tilted work plane — Euler angles <code>I</code> / <code>J</code> / <code>K</code> with origin <code>X</code> / <code>Y</code> / <code>Z</code>.</td>
</tr>
<tr>
<td><code>G69</code></td>
<td>Cancels <code>G68</code> and <code>G68.2</code>.</td>
</tr>
<tr>
<td><code>G53.1</code></td>
<td>Tool-axis direction — swings the rotary axes into line with the active <code>G68.2</code> plane.</td>
</tr>
<tr>
<td><code>G43.4</code></td>
<td>RTCP / tool centre point management. The Siemens equivalent is <code>TRAORI</code>, the Heidenhain equivalent <code>M128</code>.</td>
</tr>
</tbody>
</table>
<h3 id="canned-cycles">Canned cycles</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Cycle</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>G73</code></td>
<td>High-speed peck drilling — <code>Q</code> increments with a partial retract.</td>
</tr>
<tr>
<td><code>G74</code></td>
<td>Left-hand tapping.</td>
</tr>
<tr>
<td><code>G76</code></td>
<td>Fine boring — oriented spindle stop, <code>Q</code> shift, rapid out.</td>
</tr>
<tr>
<td><code>G81</code></td>
<td>Drilling.</td>
</tr>
<tr>
<td><code>G82</code></td>
<td>Drilling with a dwell at the bottom.</td>
</tr>
<tr>
<td><code>G83</code></td>
<td>Peck drilling — <code>Q</code> increments with a full retract to the <code>R</code> point.</td>
</tr>
<tr>
<td><code>G84</code></td>
<td>Right-hand tapping.</td>
</tr>
<tr>
<td><code>G85</code></td>
<td>Boring, feed out.</td>
</tr>
<tr>
<td><code>G86</code></td>
<td>Boring, spindle stop then rapid out.</td>
</tr>
<tr>
<td><code>G87</code></td>
<td>Back boring.</td>
</tr>
<tr>
<td><code>G89</code></td>
<td>Boring with a dwell at the bottom.</td>
</tr>
<tr>
<td><code>G80</code></td>
<td>Cancel.</td>
</tr>
<tr>
<td><code>G98</code> / <code>G99</code></td>
<td>Retract to the initial level / to the <code>R</code> level.</td>
</tr>
</tbody>
</table>
<p>A cycle is expanded into the individual strokes it performs — approach, peck, dwell, retract — each
with its own feedrate, so material removal and cycle time come out of the real motion rather than an
approximation. Modal repetition and <code>G91</code> incremental cycle data are resolved before the strokes are
built.</p>
<h3 id="polar-interpolation">Polar interpolation</h3>
<p><code>G12.1</code> turns polar coordinate interpolation on and <code>G13.1</code> turns it off. Inside a polar section the
<code>X</code> word is a <strong>diameter</strong> and the <code>C</code> word is a hypothetical Cartesian axis in millimetres, not
rotary degrees. HiNC halves <code>X</code>, resolves <code>G90</code> / <code>G91</code>, writes both the polar and the derived
Cartesian positions along with the machine C angle, and simulates polar linear and polar arc motion —
the arc as real spiral geometry that stays continuous across ±180°. <code>G41</code> / <code>G42</code> compensation is
resolved on the hypothetical plane, and <code>YA</code> / <code>ZB</code> axis pairs work the same way. G codes that
conflict with polar mode are checked before the mode is entered.</p>
<h3 id="path-smoothing">Path smoothing</h3>
<p><code>G05.1 Q1</code> enables high-precision contour control (AICC / Nano Smoothing) and <code>Q0</code> disables it. The
optional <code>R</code> precision level is preserved.</p>
<h3 id="m-codes">M codes</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>M00</code> / <code>M01</code></td>
<td>Program stop / optional stop.</td>
</tr>
<tr>
<td><code>M02</code> / <code>M30</code></td>
<td>Program end.</td>
</tr>
<tr>
<td><code>M03</code> / <code>M04</code> / <code>M05</code></td>
<td>Spindle clockwise / counter-clockwise / stop.</td>
</tr>
<tr>
<td><code>M06</code></td>
<td>Tool change. The axis travel the change requires is synthesized rather than teleported.</td>
</tr>
<tr>
<td><code>M07</code> / <code>M08</code> / <code>M09</code></td>
<td>Mist coolant on / flood coolant on / coolant off.</td>
</tr>
<tr>
<td><code>M98</code> / <code>M99</code></td>
<td>Subprogram call (<code>M98 P{program} L{repeat}</code>) and return, including <code>M99 P{sequence}</code> early return.</td>
</tr>
<tr>
<td><code>M198</code></td>
<td>Subprogram call from external storage — same shape as <code>M98</code>, different lookup folder.</td>
</tr>
</tbody>
</table>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Composite and OEM M-codes are not built in — they are declared on the machine.</strong> An <code>M13</code> that
means &ldquo;spindle CW plus flood coolant&rdquo;, an M-code that triggers a tool change, or turret <code>T</code>-word
semantics are stated once in the machine's own M-code table and expanded into the ISO effects the
rest of the pipeline already understands. A code declared with no modelled effect is voiced once as
<code>DeclaredMCode--UnmodeledEffects</code> instead of raising an unknown-code warning on every occurrence.</p>
</div>
<div class="NOTE">
<h5>Note</h5>
<p>If a program states a spindle speed greater than zero but never issues a direction, HiNC assumes
clockwise and reports <code>SpindleDirection--AssumedCw</code>. Without that assumption the cutting-force
model would silently produce zero mechanics for the whole file.</p>
</div>
<h2 id="fanuc">Fanuc</h2>
<p>Everything in the ISO core, plus:</p>
<p><strong>Custom Macro B.</strong> <code>#</code> variable assignment and arithmetic, with each range routed to the store it
belongs to — <code>#1</code><code>#33</code> local to the macro frame, <code>#100</code><code>#499</code> volatile and cleared on <code>M02</code> /
<code>M30</code>, <code>#500</code><code>#999</code> retained and saved with the project, <code>#3000</code><code>#3999</code> system control. Boolean and
logical operators, <code>IF [..] GOTO n</code>, <code>IF [..] THEN &lt;statement&gt;</code>, and <code>WHILE [..] DO m</code> / <code>END m</code> with
a bounded-loop watchdog. Position and tool-offset system variables read back into expressions.</p>
<p><strong>Macro and subprogram calls.</strong> <code>G65</code> one-shot macro call, binding arguments <code>A</code><code>Z</code> onto <code>#1</code><code>#26</code>;
<code>G66</code> / <code>G67</code> modal macro, firing at every positioning block until cancelled; <code>M98</code> / <code>M198</code> / <code>M99</code>.
A callee's blocks are spliced into the program at the call site, so the rest of the run treats them
exactly as if they had been written in the main file.</p>
<p><strong>Not supported.</strong> <code>G10</code> programmable data setting, <code>G50</code> spindle speed clamp, <code>G31</code> skip.</p>
<h2 id="syntec">Syntec</h2>
<p>Syntec runs the ISO core plus the Fanuc-family macro and subprogram vocabulary and polar
interpolation.</p>
<p><strong>Not supported.</strong> Custom <code>G</code> macros defined on the controller, <code>Pr</code> parameter mapping, and
twin-head / twin-turret program syntax.</p>
<h2 id="mazak">Mazak</h2>
<p>Mazak reads EIA/ISO with the Fanuc-family macro and subprogram vocabulary and polar interpolation.</p>
<p><strong>Not supported.</strong> MAZATROL conversational sections, and switching between MAZATROL and EIA/ISO
inside one program. Export the EIA/ISO program from the controller.</p>
<h2 id="siemens-sinumerik">Siemens SINUMERIK</h2>
<p>Real <code>.mpf</code> / <code>.spf</code> programs replay end to end — this is not an ISO subset with a Siemens label on
it.</p>
<p><strong>Modal vocabulary.</strong> <code>SUPA</code> / <code>G153</code> suppress all frames for one block; <code>G70</code> / <code>G71</code> units; the
path-smoothing family (<code>G60x</code> / <code>G64x</code>, <code>FNORM</code> / <code>SOFT</code> / <code>FFWON</code> / <code>COMP*</code> / <code>UPATH</code>, <code>CYCLE832</code>);
<code>MSG()</code> and <code>STOPRE</code>; <code>CR=</code> and <code>TURN=</code> arcs. Tail comments are quote-aware, so a <code>;</code> inside
<code>MSG(&quot;A;B&quot;)</code> does not truncate the block. <code>G74</code> / <code>G75</code> fixed-point return is claimed as a whole
block, so the dummy axis values it carries never mint a rapid to those coordinates and its <code>F</code> never
reaches the modal feedrate.</p>
<p><strong>Tools.</strong> <code>T=&quot;NAME&quot;</code> string tool calls with <code>D</code> cutting-edge offsets, resolved through the <code>$TC_DP</code>
tool table — lengths and radius plus additive wear.</p>
<p><strong>Variables and expressions.</strong> R parameters <code>R0</code><code>R999</code> are held as per-project data, <code>DEF REAL</code> /
<code>DEF INT</code> declarations lower into assignments, and a full expression evaluator means <code>Z=R63+150</code> and
<code>X=SIN(R10)*20</code> drive real motion. <code>$P_UIFR[n,axis,TR]</code> binds both ways to the frame table. Any other
<code>$</code> variable is recorded with an unsupported note rather than silently dropped.</p>
<p><strong>Frames and five-axis.</strong> <code>TRANS</code> / <code>ATRANS</code> / <code>ROT</code> / <code>AROT</code> (with <code>RPL=</code>) compose into the tilt
chain in Sinumerik RPY order; <code>TRAORI</code> is a real RTCP mode, the sibling of ISO <code>G43.4</code>, with
<code>TRAFOOF</code> handing the offset back; <code>CYCLE800</code> is decoded from its MODE bits across all four swivel
modes.</p>
<p><strong>Calls and control flow.</strong> <code>L</code>-prefixed and named subprogram calls, inlined with their <code>P</code> repetition
count; <code>M17</code> / <code>RET</code>; <code>REPEAT</code> over a labelled slice; <code>MCALL CYCLE81</code> / <code>82</code> / <code>83</code> / <code>85</code> mapped onto
the shared canned-cycle machinery; <code>PROC</code> headers and labels. <code>GOTOF</code> / <code>GOTOB</code>, <code>IF</code> / <code>ELSE</code> /
<code>ENDIF</code>, and <code>WHILE</code> / <code>FOR</code> / <code>REPEAT-UNTIL</code> / <code>LOOP</code>. Jumps and loop iterations are capped rather
than hanging the session — over the cap the construct warns and falls through.</p>
<p><strong>Per-word coordinate functions.</strong> <code>AC()</code> / <code>IC()</code> / <code>DC()</code> / <code>ACP()</code> / <code>ACN()</code>, including on <code>I</code> /
<code>J</code> / <code>K</code> circle centres, so <code>G90 C=IC(360/17)</code> is one incremental index inside an absolute program.
<code>ACP()</code> takes the forward window, <code>ACN()</code> the backward one, and <code>DC()</code> the shortest swing.</p>
<p><strong>Coded positions.</strong> <code>CAC</code> / <code>CIC</code> / <code>CDC</code> / <code>CACP</code> / <code>CACN</code> take a 1-based indexing position number
instead of a coordinate, resolved against the machine's own indexing-position tables.</p>
<p><strong>OEM auxiliary M-codes.</strong> The preset declares <code>M12</code> / <code>M13</code> / <code>M22</code> / <code>M23</code> and <code>M330</code> / <code>M331</code> as
note-only, so each occurrence voices <code>DeclaredMCode--UnmodeledEffects</code> rather than an unknown-code
warning. A machine's own table overrides the declaration once the real effects are known.</p>
<p><strong>Recognized, not simulated.</strong> <code>ROTS</code> / <code>AROTS</code>, <code>SCALE</code> / <code>ASCALE</code>, and <code>MIRROR</code> / <code>AMIRROR</code> — each
reported as <code>SiemensFrame--Unsupported</code>.</p>
<p><strong>Not supported.</strong> <code>SETAL</code>.</p>
<h2 id="see-also">See also</h2>
<ul>
<li><a href="controller-heidenhain.html">Heidenhain Support</a> — klartext and Heidenhain DIN/ISO.</li>
<li><a href="../../fundamentals/nc-parsing/index.html">NC Parsing Engine</a> — the pipeline behind these codes, the
brand-by-brand support matrix in one table, and how a machine's own vocabulary is added without
changing HiNC.</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,222 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Controller | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Controller | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="controller">Controller</h1>
<p>The controller is the NC parser a project reads its programs with: a brand, the machine and control
settings that brand assumes, and the coordinate, offset and variable tables an NC program addresses.
Setting it up is picking the brand first, then filling in the tables that brand grew.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The General Setup page, at <code>/general-setup</code>, reached from the menu bar's <strong>Page</strong> dropdown. Select
the <strong>Controller</strong> branch of the Control Tree (<code>/general-setup?tree=equipment/controller</code>); it sits
after Workpiece, and whichever node you select opens its editor below the tree in the same dock.</p>
<p>The branch grows children only with a project open and a controller resolved on it, so a Controller
node standing alone is the state before a project is open rather than a fault; a project file
naming no controller keeps the Fanuc preset. Once a runner resolves, the root's own panel badges the
brand in force and enables an <strong>Object Management</strong> (<code></code>) menu, whose <strong>Load</strong> installs a
<code>.Controller</code>, <code>.SoftNcRunner</code> or <code>.xml</code> runner file in place of the whole controller and whose
<strong>Save As</strong> writes the current one out, offered as <code>NcRunner.Controller</code>.</p>
<h2 id="pick-the-brand-first">Pick the brand first</h2>
<p>Select <strong>Controller Brand</strong> (<code>equipment/controller/machine/brand</code>), pick one of <strong>Fanuc</strong>,
<strong>Siemens</strong>, <strong>Heidenhain</strong>, <strong>Syntec</strong> and <strong>Mazak</strong>, and press <strong>Apply brand</strong>. Until you do the
pick is only staged: <strong>Revert</strong> drops it, and so does selecting another tree row.</p>
<p>Do it before anything else, because it replaces the whole controller rather than one field:</p>
<ol>
<li><strong>The dialect changes.</strong> Each brand is a different reader; what its G and M words actually do is
<a href="../../technique/nc-dialects/index.html">NC Dialects</a>.</li>
<li><strong>The node set changes.</strong> The branch is regrown, so nodes the new brand has no concept of stop
existing and its own appear.</li>
<li><strong>Machine settings reset</strong> to the new preset's defaults. The runner-owned ones — the tool-change
position, block-skip layers, subprogram folders and the macro iteration guards — reset on every
apply. The travel limits, rapid feedrates, home reference, M-code declarations and native
parameters live in the brand's parameter table and reset only where the switch also sweeps that
table; Fanuc and Mazak share one, so a switch between those two leaves them where they are.</li>
<li><strong>The old brand's own program-data tables are removed</strong> — the ones only that brand proxies:
Siemens frames, <code>$TC_DP</code> offsets and R parameters, Heidenhain datum presets and shifts. Tool
offsets survive every switch, and retained common variables survive among Fanuc, Syntec and
Mazak. What is swept does not come back: switching back builds those tables fresh from the new
preset's defaults.
<strong>Carry work-coordinate XYZ (G54…) into the new brand's table</strong>, ticked by default, moves the
work offsets across — only those, and only for ids the new brand also holds: Fanuc to Siemens
keeps G54G57 and drops the rest.</li>
</ol>
<p>A brand switch and an Object-Management load are both refused while an NC program is playing — see
<a href="../run/playing-a-program.html">Playing a Program</a>.</p>
<p>The <strong>Controller Brand</strong> leaf on a demo project, at
<code>/general-setup?tree=equipment/controller/machine/brand</code>. The machine plane above it is expanded, so
the eleven leaves this brand grows are all visible; the panel below carries the <strong>Controller brand</strong>
select reading <em>Fanuc</em>, the carry checkbox ticked, and the <strong>Apply brand</strong> and <strong>Revert</strong> buttons
that are enabled only while a different brand is staged.</p>
<p><img src="controller-img/controller-brand.en.png" alt="The Controller branch of the Control Tree with its Machine / Controller plane expanded, listing Controller Brand, Machine Limits (Stroke), Rapid Feedrates, Home / G28 Reference, Tool-Change Position, Controller Parameters, M-Code Declarations, Canned Cycle (Peck), Block Skip / Delete, Subprogram Folders and Parameters (Native); the panel below shows a Controller brand select reading Fanuc, a ticked checkbox reading carry work-coordinate XYZ into the new brand's table, and the Apply Brand and Revert buttons"></p>
<h2 id="the-two-planes">The two planes</h2>
<p>Every other node hangs on one of two group stems, and which one it is on says what it describes;
selecting a stem lists its children.</p>
<table>
<thead>
<tr>
<th>Plane</th>
<th>Tree id</th>
<th>What sits on it</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Machine / Controller</strong></td>
<td><code>equipment/controller/machine</code></td>
<td>What the machine is wired to do: travel limits, rapid feedrates, the home / G28 reference, the tool-change position, the controller parameters in both a grouped and a native form, the peck clearance, M-code declarations, block-skip layers, subprogram folders and, on Siemens, the indexing position tables</td>
</tr>
<tr>
<td><strong>Program Data</strong></td>
<td><code>equipment/controller/program-data</code></td>
<td>The tables a program reads and writes: work coordinates (G54…) and tool offsets on every brand, plus the brand's own — Siemens frames, <code>$TC_DP</code> offsets and R parameters, Heidenhain datum presets and shifts, Fanuc-family retained common variables</td>
</tr>
</tbody>
</table>
<p>The machine plane's per-axis rows are driven by the machine tool's chain: every brand preset already
declares X, Y and Z, and attaching a machine tool adds that chain's own axes beside them. Program
data stays with the project, so loading a controller file of the brand already in force leaves those
tables as they are.</p>
<p><strong>Work Coordinates</strong> always lists the plain <code>G54</code><code>G59</code> rows its brand's table holds — Siemens seeds
only G54G57 — and, on Fanuc, Mazak and Syntec, the extended <code>G59.1</code><code>G59.9</code> rows of the
brand-neutral table that sits behind the brand table; it shows the <code>G54.1P</code> and <code>G505</code><code>G599</code> rows
once a value is non-zero or the <strong>Show all</strong> toggle is on. Each row carries <strong>P0</strong>, which writes the machine coordinate the
workpiece's program-zero anchor sits at, and <strong>M0</strong>, which writes machine zero; clicking anywhere in
a row also marks that coordinate on the canvas. Aligning program zero <em>onto</em> a row's offset is not
on this branch: <strong>Align P0</strong> is on the Legacy Controller screen's Coordinate Table tab, which edits a
separate controller model — <a href="../utilities/legacy-controller.html">Legacy Controller</a>.</p>
<h2 id="a-table-that-is-not-there">A table that is not there</h2>
<p>A node the active brand has no concept of is never created rather than shown and disabled — Frames
on Fanuc, Retained Common Variables on Siemens, Block Skip / Delete on Heidenhain — and a <code>?tree=</code>
link naming one does nothing on the wrong brand, so name the brand alongside any id shared. Nor is an
id promised to survive a version change — see <a href="../basics/finding-your-way.html">Finding Your Way</a>.</p>
<p>Two further rows may differ from a colleague's tree for an unrelated reason: <strong>CSV Controller</strong> and
<strong>CL Controller</strong> are separate non-brand controllers, absent until their box in the <strong>Preference</strong>
dropdown is switched on, and which box is on is a per-device setting — see
<a href="../basics/preferences.html">Preferences</a>. Unlike a brand-gated node, though, these two are still
reachable by link: a <code>?tree=equipment/controller-csv</code> or <code>?tree=equipment/controller-cl</code> mints the
node and selects it whatever the box says, so a shared bookmark never dead-ends.</p>
<p><strong>The Preference menu answers whether you need either of them.</strong> Under each of the two checkboxes it
reads <em>This project plays CSV</em> / <em>This project plays CL</em>, or <em>Not used by this project</em>, worked out
from what the open project actually plays — the kinds its mission commands name, the play verbs its
scripts call, and, for CL, a machine chain that can only be driven from CL. Neither node is a setup task in its own right:
both are childless leaves with no Object Management, because a CSV or CL pipeline is not loaded,
pasted or saved as a file the way a brand controller is. Switching a box on reveals the pipeline's
settings; leaving it off on a project that plays neither costs nothing.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="../../technique/nc-dialects/index.html">NC Dialects</a> — what each brand's G and M vocabulary actually does, once the brand is picked</li>
<li><a href="../utilities/legacy-controller.html">Legacy Controller</a> — the superseded screen that still owns Align P0 and the two switches this branch has no editor for</li>
<li><a href="machine-tool.html">Machine Tool</a> — the chain whose axes fill the per-axis rows on the machine plane</li>
<li><a href="program-zero-alignment.html">Program Zero Alignment</a> — the other half of a work offset: where program zero sits on the workpiece</li>
<li><a href="index.html">Setup</a> — the rest of the pre-simulation configuration</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

@@ -87,9 +87,32 @@
<article data-uid="Equipment/Coolant">
<h1 id="coolant">Coolant</h1>
<p>Models the cutting-zone cooling for the milling temperature FEM. Lives on <a class="xref" href="../../api/Hi.Physics.CoolantHeatCondition.html">CoolantHeatCondition</a><small>(API)</small>; consumed by <a class="xref" href="../../api/Hi.Physics.MillingTemperatureUtil.html">MillingTemperatureUtil</a><small>(API)</small> every simulation step.</p>
<p>Two thermal settings sit beside each other in the equipment tree: how the cutting zone is cooled,
and how warm the shop is around it. Both feed the milling-temperature model, so they move computed
temperatures and everything downstream of them — and setting them needs no heat-transfer numbers at
all, because the cooling types ship as ready-made files.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The General Setup page, at <code>/general-setup</code>, reached from the menu bar's <strong>Page</strong> dropdown.
<strong>Background</strong> (<code>/general-setup?tree=equipment/background</code>) and <strong>Coolant</strong>
(<code>/general-setup?tree=equipment/coolant</code>) are two leaves of the Control Tree, sitting together
between Spindle Capability and Fixture. Both are inert until a project is open: the fields are
disabled and the panel says so.</p>
<p>The <strong>Coolant</strong> leaf selected on a demo project. The panel under the tree opens with the file row —
the <strong>Select</strong> dropdown, the path field reading <em>No coolant file (saved inline)</em>, and <strong>Save As&hellip;</strong>
— then the read-only <strong>Name</strong> and <strong>Note</strong> of whatever file is loaded, and then the condition's own
values. Neither leaf puts anything in the middle column.</p>
<p><img src="coolant-img/coolant-leaf.en.png" alt="The Coolant leaf of the Control Tree selected on the General Setup page, its panel showing the Select dropdown and empty file path above read-only Name and Note fields, then a Coolant Temperature of 25 °C and a Flood Convection Coefficient of 1000 W/(m²·K) with the app's own guidance underneath it"></p>
<h2 id="pick-a-cooling-type">Pick a cooling type</h2>
<p>You do not need to know any heat-transfer numbers to set up cooling. In the Player control tree, open <strong>Equipment Setup → Coolant</strong>, click <strong>Select → Browse Resource&hellip;</strong>, and pick the ready-made <code>.CoolantHeatCondition</code> file for the cooling your machine uses — exactly the way a workpiece material file is picked:</p>
<p>The three standard cooling types ship as ready-made <code>.CoolantHeatCondition</code> files, so picking one
<em>is</em> the cooling-type selection — exactly the way a workpiece material file is picked.</p>
<ol>
<li>Select the <strong>Coolant</strong> leaf.</li>
<li>Open the <strong>Select</strong> dropdown at the left of the file row and choose <strong>Browse Resource&hellip;</strong>. It
opens the file picker in the shipped library's own coolant folder, so the three files below are
what it lists. <strong>Browse&hellip;</strong> above it opens the same picker without that jump, which is how a
condition you saved yourself is reached.</li>
<li>Pick the file that matches the machine.</li>
</ol>
<table>
<thead>
<tr>
@@ -104,7 +127,7 @@
</tr>
<tr>
<td><strong>StandardWaterSolubleCoolant</strong></td>
<td>Water-based emulsion coolant, the common flood coolant. (A fresh project already carries these values.)</td>
<td>Water-based emulsion coolant, the common flood coolant.</td>
</tr>
<tr>
<td><strong>StandardOilBasedCoolant</strong></td>
@@ -112,136 +135,74 @@
</tr>
</tbody>
</table>
<p>Loading a file fills the <strong>Name / Note</strong> and every property field shown below them. For a customized setup, tune the fields directly and keep the result as your own named file with <strong>Save As&hellip;</strong> — it can be loaded back later, or from another project.</p>
<p>That is the whole end-user setup. Everything below explains what the values mean.</p>
<h2 id="nc-program-drives-the-mode">NC program drives the mode</h2>
<p>The parser reads M07/M08/M09 into <a class="xref" href="../../api/Hi.Numerical.CoolantMode.html">CoolantMode</a><small>(API)</small> and carries it on every <a class="xref" href="../../api/Hi.MachiningSteps.MachineMotionStep.html">MachineMotionStep</a><small>(API)</small>. The FEM picks the effective convection coefficient at run time from that mode.</p>
<p>Loading a file fills the read-only <strong>Name</strong> and <strong>Note</strong> and every value below them, and reports the
name it loaded.</p>
<p><strong>A project nobody has touched here is not neutral.</strong> Every project carries a coolant condition from
the moment it exists, and it starts on the water-soluble numbers — 25 °C, a flood baseline of
1000 W/(m²·K), a mist ratio of 0.5 and 50 W/(m²·K) with the coolant off. The read-only <strong>Name</strong> is
blank, because no file has been picked, and that blank is the only sign that nobody chose these
values. A dry-cutting machine left alone therefore simulates as though it were flooded with
water-soluble coolant, and its computed temperatures come out low.</p>
<h2 id="the-four-values">The four values</h2>
<p>They are visible whether or not a file is loaded, and editing one tunes <em>this project's</em> copy rather
than the file it came from. Each carries the app's own working range as a hint:</p>
<table>
<thead>
<tr>
<th>M-code</th>
<th><code>CoolantMode</code></th>
<th>Coefficient source</th>
<th>Field</th>
<th>What it is</th>
<th>Range the panel suggests</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>M08</code></td>
<td><code>Flood</code></td>
<td><code>CoolantConvectionCoefficient_Wdm2K</code> (baseline of the chosen type)</td>
</tr>
<tr>
<td><code>M07</code></td>
<td><code>Mist</code></td>
<td>baseline × <code>MistFloodConvectionRatio</code></td>
</tr>
<tr>
<td><code>M09</code></td>
<td><code>Off</code></td>
<td><code>OffConvectionCoefficient_Wdm2K</code></td>
</tr>
</tbody>
</table>
<p>Before the first M07/M08/M09 the mode is <code>UnDefined</code>; the FEM treats it as <code>Off</code>.</p>
<p>For <strong>StandardForcedAir</strong> (dry cutting) the machine has no liquid circuit, so even <code>M08</code> only means &ldquo;air blast on&rdquo; — its flood baseline is an air-blast coefficient, not a liquid one.</p>
<h2 id="what-each-shipped-file-sets">What each shipped file sets</h2>
<p>Each shipped cooling type is also a static preset on <a class="xref" href="../../api/Hi.Physics.CoolantHeatCondition.html">CoolantHeatCondition</a><small>(API)</small> (<code>StandardForcedAir</code>, <code>StandardWaterSolubleCoolant</code>, <code>StandardOilBasedCoolant</code>) — the same pattern as <code>WorkpieceMaterial.Al6061T6</code>; the resource files are generated from them:</p>
<table>
<thead>
<tr>
<th>Preset / file</th>
<th>Flood baseline W/(m²·K)</th>
<th>Mist ratio</th>
<th>Off W/(m²·K)</th>
<th>Temperature °C</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>StandardForcedAir</code></td>
<td>100</td>
<td>0.5</td>
<td>50</td>
<td>25</td>
</tr>
<tr>
<td><code>StandardWaterSolubleCoolant</code></td>
<td>1 000</td>
<td>0.5</td>
<td>50</td>
<td>25</td>
</tr>
<tr>
<td><code>StandardOilBasedCoolant</code></td>
<td>300</td>
<td>0.5</td>
<td>50</td>
<td>25</td>
</tr>
</tbody>
</table>
<p>The baselines are engineering defaults from the literature ranges below; when you have dynamometer / thermocouple data for your own system, tune the fields and save your own file instead. API side: <code>ApplyPreset</code> copies a preset in place; <code>MatchStandardPreset</code> maps values back to a preset name.</p>
<h2 id="properties">Properties</h2>
<p>These are the fields shown under Name / Note in the Coolant panel:</p>
<table>
<thead>
<tr>
<th>Property</th>
<th>Default</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CoolantTemperature_C</code></td>
<td>25</td>
<td>Room temperature inside the enclosure.</td>
</tr>
<tr>
<td><code>CoolantConvectionCoefficient_Wdm2K</code></td>
<td>1 000</td>
<td>Flood baseline. Water-based emulsion ≈ 1 0003 000, oil ≈ 100500, forced air ≈ 10500.</td>
</tr>
<tr>
<td><code>MistFloodConvectionRatio</code></td>
<td>0.5</td>
<td>MQL is roughly half the heat removal of flood. See below.</td>
</tr>
<tr>
<td><code>OffConvectionCoefficient_Wdm2K</code></td>
<td>50</td>
<td>Forced air inside a running enclosure. Natural air ≈ 525.</td>
</tr>
<tr>
<td><code>Name</code> / <code>Note</code></td>
<td><strong>Coolant Temperature</strong> (°C)</td>
<td>The temperature of the coolant as it arrives at the cut</td>
<td></td>
<td>From the loaded file / preset; <strong>Save As&hellip;</strong> renames the condition after the file. Legacy projects without a name still work.</td>
</tr>
<tr>
<td><strong>Flood Convection Coefficient</strong> (W/(m²·K))</td>
<td>Heat removal with the coolant on</td>
<td>Forced air 10500; typical liquid coolant 100010000</td>
</tr>
<tr>
<td><strong>Mist / Flood Ratio</strong></td>
<td>Mist heat removal relative to flood</td>
<td>Typically 0.40.8</td>
</tr>
<tr>
<td><strong>Off (Air) Convection Coefficient</strong> (W/(m²·K))</td>
<td>Heat removal with the coolant off</td>
<td>Natural air 525; forced air inside an enclosure about 50</td>
</tr>
</tbody>
</table>
<h2 id="why-the-mist-ratio-defaults-to-05">Why the mist ratio defaults to 0.5</h2>
<p>MQL removes much less heat than flood because a thin oil aerosol has a tiny thermal mass; its main value is lubrication plus evaporative cooling, not convection. Industry handbooks place it at <strong>roughly half of flood</strong>, which gives the conservative default <code>0.5</code>. Override it when you have dynamometer / thermocouple data for your own MQL system.</p>
<div class="NOTE">
<h5>Note</h5>
<p>Further reading: UNIST <em>MQL Handbook</em> (source of the &ldquo;about half&rdquo; rule), ANEBON mist-vs-flood AISI 1045 tests, Mukesh et al. <em>IEJ</em> May 2023 review on sustainable machining. Use these only to dig deeper — the <code>0.5</code> default is already calibrated from them.</p>
</div>
<h2 id="coolant-files-workpiecematerial-pattern">Coolant files (WorkpieceMaterial pattern)</h2>
<p><code>MachiningEquipment.CoolantHeatConditionFile</code> tracks an optional <code>.CoolantHeatCondition</code> side-file, exactly like <code>Workpiece.WorkpieceMaterialFile</code> tracks a material file:</p>
<p>Negative temperatures are accepted, for cryogenic coolant; the three convection coefficients cannot
go below zero.</p>
<p>Which of the three coefficients is in force at any moment is not decided here — the NC program's own
M07 / M08 / M09 decide it, step by step. That, and what the numbers do to the simulation, are
<a class="xref" href="../../technique/milling-physics/coolant-model.html">Coolant Model</a>.</p>
<h2 id="keeping-a-tuned-condition">Keeping a tuned condition</h2>
<p><strong>Save As&hellip;</strong> writes the current values out as a <code>.CoolantHeatCondition</code> file in the project folder
and starts tracking it, so the project saves a reference to the file instead of a copy of the
values. It offers a name taken from the loaded condition; a file picked from the shipped library
loses its <code>.default</code> marker on the way, because that marker means <em>shipped</em> and a file you saved is
yours.</p>
<p>The result is loadable into the next project through the same <strong>Select</strong> dropdown — which is the
point of saving one: a shop with its own measured coolant performance describes it once.</p>
<h2 id="background-temperature">Background temperature</h2>
<p>The <strong>Background</strong> leaf carries a single field, <strong>Background Temperature</strong> in °C: the surrounding
temperature the thermal model works against. It defaults to 25 °C, it belongs to the project exactly
as the coolant condition does, and it is read by the same milling-temperature model and by the feed
optimizer, so it is not a display setting.</p>
<p>Set it to the shop's real ambient. There is no file to load and nothing else to configure: one
number, applied to the whole project.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><strong>No file (default):</strong> the condition serializes inline in the <code>.hincproj</code>, byte-compatible with pre-pattern readers.</li>
<li><strong>File tracked:</strong> the project save externalizes the condition as <code>&lt;CoolantHeatCondition&gt;&lt;XmlSource&gt;relPath&lt;/XmlSource&gt;&lt;/CoolantHeatCondition&gt;</code> and (re)writes the side-file. Loading a file installs it in place of the current condition and records the reference (<code>XFactory.GenByFile&lt;CoolantHeatCondition&gt;</code>); a file loaded from the resource folder is copied into the project on the next save (self-contained project root).</li>
<li><a class="xref" href="../../technique/milling-physics/coolant-model.html">Coolant Model</a> — the coefficients, the M-code that selects one, the shipped presets and the file format</li>
<li><a class="xref" href="../../anatomy/general-setup/background-coolant.html">Background / Coolant Page</a> — the Control-Tree editor for these values, field by field</li>
<li><a href="index.html">Setup</a> — the rest of the pre-simulation configuration</li>
</ul>
<h2 id="xml">XML</h2>
<pre><code class="lang-xml">&lt;CoolantHeatCondition&gt;
&lt;Name&gt;StandardOilBasedCoolant&lt;/Name&gt;
&lt;Note&gt;Oil-based cutting fluid (neat oil).&lt;/Note&gt;
&lt;CoolantTemperature_C&gt;25&lt;/CoolantTemperature_C&gt;
&lt;CoolantConvectionCoefficient_Wdm2K&gt;300&lt;/CoolantConvectionCoefficient_Wdm2K&gt;
&lt;MistFloodConvectionRatio&gt;0.5&lt;/MistFloodConvectionRatio&gt;
&lt;OffConvectionCoefficient_Wdm2K&gt;50&lt;/OffConvectionCoefficient_Wdm2K&gt;
&lt;/CoolantHeatCondition&gt;
</code></pre>
<p><code>Name</code>/<code>Note</code> are optional (pre-preset files omit them); omit the last two elements to accept the defaults. The same element saved standalone is the <code>.CoolantHeatCondition</code> file format; inside a <code>.hincproj</code> it may instead appear as the <code>&lt;XmlSource&gt;</code> reference shown above.</p>
</article>
Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Some files were not shown because too many files have changed in this diff Show More