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
@@ -0,0 +1,227 @@
<!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="../milling-physics/cutter-geometry.html">Cutter Geometry</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="../milling-physics/cutter-geometry.html">Cutter Geometry</a> — cutter geometry (the other meaning of &ldquo;APT&rdquo;)</li>
<li><a class="xref" href="script-command.html">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>
@@ -0,0 +1,141 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Scripting | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Scripting | 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="scripting">Scripting</h1>
<p>How a HiNC session is driven from C#: the command surface a script is written against, the step
objects a run produces, and the message stream it reports through. The same commands run from the
app's script panels, from inside an NC comment, and from a hosted session, so this section
describes the surface rather than the screen.</p>
<p>Ordered the way a script meets them — the language and its global scope first, then what a run
produces and how it reports, then the one input that is not G-code.</p>
<h2 id="writing-a-script">Writing a Script</h2>
<ul>
<li><a href="script-command.html">Script Command</a> — The C# syntax, the session lifecycle a command runs inside, <code>;@</code> commands embedded in NC, and the <code>[NcName]</code> output template</li>
<li><a href="session-shell.html">SessionShell</a> — The global scope every command resolves against, mapped family by family onto the work each family does</li>
</ul>
<h2 id="what-a-run-produces">What a Run Produces</h2>
<ul>
<li><a href="step.html">Step</a> — The computation unit, one spindle revolution by default: its custom variables, and how a script reads and exports it</li>
<li><a href="step-fields.html">Step Field Reference</a> — What each group of per-step output covers, and the two values that are most often misread</li>
<li><a href="shell-progress.html">ShellProgress</a> — The four message severities, tag filtering, and exporting a session log</li>
</ul>
<h2 id="playing-something-other-than-g-code">Playing Something Other Than G-code</h2>
<ul>
<li><a href="cutter-location-playback.html">Cutter-Location (CL) Playback</a> — Replaying a CAM cutter-location file before it is post-processed, and what the chain choice decides</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="../milling-physics/index.html">Milling Physics</a> — what the per-step values a script exports are measuring</li>
<li><a href="../nc-optimization/index.html">NC Optimization</a> — the optimizer that the <code>Opt*</code> settings on this surface drive</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,232 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Script Commands | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="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="script-commands">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="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>
<p>The marker is read inside the line's <strong>comment</strong>, so the comment character is the controller's own. Where <code>;</code> opens a comment:</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 (FANUC and the other <code>( )</code> dialects), the same marker goes inside the parentheses:</p>
<pre><code>T01 M06 (;@MachiningResolution_mm=0.03125;)
S1270 M03
G43 Z10. H01
</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>
<li><strong>Do not write <code>NaN</code> into a per-step <code>NcOptOption</code>.</strong> A <code>NaN</code> feed-per-tooth boundary is refused when the step is solved: that step keeps its simulated feed rate and is reported as an error naming the option values, and the rest of the run is optimized normally. See <a href="../nc-optimization/nc-optimization-principles.html#when-a-step-cannot-be-solved">When a Step Cannot Be Solved</a>.</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">SessionShell</a> — the command families, and which workflow uses each</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="session-shell.html">SessionShell</a> — the command families this syntax reaches</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>
<li><a class="xref" href="cutter-location-playback.html">Cutter-Location (CL) Playback</a> — replaying a CL toolpath from a script</li>
<li><a class="xref" href="shell-progress.html">ShellProgress</a> — the message stream a running script writes to</li>
<li><a class="xref" href="../nc-optimization/nc-optimization-principles.html">NC Optimization</a> — what a per-step optimization option does, and how a step that fails to solve is reported</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,212 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SessionShell | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="SessionShell | 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="sessionshell">SessionShell</h1>
<p><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html">SessionShell</a> is the global scope of the HiNC scripting engine: a script names its members directly, with no object reference and no <code>using</code>. Everything a script does to a session — start a playback, set a resolution, export a file, train a coefficient, read a step — is a member of this one type.</p>
<p>The complete and current list of commands, properties and events is the generated <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html">SessionShell</a> reference. This page is the map onto it — which family does what, and which workflow reaches for it. The members are deliberately not re-listed here: a hand-copied index of an API drifts the moment the API changes, and nothing in the build can catch it.</p>
<h2 id="command-families">Command Families</h2>
<table>
<thead>
<tr>
<th>Family</th>
<th>What it does</th>
<th>Where it is used</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Playback</strong></td>
<td>Runs a program — NC files and NC strings, CSV-driven playback, cutter-location files, and tool teleports. Parse-only variants return the action sequence without pacing it.</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a>, <a class="xref" href="cutter-location-playback.html">Cutter-Location (CL) Playback</a></td>
</tr>
<tr>
<td><strong>Player control</strong></td>
<td>Paces, pauses and resets the running player: the checkpoints a script inserts into a playback.</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a></td>
</tr>
<tr>
<td><strong>Resolution and cache</strong></td>
<td>Workpiece entity resolution, motion resolution mode, display cache size. The largest single influence a script has on run time.</td>
<td><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a>, <a class="xref" href="../simulation-performance/cpu-usage.html">CPU Usage During Simulation</a></td>
</tr>
<tr>
<td><strong>Physics switches</strong></td>
<td>Whether milling force, wear effect and collision detection are evaluated; angular divisions per revolution; initial spindle temperature; whether a failure or a collision pauses the run.</td>
<td><a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a>, <a class="xref" href="../../workflows/geometry-validation.html">Workflow: Geometry Validation</a></td>
</tr>
<tr>
<td><strong>Data export</strong></td>
<td>Step-level CSV and waveform (shot) CSV, both accepting the <code>[NcName]</code> template.</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>
<tr>
<td><strong>Sensor mapping</strong></td>
<td>Puts measured data alongside the simulated run: one-to-one and series mapping from CSV, time-range selection written into NC comments, and clearing what was mapped.</td>
<td><a class="xref" href="../../workflows/sensor-mapping.html">Workflow: Sensor Data Mapping</a></td>
</tr>
<tr>
<td><strong>Training</strong></td>
<td>Trains milling coefficients from mapped data, calibrates existing ones, and loads cutting parameters into the workpiece.</td>
<td><a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a></td>
</tr>
<tr>
<td><strong>Optimization</strong></td>
<td>The optimizer's file output and its whole settings surface — feed-rate and re-interpolation switches, feed and acceleration limits, the four safety factors, the target force, the preserve ranges that exempt lines, and the per-step log.</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><strong>Geometry</strong></td>
<td>Reads, writes and exports meshed geometry (STL / OBJ / PLY), compares the cut against a target, removes disconnected residual material, and scans for defects.</td>
<td><a class="xref" href="../../workflows/geometry-validation.html">Workflow: Geometry Validation</a></td>
</tr>
<tr>
<td><strong>Messages</strong></td>
<td>The four message severities and the file export, all routed through <a class="xref" href="shell-progress.html">ShellProgress</a>.</td>
<td>all workflows</td>
</tr>
<tr>
<td><strong>Step access</strong></td>
<td>Reads a step by index, reports the step count, and registers custom step variables.</td>
<td><a class="xref" href="step.html">Step</a></td>
</tr>
<tr>
<td><strong>Events</strong></td>
<td>Per-step hooks that fire as a step is built or selected.</td>
<td><a class="xref" href="../../workflows/nc-optimization.html">Workflow: NC Optimization</a></td>
</tr>
<tr>
<td><strong>Runtime management</strong></td>
<td>Clears event handlers, buffers and runtime state, and carries data between scripts through the <code>Global</code> dictionary.</td>
<td><a class="xref" href="script-command.html">Script Commands</a></td>
</tr>
<tr>
<td><strong>Tool setup</strong></td>
<td>Adjusts contour shift angle and smart-holder observation height at run time.</td>
<td><a class="xref" href="../measurement/smart-holder-training.html">Smart Tool Holder Coefficient Training</a></td>
</tr>
</tbody>
</table>
<h2 id="what-the-generated-reference-does-not-say">What the Generated Reference Does Not Say</h2>
<ul>
<li><strong>Tool setup is for a mismatch, not for configuration.</strong> Those members exist for the case where the actual installation differs from the configured tool. Where the two agree, set the value in the tool configuration file instead — a script that sets it is silently overriding what everyone else reads.</li>
<li><strong>The geometry family answers to hidden legacy names.</strong> <code>WriteRuntimeGeom</code> / <code>ReadRuntimeGeom</code> / <code>ExportRuntimeGeomTo*</code> / <code>ScanRuntimeGeomInfDefect</code> still run in existing player scripts as aliases of the <code>MeshedGeom</code> names; new scripts use the new names. The full mapping is in <a href="../../release-note/upgrading-to-3.2/breaking-changes.html#5-renames-with-no-shim">Renames with no shim</a>.</li>
<li><strong>Resetting the runtime does not clear the record.</strong> Event handlers, buffers and runtime state go; messages already recorded stay — see <a class="xref" href="shell-progress.html">ShellProgress</a>.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html">SessionShell</a> — the generated reference this page maps</li>
<li><a class="xref" href="script-command.html">Script Commands</a> — the syntax and lifecycle a command runs inside</li>
<li><a class="xref" href="step.html">Step</a> — the data model the step-access family returns</li>
<li><a class="xref" href="shell-progress.html">ShellProgress</a> — the message host the message family writes to</li>
</ul>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,239 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ShellProgress | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="ShellProgress | 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="shellprogress">ShellProgress</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">Script Commands</a> — script command basics</li>
<li><a class="xref" href="session-shell.html">SessionShell</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>
<li><a href="../api-foundations/message-management.html">Message Management</a> — the three application-level channels this session-scoped host is one face of</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,179 @@
<!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>
<p>Every simulated <a class="xref" href="step.html">step</a> carries a row of output: the NC line it came from, the kinematics, the load, and what that load did to the cutter. The field-by-field definitions are generated — <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a> is the complete and current list, and it is not copied here. This page states what each group covers, how the numbers are to be read, and the two readings that are most often misread.</p>
<h2 id="how-a-steps-numbers-are-formed">How a Step's Numbers Are Formed</h2>
<p>A step's data covers the <strong>time interval between two consecutive steps</strong> — from the previous step to this one — not an instant. Most fields are therefore a simplification over that period, and the prefix says which: <code>Avg</code> (average), <code>Min</code> / <code>Max</code> (extremes), <code>Delta</code> (range) and <code>MaxAbs</code> (maximum absolute value).</p>
<p>A field that depends on a frame carries the frame in its name: <code>[W]</code> workpiece, <code>[TR]</code> tool running, <code>[SR]</code> spindle rotation. The frames themselves are defined in <a class="xref" href="../milling-physics/milling-physics-coordinates.html">Milling Physics Coordinates</a>.</p>
<h2 id="field-groups">Field Groups</h2>
<table>
<thead>
<tr>
<th>Group</th>
<th>What it covers</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Source</strong></td>
<td>The file, line, line text and flags of the NC command that produced the step, its index in the run, and the active tool id</td>
</tr>
<tr>
<td><strong>Time and motion</strong></td>
<td>End-of-step timecode, step duration (one spindle revolution in the default per-revolution mode), spindle angle at the start, the cutter location with its IJK normal, the machine coordinates, the displacement in program coordinates, and the feed / spindle-speed / cutting-speed / per-tooth family</td>
</tr>
<tr>
<td><strong>Engagement and removal</strong></td>
<td>Whether the cutter was engaged at all, radial and axial engagement (ae, ap), material removal rate, and the program-side cusp height and its distribution</td>
</tr>
<tr>
<td><strong>Chip</strong></td>
<td>Chip thickness, volume and mass</td>
</tr>
<tr>
<td><strong>Force and torque</strong></td>
<td>Average and maximum force on the tool, torques about the tool tip and about the sensor point in each frame, and the mapping-comparison fields that put a measured signal beside the simulated one — error ratios and symbolic error correlation</td>
</tr>
<tr>
<td><strong>Power and energy</strong></td>
<td>Spindle input power (what enters the spindle) and output power (what reaches the cut after spindle losses; the ratio between them is the spindle's configured <a class="xref" href="../../api/Hi.Milling.SpindleCapability.html#Hi_Milling_SpindleCapability_EnergyEfficiency">EnergyEfficiency</a><small>(API)</small>), the instantaneous and continuous power and torque ratios against the spindle capability curve, and accumulated energy consumption</td>
</tr>
<tr>
<td><strong>Thermal</strong></td>
<td>Cutter body, cutter surface, workpiece surface and chip temperatures, cutter subsurface temperature at a given depth, and thermal stress with its yield ratio</td>
</tr>
<tr>
<td><strong>Wear and deflection</strong></td>
<td>Instantaneous and accumulated crater wear, accumulated flank wear depth and width, tool tip and bottom-edge deflection, and re-cut depth</td>
</tr>
</tbody>
</table>
<p>For what the thermal yield ratio implies about breakage risk see <a class="xref" href="../milling-physics/machinability.html">Evaluating Process Machinability</a>; for the wear model behind the wear fields see <a class="xref" href="../milling-physics/wear.html">Tool Life and Wear</a>.</p>
<div class="NOTE">
<h5>Note</h5>
<p><code>EndTimecode</code> was named <code>AccumulatedTime</code> before the rename, and step CSVs written with the legacy header are still read.</p>
</div>
<h2 id="two-readings-that-are-usually-misread">Two Readings That Are Usually Misread</h2>
<h3 id="a-cusp-spike-is-usually-a-rapid-move-collision-not-a-finish-result">A cusp spike is usually a rapid-move collision, not a finish result</h3>
<p>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 or collision to investigate. The same engagement-during-rapid usually shows up beside it as spikes in the availability ratios — yielding stress, spindle torque, spindle power.</p>
<h3 id="a-power-or-torque-ratio-over-100-is-load-damage-and-it-is-read-by-duration">A power or torque ratio over 100% is load damage, and it is read by duration</h3>
<p>A ratio above 100% means the spindle cannot supply the demanded load at the commanded rpm, 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 and drive are overstressed. That is load damage, not a tool-versus-workpiece collision (see <a class="xref" href="../nc-optimization/nc-optimization-principles.html">NC optimization</a>).</p>
<p>Read it by <em>duration</em>, not just by height. A one-revolution overshoot usually still completes the pass, leaving a slightly insufficient cut there; 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 cutter–workpiece engagement, large tip deflection, and more vibration and noise. Because the ratio is normalized by the spindle-capability curve, a placeholder or guessed spindle skews it — confirm against the real spindle's speed–power and speed–torque curves before calling a cut overloaded.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="step.html">Step</a> — what a step is, and when one is produced</li>
<li><a class="xref" href="../machine-capability/spindle-capability.html">Spindle Capability</a> — the curves that normalize the power and torque ratios above</li>
<li><a class="xref" href="../milling-physics/milling-physics-coordinates.html">Milling Physics Coordinates</a> — what the <code>[W]</code> / <code>[TR]</code> / <code>[SR]</code> marks on these fields mean</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,207 @@
<!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 class="xref" href="step-fields.html">Step Field Reference</a> — complete field reference</li>
<li><a class="xref" href="session-shell.html">SessionShell</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>
<li><a class="xref" href="script-command.html">Script Commands</a> — the script command that drives a session</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,40 @@
<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="script-command.html" name="" title="Script Command">Script Command</a>
</li>
<li>
<a href="session-shell.html" name="" title="SessionShell">SessionShell</a>
</li>
<li>
<a href="step.html" name="" title="Step">Step</a>
</li>
<li>
<a href="step-fields.html" name="" title="Step Field Reference">Step Field Reference</a>
</li>
<li>
<a href="shell-progress.html" name="" title="ShellProgress">ShellProgress</a>
</li>
<li>
<a href="cutter-location-playback.html" name="" title="Cutter-Location (CL) Playback">Cutter-Location (CL) Playback</a>
</li>
</ul>
</div>
</div>
</div>
</div>
@@ -0,0 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Script Command","href":"script-command.html","topicHref":"script-command.html"},{"name":"SessionShell","href":"session-shell.html","topicHref":"session-shell.html"},{"name":"Step","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"},{"name":"Cutter-Location (CL) Playback","href":"cutter-location-playback.html","topicHref":"cutter-location-playback.html"}]}