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.

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>
@@ -0,0 +1,138 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Basics | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Basics | 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="basics">Basics</h1>
<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>
<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: 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 F5–F8 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>
@@ -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="signing-in.html" name="" title="Signing In">Signing In</a>
</li>
<li>
<a href="the-app-window.html" name="" title="The Application Window">The Application Window</a>
</li>
<li>
<a href="projects.html" name="" title="Projects">Projects</a>
</li>
<li>
<a href="finding-your-way.html" name="" title="Finding Your Way">Finding Your Way</a>
</li>
<li>
<a href="preferences.html" name="" title="Preferences">Preferences</a>
</li>
<li>
<a href="messages-and-logs.html" name="" title="Messages and Logs">Messages and Logs</a>
</li>
</ul>
</div>
</div>
</div>
</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"}]}