This commit is contained in:
2026-01-08 21:07:15 +08:00
parent f7f4fe0aac
commit f81f03cb13
279 changed files with 6575 additions and 5080 deletions
@@ -0,0 +1,305 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>About XML IO | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="About XML IO | 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="about-xml-io">About XML IO</h1>
<p>The XML IO design pattern in HiNc Framework is based on <a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html">IMakeXmlSource</a> interface and <a class="xref" href="../../../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> class. This pattern provides a standardized way to serialize and deserialize objects to and from XML format.</p>
<p>Don't serialize the runtime member object like <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.func-1">Func&lt;TResult&gt;</a> or <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.action">Action</a> either cache object. The runtime objects can be optionally sent by the res part on the XFactory Registration or set by the other host or dependent object. If it is set by the other object, then there is nothing can do to it in the XML IO procedure.</p>
<h2 id="core-components">Core Components</h2>
<h3 id="imakexmlsource-interface">IMakeXmlSource Interface</h3>
<p>The <a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html">IMakeXmlSource</a> interface defines the contract for objects that can be serialized to XML format. It contains a single method <code>MakeXmlSource</code>.</p>
<h3 id="xfactory-registration">XFactory Registration</h3>
<p>Every class implementing IMakeXmlSource must:</p>
<ol>
<li>Define a static XName property matching the class name.</li>
<li>Register itself in the static constructor using XFactory.Regs.Add</li>
<li>Implement XML serialization and deserialization logic</li>
</ol>
<p>For example, see <a class="xref" href="../../../api/Hi.Milling.Apts.BallApt.html">BallApt</a>:</p>
<pre><code class="lang-csharp" name="XmlRegistration">static BallApt()
{
// Register to the &lt;see cref=&quot;XFactory.Default&quot;/&gt;.
XFactory.Regs.Add(XName, (xml,baseDirectory,relFile, res) =&gt; new BallApt(xml));
}
</code></pre><h2 id="implementation-patterns">Implementation Patterns</h2>
<h3 id="simple-value-objects">Simple Value Objects</h3>
<p>See <a class="xref" href="../../../api/Hi.Milling.Apts.BallApt.html">BallApt</a> implementation:</p>
<pre><code class="lang-csharp" name="XmlImplementation">/// &lt;summary&gt;
/// Name for XML IO.
/// &lt;/summary&gt;
public static string XName =&gt; nameof(BallApt);
/// &lt;summary&gt;
/// Ctor.
/// &lt;/summary&gt;
/// &lt;param name=&quot;src&quot;&gt;XML&lt;/param&gt;
public BallApt(XElement src)
{
Diameter_mm = double.Parse(src.Element(&quot;D&quot;).Value);
FluteHeight_mm = double.Parse(src.Element(&quot;FluteH&quot;).Value);
}
/// &lt;inheritdoc/&gt;
public XElement MakeXmlSource(string baseDirectory, string relFile, bool exhibitionOnly) =&gt; ToXElement();
/// &lt;inheritdoc/&gt;
public XElement ToXElement()
{
return new XElement(XName,
new XElement(&quot;D&quot;, Diameter_mm),
new XElement(&quot;FluteH&quot;, FluteHeight_mm)
);
}
</code></pre><h3 id="complex-data-structures">Complex Data Structures</h3>
<p>See <a class="xref" href="../../../api/Hi.Milling.SpindleCapability.html">SpindleCapability</a> implementation:</p>
<pre><code class="lang-csharp" name="XmlImplementation">/// &lt;summary&gt;
/// Name for XML IO.
/// &lt;/summary&gt;
public static string XName =&gt; nameof(SpindleCapability);
/// &lt;summary&gt;
/// Initializes a new instance of the &lt;see cref=&quot;SpindleCapability&quot;/&gt; class.
/// &lt;/summary&gt;
/// &lt;param name=&quot;src&quot;&gt;The XML element containing spindle data.&lt;/param&gt;
/// &lt;param name=&quot;baseDirectory&quot;&gt;The base directory for resolving relative paths.&lt;/param&gt;
/// &lt;param name=&quot;res&quot;&gt;Additional resolution parameters.&lt;/param&gt;
public SpindleCapability(XElement src, string baseDirectory, params object[] res)
{
this.SetNameNote(src);
if (src.Element(nameof(EnergyEfficiency)) != null)
EnergyEfficiency = XmlConvert.ToDouble(
src.Element(nameof(EnergyEfficiency)).Value);
src.Element(nameof(WorkingTemperatureUpperBoundary_C))?.SelfInvoke(
e =&gt; WorkingTemperatureUpperBoundary_C = XmlConvert.ToDouble(e.Value));
src.Element(nameof(GearShiftSpindleSpeed_rpm))?.Value?.SelfInvoke(
s =&gt; GearShiftSpindleSpeed_rpm = string.IsNullOrEmpty(s)
? null : XmlConvert.ToDouble(s));
if (src.Element(nameof(DryRunFrictionPowerCoefficient_mWdrpm)) != null)
DryRunFrictionPowerCoefficient_mWdrpm = XmlConvert.ToDouble(
src.Element(nameof(DryRunFrictionPowerCoefficient_mWdrpm)).Value);
if (src.Element(nameof(DryRunWindagePowerCoefficient_pWdrpm3)) != null)
DryRunWindagePowerCoefficient_pWdrpm3 = XmlConvert.ToDouble(
src.Element(nameof(DryRunWindagePowerCoefficient_pWdrpm3)).Value);
if (src.Element(&quot;SpindleSpeedToPowerContours&quot;) != null) //for legacy
WorkableDurationToSpindleSpeedPowerContoursDictionary_min_cycleDs_kW =
src.Element(&quot;SpindleSpeedToPowerContours&quot;).Elements(&quot;Contour&quot;)
.ToDictionary(
contourElem =&gt;
{
double r = XmlConvert.ToDouble(contourElem.Attribute(&quot;InsistentRatio&quot;)?.Value);
//600s=10mins
return r ==1?double.PositiveInfinity:(r * 600);
},
contourElem =&gt; contourElem.Elements(&quot;SpindleSpeedToPower&quot;).Select(
elem =&gt; new Vec2d(
XmlConvert.ToDouble(elem.Element(&quot;SpindleSpeed-RPM&quot;).Value) / 60,
XmlConvert.ToDouble(elem.Element(&quot;Power-kW&quot;).Value)))
.ToList());
src.Element(&quot;WorkableDurationToSpindleSpeedPowerContoursDictionary&quot;)
?.SelfInvoke(dicElem =&gt;
{
WorkableDurationToSpindleSpeedPowerContoursDictionary_min_cycleDs_kW
= dicElem.Elements(&quot;Contour&quot;)
.ToDictionary(
contourElem =&gt; XmlConvert.ToDouble(
contourElem.Attribute(&quot;WorkableDuration-min&quot;)?.Value),
contourElem =&gt; contourElem.Elements(&quot;SpindleSpeedToPower&quot;).Select(
elem =&gt; new Vec2d(
XmlConvert.ToDouble(elem.Element(&quot;SpindleSpeed-RPM&quot;).Value) / 60,
XmlConvert.ToDouble(elem.Element(&quot;Power-kW&quot;).Value)))
.ToList());
});
if (src.Element(&quot;SpindleSpeedToTorqueContours&quot;) != null) //for legacy
WorkableDurationToSpindleSpeedTorqueContoursDictionary_min_cycleDs_Nm =
src.Element(&quot;SpindleSpeedToTorqueContours&quot;).Elements(&quot;Contour&quot;)
.ToDictionary(
contourElem =&gt;
{
double r = XmlConvert.ToDouble(contourElem.Attribute(&quot;InsistentRatio&quot;)?.Value);
//600s=10mins
return r == 1 ? double.PositiveInfinity : (r * 600);
},
contourElem =&gt; contourElem.Elements(&quot;SpindleSpeedToTorque&quot;).Select(
elem =&gt; new Vec2d(
XmlConvert.ToDouble(elem.Element(&quot;SpindleSpeed-RPM&quot;).Value) / 60,
XmlConvert.ToDouble(elem.Element(&quot;Torque-Nm&quot;).Value)))
.ToList());
src.Element(&quot;WorkableDurationToSpindleSpeedTorqueContoursDictionary&quot;)
?.SelfInvoke(dicElem =&gt;
{
//MessageUtil.WriteLine($&quot;dicElem: {dicElem}&quot;);
WorkableDurationToSpindleSpeedTorqueContoursDictionary_min_cycleDs_Nm =
dicElem.Elements(&quot;Contour&quot;).ToDictionary(
contourElem =&gt; XmlConvert.ToDouble(
contourElem.Attribute(&quot;WorkableDuration-min&quot;)?.Value),
contourElem =&gt; contourElem.Elements(&quot;SpindleSpeedToTorque&quot;).Select(
elem =&gt; new Vec2d(
XmlConvert.ToDouble(elem.Element(&quot;SpindleSpeed-RPM&quot;).Value) / 60,
XmlConvert.ToDouble(elem.Element(&quot;Torque-Nm&quot;).Value)))
.ToList());
//MessageUtil.WriteLine($&quot;keys: {string.Join(',',WorkableDurationToSpindleSpeedTorqueContoursDictionary_min_cycleDs_Nm.Select(e=&gt;e.Key))}&quot;);
});
//for legacy compatible.
if (src.Element(&quot;SpindleSpeedToPower--RPM-to-kW&quot;) != null)
InfInsistentSpindleSpeedToPower_cycleDs_kW =
src.Element(&quot;SpindleSpeedToPower--RPM-to-kW&quot;).Elements()
.Select(elem =&gt; new Vec2d(XmlConvert.ToDouble(elem.Attribute(
&quot;SpindleSpeed-RPM&quot;).Value) / 60,
XmlConvert.ToDouble(elem.Value))).ToList();
//for legacy compatible.
if (src.Element(&quot;SpindleSpeedToTorque--RPM-to-Nm&quot;) != null)
InfInsistentSpindleSpeedToTorque_cycleDs_Nm =
src.Element(&quot;SpindleSpeedToTorque--RPM-to-Nm&quot;).Elements()
.Select(elem =&gt; new Vec2d(XmlConvert.ToDouble(elem.Attribute(
&quot;SpindleSpeed-RPM&quot;).Value) / 60,
XmlConvert.ToDouble(elem.Value))).ToList();
}
/// &lt;inheritdoc/&gt;
public XElement MakeXmlSource(string baseDirectory, string relFile, bool exhibitionOnly)
{
return new XElement(XName,
this.GetNameNoteXElementList(),
new XElement(nameof(EnergyEfficiency), EnergyEfficiency),
new XElement(nameof(GearShiftSpindleSpeed_rpm), GearShiftSpindleSpeed_rpm),
new XElement(nameof(DryRunFrictionPowerCoefficient_mWdrpm),
DryRunFrictionPowerCoefficient_mWdrpm),
new XElement(nameof(DryRunWindagePowerCoefficient_pWdrpm3),
DryRunWindagePowerCoefficient_pWdrpm3),
new XElement(&quot;WorkableDurationToSpindleSpeedPowerContoursDictionary&quot;,
WorkableDurationToSpindleSpeedPowerContoursDictionary_min_cycleDs_kW.OrderBy(entry =&gt; entry.Key)
.Select(entry =&gt; new XElement(&quot;Contour&quot;,
new XAttribute(&quot;WorkableDuration-min&quot;, entry.Key),
entry.Value.Select(entry
=&gt; new XElement(&quot;SpindleSpeedToPower&quot;,
new XElement(&quot;SpindleSpeed-RPM&quot;, entry.X * 60),
new XElement(&quot;Power-kW&quot;, entry.Y)))))
),
new XElement(&quot;WorkableDurationToSpindleSpeedTorqueContoursDictionary&quot;,
WorkableDurationToSpindleSpeedTorqueContoursDictionary_min_cycleDs_Nm.OrderBy(entry =&gt; entry.Key)
.Select(entry =&gt; new XElement(&quot;Contour&quot;,
new XAttribute(&quot;WorkableDuration-min&quot;, entry.Key),
entry.Value.Select(entry
=&gt; new XElement(&quot;SpindleSpeedToTorque&quot;,
new XElement(&quot;SpindleSpeed-RPM&quot;, entry.X * 60),
new XElement(&quot;Torque-Nm&quot;, entry.Y)))))
)
);
}
</code></pre><h2 id="best-practices">Best Practices</h2>
<ol>
<li><strong>XName</strong>: Always define static XName property matching the class name.</li>
<li><strong>Registration</strong>: Register in static constructor using <a class="xref" href="../../../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a>.Regs</li>
<li>Call the XName such like <code>_ = CalleeClass.XName;</code> in the caller class static initailization field so that the registration takes effect before calling the Callee construction by <a class="xref" href="../../../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a>.</li>
<li><strong>Error Handling</strong>: Use appropriate <a class="xref" href="../../../api/Hi.Common.XmlUtils.GenMode.html">GenMode</a></li>
<li><strong>Legacy Support</strong>: Maintain backward compatibility when needed</li>
</ol>
</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,186 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Geometry Objects | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Geometry Objects | 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="geometry-objects">Geometry Objects</h1>
<p><strong><a class="xref" href="../../../api/Hi.Geom.IGetStl.html">IGetStl</a></strong> is the base interface for all geometry objects in HiAPI, providing unified STL support.</p>
<p>Several common geometry types are available:</p>
<ul>
<li>Basic Geometrys
<ul>
<li><a class="xref" href="../../../api/Hi.Geom.Box3d.html">Box3d</a></li>
<li><a class="xref" href="../../../api/Hi.Geom.Cylindroid.html">Cylindroid</a></li>
<li><a class="xref" href="../../../api/Hi.Geom.Stl.html">Stl</a></li>
<li><a class="xref" href="../../../api/Hi.Geom.StlFile.html">StlFile</a></li>
</ul>
</li>
<li>Management Geometrys
<ul>
<li><a class="xref" href="../../../api/Hi.Geom.TransformationGeom.html">TransformationGeom</a></li>
<li><a class="xref" href="../../../api/Hi.Geom.GeomCombination.html">GeomCombination</a></li>
</ul>
</li>
</ul>
<p>See <a href="../mechanism/transformers/index.html">Transformations</a> for <a class="xref" href="../../../api/Hi.Geom.TransformationGeom.html">TransformationGeom</a>.</p>
<ul>
<li><a class="xref" href="../../../api/Hi.Mech.Topo.GeneralTransform.html">GeneralTransform</a></li>
<li><a class="xref" href="../../../api/Hi.Mech.Topo.StaticRotation.html">StaticRotation</a></li>
<li><a class="xref" href="../../../api/Hi.Mech.Topo.StaticTranslation.html">StaticTranslation</a></li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p>All coordinate values use standard units (millimeters, radians)</p>
</div>
<h2 id="example-usage">Example Usage</h2>
<pre><code class="lang-csharp" name="SampleCode">using System;
using System.Collections.Generic;
using Hi.Geom;
using Hi.Mech.Topo;
namespace Sample.Geom
{
/// &lt;summary&gt;
/// Demonstrates the creation and manipulation of geometric objects in HiAPI.
/// Shows how to create and transform various geometry types including boxes, cylindroids, and STL files.
/// &lt;/summary&gt;
/// &lt;remarks&gt;
/// ### Source Code
/// [!code-csharp[SampleCode](~/../Hi.Sample/Geom/DemoBuildGeom.cs)]
/// &lt;/remarks&gt;
public static class DemoBuildGeom
{
/// &lt;summary&gt;
/// Generates a collection of geometric objects for demonstration purposes.
/// Creates various geometry types including boxes, cylindroids, STL files, and transformed geometries.
/// &lt;/summary&gt;
/// &lt;returns&gt;A list of geometries implementing the IGetStl interface&lt;/returns&gt;
public static List&lt;IGetStl&gt; GenGeoms()
{
Box3d box = new Box3d(0, 0, -50, 70, 50, 0);
Cylindroid cylindroid = new Cylindroid([ new PairZr(0,12),new PairZr(20,12),
new PairZr(20,16),new PairZr(30,16)]);
Stl stl = new Stl(&quot;geom.stl&quot;);
StlFile stlFile = new StlFile(&quot;geom.stl&quot;);
TransformationGeom transformationGeom = new TransformationGeom()
{
Transformer = new GeneralTransform(1,
new StaticRotation(new Vec3d(0, 0, 1), MathUtil.ToRad(15), new Vec3d(0, 0, 0)),
new StaticTranslation(new Vec3d(0, 0, 0))),
Geom = stl
};
GeomCombination geomCombination = new GeomCombination(stlFile, transformationGeom);
return new List&lt;IGetStl&gt;([box, cylindroid, stl, stlFile, transformationGeom]);
}
}
}
</code></pre>
</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: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@@ -0,0 +1,145 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Kinematic Topology | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Kinematic Topology | 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="Usage.HiMech.Topo">
<h1 id="kinematic-topology">Kinematic Topology</h1>
<p>The Kinematic Topology is composed of three elemental classes: <strong><a class="xref" href="../../../../api/Hi.Mech.Topo.Anchor.html">Anchor</a></strong>, <strong><a class="xref" href="../../../../api/Hi.Mech.Topo.Branch.html">Branch</a></strong> and <strong><a class="xref" href="../../../../api/Hi.Mech.Topo.Asmb.html">Asmb</a></strong>.</p>
<h2 id="basic-elements">Basic Elements</h2>
<h3 id="anchors-and-branches">Anchors and Branches</h3>
<p><strong><a class="xref" href="../../../../api/Hi.Mech.Topo.Anchor.html">Anchor</a></strong> object contains a cartesian coordinate. It can be a mechanical component or a flag.</p>
<p><strong><a class="xref" href="../../../../api/Hi.Mech.Topo.Branch.html">Branch</a></strong> object is a directional link between two <a class="xref" href="../../../../api/Hi.Mech.Topo.Anchor.html">Anchor</a> objects. It contains the <strong><a class="xref" href="../../../../api/Hi.Mech.Topo.ITransformer.html">ITransformer</a></strong> object. The <a class="xref" href="../../../../api/Hi.Mech.Topo.ITransformer.html">ITransformer</a> object contains a coordinate <strong>transformation matrix</strong>. As shown in the following sketch:</p>
<p><img src="chainLink.png" alt="Chain Structure"></p>
<h3 id="assembly-management">Assembly Management</h3>
<p><strong><a class="xref" href="../../../../api/Hi.Mech.Topo.Asmb.html">Asmb</a></strong> (Assembly) provides organization and management of Anchors. An Assembly can contain both Anchors and other Assemblies. Key features include:</p>
<ul>
<li>Grouping related Anchors together</li>
<li>Managing coordinate transformations</li>
<li>Providing display and indexing functions</li>
<li>Supporting hierarchical structure</li>
</ul>
<h2 id="kinematic-chain-example">Kinematic Chain Example</h2>
<p>The following figure shows a kinematic chain of a non-orthogonal 5-axis machine tool:</p>
<p><img src="vmt.png" alt="VMT Structure"></p>
<p>Each <a class="xref" href="../../../../api/Hi.Mech.Topo.Anchor.html">Anchor</a> represents a component:</p>
<ul>
<li>Axis components: X, Y, Z, B, C</li>
<li>Base components: O (base1), O* (base2)</li>
<li>Tool components: S (spindle), T (tool body), T* (tool flute)</li>
<li>Workpiece: W</li>
</ul>
<p>The relative transform between two Anchors is calculated by multiplying the transform matrices along the Branch. For example, the transform matrix from W to T is:</p>
<div class="math">
\[
M_{WT} = M_{CW}^{-1} \cdot M_{YC}^{-1} \cdot M_{OY}^{-1} \cdot M_{OO^*} \cdot M_{O^*X} \cdot M_{XZ} \cdot M_{ZB} \cdot M_{BS} \cdot M_{ST}
\]</div>
<p>This matrix can be obtained using <a class="xref" href="../../../../api/Hi.Mech.Topo.Asmb.html#Hi_Mech_Topo_Asmb_GetMat4d_Hi_Mech_Topo_IGetAnchor_Hi_Mech_Topo_IGetAnchor_">GetMat4d(IGetAnchor, IGetAnchor)</a>.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

@@ -0,0 +1,139 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HiAPI Mechanics Overview | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="HiAPI Mechanics Overview | 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="HiMech.Overview">
<h1 id="mechanism-topology">Mechanism Topology</h1>
<p>HiAPI Mechanism Topology provides basic functionality for assembling mechanical structures and simulating their motions. It allows you to build kinematic models of milling machines and similar mechanical structures through a topology-based approach.</p>
<h2 id="core-concepts">Core Concepts</h2>
<h3 id="kinematic-topology">Kinematic Topology</h3>
<p>Kinematic Topology is the core concept of this module, which describes the motion relationships between mechanical components. With Kinematic Topology, you can:</p>
<ul>
<li>Define mechanical structures and motion relationships</li>
<li>Calculate forward and inverse kinematics</li>
<li>Display component positions and orientations</li>
<li>Conduct collision detection</li>
</ul>
<h3 id="main-modules">Main Modules</h3>
<ul>
<li><a href="Topo/index.html">Topology</a> - Kinematic topology structure, including assembly management and chain definition</li>
<li><a href="transformers/index.html">Transformers</a> - Coordinate transformation and motion transformation</li>
<li><a href="render-topology/index.html">Render Topology</a> - Rendering with topology structure and anchored display</li>
</ul>
<h2 id="api-references">API References</h2>
<ul>
<li><a class="xref" href="../../../api/Hi.Mech.Topo.html">Hi.Mech.Topo</a> - Core topology functionality</li>
<li><a class="xref" href="../../../api/Hi.Mech.Topo.Asmb.html">Asmb</a> - Assembly-related functionality</li>
<li><a class="xref" href="../../../api/Hi.Mech.Topo.Branch.html">Branch</a> - Chain-related functionality</li>
</ul>
<h2 id="examples">Examples</h2>
<p>Please refer to the examples in each sub-section to learn how to use these features to build your applications.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,228 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Render Topology | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Render Topology | 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="render-topology">Render Topology</h1>
<p>Read <a href="../Topo/index.html">Kinematic Topology</a> <a href="../../rendering/index.html">Rendering</a> for the prerequisite.</p>
<p>A <a class="xref" href="../../../../api/Hi.Mech.Topo.Asmb.html">Asmb</a> is a group to render its descendent <a class="xref" href="../../../../api/Hi.Mech.Topo.Anchor.html">Anchor</a>s.</p>
<p>Several ways to render with the topology:</p>
<ul>
<li>Render by Anchoring Matrix Map</li>
<li>Render by Anchored Displayee</li>
</ul>
<h2 id="render-by-anchoring-matrix-map">Render by Anchoring Matrix Map</h2>
<h2 id="render-by-anchored-displayee">Render by Anchored Displayee</h2>
<p>Inherit <a class="xref" href="../../../../api/Hi.Mech.Topo.IAnchoredDisplayee.html">IAnchoredDisplayee</a> or apply <a class="xref" href="../../../../api/Hi.Mech.Topo.AnchoredDisplayee.html">AnchoredDisplayee</a> to <a class="xref" href="../../../../api/Hi.Mech.Topo.Asmb.html">Asmb</a>.Display().</p>
<p>Inherit <a class="xref" href="../../../../api/Hi.Mech.Topo.ITopoDisplayee.html">ITopoDisplayee</a> to manage the object with <a class="xref" href="../../../../api/Hi.Mech.Topo.Asmb.html">Asmb</a> and plural anchors .</p>
<p>The base logic is also by the anchoring matrix. Here is some class and function wrapping the logic.</p>
<p>The sample code shows the topology rendering for a <a class="xref" href="../../../../api/Hi.Milling.MillingTools.MillingTool.html">MillingTool</a> editing helper:</p>
<pre><code class="lang-csharp" name="MillingToolEditorDisplayee">using Hi.Common;
using Hi.Common.Messages;
using Hi.Disp;
using Hi.Disp.Flag;
using Hi.Geom;
using Hi.Mech.Topo;
using Hi.Milling.Cutters;
using Hi.NcMech.Holders;
using System;
using System.Collections.Generic;
namespace Hi.Milling.MillingTools
{
/// &lt;summary&gt;
/// Display host for a milling tool composed of a cutter and a holder.
/// &lt;/summary&gt;
public class MillingToolEditorDisplayee : ITopoDisplayee, IClearCache
{
/// &lt;summary&gt;
/// Gets or sets the delegate that provides the &lt;see cref=&quot;MillingTool&quot;/&gt; instance.
/// &lt;/summary&gt;
public Func&lt;MillingTool&gt; MillingToolGetter { get; set; }
/// &lt;summary&gt;
/// Gets the current &lt;see cref=&quot;MillingTool&quot;/&gt; instance.
/// &lt;/summary&gt;
public MillingTool MillingTool =&gt; MillingToolGetter?.Invoke();
/// &lt;summary&gt;
/// Gets or sets whether to show the cutter.
/// &lt;/summary&gt;
public bool ShowCutter { get; set; } = true;
/// &lt;summary&gt;
/// Gets or sets whether to show the holder.
/// &lt;/summary&gt;
public bool ShowHolder { get; set; } = true;
/// &lt;summary&gt;
/// Gets the displayee for the milling cutter.
/// &lt;/summary&gt;
public MillingCutterEditorDisplayee MillingCutterEditorDisplayee { get; }
= new MillingCutterEditorDisplayee();
/// &lt;summary&gt;
/// Gets the displayee for the holder.
/// &lt;/summary&gt;
public HolderEditorDisplayee HolderEditorDisplayee { get; }
= new HolderEditorDisplayee();
/// &lt;inheritdoc/&gt;
public List&lt;IAnchoredDisplayee&gt; GetAnchoredDisplayeeList()
{
var dst = new List&lt;IAnchoredDisplayee&gt;();
var millingTool = MillingTool;
if (millingTool == null)
return dst;
if (ShowCutter)
{
var cutter = millingTool.Cutter;
if (cutter is MillingCutter millingCutter)
{
//MessageKit.AddMessage($&quot;MillingTool.Cutter: {MillingTool?.Cutter?.GetHashCode()}&quot;);
MillingCutterEditorDisplayee.MillingCutterSourceFunc
= () =&gt; MillingTool?.Cutter as MillingCutter;
dst.Add(MillingCutterEditorDisplayee);
}
else if(cutter!=null)
dst.Add(cutter);
}
if (ShowHolder)
{
HolderEditorDisplayee.Holder = millingTool.Holder;
dst.Add(HolderEditorDisplayee);
}
return dst;
}
/// &lt;inheritdoc/&gt;
public void Display(Bind bind)
{
bind.PushCoveringPixelMode();
DimensionBar.Display(bind, &quot;mm&quot;);
bind.ModelMatStack.Pop();
TopoDisplayeeUtil.Display(this, bind);
}
/// &lt;inheritdoc/&gt;
public void ExpandToBox3d(Box3d dst)
{
TopoDisplayeeUtil.ExpandToBox3d(this, dst);
}
/// &lt;inheritdoc/&gt;
public Asmb GetAsmb() =&gt; MillingTool?.Asmb;
/// &lt;inheritdoc/&gt;
public Anchor GetAnchor() =&gt; MillingTool?.GetAnchor();
/// &lt;inheritdoc/&gt;
public void ClearCache()
{
MillingCutterEditorDisplayee?.ClearCache();
}
}
}
</code></pre>
</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,199 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Handle Transform Matrix by ITransformer | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Handle Transform Matrix by ITransformer | 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="HiMech.Tutor.transformers">
<h1 id="handle-transform-matrix-by-itransformer">Handle Transform Matrix by ITransformer</h1>
<p><strong><a class="xref" href="../../../../api/Hi.Mech.Topo.ITransformer.html">ITransformer</a></strong> contains a transform matrix and a inverse transform matrix. The matrix is 4x4 column-major matrix, which describe the orientation or movement between 3D coordinates.</p>
<p>Several common used interface and class are implemented from <a class="xref" href="../../../../api/Hi.Mech.Topo.ITransformer.html">ITransformer</a>. The inheritance is shown:</p>
<ul>
<li><a class="xref" href="../../../../api/Hi.Mech.Topo.IStaticTransformer.html">IStaticTransformer</a>
<ul>
<li><a class="xref" href="../../../../api/Hi.Mech.Topo.NoTransform.html">NoTransform</a></li>
<li><a class="xref" href="../../../../api/Hi.Mech.Topo.StaticTranslation.html">StaticTranslation</a></li>
<li><a class="xref" href="../../../../api/Hi.Mech.Topo.StaticRotation.html">StaticRotation</a></li>
<li><a class="xref" href="../../../../api/Hi.Mech.Topo.StaticFreeform.html">StaticFreeform</a></li>
<li><a class="xref" href="../../../../api/Hi.Mech.Topo.GeneralTransform.html">GeneralTransform</a></li>
</ul>
</li>
<li><a class="xref" href="../../../../api/Hi.Mech.Topo.IDynamicTransformer.html">IDynamicTransformer</a>
<ul>
<li><a class="xref" href="../../../../api/Hi.Mech.Topo.IDynamicRegular.html">IDynamicRegular</a>
<ul>
<li><a class="xref" href="../../../../api/Hi.Mech.Topo.DynamicTranslation.html">DynamicTranslation</a></li>
<li><a class="xref" href="../../../../api/Hi.Mech.Topo.DynamicRotation.html">DynamicRotation</a></li>
</ul>
</li>
<li><a class="xref" href="../../../../api/Hi.Mech.Topo.DynamicFreeform.html">DynamicFreeform</a></li>
</ul>
</li>
</ul>
<p><strong><a class="xref" href="../../../../api/Hi.Mech.Topo.IStaticTransformer.html">IStaticTransformer</a></strong> is transformer with constant matrix. <strong><a class="xref" href="../../../../api/Hi.Mech.Topo.NoTransform.html">NoTransform</a></strong>, <strong><a class="xref" href="../../../../api/Hi.Mech.Topo.StaticTranslation.html">StaticTranslation</a></strong> and <strong><a class="xref" href="../../../../api/Hi.Mech.Topo.StaticRotation.html">StaticRotation</a></strong> contains transform matrix of identity, translate and rotate respectively. <strong><a class="xref" href="../../../../api/Hi.Mech.Topo.StaticFreeform.html">StaticFreeform</a></strong> contains a arbitrary constant transform matrix.</p>
<p>The transform matrix of <a class="xref" href="../../../../api/Hi.Mech.Topo.StaticTranslation.html">StaticTranslation</a> is:</p>
<div class="math">
\[
M_{StaticTranslate}=
\begin{bmatrix}
1 &amp; 0 &amp; 0 &amp; 0 \\\\
0 &amp; 1 &amp; 0 &amp; 0 \\\\
0 &amp; 0 &amp; 1 &amp; 0 \\\\
Trans.x &amp; Trans.y &amp; Trans.z &amp; 1
\end{bmatrix}
\]</div>
<p>The transform matrix of <a class="xref" href="../../../../api/Hi.Mech.Topo.StaticRotation.html">StaticRotation</a> and <a class="xref" href="../../../../api/Hi.Mech.Topo.DynamicRotation.html">DynamicRotation</a> is:</p>
<div class="math">
\[
M_{Rotate}=
\begin{bmatrix}
1 &amp; 0 &amp; 0 &amp; 0 \\\\
0 &amp; 1 &amp; 0 &amp; 0 \\\\
0 &amp; 0 &amp; 1 &amp; 0 \\\\
-Pivot.x &amp; -Pivot.y &amp; -Pivot.z &amp; 1
\end{bmatrix}
\cdot
\\\\
\begin{bmatrix}
Rot_{00}(axis,rad) &amp; Rot_{01}(axis,rad) &amp; Rot_{02}(axis,rad) &amp; 0 \\\\
Rot_{10}(axis,rad) &amp; Rot_{11}(axis,rad) &amp; Rot_{12}(axis,rad) &amp; 0 \\\\
Rot_{20}(axis,rad) &amp; Rot_{21}(axis,rad) &amp; Rot_{22}(axis,rad) &amp; 0 \\\\
0 &amp; 0 &amp; 0 &amp; 1
\end{bmatrix}
\cdot
\\\\
\begin{bmatrix}
1 &amp; 0 &amp; 0 &amp; 0 \\\\
0 &amp; 1 &amp; 0 &amp; 0 \\\\
0 &amp; 0 &amp; 1 &amp; 0 \\\\
Pivot.x &amp; Pivot.y &amp; Pivot.z &amp; 1
\end{bmatrix}
\]</div>
<p>Where <a class="xref" href="../../../../api/Hi.Mech.Topo.DynamicRotation.html#Hi_Mech_Topo_DynamicRotation_Pivot">Pivot</a> is the position of the rotation axis.</p>
<div class="TIP">
<h5>Tip</h5>
<p>Pivot is a point. However, rotation axis is a line. It means that it causes the same matrix no matter how the pivot is moving along the axis.</p>
</div>
<p><strong><a class="xref" href="../../../../api/Hi.Mech.Topo.IDynamicTransformer.html">IDynamicTransformer</a></strong> is transformer with inconstant transform matrix. <strong><a class="xref" href="../../../../api/Hi.Mech.Topo.IDynamicRegular.html">IDynamicRegular</a></strong> has a property <a class="xref" href="../../../../api/Hi.Mech.Topo.IDynamicRegular.html#Hi_Mech_Topo_IDynamicRegular_Step">Step</a>, implied that the transform matrix is one parameter driven. <a class="xref" href="../../../../api/Hi.Mech.Topo.TransformerUtil.html#Hi_Mech_Topo_TransformerUtil_GetSteps_Hi_Mech_Topo_IDynamicRegular___">GetSteps(IDynamicRegular[])</a> and <a class="xref" href="../../../../api/Hi.Mech.Topo.TransformerUtil.html#Hi_Mech_Topo_TransformerUtil_SetSteps_Hi_Mech_Topo_IDynamicRegular___System_Double___">SetSteps(IDynamicRegular[], double[])</a> provide easy handle of an array of <a class="xref" href="../../../../api/Hi.Mech.Topo.IDynamicRegular.html">IDynamicRegular</a> objects.</p>
<p>The transform matrix of <a class="xref" href="../../../../api/Hi.Mech.Topo.DynamicTranslation.html">DynamicTranslation</a> is:</p>
<div class="math">
\[
M_{DynamicTranslate}=
\begin{bmatrix}
1 &amp; 0 &amp; 0 &amp; 0 \\\\
0 &amp; 1 &amp; 0 &amp; 0 \\\\
0 &amp; 0 &amp; 1 &amp; 0 \\\\
Trans.x \cdot Step &amp; Trans.y \cdot Step &amp; Trans.z \cdot Step &amp; 1
\end{bmatrix}
\]</div>
<div class="NOTE">
<h5>Note</h5>
<p>In convention, <a class="xref" href="../../../../api/Hi.Mech.Topo.StaticTranslation.html#Hi_Mech_Topo_StaticTranslation_Trans">Trans</a> should be normalized.</p>
</div>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

@@ -0,0 +1,300 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Using Hi.Disp.Drawing | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Using Hi.Disp.Drawing | 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="using-hidispdrawing">Using Hi.Disp.Drawing</h1>
<p>The <a class="xref" href="../../../../api/Hi.Disp.Drawing.html">Drawing</a> class is the most fundamental and efficient rendering unit that allows you to draw points, lines, and surfaces within the <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a>.</p>
<h2 id="understanding-drawing-structure">Understanding Drawing Structure</h2>
<p>Looking at the constructor <a class="xref" href="../../../../api/Hi.Disp.Drawing.html#Hi_Disp_Drawing__ctor_System_Double___Hi_Disp_Stamp_System_Int32_">Drawing(double[], Stamp, int)</a> helps explain its structure:</p>
<ul>
<li>The <code>double[]</code> array contains batch data for rendering, composed of one or more data groups of consistent length</li>
<li>Each data group's length is determined by the <a class="xref" href="../../../../api/Hi.Disp.Stamp.html">Stamp</a> parameter</li>
<li>Each data group describes a single vertex</li>
</ul>
<h2 id="data-components">Data Components</h2>
<p>A data group can contain up to four types of information:</p>
<table>
<thead>
<tr>
<th>Information</th>
<th>Abbreviation</th>
<th>Description</th>
<th>Size</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Vertex</strong></td>
<td>V</td>
<td>The position of the point (x, y, z)</td>
<td>3 doubles</td>
</tr>
<tr>
<td><strong>Normal</strong></td>
<td>N</td>
<td>The normal vector affecting light reflection (Nx, Ny, Nz)</td>
<td>3 doubles</td>
</tr>
<tr>
<td><strong>Color</strong></td>
<td>C</td>
<td>RGB color values ranging from 0 to 1</td>
<td>3 doubles</td>
</tr>
<tr>
<td><strong>Pick ID</strong></td>
<td>P</td>
<td>A single double value converted from an integer for selection operations</td>
<td>1 double</td>
</tr>
</tbody>
</table>
<p>The <a class="xref" href="../../../../api/Hi.Disp.Stamp.html">Stamp</a> enumeration combines these abbreviations to create these possible stamps: <code>{V, NV, CV, CNV, PV, PNV, PCV, PCNV}</code>.</p>
<h3 id="important-notes">Important Notes:</h3>
<ul>
<li>The <strong>Vertex</strong> (V) is mandatory, which is why V appears in every Stamp option</li>
<li><strong>Normal</strong> vectors (N) are typically used for 3D graphics to create a sense of depth through lighting</li>
<li><strong>Color</strong> (C) uses three double values (R, G, B) in the range of 0 to 1</li>
<li><strong>Pick ID</strong> (P) is used for graphical selection operations</li>
</ul>
<h2 id="data-structure-example">Data Structure Example</h2>
<ul>
<li>If <a class="xref" href="../../../../api/Hi.Disp.Stamp.html">Stamp</a> is <code>V</code>, each data group consists of 3 double values (x, y, z)</li>
<li>If <a class="xref" href="../../../../api/Hi.Disp.Stamp.html">Stamp</a> is <code>PCV</code>, each data group consists of 1(P) + 3(C) + 3(V) = 7 double values</li>
</ul>
<h2 id="rendering-mode">Rendering Mode</h2>
<p>The <code>glmode</code> parameter is an OpenGL constant that specifies the drawing mode. You can search for &ldquo;OpenGL Primitives&rdquo; online to see illustrations of these modes.</p>
<h2 id="example-usage">Example Usage</h2>
<pre><code class="lang-csharp">// Creating a simple line strip with three vertices
double[] vertices = new double[] {
0, 0, 0, // First point at origin
1, 0, 0, // Second point along X-axis
0, 0, 1 // Third point along Z-axis
};
// Create drawing object using the vertices
var drawing = new Drawing(vertices, Stamp.V, (int)OpenGL.GL_LINE_STRIP);
</code></pre>
<p>This example creates three vertices with only position information (V), so each vertex has just xyz coordinates. The drawing mode is set to LineStrip.</p>
<p><img src="easydraw_lines.png" alt="Line Strip Drawing Example"></p>
<h2 id="performance-considerations">Performance Considerations</h2>
<div class="NOTE">
<h5>Note</h5>
<p>After a <a class="xref" href="../../../../api/Hi.Disp.Drawing.html">Drawing</a> object is created, its source data is stored in GPU memory. Regardless of the amount of data, the CPU processing load when calling <a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html#Hi_Disp_IDisplayee_Display_Hi_Disp_Bind_">Display(Bind)</a> remains consistent. This means displaying 100 points with one <a class="xref" href="../../../../api/Hi.Disp.Drawing.html">Drawing</a> object is approximately 100 times faster than using 100 separate Drawing objects to display 100 individual points.</p>
</div>
<h2 id="composing-multiple-idisplayee-objects">Composing Multiple IDisplayee Objects</h2>
<p>A common pattern is to combine multiple <a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a> objects, including <a class="xref" href="../../../../api/Hi.Disp.Drawing.html">Drawing</a> objects:</p>
<pre><code class="lang-csharp">public class MyCompositeDisplayee : IDisplayee
{
private readonly List&lt;IDisplayee&gt; _displayees = new List&lt;IDisplayee&gt;();
public MyCompositeDisplayee()
{
// Create a grid drawing
_displayees.Add(CreateGridDrawing());
// Create an axes drawing
_displayees.Add(CreateAxesDrawing());
// Add other custom drawings
_displayees.Add(CreateCustomDrawing());
}
private Drawing CreateGridDrawing()
{
// Code to create a grid
double[] gridVertices = new double[/* grid data */];
return new Drawing(gridVertices, Stamp.CV, (int)OpenGL.GL_LINES);
}
private Drawing CreateAxesDrawing()
{
// Create colored axes
double[] axesData = new double[] {
// Red X-axis (with color)
1, 0, 0, 0, 0, 0, // Red color, origin
1, 0, 0, 1, 0, 0, // Red color, x-axis end
// Green Y-axis (with color)
0, 1, 0, 0, 0, 0, // Green color, origin
0, 1, 0, 0, 1, 0, // Green color, y-axis end
// Blue Z-axis (with color)
0, 0, 1, 0, 0, 0, // Blue color, origin
0, 0, 1, 0, 0, 1 // Blue color, z-axis end
};
return new Drawing(axesData, Stamp.CV, (int)OpenGL.GL_LINES);
}
public void Display(Bind bind)
{
// Render all contained displayees
foreach (var displayee in _displayees)
{
displayee.Display(bind);
}
}
public void ExpandToBox3d(Box3d box)
{
// Update bounding box based on all displayees
foreach (var displayee in _displayees)
{
displayee.ExpandToBox3d(box);
}
}
}
</code></pre>
<h2 id="creating-common-shapes">Creating Common Shapes</h2>
<p>Here are some examples of creating common shapes using the <a class="xref" href="../../../../api/Hi.Disp.Drawing.html">Drawing</a> class:</p>
<h3 id="creating-points">Creating Points</h3>
<pre><code class="lang-csharp">// Create an array of points
double[] pointData = new double[] {
0, 0, 0, // Point 1
1, 1, 1, // Point 2
2, 0, 0, // Point 3
0, 2, 0 // Point 4
};
// Create a Drawing for points
var pointDrawing = new Drawing(pointData, Stamp.V, (int)OpenGL.GL_POINTS);
</code></pre>
<h3 id="creating-lines">Creating Lines</h3>
<pre><code class="lang-csharp">// Create line segments (pairs of vertices)
double[] lineData = new double[] {
0, 0, 0, 1, 1, 0, // Line 1: (0,0,0) to (1,1,0)
2, 0, 0, 2, 2, 0 // Line 2: (2,0,0) to (2,2,0)
};
// Create a Drawing for lines
var lineDrawing = new Drawing(lineData, Stamp.V, (int)OpenGL.GL_LINES);
</code></pre>
<h3 id="creating-triangles">Creating Triangles</h3>
<pre><code class="lang-csharp">// Create triangles (triplets of vertices)
double[] triangleData = new double[] {
// Triangle 1
0, 0, 0, // Vertex 1
1, 0, 0, // Vertex 2
0, 1, 0 // Vertex 3
};
// Create a Drawing for triangles
var triangleDrawing = new Drawing(triangleData, Stamp.V, (int)OpenGL.GL_TRIANGLES);
</code></pre>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a></li>
<li><a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a></li>
<li><a class="xref" href="../../../../api/Hi.Disp.DispList.html">DispList</a></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,171 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Rendering with HiAPI | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Rendering with HiAPI | 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="rendering-with-hiapi">Rendering with HiAPI</h1>
<p>This section covers the rendering capabilities of HiAPI, focusing on how to create and display visual content in your applications.</p>
<h2 id="overview">Overview</h2>
<p>HiAPI provides a powerful rendering system built around the <a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a> and <a class="xref" href="../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a> interface. This system enables you to:</p>
<ul>
<li>Create and render 3D and 2D graphics</li>
<li>Implement interactive user interfaces</li>
<li>Achieve high-performance rendering across multiple platforms</li>
<li>Handle touch, mouse, and keyboard input uniformly</li>
</ul>
<h2 id="key-components">Key Components</h2>
<p>The HiAPI rendering system consists of several key components:</p>
<ul>
<li><strong>DispEngine</strong>: The core rendering engine that processes displayees and handles user interaction</li>
<li><strong>IDisplayee</strong>: The interface for renderable objects</li>
<li><strong>Drawing</strong>: A fundamental rendering unit for creating basic geometric elements</li>
<li><strong>RenderingCanvas</strong>: UI controls for different frameworks that host the DispEngine</li>
</ul>
<h2 id="sections">Sections</h2>
<table>
<thead>
<tr>
<th>Topic</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="rendering-canvas/index.html">Using RenderingCanvas with DispEngine</a></td>
<td>Learn how to use the RenderingCanvas component in your applications</td>
</tr>
<tr>
<td><a href="rendering-canvas/custom-implementation.html">Building Your Own Rendering Canvas</a></td>
<td>Understand how to implement custom rendering components</td>
</tr>
<tr>
<td><a href="drawing/index.html">Drawing</a></td>
<td>Learn how to use the Drawing class to create basic geometric elements</td>
</tr>
</tbody>
</table>
<h2 id="basic-rendering-workflow">Basic Rendering Workflow</h2>
<p>The typical workflow for rendering with HiAPI follows these steps:</p>
<ol>
<li><strong>Create Displayees</strong>: Implement <a class="xref" href="../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a> or use existing implementations like <a class="xref" href="../../../api/Hi.Disp.Drawing.html">Drawing</a></li>
<li><strong>Configure DispEngine</strong>: Create and initialize a <a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a> with your displayees</li>
<li><strong>UI Integration</strong>: Use RenderingCanvas components to display the rendered content in your UI</li>
<li><strong>Handle Input</strong>: Process user interactions through the DispEngine's input handling methods</li>
</ol>
<p>This pattern works consistently across all supported UI frameworks, allowing you to develop cross-platform applications with a unified codebase.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a></li>
<li><a class="xref" href="../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a></li>
<li><a class="xref" href="../../../api/Hi.Disp.Drawing.html">Drawing</a></li>
<li><a class="xref" href="../../../api/Hi.Disp.DispList.html">DispList</a></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,832 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Building Your Own Rendering Canvas | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Building Your Own Rendering Canvas | HiAPI-C# 2025 ">
<link rel="icon" href="../../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../../public/main.css">
<meta name="docfx:navrel" content="../../../../toc.html">
<meta name="docfx:tocrel" content="../../../toc.html">
<meta name="docfx:rel" content="../../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../../../index.html">
<img id="logo" class="svg" src="../../../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="building-your-own-rendering-canvas">Building Your Own Rendering Canvas</h1>
<p>This guide provides detailed implementation information for creating your own <code>RenderingCanvas</code> using the <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a>. By understanding these implementation details, you can customize the rendering component for specific application needs or create implementations for other UI frameworks.</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>For Windows Applications</strong>: If you are developing for Windows systems, it is recommended to directly use the existing <code>RenderingCanvas</code> implementations in the <code>Hi.WinForm</code> or <code>Hi.WpfPlus</code> packages, rather than creating your own. These implementations are fully tested, optimized, and maintained.</p>
<p>The implementation details provided in this document are primarily for educational purposes or for developers who need to port RenderingCanvas to other platforms/frameworks.</p>
</div>
<h2 id="basic-dispengine-usage">Basic DispEngine Usage</h2>
<p>The <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a> is designed to display objects that implement the <a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a> interface. This is the fundamental purpose of DispEngine - to render displayable objects. Assign <a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a> to <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a>.</p>
<h2 id="core-implementation-pattern">Core Implementation Pattern</h2>
<p>When implementing a custom <code>RenderingCanvas</code> for a UI platform, follow these key steps:</p>
<ol>
<li><strong>Initialize UI Component</strong> - Set up the UI control properties and event handling</li>
<li><strong>Configure DispEngine</strong> - Create and properly initialize the <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a> instance</li>
<li><strong>Set Up Rendering Pipeline</strong> - Implement buffer swapping mechanism for visualization</li>
<li><strong>Handle User Input</strong> - Map platform-specific input events to DispEngine methods</li>
<li><strong>Manage Component Lifecycle</strong> - Ensure proper resource management and cleanup</li>
</ol>
<p>Let's examine the actual implementations in WinForm and WPF frameworks to understand these patterns in practice.</p>
<h2 id="winform-implementation-details">WinForm Implementation Details</h2>
<p>The WinForm implementation in <code>Hi.WinForm</code> combines Windows Forms controls with the <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a> rendering system.</p>
<h3 id="core-properties-and-fields">Core Properties and Fields</h3>
<p>Here are the essential properties and fields defined in the WinForm implementation:</p>
<pre><code class="lang-csharp" name="RenderingCanvas">/// &lt;summary&gt;
/// &lt;see cref=&quot;DispEngine&quot;/&gt;.
/// &lt;/summary&gt;
public DispEngine DispEngine { get; }
// Constants and structures for WM_TOUCH
private const int WM_TOUCH = 0x0240;
private const int TOUCHEVENTF_MOVE = 0x0001;
private const int TOUCHEVENTF_DOWN = 0x0002;
private const int TOUCHEVENTF_UP = 0x0004;
[StructLayout(LayoutKind.Sequential)]
private struct TOUCHINPUT
{
public int x;
public int y;
public IntPtr hSource;
public int dwID;
public int dwFlags;
public int dwMask;
public int dwTime;
public IntPtr dwExtraInfo;
public int cxContact;
public int cyContact;
}
[DllImport(&quot;user32.dll&quot;)]
private static extern bool RegisterTouchWindow(IntPtr hWnd, uint ulFlags);
[DllImport(&quot;user32.dll&quot;)]
private static extern bool GetTouchInputInfo(IntPtr hTouchInput, int cInputs, [In, Out] TOUCHINPUT[] pInputs, int cbSize);
[DllImport(&quot;user32.dll&quot;)]
private static extern void CloseTouchInputHandle(IntPtr lParam);
</code></pre><h3 id="initialization">Initialization</h3>
<p>The initialization code sets up event handlers and creates the DispEngine:</p>
<pre><code class="lang-csharp" name="RenderingCanvas">/// &lt;summary&gt;
/// Ctor.
/// &lt;/summary&gt;
/// &lt;param name=&quot;displayees&quot;&gt;displayees&lt;/param&gt;
public unsafe RenderingCanvas(params IDisplayee[] displayees)
{
// Configure the control's visual styles
SetStyle(ControlStyles.Selectable, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
SetStyle(ControlStyles.ContainerControl, false);
SetStyle(ControlStyles.ResizeRedraw, false);
DoubleBuffered = true;
InitializeComponent();
Dock = DockStyle.Fill;
// Connect event handlers for user input and window events
this.Resize += RenderingCanvas_Resize;
this.VisibleChanged += RenderingCanvas_VisibleChanged;
this.MouseMove += RenderingCanvas_MouseMove;
this.MouseDown += RenderingCanvas_MouseDown;
this.MouseUp += RenderingCanvas_MouseUp;
this.MouseWheel += RenderingCanvas_MouseWheel;
this.KeyDown += RenderingCanvas_KeyDown;
this.KeyUp += RenderingCanvas_KeyUp;
// Add focus event handler
this.GotFocus += RenderingCanvas_GotFocus;
this.HandleCreated += OnHandleCreated;
// Enable touch input and click events for the control
this.SetStyle(ControlStyles.StandardClick, true);
this.SetStyle(ControlStyles.StandardDoubleClick, true);
this.TabStop = true;
// Initialize the DispEngine with provided displayees
DispEngine = new DispEngine(displayees);
DispEngine.BackgroundColor = new Vec3d(0.1, 0.1, 0.5);
DispEngine.BackgroundOpacity = 0.1;
DispEngine.SetViewToHomeView();
DispEngine.ImageRequestAfterBufferSwapped += DispEngine_ImageRequestAfterBufferSwapped;
// Set initial size and start the rendering engine
this.Size = new System.Drawing.Size(500, 300);
DispEngine.Start(this.ClientSize.Width, this.ClientSize.Height);
}
</code></pre><h3 id="rendering-pipeline">Rendering Pipeline</h3>
<p>The rendering pipeline processes images from DispEngine and displays them:</p>
<pre><code class="lang-csharp" name="RenderingCanvas">private unsafe void DispEngine_ImageRequestAfterBufferSwapped(byte* bgra_unsignedbyte_pixels, int w, int h)
{
// Create a bitmap from the raw pixel data provided by DispEngine
Bitmap bitmap;
bitmap = new Bitmap(new Bitmap(w, h, w * 4,
PixelFormat.Format32bppArgb, new IntPtr(bgra_unsignedbyte_pixels)));
// Update the background image and dispose the previous one
Image pre = this.BackgroundImage;
this.BackgroundImage = bitmap;
pre?.Dispose();
}
</code></pre><h3 id="input-handling">Input Handling</h3>
<h4 id="windows-message-handling-for-touch">Windows Message Handling for Touch</h4>
<p>WinForm implementation intercepts Windows touch messages and forwards them to DispEngine:</p>
<pre><code class="lang-csharp" name="RenderingCanvas">/// &lt;summary&gt;
/// Processes Windows messages, handling touch input and forwarding other messages to the base class.
/// &lt;/summary&gt;
/// &lt;param name=&quot;m&quot;&gt;The Windows message to process.&lt;/param&gt;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_TOUCH)
{
HandleTouchInput(m.WParam, m.LParam);
return;
}
base.WndProc(ref m);
}
private void OnHandleCreated(object sender, EventArgs e)
{
// Register window to receive touch messages
RegisterTouchWindow(this.Handle, 0);
}
private void HandleTouchInput(IntPtr wParam, IntPtr lParam)
{
int inputCount = wParam.ToInt32();
TOUCHINPUT[] inputs = new TOUCHINPUT[inputCount];
if (!GetTouchInputInfo(lParam, inputCount, inputs, Marshal.SizeOf(typeof(TOUCHINPUT))))
return;
try
{
for (int i = 0; i &lt; inputCount; i++)
{
TOUCHINPUT ti = inputs[i];
int touchId = ti.dwID;
// Convert touch coordinates to client coordinates
Point touchPoint = PointToClient(new Point(ti.x / 100, ti.y / 100));
if ((ti.dwFlags &amp; TOUCHEVENTF_DOWN) != 0)
{
// Touch down event
DispEngine.TouchDown(touchId, touchPoint.X, touchPoint.Y);
this.Focus();
}
else if ((ti.dwFlags &amp; TOUCHEVENTF_MOVE) != 0)
{
// Touch move event
DispEngine.TouchMove(touchId, touchPoint.X, touchPoint.Y);
}
else if ((ti.dwFlags &amp; TOUCHEVENTF_UP) != 0)
{
// Touch up event
DispEngine.TouchUp(touchId);
}
}
}
finally
{
CloseTouchInputHandle(lParam);
}
}
</code></pre>
<p>The key aspect is mapping Windows touch events to DispEngine's touch API:</p>
<pre><code class="lang-csharp">// Inside HandleTouchInput method
if ((ti.dwFlags &amp; TOUCHEVENTF_DOWN) != 0)
{
// Touch down event - delegate to DispEngine
DispEngine.TouchDown(touchId, touchPoint.X, touchPoint.Y);
this.Focus();
}
else if ((ti.dwFlags &amp; TOUCHEVENTF_MOVE) != 0)
{
// Touch move event - delegate to DispEngine
DispEngine.TouchMove(touchId, touchPoint.X, touchPoint.Y);
}
else if ((ti.dwFlags &amp; TOUCHEVENTF_UP) != 0)
{
// Touch up event - delegate to DispEngine
DispEngine.TouchUp(touchId);
}
</code></pre>
<h4 id="mouse-events">Mouse Events</h4>
<pre><code class="lang-csharp" name="RenderingCanvas">private void RenderingCanvas_MouseMove(object sender, MouseEventArgs e)
{
// Update mouse position and handle drag transforms
DispEngine.MouseMove(e.Location.X, e.Location.Y);
DispEngine.MouseDragTransform(e.Location.X, e.Location.Y,
new mouse_button_table__transform_view_by_mouse_drag_t()
{
LEFT_BUTTON = (long)MouseButtons.Left,
RIGHT_BUTTON = (long)MouseButtons.Right
});
}
private void RenderingCanvas_MouseDown(object sender, MouseEventArgs e)
{
// Handle mouse button press
DispEngine.MouseButtonDown((long)e.Button);
this.Focus();
}
private void RenderingCanvas_MouseUp(object sender, MouseEventArgs e)
{
// Handle mouse button release
DispEngine.MouseButtonUp((long)e.Button);
}
private void RenderingCanvas_MouseWheel(object sender, MouseEventArgs e)
{
// Handle mouse wheel for zoom operations
DispEngine.MouseWheel(0, e.Delta / 120);
DispEngine.MouseWheelTransform(0, e.Delta / 120);
}
</code></pre><h4 id="keyboard-events">Keyboard Events</h4>
<pre><code class="lang-csharp" name="RenderingCanvas">/// &lt;inheritdoc/&gt;
protected override bool IsInputKey(Keys keyData)
{
//since in default, arrow does not trigger key event(keyDown and keyUp).
return true;
}
private void RenderingCanvas_KeyDown(object sender, KeyEventArgs e)
{
Focus();
DispEngine.KeyDown((long)e.KeyData);
// Map specific keys for view transformation
long key = (long)e.KeyData;
if (key == (long)Keys.LShiftKey || key == (long)Keys.RShiftKey || key == (long)Keys.ShiftKey)
key = (long)Keys.Shift;
DispEngine.KeyDownTransform(key, new key_table__transform_view_by_key_pressing_t()
{
HOME = (long)Keys.Home,
PAGE_UP = (long)Keys.PageUp,
PAGE_DOWN = (long)Keys.PageDown,
F1 = (long)Keys.F1,
F2 = (long)Keys.F2,
F3 = (long)Keys.F3,
F4 = (long)Keys.F4,
SHIFT = (long)Keys.Shift,
ARROW_LEFT = (long)Keys.Left,
ARROW_RIGHT = (long)Keys.Right,
ARROW_DOWN = (long)Keys.Down,
ARROW_UP = (long)Keys.Up
});
}
private void RenderingCanvas_KeyUp(object sender, KeyEventArgs e)
{
DispEngine.KeyUp((long)e.KeyData);
}
</code></pre><h3 id="lifecycle-management">Lifecycle Management</h3>
<p>Window event handling ensures proper state management:</p>
<pre><code class="lang-csharp" name="RenderingCanvas">private void RenderingCanvas_Resize(object sender, EventArgs e)
{
// Notify DispEngine of size changes
DispEngine.Resize(this.ClientSize.Width, this.ClientSize.Height);
}
private void RenderingCanvas_VisibleChanged(object sender, EventArgs e)
{
// Update visibility state in DispEngine
DispEngine.IsVisible = this.Visible;
}
</code></pre><h3 id="resource-cleanup">Resource Cleanup</h3>
<pre><code class="lang-csharp" name="RenderingCanvas">/// &lt;summary&gt;
/// Clean up any resources being used.
/// &lt;/summary&gt;
/// &lt;param name=&quot;disposing&quot;&gt;true if managed resources should be disposed; otherwise, false.&lt;/param&gt;
protected override void Dispose(bool disposing)
{
if (disposing &amp;&amp; (components != null))
{
// Dispose the DispEngine to free resources
DispEngine.Dispose();
components.Dispose();
}
base.Dispose(disposing);
}
</code></pre><h2 id="wpf-implementation-details">WPF Implementation Details</h2>
<p>The WPF implementation uses WPF-specific controls and mechanisms but follows the same core pattern.</p>
<h3 id="core-properties">Core Properties</h3>
<pre><code class="lang-csharp" name="RenderingCanvas">/// &lt;summary&gt;
/// The DispEngine instance that handles rendering and user interactions
/// &lt;/summary&gt;
public DispEngine DispEngine { get; } = new DispEngine();
/// &lt;summary&gt;
/// Internal container for rendering content
/// &lt;/summary&gt;
private UserControl DisplayerPane { get; }
/// &lt;summary&gt;
/// Dictionary to store touch point information
/// &lt;/summary&gt;
private Dictionary&lt;int, Point&gt; TouchingPointsMap { get; } = new Dictionary&lt;int, Point&gt;();
/// &lt;summary&gt;
/// Dictionary to store previous positions of touch points
/// &lt;/summary&gt;
private Dictionary&lt;int, Point&gt; PreviousTouchingPointsMap { get; } = new Dictionary&lt;int, Point&gt;();
</code></pre><h3 id="initialization-1">Initialization</h3>
<pre><code class="lang-csharp" name="RenderingCanvas">/// &lt;summary&gt;
/// Initializes a new instance of the RenderingCanvas
/// &lt;/summary&gt;
public RenderingCanvas()
{
DispEngine.BackgroundColor = new Vec3d(0.1, 0.1, 0.5);
DispEngine.BackgroundOpacity = 0.1;
// Configure the main control properties
HorizontalAlignment = HorizontalAlignment.Stretch;
VerticalAlignment = VerticalAlignment.Stretch;
Focusable = true;
KeyboardNavigation.SetDirectionalNavigation(this, KeyboardNavigationMode.Cycle);
DataContextChanged += CanvasDataContextChanged;
// Create and configure the display pane
DisplayerPane = new UserControl();
DisplayerPane.HorizontalAlignment = HorizontalAlignment.Stretch;
DisplayerPane.VerticalAlignment = VerticalAlignment.Stretch;
DisplayerPane.Focusable = true;
DisplayerPane.IsTabStop = true;
// Connect event handlers for user input and window events
DisplayerPane.SizeChanged += RenderingCanvas_SizeChanged;
DisplayerPane.MouseMove += RenderingCanvas_MouseMove;
DisplayerPane.MouseDown += RenderingCanvas_MouseDown;
DisplayerPane.MouseUp += RenderingCanvas_MouseUp;
DisplayerPane.MouseWheel += RenderingCanvas_MouseWheel;
DisplayerPane.KeyDown += RenderingCanvas_KeyDown;
DisplayerPane.KeyUp += RenderingCanvas_KeyUp;
DisplayerPane.Loaded += RenderingCanvas_Loaded;
DisplayerPane.Unloaded += RenderingCanvas_Unloaded;
DisplayerPane.IsVisibleChanged += DisplayerPane_IsVisibleChanged;
// Add touch event handlers
DisplayerPane.TouchDown += RenderingCanvas_TouchDown;
DisplayerPane.TouchMove += RenderingCanvas_TouchMove;
DisplayerPane.TouchUp += RenderingCanvas_TouchUp;
// Enable touch support
this.IsManipulationEnabled = true;
// Initialize power management
InitializePowerManagement();
// Add the display pane to this control's content
Content = DisplayerPane;
}
</code></pre><h3 id="rendering-pipeline-1">Rendering Pipeline</h3>
<pre><code class="lang-csharp" name="RenderingCanvas">/// &lt;summary&gt;
/// Handles the buffer swapped event from DispEngine
/// &lt;/summary&gt;
private unsafe void RenderingCanvas_BufferSwapped(byte* data, int w, int h)
{
if (data == null)
return;
Span&lt;byte&gt; bgra = new Span&lt;byte&gt;(data, w * h * 4);
// Copy pixel data from DispEngine
int n = w * h * 4;
byte[] arr = new byte[n];
for (int i = 0; i &lt; n; i++)
arr[i] = data[i];
// Update UI on the UI thread
DisplayerPane.Dispatcher.InvokeAsync(() =&gt;
{
BitmapSource bitmap = BitmapSource.Create(w, h, 1, 1, PixelFormats.Bgra32, null, arr, w * 4);
DisplayerPane.Background = new ImageBrush(bitmap);
});
}
/// &lt;summary&gt;
/// Handles the size changed event
/// &lt;/summary&gt;
private void RenderingCanvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
// Notify DispEngine of size changes
DispEngine.Resize((int)DisplayerPane.RenderSize.Width, (int)DisplayerPane.RenderSize.Height);
}
/// &lt;summary&gt;
/// Handles visibility changes
/// &lt;/summary&gt;
private unsafe void DisplayerPane_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
// Update visibility state in DispEngine
DispEngine.IsVisible = IsVisible;
}
</code></pre><h3 id="mouse-and-keyboard-handling">Mouse and Keyboard Handling</h3>
<pre><code class="lang-csharp" name="RenderingCanvas">/// &lt;summary&gt;
/// Helper method to get mouse button mask
/// &lt;/summary&gt;
internal static HiMouseButtonMask GetMouseButtonMask(MouseDevice device)
{
HiMouseButtonMask mouseButtonMask = 0;
mouseButtonMask.SetLeftPressed(device.LeftButton == MouseButtonState.Pressed);
mouseButtonMask.SetMiddlePressed(device.MiddleButton == MouseButtonState.Pressed);
mouseButtonMask.SetRightPressed(device.RightButton == MouseButtonState.Pressed);
mouseButtonMask.SetXButton1Pressed(device.XButton1 == MouseButtonState.Pressed);
mouseButtonMask.SetXButton2Pressed(device.XButton2 == MouseButtonState.Pressed);
return mouseButtonMask;
}
/// &lt;summary&gt;
/// Handles the mouse wheel event
/// &lt;/summary&gt;
private void RenderingCanvas_MouseWheel(object sender, MouseWheelEventArgs e)
{
// Handle mouse wheel for zoom operations
DispEngine.MouseWheel(0, e.Delta / 120);
DispEngine.MouseWheelTransform(0, e.Delta / 120);
}
/// &lt;summary&gt;
/// Handles the mouse up event
/// &lt;/summary&gt;
private void RenderingCanvas_MouseUp(object sender, MouseButtonEventArgs e)
{
// Handle mouse button release
DispEngine.MouseButtonUp((long)e.ChangedButton);
(sender as UIElement)?.ReleaseMouseCapture();
}
/// &lt;summary&gt;
/// Handles the mouse down event
/// &lt;/summary&gt;
private void RenderingCanvas_MouseDown(object sender, MouseButtonEventArgs e)
{
// Handle mouse button press
DispEngine.MouseButtonDown((long)e.ChangedButton);
DisplayerPane.Focus();
(sender as UIElement)?.CaptureMouse();
}
/// &lt;summary&gt;
/// Handles the mouse move event
/// &lt;/summary&gt;
private void RenderingCanvas_MouseMove(object sender, MouseEventArgs e)
{
// Update mouse position and handle drag transforms
Point p = e.GetPosition(DisplayerPane);
DispEngine.MouseMove((int)p.X, (int)p.Y);
DispEngine.MouseDragTransform((int)p.X, (int)p.Y,
new mouse_button_table__transform_view_by_mouse_drag_t()
{
LEFT_BUTTON = (long)MouseButton.Left,
RIGHT_BUTTON = (long)MouseButton.Right
});
}
</code></pre><pre><code class="lang-csharp" name="RenderingCanvas">/// &lt;summary&gt;
/// Handles the key up event
/// &lt;/summary&gt;
private void RenderingCanvas_KeyUp(object sender, KeyEventArgs e)
{
DispEngine.KeyUp((long)e.Key);
}
/// &lt;summary&gt;
/// Handles the key down event
/// &lt;/summary&gt;
private void RenderingCanvas_KeyDown(object sender, KeyEventArgs e)
{
DispEngine.KeyDown((long)e.Key);
// Map specific keys for view transformation
long key = (long)e.Key;
if (key == (long)Key.RightShift)
key = (long)Key.LeftShift;
DispEngine.KeyDownTransform(key, new key_table__transform_view_by_key_pressing_t()
{
HOME = (long)Key.Home,
PAGE_UP = (long)Key.PageUp,
PAGE_DOWN = (long)Key.PageDown,
F1 = (long)Key.F1,
F2 = (long)Key.F2,
F3 = (long)Key.F3,
F4 = (long)Key.F4,
SHIFT = (long)Key.LeftShift,
ARROW_LEFT = (long)Key.Left,
ARROW_RIGHT = (long)Key.Right,
ARROW_DOWN = (long)Key.Down,
ARROW_UP = (long)Key.Up
});
}
</code></pre><h3 id="lifecycle-management-1">Lifecycle Management</h3>
<pre><code class="lang-csharp" name="RenderingCanvas">/// &lt;summary&gt;
/// Handles window state changes (maximize, minimize, etc.)
/// &lt;/summary&gt;
private unsafe void RenderingCanvas_StateChanged(object sender, EventArgs e)
{
switch ((sender as Window).WindowState)
{
case WindowState.Maximized:
DispEngine.IsVisible = true;
break;
case WindowState.Minimized:
DispEngine.IsVisible = false;
break;
case WindowState.Normal:
DispEngine.IsVisible = true;
break;
}
}
/// &lt;summary&gt;
/// Handles data context changes
/// &lt;/summary&gt;
private unsafe void CanvasDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
DispEngine pre = e.OldValue as DispEngine;
DispEngine cur = e.NewValue as DispEngine;
//child's binding event is triggered after IsVisible event and Load event.
if (pre != null) //this section will never occur if the datacontext not set twice.
{
pre.Terminate();
pre.ImageRequestAfterBufferSwapped -= RenderingCanvas_BufferSwapped;
}
if (cur != null)
{
cur.ImageRequestAfterBufferSwapped += RenderingCanvas_BufferSwapped;
cur.Start((int)DisplayerPane.RenderSize.Width, (int)DisplayerPane.RenderSize.Height);
cur.IsVisible = IsVisible;
}
}
/// &lt;summary&gt;
/// Reference to the current window containing this control
/// &lt;/summary&gt;
private Window currentWindow;
/// &lt;summary&gt;
/// Gets or sets the current window, connecting or disconnecting state change events
/// &lt;/summary&gt;
Window CurrentWindow
{
get =&gt; currentWindow; set
{
if (currentWindow != null)
currentWindow.StateChanged -= RenderingCanvas_StateChanged;
currentWindow = value;
if (currentWindow != null)
currentWindow.StateChanged += RenderingCanvas_StateChanged;
}
}
/// &lt;summary&gt;
/// Handles the loaded event
/// &lt;/summary&gt;
private unsafe void RenderingCanvas_Loaded(object sender, RoutedEventArgs e)
{
// Get the window containing this control
CurrentWindow = Window.GetWindow(this);
// Set up DispEngine rendering
DispEngine.ImageRequestAfterBufferSwapped -= RenderingCanvas_BufferSwapped;
DispEngine.ImageRequestAfterBufferSwapped += RenderingCanvas_BufferSwapped;
DispEngine.Start((int)DisplayerPane.RenderSize.Width, (int)DisplayerPane.RenderSize.Height);
DispEngine.IsVisible = IsVisible;
}
/// &lt;summary&gt;
/// Handles the unloaded event
/// &lt;/summary&gt;
private unsafe void RenderingCanvas_Unloaded(object sender, RoutedEventArgs e)
{
DispEngine.IsVisible = IsVisible;
DispEngine.ImageRequestAfterBufferSwapped -= RenderingCanvas_BufferSwapped;
CurrentWindow = null;
}
</code></pre><h3 id="resource-cleanup-1">Resource Cleanup</h3>
<pre><code class="lang-csharp" name="RenderingCanvas">/// &lt;summary&gt;
/// Flag to track disposed state
/// &lt;/summary&gt;
private bool disposedValue;
/// &lt;summary&gt;
/// Disposes managed resources
/// &lt;/summary&gt;
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// Unsubscribe from power events
SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;
// Dispose the DispEngine to free resources
DispEngine.Dispose();
}
disposedValue = true;
}
}
/// &lt;summary&gt;
/// Public dispose method to free resources
/// &lt;/summary&gt;
public void Dispose()
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
</code></pre><h2 id="core-dispengine-integration-patterns">Core DispEngine Integration Patterns</h2>
<h3 id="1-initialization-sequence">1. Initialization Sequence</h3>
<pre><code class="lang-csharp">// Create DispEngine (optionally with displayees)
var engine = new DispEngine(displayees);
// Set up image buffer callback
engine.ImageRequestAfterBufferSwapped += OnBufferSwapped;
// Initialize with canvas size
engine.Start(width, height);
// Set initial view (optional)
engine.SetViewToHomeView();
</code></pre>
<h3 id="2-render-loop">2. Render Loop</h3>
<p>The rendering process follows this pattern:</p>
<ol>
<li><a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a> processes <a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a> objects</li>
<li>Buffer is swapped and callback is triggered</li>
<li>UI framework renders the buffer to screen</li>
<li>User input triggers view updates</li>
<li>Process repeats</li>
</ol>
<h3 id="3-complete-user-input-mapping">3. Complete User Input Mapping</h3>
<p>All user interactions must be mapped to <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a> methods:</p>
<table>
<thead>
<tr>
<th>User Action</th>
<th>DispEngine Method</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mouse move</td>
<td><a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_MouseMove_System_Int32_System_Int32_">MouseMove(int, int)</a></td>
</tr>
<tr>
<td>Mouse drag</td>
<td><a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_MouseDragTransform_System_Int32_System_Int32_Hi_Native_mouse_button_table__transform_view_by_mouse_drag_t_">MouseDragTransform(int, int, mouse_button_table__transform_view_by_mouse_drag_t)</a></td>
</tr>
<tr>
<td>Mouse button</td>
<td><a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_MouseButtonDown_System_Int64_">MouseButtonDown(long)</a> / <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_MouseButtonUp_System_Int64_">MouseButtonUp(long)</a></td>
</tr>
<tr>
<td>Mouse wheel</td>
<td><a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_MouseWheel_System_Int32_System_Int32_">MouseWheel(int, int)</a> and <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_MouseWheelTransform_System_Int32_System_Int32_System_Double_">MouseWheelTransform(int, int, double)</a></td>
</tr>
<tr>
<td>Key press</td>
<td><a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_KeyDown_System_Int64_">KeyDown(long)</a> / <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_KeyUp_System_Int64_">KeyUp(long)</a> and <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_KeyDownTransform_System_Int64_Hi_Native_key_table__transform_view_by_key_pressing_t_">KeyDownTransform(long, key_table__transform_view_by_key_pressing_t)</a></td>
</tr>
<tr>
<td>Touch events</td>
<td><a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_TouchDown_System_Int32_System_Int32_System_Int32_">TouchDown(int, int, int)</a> / <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_TouchMove_System_Int32_System_Int32_System_Int32_">TouchMove(int, int, int)</a> / <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_TouchUp_System_Int32_">TouchUp(int)</a></td>
</tr>
</tbody>
</table>
<h3 id="4-proper-resource-cleanup">4. Proper Resource Cleanup</h3>
<p>Resource management is critical for proper operation:</p>
<pre><code class="lang-csharp">// In dispose method
DispEngine.ImageRequestAfterBufferSwapped -= OnBufferSwapped;
DispEngine.Terminate();
DispEngine.Dispose();
</code></pre>
<h2 id="advanced-implementation-considerations">Advanced Implementation Considerations</h2>
<p>When creating custom implementations, consider these aspects:</p>
<h3 id="view-manipulation">View Manipulation</h3>
<p>Use <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SketchView">SketchView</a> to directly access or modify the view matrix:</p>
<pre><code class="lang-csharp">// Get current view matrix
Mat4d currentView = engine.SketchView;
// Apply custom rotation
Mat4d rotation = Mat4d.RotateX(Math.PI/4);
engine.SketchView = currentView * rotation;
</code></pre>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a></li>
<li><a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a></li>
<li><a class="xref" href="../../../../api/Hi.Geom.Vec2d.html">Vec2d</a></li>
<li><a class="xref" href="../../../../api/Hi.Geom.Mat4d.html">Mat4d</a></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,265 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Using RenderingCanvas with DispEngine | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Using RenderingCanvas with DispEngine | 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="using-renderingcanvas-with-dispengine">Using RenderingCanvas with DispEngine</h1>
<p>The <code>RenderingCanvas</code> is the primary UI component for displaying and interacting with 3D content across different platforms. This section explains how to use it with the <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a> to create cross-platform applications.</p>
<h2 id="overview">Overview</h2>
<p>The <code>RenderingCanvas</code> class is available in frameworks:</p>
<ul>
<li><code>Hi.WinForm</code> for Windows Forms applications</li>
<li><code>Hi.WpfPlus</code> for WPF applications</li>
</ul>
<p>All implementations share a common architecture centered around the <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a> class, enabling consistent rendering and interaction across platforms.</p>
<h2 id="core-concept-dispengine-and-idisplayee">Core Concept: DispEngine and IDisplayee</h2>
<p>At the heart of the rendering system is the relationship between <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a> and <a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a>:</p>
<ul>
<li><a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a>: The rendering engine that manages the OpenGL context and handles user interaction</li>
<li><a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a>: The interface that defines objects that can be rendered by the DispEngine</li>
</ul>
<p>This relationship is fundamental - <strong>the purpose of <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a> is to render <a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a> objects</strong>.</p>
<pre><code class="lang-mermaid">graph TD
A[IDisplayee Objects] --&gt;|Rendered by| B
B[DispEngine] &lt;--&gt; C[RenderingCanvas UI Component]
</code></pre>
<h3 id="working-with-idisplayee">Working with IDisplayee</h3>
<p>Objects implementing <a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a> define what gets rendered. Typically, you'll use <a class="xref" href="../../../../api/Hi.Disp.Drawing.html">Drawing</a> objects or compose multiple IDisplayee objects together:</p>
<pre><code class="lang-csharp">// Create a composite displayee
public class MyCompositeDisplayee : IDisplayee
{
private List&lt;IDisplayee&gt; _displayees = new List&lt;IDisplayee&gt;();
public MyCompositeDisplayee()
{
// Add various displayees
_displayees.Add(new AxesDisplayee());
_displayees.Add(new ModelDisplayee());
}
public void Display(Bind bind)
{
// Render all contained displayees
foreach (var displayee in _displayees)
{
displayee.Display(bind);
}
}
public void ExpandToBox3d(Box3d box)
{
// Update bounding box based on all displayees
foreach (var displayee in _displayees)
{
displayee.ExpandToBox3d(box);
}
}
}
</code></pre>
<p>For more detailed information on creating displayees with <a class="xref" href="../../../../api/Hi.Disp.Drawing.html">Drawing</a>, see the <a href="../drawing/index.html">Drawing</a> section.</p>
<h2 id="basic-usage">Basic Usage</h2>
<h3 id="apply-hiwinform">Apply Hi.WinForm</h3>
<pre><code class="lang-csharp">// Create a new instance with displayee objects
using Hi.WinForm.Disp;
// Create displayee object
var displayee = new MyCompositeDisplayee();
// Initialize canvas with the displayee
var canvas = new RenderingCanvas(displayee);
// Access the DispEngine for direct manipulation
DispEngine engine = canvas.DispEngine;
// Add to a form
myForm.Controls.Add(canvas);
</code></pre>
<h3 id="apply-hiwpf">Apply Hi.WPF</h3>
<pre><code class="lang-csharp">// Create a new instance
using Hi.WpfPlus.Disp;
// Create displayee object
var displayee = new MyCompositeDisplayee();
// Initialize the canvas
var canvas = new RenderingCanvas();
// Set displayee objects through the DispEngine
canvas.DispEngine.Displayee = displayee;
// Add to a container
myGrid.Children.Add(canvas);
</code></pre>
<h2 id="switching-displayees-at-runtime">Switching Displayees at Runtime</h2>
<p>You can dynamically change what's being displayed:</p>
<pre><code class="lang-csharp">// Switch to a different displayee
renderingCanvas.DispEngine.Displayee = alternativeDisplayee;
// Or update a DispList
var displayList = new DispList();
if (showModel) displayList.Add(modelDisplayee);
if (showGrid) displayList.Add(gridDisplayee);
renderingCanvas.DispEngine.Displayee = displayList;
</code></pre>
<h2 id="key-features-of-dispengine">Key Features of DispEngine</h2>
<p>The <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a> provides cross-platform support for:</p>
<ul>
<li>Handles buffer swapping and image generation</li>
<li>Mouse/pointer events</li>
<li>Keyboard navigation</li>
<li>Touch gestures</li>
<li>Zoom, pan, and rotate operations</li>
<li>Resize and Visibility changed.</li>
<li>Camera positioning and orientation</li>
<li>Standard views (front, top, isometric, etc.)</li>
<li>Renders <a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a> implementations</li>
</ul>
<h2 id="touch-and-gesture-support">Touch and Gesture Support</h2>
<p>The <a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a> centralizes touch handling across all platforms with a unified API that supports:</p>
<ul>
<li>Single-finger pan</li>
<li>Two-finger rotate and scale</li>
<li>Multi-finger specialized operations</li>
</ul>
<p>The touch API is designed to be simple for UI implementations to use. Platform-specific UI components only need to capture touch events and forward them to the DispEngine.</p>
<h2 id="common-operations">Common Operations</h2>
<pre><code class="lang-csharp">// Accessing DispEngine (works on all platforms)
var engine = renderingCanvas.DispEngine;
// Set to standard views
engine.SetViewToHomeView();
engine.SetViewToFrontView();
// Manual camera manipulation
engine.Translate(dx, dy);
engine.Rotate(deltaX, deltaY);
// Resize handling
engine.Resize(width, height);
</code></pre>
<h2 id="implementation-details">Implementation Details</h2>
<p>For detailed implementation information, including:</p>
<ul>
<li>Full source code examples</li>
<li>Implementation details for each platform</li>
<li>Advanced touch handling</li>
<li>Custom implementation guidance</li>
</ul>
<p>See the <a href="custom-implementation.html">Building Your Own RenderingCanvas</a> guide.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../../../api/Hi.Disp.DispEngine.html">DispEngine</a></li>
<li><a class="xref" href="../../../../api/Hi.Disp.IDisplayee.html">IDisplayee</a></li>
<li><a class="xref" href="../../../../api/Hi.Disp.DispList.html">DispList</a></li>
<li><a class="xref" href="../../../../api/Hi.Disp.Drawing.html">Drawing</a></li>
<li><a href="custom-implementation.html">Building Your Own RenderingCanvas</a></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,154 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>DictionaryService and DictionaryHub Pattern | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="DictionaryService and DictionaryHub Pattern | 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="dictionaryservice-and-dictionaryhub-pattern">DictionaryService and DictionaryHub Pattern</h1>
<h2 id="overview">Overview</h2>
<p>A connection-scoped indexing pattern for referencing backend objects across hierarchical SignalR hub connections.</p>
<h2 id="core-components">Core Components</h2>
<p><code>DictionaryService</code>: Manages connection-scoped index dictionaries</p>
<ul>
<li>First layer key: Hub connectionId (auto-generated by SignalR)</li>
<li>Second layer key: LocalId (resource name)</li>
<li>Value: References to backend objects (functions, getters/setters)</li>
</ul>
<p><code>DictionaryHub</code>: Base hub that auto-cleans index entries on disconnect</p>
<h2 id="architecture">Architecture</h2>
<pre><code>Root-Hub
└── Child-Hub - has parent's connectionId
└── Grandchild-Hub - has parent's connectionId
</code></pre>
<p>Each hub gets a unique system-generated hub-connectionId. Child hubs receive parent's connectionId to access parent data.</p>
<h2 id="key-patterns">Key Patterns</h2>
<ol>
<li><strong>Parent ConnectionId Passing</strong>: Child hubs copy parent's function references via connectionId</li>
<li><strong>Frontend ConnectionId Chain</strong>: Components pass connectionId down the hierarchy</li>
<li><strong>Wrapper Function Pattern</strong>: Child hubs should create wrapper functions that dynamically retrieve and invoke parent functions at runtime, rather than directly copying references. This ensures type safety through runtime checking and supports dynamic function updates from the parent.</li>
</ol>
<h2 id="benefits">Benefits</h2>
<ul>
<li><strong>Isolation</strong>: Each component has its own connection/index space</li>
<li><strong>Nesting Support</strong>: Same components can be nested without conflicts</li>
<li><strong>Auto-cleanup</strong>: Index entries cleaned on disconnect</li>
<li><strong>Data Inheritance</strong>: Access parent's backend objects via connectionId chain</li>
</ul>
<h2 id="best-practices">Best Practices</h2>
<ul>
<li>Apply or inherit from DictionaryHub for auto-cleanup</li>
<li>Use meaningful key names (e.g., &ldquo;transformer-getter&rdquo;)</li>
<li>Always setup dictionary functions unconditionally during initialization - put condition checks inside the functions, not around the setup. This ensures child panels can access functions even when parent objects temporarily don't meet the conditions.</li>
</ul>
<h2 id="common-pitfalls">Common Pitfalls</h2>
<ul>
<li>Don't use child's connectionId to index parent's data</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,123 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Webapi with hub-cleapup assistence pattern | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Webapi with hub-cleapup assistence pattern | 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="webapi-with-hub-cleapup-assistence-pattern">Webapi with hub-cleapup assistence pattern</h1>
<p>any of the index key should be registerForCleanup. i.e. any of indexXxx should follow the registerForCleanup.</p>
<p>clean the indexed key which indexed by the host component in beforeUnmount. And so that the component doesn't clean the key that doesn't create by the component itself.</p>
<p>Although cleanupHub clean them for sure, the code demonstrates example of pure web-api cleanup (So that it can be a complete web-api workflow).</p>
<h2 id="notice">Notice</h2>
<ol>
<li>before current key modified, the previous key should be called this.cleanupKey.</li>
<li>A twin key should be made from the outside key to keep the lifecycle maintained.</li>
</ol>
</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,325 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Controller Page | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Controller Page | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../../index.html">
<img id="logo" class="svg" src="../../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="controller-page">Controller Page</h1>
<p>The Controller Page is responsible for configuring and managing the CNC controller settings for the machine tool.</p>
<h2 id="key-models">Key Models</h2>
<p>The key models used by the Controller Page are:</p>
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html">NcEnv</a></li>
<li><a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a></li>
</ul>
<p>The <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a> contains <a class="xref" href="../../../api/Hi.Numerical.IsoCoordinateEntryDisplayee.html">IsoCoordinateEntryDisplayee</a> and <a class="xref" href="../../../api/Hi.Numerical.HeidenhainCoordinateEntryDisplayee.html">HeidenhainCoordinateEntryDisplayee</a>. They are used in this GUI.</p>
<h3 id="connection-with-main-panel">Connection with Main Panel</h3>
<p>The Controller Page is activated through the <a href="../main-panel.html">Main Panel</a>'s Environment menu. It retrieves the <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> from the Main Panel and updates the model.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Controller Page
<ul>
<li>Management Panel
<ul>
<li>Head Line
<ul>
<li><a href="../widget/object-management-menu-button.html">Object Management Menu Button</a>
<ul>
<li>file extension is NcEnv</li>
<li>The pointed Editor Panel is Management Tabs Panel</li>
</ul>
</li>
<li>Title Label</li>
</ul>
</li>
<li>Management Tabs Panel
<ul>
<li>Coordinate Table Tab
<ul>
<li>ISO Coordinate Table Panel
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html">NcEnv</a>.<a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_IsoCoordinateTable">IsoCoordinateTable</a> Display
(Note that The XYZ is not sortable on the table.)</li>
</ul>
</li>
</ul>
</li>
<li>Datum Preset Table Tab (Only visible for <a class="xref" href="../../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Heidenhain">Heidenhain</a> controllers)
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_HeidenhainDatumPresetTable">HeidenhainDatumPresetTable</a> Panel
(Note that The XYZ is not sortable on the table.)
<ul>
<li>Show Datum Preset Toggle Button for <a class="xref" href="../../../api/Hi.Numerical.HeidenhainCoordinateEntryDisplayee.html">HeidenhainCoordinateEntryDisplayee</a></li>
</ul>
</li>
</ul>
</li>
<li>Datum Shift Table Tab (Only visible for <a class="xref" href="../../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Heidenhain">Heidenhain</a> controllers)
(Note that The XYZ is not sortable on the table.)
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_HeidenhainDatumShiftTable">HeidenhainDatumShiftTable</a> Panel</li>
<li>Show Datum Shift Toggle Button for <a class="xref" href="../../../api/Hi.Numerical.HeidenhainCoordinateEntryDisplayee.html">HeidenhainCoordinateEntryDisplayee</a></li>
</ul>
</li>
<li>Offset Table Tab
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.MillingToolOffsetTable.html">MillingToolOffsetTable</a> Panel
<ul>
<li>Set Ideal Offset Dependent on Tool House Checkbox</li>
</ul>
</li>
</ul>
</li>
<li>Machine Tab
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_RapidFeedrate_mmdmin">RapidFeedrate_mmdmin</a> Settings</li>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_ToolingTime">ToolingTime</a> Settings</li>
<li>Linear Axis Limits Table
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_StrokeLimitXyz_mm">StrokeLimitXyz_mm</a> Min and Max for X, Y, Z</li>
</ul>
</li>
<li>Rotary Axis Table
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_StrokeLimitAbc_rad">StrokeLimitAbc_rad</a> Min and Max for A, B, C</li>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_MaxRotarySpeedABC_radds">MaxRotarySpeedABC_radds</a> for A, B, C</li>
</ul>
</li>
</ul>
</li>
<li>Brand Tab
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_CncBrand">CncBrand</a> Selection Dropdown
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Syntec">Syntec</a></li>
<li><a class="xref" href="../../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Fanuc">Fanuc</a></li>
<li><a class="xref" href="../../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Heidenhain">Heidenhain</a></li>
<li><a class="xref" href="../../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Siemens">Siemens</a></li>
</ul>
</li>
<li>Brand-specific Settings Panel (content varies based on selected brand)</li>
</ul>
</li>
<li>Config Tab
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_SetToolHeightCompensationOnFeatureNormal">SetToolHeightCompensationOnFeatureNormal</a> Setting</li>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_EnableShortestRotary">EnableShortestRotary</a> Setting</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Viewer Panel
<ul>
<li>Viewer Toolbar
<ul>
<li><a href="../renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a></li>
<li>Rendering Items SubMenu
See Rendering Items SubMenu from <a href="../player/player-extended-renderingcanvas-tool-bar.html">Player extended RenderingCanvas Tool Bar</a>.</li>
</ul>
</li>
<li>RenderingCanvas
<ul>
<li>The <a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a> is <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>Viewer Panel is not essential in the single user desktop application if this page raises a new window so that there arises a duplicate rendering content with the Main Window. This page should have a code-behind boolean property to add / remove the Viewer Panel. There should not preserve space for the un-existed Viewer Panel.</p>
<p>Apply <a class="xref" href="../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToIsometricView">SetViewToIsometricView()</a> on initialization if Viewer Panel has enabled.</p>
</div>
<div class="TIP">
<h5>Tip</h5>
<p>Add a resizable splitter between the Manage Panel and Viewer Panel to allow users to customize the interface layout according to their needs.</p>
</div>
<h2 id="behavior">Behavior</h2>
<h3 id="iso-coordinate-table">ISO Coordinate Table</h3>
<p>The ISO coordinate table allows users to edit and manage coordinates for the <a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_IsoCoordinateTable">IsoCoordinateTable</a>. Each entry consists of:</p>
<ul>
<li>An index identifier</li>
<li>X, Y, Z coordinate values</li>
<li>Action buttons to set the entry to program zero or machine zero</li>
</ul>
<p>Row selection updates <a class="xref" href="../../../api/Hi.Numerical.IsoCoordinateEntryDisplayee.html#Hi_Numerical_IsoCoordinateEntryDisplayee_IsoCoordinateId">IsoCoordinateId</a>.</p>
<h3 id="datum-preset-and-shift-tables-heidenhain">Datum Preset and Shift Tables (Heidenhain)</h3>
<p>These tables are specific to <a class="xref" href="../../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Heidenhain">Heidenhain</a> controllers and provide interfaces for:</p>
<ul>
<li>Setting datum preset positions in <a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_HeidenhainDatumPresetTable">HeidenhainDatumPresetTable</a></li>
<li>Configuring datum shifts in <a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_HeidenhainDatumShiftTable">HeidenhainDatumShiftTable</a></li>
<li>Visualizing selected datum in the 3D viewer with <a class="xref" href="../../../api/Hi.Numerical.HeidenhainCoordinateEntryDisplayee.html">HeidenhainCoordinateEntryDisplayee</a></li>
</ul>
<h3 id="offset-table">Offset Table</h3>
<p>Manages tool offsets with the following capabilities:</p>
<ul>
<li>Display and edit ideal radius and height values in <a class="xref" href="../../../api/Hi.Numerical.MillingToolOffsetTable.html">MillingToolOffsetTable</a></li>
<li>Configure radial and axial wear values</li>
<li>Option to automatically set ideal offset based on the <a class="xref" href="../../../api/Hi.Machining.MachiningToolHouse.html">MachiningToolHouse</a> configuration</li>
<li>Add new tool offset entries (when not using tool house dependency)</li>
</ul>
<h3 id="machine-configuration">Machine Configuration</h3>
<p>Controls machine-specific settings:</p>
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_RapidFeedrate_mmdmin">RapidFeedrate_mmdmin</a> (mm/min)</li>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_ToolingTime">ToolingTime</a> (seconds)</li>
<li>Stroke limits (minimum and maximum) for linear axes (<a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_StrokeLimitXyz_mm">StrokeLimitXyz_mm</a>)</li>
<li>Stroke limits and maximum speeds for rotary axes (<a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_StrokeLimitAbc_rad">StrokeLimitAbc_rad</a> and <a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_MaxRotarySpeedABC_radds">MaxRotarySpeedABC_radds</a>)</li>
</ul>
<h3 id="brand-selection">Brand Selection</h3>
<p>Allows switching between different CNC controller brands via <a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_CncBrand">CncBrand</a>:</p>
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Syntec">Syntec</a></li>
<li><a class="xref" href="../../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Fanuc">Fanuc</a></li>
<li><a class="xref" href="../../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Heidenhain">Heidenhain</a></li>
<li><a class="xref" href="../../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Siemens">Siemens</a></li>
</ul>
<p>Each brand may have specialized settings that appear when selected.</p>
<h3 id="config-options">Config Options</h3>
<p>General configuration options including:</p>
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_SetToolHeightCompensationOnFeatureNormal">SetToolHeightCompensationOnFeatureNormal</a> setting</li>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_EnableShortestRotary">EnableShortestRotary</a> optimization</li>
</ul>
<h2 id="source-code-locations">Source Code Locations</h2>
<p>See <a href="../index.html">HiNC GUI Architecture</a> for git repository links.</p>
<h3 id="wpf-application">WPF Application</h3>
<ul>
<li>Numerical/Controller/ControllerWindow</li>
<li>Numerical/Controller/IsoCoordinateTablePanel</li>
<li>Numerical/Controller/DatumPresetTablePanel</li>
<li>Numerical/Controller/DatumShiftTablePanel</li>
<li>Numerical/Controller/ControllerExtendedRenderingCanvasToolBar</li>
</ul>
<h3 id="web-application">Web Application</h3>
<ul>
<li>Controller/ControllerController.cs - Backend API controller</li>
<li>wwwroot/controller/controller-panel.html - Main HTML structure</li>
<li>wwwroot/controller/controller-panel.js - Main Vue.js component</li>
<li>wwwroot/controller/controller-panel.css - Main styling</li>
<li>wwwroot/controller/controller-extended-toolbar.js - Extended toolbar Vue.js component</li>
<li>wwwroot/controller/controller-extended-toolbar.css - Toolbar styling</li>
<li>wwwroot/controller/tabs/*.js - Individual tab components:
<ul>
<li>coordinate-table-tab.js</li>
<li>datum-preset-tab.js</li>
<li>datum-shift-tab.js</li>
<li>offset-table-tab.js</li>
<li>machine-tab.js</li>
<li>brand-tab.js</li>
<li>config-tab.js</li>
</ul>
</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,273 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Controller Page Web Implementation | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Controller Page Web Implementation | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../../index.html">
<img id="logo" class="svg" src="../../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="controller-page-web-implementation">Controller Page Web Implementation</h1>
<p>This document describes the web implementation of the Controller Page in the HiNC-2025-webservice project.</p>
<h2 id="overview">Overview</h2>
<p>The Controller Page web implementation consists of:</p>
<ul>
<li>Backend API controller (<code>ControllerController.cs</code>)</li>
<li>Frontend HTML, JavaScript, and CSS files</li>
<li>Integration with the rendering canvas and toolbar components</li>
</ul>
<h2 id="backend-implementation">Backend Implementation</h2>
<h3 id="controllercontrollercs">ControllerController.cs</h3>
<p>Located at <code>Controller/ControllerController.cs</code>, this API controller provides endpoints for managing CNC controller settings:</p>
<h4 id="endpoints">Endpoints</h4>
<ul>
<li><code>GET /api/controller/cnc-brand</code> - Gets the current CNC brand</li>
<li><code>PUT /api/controller/cnc-brand</code> - Updates the CNC brand</li>
<li><code>GET /api/controller/machine-config</code> - Gets machine configuration</li>
<li><code>PUT /api/controller/machine-config</code> - Updates machine configuration</li>
<li><code>GET /api/controller/general-config</code> - Gets general configuration settings</li>
<li><code>PUT /api/controller/general-config</code> - Updates general configuration</li>
<li><code>GET /api/controller/iso-coordinate-table</code> - Gets the ISO coordinate table</li>
<li><code>PUT /api/controller/iso-coordinate-table/{index}</code> - Updates an ISO coordinate entry</li>
<li><code>GET /api/controller/heidenhain-datum-preset-table</code> - Gets the Heidenhain datum preset table</li>
<li><code>PUT /api/controller/heidenhain-datum-preset-table/{index}</code> - Updates a Heidenhain datum preset entry</li>
<li><code>GET /api/controller/heidenhain-datum-shift-table</code> - Gets the Heidenhain datum shift table</li>
<li><code>PUT /api/controller/heidenhain-datum-shift-table/{index}</code> - Updates a Heidenhain datum shift entry</li>
<li><code>GET /api/controller/milling-tool-offset-table</code> - Gets the milling tool offset table</li>
<li><code>PUT /api/controller/milling-tool-offset-table</code> - Updates the milling tool offset table</li>
<li><code>GET /api/controller/ideal-offset-dependent</code> - Gets the ideal offset dependent setting</li>
<li><code>PUT /api/controller/ideal-offset-dependent</code> - Updates the ideal offset dependent setting</li>
<li><code>POST /api/controller/set-ideal-offset-from-toolhouse</code> - Sets ideal offset based on tool house</li>
<li><code>POST /api/controller/initialize-display</code> - Initializes the display engine for rendering</li>
</ul>
<h2 id="frontend-implementation">Frontend Implementation</h2>
<h3 id="html-structure">HTML Structure</h3>
<p>The main HTML file (<code>wwwroot/controller/controller-panel.html</code>) contains:</p>
<ul>
<li>Management panel with tabs for different configuration sections</li>
<li>Viewer panel with rendering canvas for 3D visualization</li>
<li>Responsive layout with resizable panels</li>
</ul>
<h3 id="javascript-components">JavaScript Components</h3>
<p>The frontend uses Vue.js framework with ES modules for component-based architecture.</p>
<h4 id="controller-paneljs">controller-panel.js</h4>
<p>Main Vue.js component that orchestrates the controller page:</p>
<ul>
<li>Imports and registers all sub-components (tabs, toolbars, rendering canvas)</li>
<li>Manages global state (CNC brand, rendering connection)</li>
<li>Handles tab switching and dynamic component loading</li>
<li>Initializes display engine and rendering connections</li>
</ul>
<p>Key features:</p>
<ul>
<li>Component-based architecture using Vue.js</li>
<li>Dynamic tab components loaded from separate files</li>
<li>Brand-specific UI updates (showing/hiding Heidenhain tabs)</li>
<li>Integration with rendering canvas and toolbars</li>
</ul>
<h4 id="tab-components">Tab Components</h4>
<p>Each configuration tab is implemented as a separate Vue.js component:</p>
<ul>
<li><code>coordinate-table-tab.js</code> - ISO coordinate table management</li>
<li><code>datum-preset-tab.js</code> - Heidenhain datum preset table (brand-specific)</li>
<li><code>datum-shift-tab.js</code> - Heidenhain datum shift table (brand-specific)</li>
<li><code>offset-table-tab.js</code> - Tool offset table with ideal offset settings</li>
<li><code>machine-tab.js</code> - Machine configuration with axis limits (degrees for rotary axes)</li>
<li><code>brand-tab.js</code> - CNC brand selection</li>
<li><code>config-tab.js</code> - General configuration settings</li>
</ul>
<h4 id="controller-extended-toolbarjs">controller-extended-toolbar.js</h4>
<p>Vue.js component for the extended toolbar that provides:</p>
<ul>
<li>Rendering flags dropdown menu (similar to WPF's RenderingFlagSubmenu)</li>
<li>Controller-specific rendering options (Machine, Coordinates, ISO, Datum, etc.)</li>
<li>Brand-aware rendering flags (Heidenhain-specific options)</li>
<li>Integration with display engine for real-time updates</li>
</ul>
<h3 id="css-styling">CSS Styling</h3>
<p>Two CSS files provide styling:</p>
<ul>
<li><code>controller-panel.css</code> - Main panel layout and component styles
<ul>
<li>Two-column responsive layout using flexbox</li>
<li>Tab navigation and content styling</li>
<li>Form controls with special handling for checkboxes</li>
<li>Overrides global styles for proper checkbox display</li>
</ul>
</li>
<li><code>controller-extended-toolbar.css</code> - Toolbar-specific styles
<ul>
<li>Dropdown menu styling</li>
<li>Button and icon styling</li>
<li>Consistent with player toolbar design</li>
</ul>
</li>
</ul>
<h2 id="integration-points">Integration Points</h2>
<h3 id="with-main-application">With Main Application</h3>
<p>The controller page is integrated into the main application through:</p>
<ul>
<li>Navigation menu in <code>index.html</code></li>
<li>Route handling in <code>main.js</code></li>
<li>Iframe embedding for isolated functionality</li>
</ul>
<h3 id="with-project-service">With Project Service</h3>
<p>The controller utilizes the <code>IProjectService</code> to:</p>
<ul>
<li>Access the current <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></li>
<li>Retrieve and update <a class="xref" href="../../../api/Hi.Numerical.NcEnv.html">NcEnv</a> settings</li>
<li>Save changes to the project</li>
</ul>
<h3 id="with-rendering-engine">With Rendering Engine</h3>
<p>The controller page integrates with:</p>
<ul>
<li><a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a> for 3D visualization</li>
<li><a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a> for rendering project data</li>
<li>Custom rendering flags for controller-specific visualizations</li>
</ul>
<h2 id="key-differences-from-wpf-implementation">Key Differences from WPF Implementation</h2>
<ol>
<li><strong>Asynchronous Operations</strong>: All data operations are asynchronous using fetch API</li>
<li><strong>Component Architecture</strong>: Vue.js components instead of WPF UserControls</li>
<li><strong>Web-based Rendering</strong>: Uses WebGL-based rendering canvas instead of WPF controls</li>
<li><strong>Responsive Design</strong>: Two-column layout with CSS flexbox for better screen utilization</li>
<li><strong>Unit Conversion</strong>: Frontend handles degree/radian conversion for rotary axes</li>
<li><strong>Granular API</strong>: Split NcEnv into multiple focused endpoints instead of single large DTO</li>
<li><strong>Toolbar Integration</strong>: Reuses rendering flag patterns from player section</li>
</ol>
<h2 id="implementation-details">Implementation Details</h2>
<h3 id="data-transfer-objects-dtos">Data Transfer Objects (DTOs)</h3>
<p>The backend uses several DTOs to simplify complex object serialization:</p>
<ul>
<li><code>IsoCoordinateTableEntry</code> - For ISO coordinate table entries</li>
<li><code>DatumTableEntry</code> - For Heidenhain datum tables</li>
<li><code>MachineConfigDto</code> - For machine configuration settings</li>
<li><code>GeneralConfigDto</code> - For general configuration settings</li>
</ul>
<h3 id="unit-handling">Unit Handling</h3>
<ul>
<li>Backend stores rotary axis values in radians (following HiAPI conventions)</li>
<li>Frontend displays and accepts input in degrees for user-friendliness</li>
<li>Conversion happens in the Vue.js components (<code>radToDeg</code> and <code>degToRad</code> functions)</li>
</ul>
<h3 id="rendering-flag-management">Rendering Flag Management</h3>
<p>The controller uses specific rendering flags for visualization:</p>
<ul>
<li>Flag indices follow the <code>RenderingFlag</code> enum structure</li>
<li>Controller-specific flags include: Coordinate, HeidenhainDatumPreset, HeidenhainDatumShift, Stock, AxisLimits</li>
<li>Flags are synchronized between frontend state and display engine</li>
</ul>
<h2 id="future-enhancements">Future Enhancements</h2>
<ul>
<li>Implement ObjectManagementMenuButton component for file management</li>
<li>Add undo/redo functionality</li>
<li>Implement keyboard shortcuts</li>
<li>Add client-side validation for numeric inputs</li>
<li>Implement batch updates for better performance</li>
<li>Add tooltips for configuration options</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,162 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>General Rules | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="General Rules | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="general-rules">General Rules</h1>
<p>This document describes the common patterns and conventions used throughout the HiNC GUI codebase.</p>
<h2 id="message-and-exception-handling">Message and Exception Handling</h2>
<p>The HiNC applications use <a class="xref" href="../../api/Hi.Common.Messages.MessageHost.html">MessageHost</a> to display user-facing messages, and <a class="xref" href="../../api/Hi.Common.ExceptionUtil.html">ExceptionUtil</a>.<a class="xref" href="../../api/Hi.Common.ExceptionUtil.html#Hi_Common_ExceptionUtil_ShowException_System_Exception_System_Object_">ShowException(Exception, object)</a> to handle exceptions with detailed treatment. All messages are displayed in the <a href="message-section-on-main-panel.html">Message Section on Main Panel</a>.</p>
<p>For examples of message and exception handling patterns:</p>
<ol>
<li>Normal message handling:</li>
</ol>
<pre><code class="lang-csharp" name="Normal Messages">MessageHost.AddMessage(&quot;Operation completed successfully.&quot;);
MessageHost.AddWarning(&quot;Please check your input.&quot;);
</code></pre>
<ol start="2">
<li>Exception handling in synchronous code:</li>
</ol>
<pre><code class="lang-csharp" name="Sync Exception">try
{
// Your code here
throw new NotImplementedException(&quot;Demo exception&quot;);
}
catch (Exception ex)
{
ExceptionUtil.ShowException(ex, null);
}
</code></pre>
<ol start="3">
<li>Exception handling in asynchronous code:</li>
</ol>
<pre><code class="lang-csharp" name="Async Exception">await Task.Run(() =&gt;
{
// Your async operation here
throw new NotImplementedException(&quot;Demo async exception&quot;);
}).ShowIfCatched(null);
</code></pre>
<p>The examples are in project Hi.Sample. See <a href="index.html">this page</a> for git repository.</p>
<h2 id="loose-manner">Loose Manner</h2>
<p>The Loose Manner pattern handles rapidly-called synchronous actions where only the last call needs to be effective.</p>
<p>The <a class="xref" href="../../api/Hi.Common.LooseRunner.html">LooseRunner</a> class manages skippable rapid-calling synchronous actions. When an action is called rapidly, only the last call is executed while previous calls are safely skipped. The <a class="xref" href="../../api/Hi.Common.LooseRunner.html#Hi_Common_LooseRunner_TryRun_">TryRun</a> method is used to execute actions in this manner.</p>
<p>The <a class="xref" href="../../api/Hi.Common.LooseRunner.html">LooseRunner</a> should be disposed when its owner is disposed to ensure proper resource cleanup.</p>
<h2 id="gui-file-path-assignment">GUI File Path Assignment</h2>
<p>See <a href="widget/gui-file-path-assignment.html">GUI File Path Assignment</a>.</p>
<h2 id="numeric-inputoutput-handling">Numeric Input/Output Handling</h2>
<p>The <code>numeric-utils.js</code> module handles special floating-point values (such as NaN, Infinity) in web forms. See <a href="widget/numeric-io-utilities.html">Numeric Input/Output Utilities</a> for details.</p>
<h2 id="webapi-with-hub-cleapup-assistence-pattern">Webapi with hub-cleapup assistence pattern</h2>
<p><a href="common/webapi-with-hub-cleanup-assistence-pattern.html">Webapi with hub-cleapup assistence pattern</a></p>
<h2 id="loose-couple">Loose Couple</h2>
<p>If model of the UI component is null or mismatch, apply status badge instead of throwing exception to keep UI work.</p>
<h2 id="translation-remarks">Translation Remarks</h2>
<p>See <a href="translation-remarks.html">Translation Remarks</a>.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,150 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Box3dControl | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Box3dControl | 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="box3dcontrol">Box3dControl</h1>
<p>The <code>Box3dControl</code> provides a user interface for editing a 3D box defined by its minimum and maximum coordinates.</p>
<h2 id="features">Features</h2>
<ul>
<li>Edit the minimum and maximum coordinates of the box</li>
<li>View the calculated dimensions and center of the box</li>
<li>Read-Only Mode and Edit Mode</li>
<li>There are three sub-edit modes that can be selected in Edit Mode:
<ul>
<li>Min and Max</li>
<li>Min and Dimension</li>
<li>Center and Dimension</li>
</ul>
</li>
</ul>
<h2 id="ui-layout">UI Layout</h2>
<p>The <code>Box3dControl</code> includes the following UI elements:</p>
<ol>
<li><strong>Min</strong> Vec3dControl</li>
<li><strong>Max</strong> Vec3dControl</li>
<li><strong>Dimension</strong> Vec3dControl</li>
<li><strong>Center</strong> Vec3dControl</li>
</ol>
<p>The sub-edit mode rules the controls to readonly or editable.</p>
<p>Since the native of <a class="xref" href="../../../api/Hi.Geom.Box3d.html">Box3d</a> is that only Min and Max Properties are editable, the other mode requires little additional logic to take effect.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Geom/Box3dControl</li>
</ul>
<h3 id="web-service-application-source-code-path">Web Service Application Source Code Path</h3>
<ul>
<li>wwwroot/geom/box3d-control.js</li>
<li>Geom/Box3dHub.cs</li>
</ul>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,141 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CylindroidControl | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="CylindroidControl | 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="cylindroidcontrol">CylindroidControl</h1>
<p>The <code>CylindroidControl</code> provides a user interface for editing a cylindroid, which is a generalized cylinder defined by a series of radius values along the Z-axis.</p>
<h2 id="features">Features</h2>
<ul>
<li>Edit the Z-radius pairs that define the cylindroid's profile</li>
<li>Set the longitude number (resolution) for the cylindroid</li>
<li>Add and remove Z-radius pairs</li>
</ul>
<h2 id="ui-layout">UI Layout</h2>
<p>The <code>CylindroidControl</code> includes the following UI elements:</p>
<ol>
<li><strong>Longitude Number</strong> - A numeric input for setting the resolution of the cylindroid</li>
<li><strong>Z-Radius Pairs</strong> - A DataGrid showing the Z-coordinate and radius pairs</li>
<li><strong>Add Button</strong> - Adds a new Z-radius pair</li>
<li><strong>Remove Button</strong> - Removes the selected Z-radius pair</li>
</ol>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Geom/CylindroidControl</li>
</ul>
<h3 id="web-service-application-source-code-path">Web Service Application Source Code Path</h3>
<ul>
<li>wwwroot/geom/cylindroid-control.js</li>
<li>Geom/CylindroidHub.cs</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,135 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Extended Cylinder Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Extended Cylinder Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="extended-cylinder-panel">Extended Cylinder Panel</h1>
<p>The model is <a class="xref" href="../../../api/Hi.Geom.ExtendedCylinder.html">ExtendedCylinder</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Extended Cylinder Panel
<ul>
<li>FullLength Input Field</li>
</ul>
</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Geom/ExtendedCylinderControl</li>
</ul>
<h3 id="web-service-application-source-code-path">Web Service Application Source Code Path</h3>
<ul>
<li>wwwroot/geom/extended-cylinder-panel.js</li>
<li>Geom/ExtendedCylinderHub.cs</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,155 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>GeomCombinationControl | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="GeomCombinationControl | 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="geomcombinationcontrol">GeomCombinationControl</h1>
<p>The <code>GeomCombinationControl</code> provides a user interface for combining multiple geometric objects into a single composite geometry. This is useful for creating complex shapes from simpler primitives.</p>
<h2 id="features">Features</h2>
<ul>
<li>Add multiple geometric objects to the combination</li>
<li>Remove selected objects from the combination</li>
<li>Edit the properties of each included geometry</li>
<li>Support for various geometry types</li>
</ul>
<h2 id="ui-layout">UI Layout</h2>
<p>The <code>GeomCombinationControl</code> includes the following UI elements:</p>
<ol>
<li><strong>Geometry List</strong> - A ListView showing all the geometries in the combination</li>
<li><strong>Add Geometry</strong> - A section for adding new geometries:
<ul>
<li><strong>Geometry Type</strong> - A combo box for selecting the type of geometry to add</li>
<li><strong>Add Button</strong> - Adds a new geometry of the selected type to the combination</li>
</ul>
</li>
<li><strong>Remove Button</strong> - Removes the selected geometry from the combination</li>
<li><strong>Geometry Properties</strong> - A container that shows the appropriate control for editing the selected geometry</li>
</ol>
<h2 id="supported-geometry-types">Supported Geometry Types</h2>
<p>The control supports adding the following geometry types to the combination:</p>
<ul>
<li>Box3d</li>
<li>Cylindroid</li>
<li>StlFile</li>
<li>TransformationGeom</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Geom/GeomCombinationControl</li>
</ul>
<h3 id="web-service-application-source-code-path">Web Service Application Source Code Path</h3>
<ul>
<li>wwwroot/geom/geom-combination-control.js</li>
<li>Geom/GeomCombinationHub.cs (to be created)</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,162 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Geometry Management Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Geometry Management Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="geometry-management-panel">Geometry Management Panel</h1>
<p>Geometry Management Panel get and set a TargetGeometry <a class="xref" href="../../../api/Hi.Geom.IStlSource.html">IStlSource</a>.</p>
<p>null is acceptable for TargetGeometry.</p>
<p>The TargetGeometry can be convert to <a class="xref" href="../../../api/Hi.Geom.TransformationGeom.html">TransformationGeom</a> or get out of the <a class="xref" href="../../../api/Hi.Geom.TransformationGeom.html">TransformationGeom</a>. The conversion button can be hide by the code-behind property.</p>
<p>The TargetGeometry can be convert to <a class="xref" href="../../../api/Hi.Geom.GeomCombination.html">GeomCombination</a> or get out of the <a class="xref" href="../../../api/Hi.Geom.GeomCombination.html">GeomCombination</a> if there is only one geometry in <a class="xref" href="../../../api/Hi.Geom.GeomCombination.html#Hi_Geom_GeomCombination_StlSources">StlSources</a>. The conversion button can be hide by the code-behind property.</p>
<p>The geometry type in the</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Geometry Management Panel
<ul>
<li>Geometry Selection and Conversion Bar
<ul>
<li>Geometry Type Selection Bar</li>
<li><a class="xref" href="../../../api/Hi.Geom.TransformationGeom.html">TransformationGeom</a> Conversion Button</li>
<li><a class="xref" href="../../../api/Hi.Geom.GeomCombination.html">GeomCombination</a> Conversion Button</li>
</ul>
</li>
<li>Content Panel (varied by the TargetGeometry)</li>
</ul>
</li>
</ul>
<h2 id="geometry-type-selection-bar-setting">Geometry Type Selection Bar Setting</h2>
<p>See <a href="index.html">Geometry Panels</a> for the various geometry type.</p>
<p>The geometries are availible by default:</p>
<ul>
<li><a class="xref" href="../../../api/Hi.Geom.Box3d.html">Box3d</a></li>
<li><a class="xref" href="../../../api/Hi.Geom.Cylindroid.html">Cylindroid</a></li>
<li><a class="xref" href="../../../api/Hi.Geom.StlFile.html">StlFile</a></li>
<li><a class="xref" href="../../../api/Hi.Geom.TransformationGeom.html">TransformationGeom</a></li>
<li><a class="xref" href="../../../api/Hi.Geom.GeomCombination.html">GeomCombination</a></li>
</ul>
<p>The geometries are default hiding but they can be code-behind optionally enabled:</p>
<ul>
<li><a class="xref" href="../../../api/Hi.Cbtr.CubeTree.html">CubeTree</a></li>
<li><a class="xref" href="../../../api/Hi.Geom.ExtendedCylinder.html">ExtendedCylinder</a></li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Geom/GeometryManagementPanel</li>
</ul>
<h3 id="web-service-application-source-code-path">Web Service Application Source Code Path</h3>
<ul>
<li>wwwroot/geom/geometry-management-panel.js</li>
<li>Geom/GeomHub.cs</li>
<li>Geom/GeometryController.cs</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,188 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Geometry Panels | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Geometry Panels | 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="geometry-panels">Geometry Panels</h1>
<p>The Geometry Panels provide GUI components for editing <a href="../../basic/geom/basic-geometry.html">Geometry Objects</a>. The <a href="geom-manage-control.html">Geometry Management Control</a> handles geometry selection, modification, and lifecycle management.</p>
<h2 id="basic-geometry-controls">Basic Geometry Controls</h2>
<table>
<thead>
<tr>
<th>Control</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="box3d-control.html">Box3dControl</a></td>
<td>Edits a 3D box defined by min/max coordinates</td>
</tr>
<tr>
<td><a href="cylindroid-control.html">CylindroidControl</a></td>
<td>Edits a cylindroid with radius values along Z-axis</td>
</tr>
<tr>
<td><a href="stlfile-control.html">StlFileControl</a></td>
<td>Loads and manipulates STL files</td>
</tr>
</tbody>
</table>
<h2 id="transformation-controls">Transformation Controls</h2>
<table>
<thead>
<tr>
<th>Control</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="transformation-geom-control.html">TransformationGeomControl</a></td>
<td>Applies transformations to geometric objects</td>
</tr>
<tr>
<td><a href="geom-combination-control.html">GeomCombinationControl</a></td>
<td>Combines multiple geometric objects</td>
</tr>
</tbody>
</table>
<h2 id="special-controls">Special Controls</h2>
<table>
<thead>
<tr>
<th>Control</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="runtime-geom-panel.html">Runtime Geometry Panel</a></td>
<td>Manages runtime geometry (not <a class="xref" href="../../../api/Hi.Geom.IStlSource.html">IStlSource</a>, but follows similar patterns)</td>
</tr>
<tr>
<td><a href="extended-cylinder-panel.html">Extended Cylinder Panel</a></td>
<td>Extended cylindrical geometry editing</td>
</tr>
</tbody>
</table>
<h2 id="source-code-locations">Source Code Locations</h2>
<p>See <a href="../index.html">HiNC GUI Architecture</a> for git repository links.</p>
<h3 id="wpf-application">WPF Application</h3>
<ul>
<li><code>Geom/</code></li>
</ul>
<h3 id="web-application">Web Application</h3>
<ul>
<li><code>wwwroot/geom/</code></li>
<li><code>Geom/GeomHub.cs</code></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,140 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Runtime Geometry Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Runtime Geometry Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="runtime-geometry-panel">Runtime Geometry Panel</h1>
<p>Key model is <a class="xref" href="../../../api/Hi.Cbtr.CubeTreeFile.html">CubeTreeFile</a>.</p>
<div class="NOTE">
<h5>Note</h5>
<p>The term Runtime Geometry is <a class="xref" href="../../../api/Hi.Cbtr.CubeTree.html">CubeTree</a>.</p>
</div>
<h2 id="layout">Layout</h2>
<ul>
<li>Runtime Geom Panel
<ul>
<li>File Selector</li>
</ul>
</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Geom/RuntimeGeomPanel</li>
</ul>
<h3 id="web-service-application-source-code-path">Web Service Application Source Code Path</h3>
<ul>
<li>wwwroot/geom/runtime-geom-panel.js</li>
<li>Geom/RuntimeGeomHub.cs (to be created)</li>
<li>Geom/GeometryController.cs</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,140 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>StlFileControl | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="StlFileControl | 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="stlfilecontrol">StlFileControl</h1>
<p>The <code>StlFileControl</code> provides a user interface for loading and manipulating STL (STereoLithography) files, which are commonly used for representing 3D surface geometry.</p>
<h2 id="features">Features</h2>
<ul>
<li>Load STL files from the file system</li>
<li>Display the path of the loaded STL file</li>
<li>View basic information about the loaded STL (when available)</li>
</ul>
<h2 id="ui-layout">UI Layout</h2>
<p>The <code>StlFileControl</code> includes the following UI elements:</p>
<ol>
<li><strong>File Path</strong> - A text box showing the path of the loaded STL file</li>
<li><strong>Browse Button</strong> - Opens a file dialog to select an STL file</li>
<li><strong>Information Panel</strong> - Displays information about the loaded STL file (when available)</li>
</ol>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Geom/StlFileControl</li>
</ul>
<h3 id="web-service-application-source-code-path">Web Service Application Source Code Path</h3>
<ul>
<li>wwwroot/geom/stlfile-control.js</li>
<li>Geom/StlFileHub.cs</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,156 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TransformationGeomControl | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="TransformationGeomControl | 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="transformationgeomcontrol">TransformationGeomControl</h1>
<p>The <code>TransformationGeomControl</code> provides a user interface for applying transformations to geometric objects. It allows you to wrap any geometry with transformation parameters like scaling, rotation, and translation.</p>
<h2 id="features">Features</h2>
<ul>
<li>Select and edit the base geometry object</li>
<li>Apply transformations including scaling, rotation, and translation</li>
<li>Preview the transformed geometry</li>
</ul>
<h2 id="ui-layout">UI Layout</h2>
<p>The <code>TransformationGeomControl</code> includes the following UI elements:</p>
<ul>
<li>Base Geometry - A combo box for selecting the type of base geometry</li>
<li>Geometry Properties - A container that shows the appropriate control for the selected geometry type</li>
<li><a href="../mech/topo/transformers.html">Transformation Selection Bar</a>
<ul>
<li>Available options (The dynamic transformer is not avaible):
<ul>
<li>Null Transform Option (Show if originally existed or code-behind optionally assinged)</li>
<li>Identity Transform Option (Show if originally existed or code-behind optionally assinged)</li>
<li>Static Translate Option</li>
<li>General Transform Option</li>
<li>Freeform Transform Option</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="../../basic/mechanism/transformers/index.html">Transformers</a></li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-source-code-path">WPF Source Code Path</h3>
<ul>
<li>Geom/TransformationGeomControl</li>
</ul>
<h3 id="web-service-application-source-code-path">Web Service Application Source Code Path</h3>
<ul>
<li>wwwroot/geom/transformation-geom-control.js</li>
<li>Geom/TransformationGeomHub.cs (to be created)</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,165 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Rendering Canvas on Web Service Application | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Rendering Canvas on Web Service Application | 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="rendering-canvas-on-web-service-application">Rendering Canvas on Web Service Application</h1>
<h2 id="overview">Overview</h2>
<p>In the HiNC-2025-webservice example project, the 3D canvas rendering is handled through a WebSocket-based architecture using SignalR Hub connections.</p>
<h2 id="core-component">Core Component</h2>
<p>The primary component for 3D canvas rendering:</p>
<ul>
<li><strong>Location</strong>: <code>wwwroot/disp/rendering-canvas.js</code></li>
<li><strong>Purpose</strong>: Manages all 3D canvas rendering operations</li>
</ul>
<h2 id="connection-management">Connection Management</h2>
<h3 id="signalr-hub-connection">SignalR Hub Connection</h3>
<ul>
<li>Components using WebSocket (corresponding to SignalR Hub) receive a unique Hub <code>connectionId</code></li>
<li>The <code>rendering-canvas</code> component maintains a primary <code>connectionId</code></li>
<li>This ID serves as the index for all canvas data stream operations</li>
</ul>
<h3 id="connection-id-naming-convention">Connection ID Naming Convention</h3>
<p>In other components, the connection ID may be referenced with different naming patterns:</p>
<ul>
<li><code>renderingConnectionId</code></li>
<li><code>rendering-connectionId</code></li>
<li>Similar variations</li>
</ul>
<h3 id="naming-convention-examples">Naming Convention Examples</h3>
<p>Different components may reference the connection ID with various naming patterns:</p>
<ul>
<li><code>player-panel</code> component: uses <code>renderingConnectionId</code> (<code>wwwroot/player/player-panel.js</code>)</li>
<li>Other components may use similar variations like <code>rendering-connectionId</code></li>
</ul>
<h2 id="data-flow-architecture">Data Flow Architecture</h2>
<h3 id="frontend-responsibilities">Frontend Responsibilities</h3>
<ul>
<li>The <code>rendering-canvas</code> component handles data stream transmission via WebSocket</li>
<li>Manages real-time rendering updates through the connection ID</li>
</ul>
<h3 id="backend-integration">Backend Integration</h3>
<p>Multiple backend controllers can specify content to be rendered on the <code>rendering-canvas</code>. The architecture is designed to be flexible and reusable across different features.</p>
<h4 id="example-player-controller">Example: Player Controller</h4>
<p>One example of backend integration:</p>
<ul>
<li><strong>File</strong>: <code>Players/PlayerController.cs</code></li>
<li><strong>Method</strong>: <code>InitializePlayer</code></li>
<li><strong>Purpose</strong>: Initializes player-specific rendering content</li>
</ul>
<p>This is just one example - any controller in the application can interact with the rendering canvas using the same connection ID mechanism to display different types of 3D content</p>
<h2 id="key-points">Key Points</h2>
<ul>
<li>All canvas data stream operations are indexed by the connection ID</li>
<li>The WebSocket connection enables real-time rendering updates</li>
<li>The architecture separates rendering logic (frontend) from content specification (backend)</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,188 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HiNC GUI Architecture | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="HiNC GUI Architecture | 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="hinc-gui-architecture">HiNC GUI Architecture</h1>
<p>This section provides an architectural overview of the HiNC GUI applications. The <a href="general-rules.html">General Rules</a> document describes common patterns and conventions used throughout the codebase.</p>
<h2 id="source-code-repositories">Source Code Repositories</h2>
<h3 id="wpf-desktop-application">WPF Desktop Application</h3>
<p>The HiNC-2025-win-desktop project provides a native Windows desktop application built with WPF.</p>
<ul>
<li>Repository: <a href="https://superhightech-gitea.webredirect.org/HiNC-Deploy/HiNC-2025-win-desktop.git">https://superhightech-gitea.webredirect.org/HiNC-Deploy/HiNC-2025-win-desktop.git</a></li>
</ul>
<h3 id="web-service-application">Web Service Application</h3>
<p>The HiNC-2025-webservice project provides a web-based application using Vue.js for the frontend and ASP.NET Core for the backend.</p>
<ul>
<li>Repository: <a href="https://superhightech-gitea.webredirect.org/HiNC-Deploy/HiNC-2025-webservice.git">https://superhightech-gitea.webredirect.org/HiNC-Deploy/HiNC-2025-webservice.git</a></li>
</ul>
<h2 id="architecture-patterns">Architecture Patterns</h2>
<p>The following architectural patterns are used in the HiNC GUI applications:</p>
<ul>
<li><a href="common/dictionary-service-pattern.html">DictionaryService and DictionaryHub Pattern</a> - Connection-scoped object indexing for hierarchical components</li>
<li><a href="hinc-web-service/disp-web-service.html">Rendering Canvas on Web Service</a> - WebSocket-based 3D canvas rendering architecture using SignalR Hub</li>
</ul>
<h2 id="gui-component-structure">GUI Component Structure</h2>
<p>The HiNC GUI is organized into the following major components:</p>
<h3 id="core-framework">Core Framework</h3>
<ul>
<li><a href="initialize-hiapi.html">Initialize HiAPI</a> - Application initialization and HiAPI setup</li>
<li><a href="main-panel.html">Main Panel</a> - The main window layout and navigation structure</li>
<li><a href="message-section-on-main-panel.html">Message Section</a> - Status and message display area</li>
</ul>
<h3 id="rendering-and-visualization">Rendering and Visualization</h3>
<ul>
<li><a href="renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a> - 3D view control toolbar</li>
<li><a href="player/index.html">Player Panel</a> - Simulation playback and visualization</li>
</ul>
<h3 id="configuration-panels">Configuration Panels</h3>
<ul>
<li><a href="preference/index.html">Preference Menu</a> - Application settings and preferences</li>
<li><a href="preference/graphic-cache-dropdown.html">Graphic-Cache Dropdown</a> - Graphics caching configuration</li>
</ul>
<h3 id="geometry-and-mechanism">Geometry and Mechanism</h3>
<ul>
<li><a href="widget/vec3d/index.html">Widget Components</a> - Reusable GUI widgets (Vec3dControl, etc.)</li>
<li><a href="geom/index.html">Geometry Panels</a> - Geometry definition and management</li>
<li><a href="mech/topo/transformers.html">Transformers</a> - Coordinate transformation components</li>
<li><a href="mech/fixture-page.html">Fixture Page</a> - Fixture configuration</li>
<li><a href="mech/workpiece-page.html">Workpiece Page</a> - Workpiece definition</li>
<li><a href="mech/tool-house-page.html">ToolHouse Page</a> - Tool library management</li>
</ul>
<h3 id="operation">Operation</h3>
<ul>
<li><a href="controller/index.html">Controller Page</a> - Machine controller settings</li>
<li><a href="mission/index.html">Mission Page</a> - Machining mission management</li>
</ul>
<h2 id="building-a-new-hinc-application">Building a New HiNC Application</h2>
<div class="TIP">
<h5>Tip</h5>
<p>To build a new HiNC GUI application from scratch, see <a href="../getting-started/index.html">Getting Started</a> for package configuration and setup instructions.</p>
</div>
<p>If you are building a new application, the following checklist provides a recommended implementation order:</p>
<ol>
<li>Create and configure an application project (x64 platform, add <code>HiNc</code> packages, add <code>Hi.WpfPlus</code> for WPF).</li>
<li>Create Main Window with <a href="main-panel.html#layout-structure">Main Panel Layout</a>.</li>
<li>Implement <a href="message-section-on-main-panel.html">Message Section</a>.</li>
<li><a href="initialize-hiapi.html">Initialize HiAPI</a> at application entry point.</li>
<li>Set up <a href="main-panel.html#project-menu-behavior">Navigation Menu/Project</a> behavior.</li>
<li>Create <a href="renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a>.</li>
<li>Implement <a href="player/index.html">Player Panel</a>.</li>
<li>Implement <a href="preference/graphic-cache-dropdown.html">Graphic-Cache Dropdown</a>.</li>
<li>Build widget components (<a href="widget/vec3d/index.html">Vec3dControl</a>, etc.).</li>
<li>Build <a href="mech/topo/transformers.html">Transformers</a>, <a href="geom/index.html">Geometry Panels</a>.</li>
<li>Build <a href="mech/fixture-page.html">Fixture Page</a>, <a href="mech/workpiece-page.html">Workpiece Page</a>, <a href="controller/index.html">Controller Page</a>, <a href="mech/tool-house-page.html">ToolHouse Page</a>.</li>
</ol>
<div class="NOTE">
<h5>Note</h5>
<p>If you are using an AI agent to build the application, ask the AI to do only one job at a time to ensure quality. Compile to verify code works after each step.</p>
</div>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,130 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HiAPI Initialization | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="HiAPI Initialization | 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="hiapi-initialization">HiAPI Initialization</h1>
<p>The HiNC applications initialize HiAPI at the application entry point using the following methods:</p>
<ul>
<li><a class="xref" href="../../api/Hi.HiNcKits.LocalApp.html#Hi_HiNcKits_LocalApp_AppBegin_">AppBegin</a> - Called at application startup</li>
<li><a class="xref" href="../../api/Hi.HiNcKits.LocalApp.html#Hi_HiNcKits_LocalApp_AppEnd_">AppEnd</a> - Called on application shutdown</li>
</ul>
<p>These methods handle the initialization and release of:</p>
<ul>
<li>Licensing</li>
<li>Display engine</li>
<li>Background resources</li>
</ul>
<div class="IMPORTANT">
<h5>Important</h5>
<p>Both DI-based and legacy flow implementations require calling <code>LocalApp.AppBegin()</code> at startup and <code>LocalApp.AppEnd()</code> on shutdown.</p>
</div>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,241 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Main Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Main Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="main-panel">Main Panel</h1>
<p>The Main Panel is the primary window of the HiNC application, providing navigation and access to all major features.</p>
<h2 id="key-models">Key Models</h2>
<ul>
<li>Project Service
<ul>
<li><strong>WPF Single-User Desktop Application</strong>: Uses self-hosted <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a></li>
<li><strong>Web Service Application</strong>: Service inherits from <a class="xref" href="../../api/Hi.MachiningProcs.IProjectService.html">IProjectService</a></li>
</ul>
</li>
<li><strong>User Service</strong>: <a class="xref" href="../../api/Hi.HiNcKits.UserService.html">UserService</a></li>
</ul>
<h2 id="layout-structure">Layout Structure</h2>
<ul>
<li>Top <code>Navigation Menu</code>
<ul>
<li><code>Project Menu Dropdown</code>
<ul>
<li><code>Project Path Text Field</code></li>
<li><code>New MenuItem</code></li>
<li><code>Load MenuItem</code></li>
<li><code>Save MenuItem</code></li>
<li><code>Save As MenuItem</code></li>
</ul>
</li>
<li><code>Environment Menu Dropdown</code>
<ul>
<li>Machine Tool MenuItem
Open <a href="mech/machining-chain-page.html">Machine Tool Page</a>
Sole window in WPF app.
The page manages <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_MachiningEquipment">MachiningEquipment</a>.<a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_MachiningChain">MachiningChain</a>.</li>
<li>Controller MenuItem
Open <a href="controller/index.html">Controller Page</a></li>
<li>Tool House MenuItem</li>
<li>Fixture MenuItem
Open <a href="mech/fixture-page.html">Fixture Page</a></li>
<li>Workpiece MenuItem
Open <a href="mech/workpiece-page.html">Workpiece Page</a></li>
</ul>
</li>
<li>Mission MenuItem
Open <a href="mission/index.html">Mission Page</a></li>
<li>Player MenuItem
Link to <a href="player/index.html">Player Panel</a>
(Not exist on WPF app.)</li>
<li>Player Belonged Tool Bars. See <a href="player/index.html">Player Panel</a>. Shows only if the Main Panel content is Player Panel.</li>
<li><a href="preference/index.html">Preference Menu Dropdown</a></li>
<li>Help MenuItem
<ul>
<li>HiAPI Version label
A label to show the HiNc library version.</li>
</ul>
</li>
</ul>
</li>
<li>Log MenuItem
Open Log Viewer to display application logs for the current day.
The Log Viewer provides real-time access to system logs with filtering and download capabilities.
It reads log files from the server's log directory and presents them in a formatted, searchable interface.
Users can refresh the log content or download the current day's log file for offline analysis.</li>
<li>Central <code>Page Panel</code></li>
<li><a href="message-section-on-main-panel.html">Message Section on Main Panel</a></li>
</ul>
<h2 id="project-menu-behavior">Project Menu Behavior</h2>
<p>The <code>Project Path Text Field</code> displays the current project path when a project is loaded. It is implemented as a pure text field (not a button) that allows users to select and copy the path.</p>
<p>The <code>Project</code> Menu manages <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> with the following operations:</p>
<table>
<thead>
<tr>
<th>Operation</th>
<th>Description</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>New</td>
<td>Creates a new project</td>
<td>See <a class="xref" href="../../sample/Sample.Machining.DemoBuildGeomOnlyMachiningProject.html">DemoBuildGeomOnlyMachiningProject</a></td>
</tr>
<tr>
<td>Load</td>
<td>Opens an existing project</td>
<td>See <a class="xref" href="../../sample/Sample.Machining.DemoUseMachiningProject.html">DemoUseMachiningProject</a></td>
</tr>
<tr>
<td>Save</td>
<td>Saves the current project</td>
<td>See <a class="xref" href="../../sample/Sample.Machining.DemoBuildGeomOnlyMachiningProject.html">DemoBuildGeomOnlyMachiningProject</a></td>
</tr>
<tr>
<td>Save As</td>
<td>Saves the project to a new location</td>
<td>See <a class="xref" href="../../sample/Sample.Machining.DemoBuildGeomOnlyMachiningProject.html">DemoBuildGeomOnlyMachiningProject</a></td>
</tr>
</tbody>
</table>
<p>All operation results (success or exception) are displayed via <a class="xref" href="../../api/Hi.Common.Messages.MessageHost.html">MessageHost</a>. When a project is loaded, the Player Panel's RenderingCanvas is set to isometric view using <a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToIsometricView">SetViewToIsometricView()</a>.</p>
<div class="NOTE">
<h5>Note</h5>
<p>The implementation uses static functions of <a class="xref" href="../../api/Hi.Common.Messages.MessageHost.html">MessageHost</a> for message handling. Async operations ensure smooth user experience during file I/O.</p>
</div>
<h2 id="platform-specific-differences">Platform-Specific Differences</h2>
<h3 id="wpf-application">WPF Application</h3>
<ul>
<li>Only a single instance of each sub-window (Mission, Workpiece, Fixture) can exist at a time</li>
<li>The Player MenuItem does not exist in the WPF version, as the Main Panel itself serves as the Player Panel</li>
</ul>
<h3 id="web-application">Web Application</h3>
<ul>
<li>The Player Panel is the default panel displayed on the main page</li>
<li>The page URL and panel state are synchronized (bi-directional navigation)</li>
</ul>
<h2 id="source-code-locations">Source Code Locations</h2>
<p>See <a href="index.html">HiNC GUI Architecture</a> for git repository links.</p>
<h3 id="wpf-application-1">WPF Application</h3>
<ul>
<li><code>MainWindow</code></li>
</ul>
<h3 id="web-application-1">Web Application</h3>
<ul>
<li><code>Environments/PreferenceController.cs</code></li>
<li><code>Environments/ProjectController.cs</code></li>
<li><code>wwwroot/app.js</code></li>
<li><code>wwwroot/index.html</code></li>
<li><code>wwwroot/preference/log-viewer.js</code></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,151 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>APT Profile Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="APT Profile Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../../public/main.css">
<meta name="docfx:navrel" content="../../../../toc.html">
<meta name="docfx:tocrel" content="../../../toc.html">
<meta name="docfx:rel" content="../../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="apt-profile-panel">APT Profile Panel</h1>
<p>The main model is <a class="xref" href="../../../../api/Hi.Milling.Cutters.AptProfile.html">AptProfile</a> and its property <a class="xref" href="../../../../api/Hi.Milling.Cutters.AptProfile.html">AptProfile</a>.<a class="xref" href="../../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a>.</p>
<p>See <a href="../../../../user-guide/zh-Hant/milling-tool/apt.html">APT Cutter Definition</a>. <a class="xref" href="../../../../api/Hi.Milling.Apts.GeneralApt.html">GeneralApt</a> is the generalization of other <a class="xref" href="../../../../api/Hi.Milling.Apts.IAptBased.html">IAptBased</a> types.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>APT Profile Panel
<ul>
<li>Diameter Input Field (mm)</li>
<li>Round Radius Input Field (mm)
Visibly if <a class="xref" href="../../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a> is <a class="xref" href="../../../../api/Hi.Milling.Apts.IAptRc.html">IAptRc</a></li>
<li>Round Ring Radius Input Field(mm)
Visibly if <a class="xref" href="../../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a> is <a class="xref" href="../../../../api/Hi.Milling.Apts.IAptRr.html">IAptRr</a></li>
<li>Round Ring Height Input Field(mm)
Visibly if <a class="xref" href="../../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a> is <a class="xref" href="../../../../api/Hi.Milling.Apts.IAptRz.html">IAptRz</a></li>
<li>Bottom Cone Angle Input Field (deg)
Visibly if <a class="xref" href="../../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a> is <a class="xref" href="../../../../api/Hi.Milling.Apts.IAptAlpha.html">IAptAlpha</a></li>
<li>Top Cone Angle Input Field (deg)
Visibly if <a class="xref" href="../../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a> is <a class="xref" href="../../../../api/Hi.Milling.Apts.IAptBeta.html">IAptBeta</a></li>
<li>Length of Cut Input Field (mm)</li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>Keep field format &ldquo;G4&rdquo;</p>
</div>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/ToolHouse/AptProfilePanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/cutter/apt-profile-panel.js</li>
<li>Controller/Mech/MechController.cs</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,200 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Freeform Remover Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Freeform Remover Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../../public/main.css">
<meta name="docfx:navrel" content="../../../../toc.html">
<meta name="docfx:tocrel" content="../../../toc.html">
<meta name="docfx:rel" content="../../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="freeform-remover-panel">Freeform Remover Panel</h1>
<p>The key model is <a class="xref" href="../../../../api/Hi.Machining.FreeformRemover.html">FreeformRemover</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Freeform Remover Panel
<ul>
<li>Tabs
<ul>
<li>Strut Geometry Tab
<ul>
<li><a href="../../geom/geom-manage-control.html">Geometry Management Panel</a>
<ul>
<li>Manages <a class="xref" href="../../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_StrutGeom">StrutGeom</a></li>
</ul>
</li>
</ul>
</li>
<li>Shaper Geometry Tab
<ul>
<li><a href="../../geom/geom-manage-control.html">Geometry Management Panel</a>
<ul>
<li>Manages <a class="xref" href="../../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_ShaperGeom">ShaperGeom</a></li>
</ul>
</li>
</ul>
</li>
<li>Anchor Tab
<ul>
<li>Label: Geometry Anchor To Holder Buckle</li>
<li><a class="xref" href="../../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_KeepHolderBuckleOnTop">KeepHolderBuckleOnTop</a> Checkbox</li>
<li><a href="../topo/transformers.html">Transformer Manage Panel</a>
<ul>
<li>Model is <a class="xref" href="../../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_GeomToHolderTransformer">GeomToHolderTransformer</a></li>
<li>Enabled if <a class="xref" href="../../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_KeepHolderBuckleOnTop">KeepHolderBuckleOnTop</a> is true.</li>
</ul>
</li>
</ul>
</li>
<li>Property Tab
<ul>
<li>Is Spinning Cutter Checkbox
<ul>
<li>Controls <a class="xref" href="../../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_IsSpinningCutter">IsSpinningCutter</a></li>
</ul>
</li>
</ul>
</li>
<li>Info Tab
<ul>
<li>Name TextField (editable)</li>
<li>AbstractNote TextField (readonly)</li>
<li>Note TextField (editable)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="geometry-definitions">Geometry Definitions</h2>
<ul>
<li><strong>Strut Geometry</strong> - The non-cutting portion (holder/shank)
<ul>
<li>Used for collision detection</li>
</ul>
</li>
<li><strong>Shaper Geometry</strong> - The cutting portion
<ul>
<li>Defines cutting surfaces</li>
<li>Used for material removal simulation</li>
</ul>
</li>
</ul>
<h2 id="implementation-note">Implementation Note</h2>
<p>Remember to call <a class="xref" href="../../../../api/Hi.Machining.FreeformRemover.html#Hi_Machining_FreeformRemover_ClearCache">ClearCache()</a> after geometry changes.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/ToolHouse/FreeformRemoverPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/cutter/freeform-remover-panel.js</li>
<li>Controller/Mech/MechController.cs</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,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Cutter Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Cutter Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../../public/main.css">
<meta name="docfx:navrel" content="../../../../toc.html">
<meta name="docfx:tocrel" content="../../../toc.html">
<meta name="docfx:rel" content="../../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../../../index.html">
<img id="logo" class="svg" src="../../../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="cutter-panel">Cutter Panel</h1>
<h2 id="overview">Overview</h2>
<p>The key component is <a class="xref" href="../../../../api/Hi.Machining.ICutter.html">ICutter</a>.</p>
<p>The Cutter Panel is used to manage cutting tool definitions in HiNC. It supports two main types of cutting tools: <a class="xref" href="../../../../api/Hi.Milling.Cutters.MillingCutter.html">MillingCutter</a> and <a class="xref" href="../../../../api/Hi.Machining.FreeformRemover.html">FreeformRemover</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Cutter Panel
<ul>
<li>Head Line
<ul>
<li><a href="../../widget/object-management-menu-button.html">Object Management Menu Button</a>
<ul>
<li>File extension is <code>.Cutter</code></li>
<li>The pointed Editor Panel is Cutter Management Panel</li>
</ul>
</li>
<li>Title Label</li>
<li>Cutter Type Selection Dropdown
<ul>
<li>Options: Milling Cutter, Freeform Remover, Unset</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Cutter Management Panel
Varies by the Cutter Type. It can be:
<ul>
<li><a href="milling-cutter-panel.html">Milling Cutter Panel</a></li>
<li><a href="freeform-remover-panel.html">Freeform Remover Panel</a></li>
</ul>
</li>
</ul>
<h2 id="features">Features</h2>
<p>Since <a class="xref" href="../../../../api/Hi.Machining.ICutter.html">ICutter</a> implements <a class="xref" href="../../../../api/Hi.Common.IClearCache.html">IClearCache</a>, remember to call the <a class="xref" href="../../../../api/Hi.Common.IClearCache.html#Hi_Common_IClearCache_ClearCache_">ClearCache</a> method when the cutter geometry or properties change to ensure proper updates in simulation.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/ToolHouse/CutterManagementPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/cutter/cutter-management-panel.js</li>
<li>Controller/Mech/MechController.cs</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,451 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Milling Cutter Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Milling Cutter Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../../public/main.css">
<meta name="docfx:navrel" content="../../../../toc.html">
<meta name="docfx:tocrel" content="../../../toc.html">
<meta name="docfx:rel" content="../../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="milling-cutter-panel">Milling Cutter Panel</h1>
<p>The key model is <a class="xref" href="../../../../api/Hi.Milling.Cutters.MillingCutter.html">MillingCutter</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Milling Cutter Panel
<ul>
<li>Tabs
<ul>
<li><a href="#flute-profile-tab">Flute-Profile Tab</a></li>
<li>Upper-Beam Tab
<ul>
<li><a href="../../geom/geom-manage-control.html">Geometry Management Control</a>
<a class="xref" href="../../../../api/Hi.Geom.ExtendedCylinder.html">ExtendedCylinder</a> option is enabled.</li>
</ul>
</li>
<li><a href="#property-tab">Property Tab</a></li>
<li><a href="#insert-cutter-tab">Insert-Cutter Tab</a></li>
<li><a href="#material-tab">Material Tab</a></li>
<li><a href="#flute-contours-tab">Flute-Contours Tab</a></li>
<li><a href="#flute-inner-beam-tab">Flute-Inner-Beam Tab</a></li>
<li><a href="#optimization-tab">Optimization Tab</a></li>
<li>Info Tab
<ul>
<li>Name TextField (editable)</li>
<li>AbstractNote TextField (readonly)</li>
<li>Note TextField (editable)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="flute-profile-tab">Flute-Profile Tab</h3>
<ul>
<li>Profile Type Selection Dropdown
<ul>
<li>APT General (<a class="xref" href="../../../../api/Hi.Milling.Apts.GeneralApt.html">GeneralApt</a>)</li>
<li>APT Ball (<a class="xref" href="../../../../api/Hi.Milling.Apts.BallApt.html">BallApt</a>)</li>
<li>APT Column (<a class="xref" href="../../../../api/Hi.Milling.Apts.ColumnApt.html">ColumnApt</a>)</li>
<li>APT Cone (<a class="xref" href="../../../../api/Hi.Milling.Apts.ConeApt.html">ConeApt</a>)</li>
<li>APT Taper (<a class="xref" href="../../../../api/Hi.Milling.Apts.TaperApt.html">TaperApt</a>)</li>
<li>Custom Spinning Profile (<a class="xref" href="../../../../api/Hi.Milling.Cutters.CustomSpinningProfile.html">CustomSpinningProfile</a>)</li>
</ul>
</li>
<li>Profile Configuration Panel
<ul>
<li>Dynamic component based on selected profile type</li>
</ul>
</li>
</ul>
<p>See <a class="xref" href="../../../../sample/Sample.Machining.DemoBuildMachiningProject.html">DemoBuildMachiningProject</a> for creating the apt profile and setting to the cutter.</p>
<p>See <a href="apt-profile-panel.html">APT Panel</a> for APT-based Profile Configuration Panel. The APT series option is all wrap by <a class="xref" href="../../../../api/Hi.Milling.Cutters.AptProfile.html">AptProfile</a> but with different property <a class="xref" href="../../../../api/Hi.Milling.Cutters.AptProfile.html">AptProfile</a>.<a class="xref" href="../../../../api/Hi.Milling.Cutters.AptProfile.html#Hi_Milling_Cutters_AptProfile_Apt">Apt</a> assigned.</p>
<ul>
<li>Custom Spinning Profile Panel
<ul>
<li><a href="../../geom/geom-manage-control.html">Geometry Management Control</a></li>
</ul>
</li>
</ul>
<h3 id="property-tab">Property Tab</h3>
<p>Visible if <a class="xref" href="../../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<ul>
<li>Integral Mode Selection Dropdown
<ul>
<li>Solid End</li>
<li>Insert End</li>
</ul>
</li>
<li>Cutter/Shank Mass Input Field (g)
<ul>
<li>Show the label &lsquo;Cutter Mass&rsquo; if the Cutter is Solid End Integral Mode; Show the label &lsquo;Shank Mass&rsquo; if the Cutter is Insert End Integral Mode.</li>
<li>Value format &ldquo;G4&rdquo;</li>
<li>Auto Update CheckBox
The model is <a class="xref" href="../../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_ShankMassAssignmentMode">ShankMassAssignmentMode</a>.
<ul>
<li>When enabled: field becomes readonly and shows calculated value.</li>
<li>When disabled: field is editable</li>
<li>Functionality Note: The value is calculate by the volume and density. The volume is the inner beam volume and the upper beam volume.</li>
</ul>
</li>
</ul>
</li>
<li>Hone Radius (μm) Input Field</li>
<li>Relief Angle (deg) Input Field</li>
<li>Minimum Available Cutting Thickness (μm)
<ul>
<li>Readonly field with format &ldquo;G4&rdquo;</li>
<li>Shows calculated value from <a class="xref" href="../../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_GetMinimumUncutChipThickness_um_Hi_MillingForces_Fittings_ICuttingPara_">GetMinimumUncutChipThickness_um(ICuttingPara)</a>. The argument (cutting parameter) is obtained by the <a class="xref" href="../../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_Workpiece">Workpiece</a>.<a class="xref" href="../../../../api/Hi.NcMech.Workpieces.Workpiece.html#Hi_NcMech_Workpieces_Workpiece_CuttingPara">CuttingPara</a>. Series pass the models by the GUI if needed.</li>
<li>Note Label
<ul>
<li>Show Workpiece Cutting Parameter Name.
Label Text &quot;Reference: Workpiece Cutting Parameter - {<a class="xref" href="../../../../api/Hi.NcMech.Workpieces.Workpiece.html#Hi_NcMech_Workpieces_Workpiece_CuttingPara">CuttingPara</a>.<a class="xref" href="../../../../api/Hi.Common.INameNote.html#Hi_Common_INameNote_Name">Name</a>}&quot;.
Since the thickness depdents on the Workpiece Cutting Parameter and hone radius.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="insert-cutter-tab">Insert-Cutter Tab</h3>
<p>Visible if <a class="xref" href="../../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true and Integral Mode is Insert End.</p>
<ul>
<li>Insert Number Input field</li>
<li>Insert Mass Input field (g)
<ul>
<li>Format &ldquo;G4&rdquo;</li>
</ul>
</li>
<li>Insert Thickness Input field (mm)
<ul>
<li>Format &ldquo;G4&rdquo;</li>
<li>The Insert Thickness is for computing heat transfer.</li>
</ul>
</li>
</ul>
<h3 id="material-tab">Material Tab</h3>
<p>Visible if <a class="xref" href="../../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<ul>
<li>Shank Material (visible only for Integral Mode is Insert End mode)
<ul>
<li>Material File Selector
Apply <a class="xref" href="../../../../api/Hi.Physics.IStructureMaterial.html">IStructureMaterial</a>
<ul>
<li>Menu Dropdown
<ul>
<li>Browse Button</li>
<li>Browse Resource Button</li>
</ul>
</li>
<li>Readonly Name TextBox (<a class="xref" href="../../../../api/Hi.Common.INameNote.html#Hi_Common_INameNote_Name">Name</a>)
<ul>
<li>ToolTip by <a class="xref" href="../../../../api/Hi.Common.INameNote.html#Hi_Common_INameNote_Note">Note</a> from the material</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Flute Material
<ul>
<li>Material File Selector
Apply <a class="xref" href="../../../../api/Hi.Physics.CutterMaterial.html">CutterMaterial</a>
<ul>
<li>Menu Dropdown
<ul>
<li>Browse Button</li>
<li>Browse Resource Button</li>
</ul>
</li>
<li>Readonly Name TextBox (<a class="xref" href="../../../../api/Hi.Common.INameNote.html#Hi_Common_INameNote_Name">Name</a>)
<ul>
<li>ToolTip by <a class="xref" href="../../../../api/Hi.Common.INameNote.html#Hi_Common_INameNote_Note">Note</a> from the material</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Coating Panel
<ul>
<li>Show note that the sequence starts from surface, i.e. from outer to inner.</li>
<li>Manages <a class="xref" href="../../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_CoatingLayerList">CoatingLayerList</a>
<ul>
<li>Exists sequence management.</li>
<li>The first layer has the remark: Air-Exposing Coating.</li>
<li><a class="xref" href="../../../../api/Hi.Physics.ThermalLayer1D.html">ThermalLayer1D</a> Component
<div class="TIP">
<h5>Tip</h5>
<ul>
<li>Keep the child components to one line.</li>
<li>After Coating Material is manual loaded, set the <a class="xref" href="../../../../api/Hi.Physics.CoatingMaterial.html#Hi_Physics_CoatingMaterial_PreferedThickness_um">PreferedThickness_um</a> to the <a class="xref" href="../../../../api/Hi.Physics.ThermalLayer1D.html#Hi_Physics_ThermalLayer1D_Length_um">Length_um</a> and update the corresponding field.</li>
</ul>
</div>
<ul>
<li>Coating Material
<ul>
<li>Material File Selector
Apply <a class="xref" href="../../../../api/Hi.Physics.CoatingMaterial.html">CoatingMaterial</a>
<ul>
<li>Menu Dropdown
<ul>
<li>Browse Button</li>
<li>Browse Resource Button</li>
</ul>
</li>
<li>Readonly Name TextBox (<a class="xref" href="../../../../api/Hi.Common.INameNote.html#Hi_Common_INameNote_Name">Name</a>)
<ul>
<li>ToolTip by <a class="xref" href="../../../../api/Hi.Common.INameNote.html#Hi_Common_INameNote_Note">Note</a> from the material</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Thickness Input Field (um) (editable)
<ul>
<li><a class="xref" href="../../../../api/Hi.Physics.ThermalLayer1D.html#Hi_Physics_ThermalLayer1D_Length_um">Length_um</a></li>
<li>Use format &ldquo;G4&rdquo;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>If the cutter is Solid End, the Shank Material should keep the same with Flute Material. i.e. Set the Shank Material when Flute Material set.</p>
<h4 id="default-resource">Default Resource</h4>
<p>The default resources of Material exist in <code>Resource</code> folder under application folder (Not project folder). Set the corresponding default folder of the File Selector to the <code>Resource</code> sub folder:</p>
<ul>
<li>&ldquo;Resource/StructureMaterial&rdquo;</li>
<li>&ldquo;Resource/CutterMaterial&rdquo;</li>
<li>&ldquo;Resource/CoatingMaterial&rdquo;</li>
</ul>
<h3 id="flute-contours-tab">Flute-Contours Tab</h3>
<p>Visible if <a class="xref" href="../../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<p>This part manages <a class="xref" href="../../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_FluteContourTray">FluteContourTray</a>.</p>
<ul>
<li>Contour Tray Selection Dropdown
<ul>
<li>Uniform Contour Tray (<a class="xref" href="../../../../api/Hi.Milling.FluteContours.UniformContourTray.html">UniformContourTray</a>)</li>
<li>Free Contour Tray (<a class="xref" href="../../../../api/Hi.Milling.FluteContours.FreeContourTray.html">FreeContourTray</a>)</li>
<li>Unset</li>
</ul>
</li>
<li>Contour Tray Configuration Panel
<ul>
<li>Dynamic component based on selected contour tray type</li>
<li>For Uniform Contour Tray:
<ul>
<li>Track Number Input Field</li>
<li>Baseline Contour Configuration
//building</li>
</ul>
</li>
<li>For Free Contour Tray:
<ul>
<li>Individual contour configuration for each flute
//building</li>
<li>Add/Remove contour controls</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="flute-inner-beam-tab">Flute-Inner-Beam Tab</h3>
<p>Visible if <a class="xref" href="../../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<p>This part manages <a class="xref" href="../../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_InnerBeamProfile">InnerBeamProfile</a>.</p>
<ul>
<li>Profile Type Selection Dropdown
<ul>
<li>Flute Dependent Ratio Profile (<a class="xref" href="../../../../api/Hi.Milling.Cutters.FluteDependentRatioProfile.html">FluteDependentRatioProfile</a>)</li>
<li>Const Ratio Profile (<a class="xref" href="../../../../api/Hi.Milling.Cutters.ConstRatioProfile.html">ConstRatioProfile</a>)</li>
<li>Custom Spinning Profile (<a class="xref" href="../../../../api/Hi.Milling.Cutters.CustomSpinningProfile.html">CustomSpinningProfile</a>)</li>
<li>Unset</li>
</ul>
</li>
<li>Profile Configuration Panel
<ul>
<li>Dynamic component based on selected profile type</li>
<li>For Flute Dependent Ratio Profile:
<ul>
<li>Radius Ratio Number Field (readonly)
<ul>
<li>Label also shows the additional information: &lsquo;Dependent on flute num xxx&rsquo;, the &lsquo;xxx&rsquo; is the flute number that pass by <a class="xref" href="../../../../api/Hi.Milling.Cutters.MillingCutter.html">MillingCutter</a>.<a class="xref" href="../../../../api/Hi.Milling.Cutters.MillingCutter.html#Hi_Milling_Cutters_MillingCutter_FluteContourTray_">FluteContourTray</a>. Series pass the model by the GUI if needed.</li>
</ul>
</li>
</ul>
</li>
<li>For Const Ratio Profile:
<ul>
<li>Radius Ratio Number Field (editable)</li>
</ul>
</li>
<li>For Custom Spinning Profile:
<ul>
<li><a href="../../geom/geom-manage-control.html">Geometry Management Control</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="optimization-tab">Optimization Tab</h3>
<p>Visible if <a class="xref" href="../../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</p>
<p>This part manages <a class="xref" href="../../../../api/Hi.NcOpt.MillingCutterOptOption.html">MillingCutterOptOption</a>.</p>
<ul>
<li>Enable Optimization Checkbox
<ul>
<li>Controls whether optimization limits are active</li>
</ul>
</li>
<li>When optimization is enabled:
<ul>
<li>Limit by Theoretical Minimum Feed Per Tooth Checkbox
<ul>
<li>Shows calculated minimum uncut chip thickness value.
To get the value, <a class="xref" href="../../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_Workpiece">Workpiece</a>.<a class="xref" href="../../../../api/Hi.NcMech.Workpieces.Workpiece.html#Hi_NcMech_Workpieces_Workpiece_CuttingPara_">CuttingPara</a> and <a class="xref" href="../../../../api/Hi.Milling.Cutters.MillingCutter.html">MillingCutter</a> are required. Series pass the model by the GUI if needed.</li>
<li>When checked, enforces minimum feed constraint</li>
</ul>
</li>
<li>Min Feed Per Tooth (mm) Number Field
<ul>
<li>Step (If UI supported): 0.01</li>
</ul>
</li>
<li>Max Feed Per Tooth (mm) Number Field
<ul>
<li>Step (If UI supported): 0.01</li>
</ul>
</li>
<li>Safety Factor for Yielding Number Field
<ul>
<li>Step (If UI supported): 0.1</li>
<li>Default value typically around 2.0</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/ToolHouse/MillingCutterPanel</li>
<li>Mech/ToolHouse/AptProfilePanel</li>
<li>Mech/ToolHouse/MaterialTabPanel</li>
<li>Mech/ToolHouse/PropertyTabPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/cutter/milling-cutter-panel.js</li>
<li>wwwroot/mech/cutter/apt-profile-panel.js</li>
<li>wwwroot/mech/cutter/material-tab-panel.js</li>
<li>wwwroot/mech/cutter/property-tab-panel.js</li>
<li>Controller/Mech/MechController.cs</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,194 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Fixture Page | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Fixture Page | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="fixture-page">Fixture Page</h1>
<p>The page triggers by <a href="../main-panel.html">Main Panel</a>.</p>
<p>The key model is <a class="xref" href="../../../api/Hi.NcMech.Fixtures.Fixture.html">Fixture</a> and <a class="xref" href="../../../api/Hi.NcMech.Fixtures.FixtureEditorDisplayeeConfig.html">FixtureEditorDisplayeeConfig</a>.
Fixture is assigned from the Main Panel's <a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_Fixture">Fixture</a>.</p>
<p><a class="xref" href="../../../api/Hi.NcMech.Fixtures.FixtureEditorDisplayeeConfig.html">FixtureEditorDisplayeeConfig</a> is from <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_UserConfig">UserConfig</a> which assigned from the parent component.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Fixture Page
<ul>
<li>Management Panel
<ul>
<li>Head Line
<ul>
<li><a href="../widget/object-management-menu-button.html">Object Management Menu Button</a>
<ul>
<li>file extension is Fixture</li>
<li>The pointed Editor Panel is Management Tabs Panel</li>
</ul>
</li>
<li>Title Label</li>
</ul>
</li>
<li>Management Tabs Panel
<ul>
<li>Geometry Tab
(Apply <a href="../geom/geom-manage-control.html">Geometry Management Control</a> to set the <a class="xref" href="../../../api/Hi.NcMech.Fixtures.Fixture.html">Fixture</a>.<a class="xref" href="../../../api/Hi.NcMech.Fixtures.Fixture.html#Hi_NcMech_Fixtures_Fixture_Geom">Geom</a>.)</li>
<li>Anchor Tab
(Apply <a href="topo/transformers.html">Transformer Manage Panel</a> to set the following tabs)
<ul>
<li>Geom To Workpiece Tab</li>
<li>Geom To Table Tab</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Viewer Panel
<ul>
<li>Viewer ToolBar
<ul>
<li><a href="../renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a></li>
<li>SetupDisplayee Options ToolBar
<ul>
<li>Options of <a class="xref" href="../../../api/Hi.NcMech.Fixtures.FixtureEditorDisplayee.html">FixtureEditorDisplayee</a></li>
</ul>
</li>
</ul>
</li>
<li>RenderingCanvas
<ul>
<li>The <a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a> is <a class="xref" href="../../../api/Hi.NcMech.Fixtures.FixtureEditorDisplayee.html">FixtureEditorDisplayee</a> (Apply the model <a class="xref" href="../../../api/Hi.NcMech.Fixtures.FixtureEditorDisplayeeConfig.html">FixtureEditorDisplayeeConfig</a>).</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>Add a resizable splition bar between Manage Panel and Viewer Panel.</p>
</div>
<h2 id="behavior">Behavior</h2>
<ul>
<li>Call <a class="xref" href="../../../api/Hi.NcMech.Fixtures.Fixture.html">Fixture</a>.<a class="xref" href="../../../api/Hi.NcMech.Fixtures.Fixture.html#Hi_NcMech_Fixtures_Fixture_ClearGeomCache">ClearGeomCache()</a> on geometry set or changed.</li>
<li>Call RenderCanvas.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToIsometricView">SetViewToIsometricView()</a> on geometry set. (Since the assumption of the shape set raise larger viewer changed than content changed, only adjust view of the setter event.)</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/Fixtures/FixturePage</li>
<li>Mech/Fixtures/FixtureWindow</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/fixture-page.js</li>
<li>Controller/Mech/MechController.cs</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,159 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Cylindroid Holder Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Cylindroid Holder Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../../public/main.css">
<meta name="docfx:navrel" content="../../../../toc.html">
<meta name="docfx:tocrel" content="../../../toc.html">
<meta name="docfx:rel" content="../../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="cylindroid-holder-panel">Cylindroid Holder Panel</h1>
<p>The key model is <a class="xref" href="../../../../api/Hi.NcMech.Holders.CylindroidHolder.html">CylindroidHolder</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Cylindroid Holder Panel
<ul>
<li>Head Line
<ul>
<li>Title Label</li>
</ul>
</li>
<li>Tabs
<ul>
<li>Geometry Tab
<ul>
<li><a href="../../geom/cylindroid-control.html">Cylindroid Panel</a></li>
</ul>
</li>
<li>Resolution Tab
Model: <a class="xref" href="../../../../api/Hi.NcMech.Holders.CylindroidHolder.html#Hi_NcMech_Holders_CylindroidHolder_PolarResolution2d">PolarResolution2d</a>
<a href="../../widget/polar-resolution-2d-panel.html">Polar Resolution 2d</a></li>
<li>Info Tab
<ul>
<li>Name TextField (editable)</li>
<li>AbstractNote TextField (readonly)</li>
<li>Note TextField (editable)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Remember to call <a class="xref" href="../../../../api/Hi.NcMech.Holders.CylindroidHolder.html#Hi_NcMech_Holders_CylindroidHolder_UpdateByCylindroid">UpdateByCylindroid()</a> after geometry reference or content changed.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/ToolHouse/CylindroidHolderPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/holder/cylindroid-holder-panel.js</li>
<li>Controller/Mech/MechController.cs</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,166 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Freeform Holder Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Freeform Holder Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../../public/main.css">
<meta name="docfx:navrel" content="../../../../toc.html">
<meta name="docfx:tocrel" content="../../../toc.html">
<meta name="docfx:rel" content="../../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="freeform-holder-panel">Freeform Holder Panel</h1>
<p>The key model is <a class="xref" href="../../../../api/Hi.NcMech.Holders.FreeformHolder.html">FreeformHolder</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Freeform Holder Panel
<ul>
<li>Head Line
<ul>
<li>Title Label</li>
</ul>
</li>
<li>Tabs
<ul>
<li>Geometry Tab
<ul>
<li><a href="../../geom/geom-manage-control.html">Geometry Management Panel</a></li>
</ul>
</li>
<li>Anchor Tab
(Apply <a href="../topo/transformers.html">Transformer Manage Panel</a> to set the following tabs)
<ul>
<li>Geom To Spindle Tab</li>
<li>Geom To Cutter Tab</li>
</ul>
</li>
<li>Resolution Tab
Model: <a class="xref" href="../../../../api/Hi.NcMech.Holders.FreeformHolder.html#Hi_NcMech_Holders_FreeformHolder_PolarResolution2d">PolarResolution2d</a>
<a href="../../widget/polar-resolution-2d-panel.html">Polar Resolution 2d</a></li>
<li>Info Tab
<ul>
<li>Name TextField (editable)</li>
<li>AbstractNote TextField (readonly)</li>
<li>Note TextField (editable)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Remember to call <a class="xref" href="../../../../api/Hi.NcMech.Holders.FreeformHolder.html#Hi_NcMech_Holders_FreeformHolder_UpdateByGeom">UpdateByGeom()</a> after geometry reference or content changed.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/ToolHouse/FreeformHolderPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/holder/freeform-holder-panel.js</li>
<li>Controller/Mech/MechController.cs</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,162 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Holder Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Holder Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../../public/main.css">
<meta name="docfx:navrel" content="../../../../toc.html">
<meta name="docfx:tocrel" content="../../../toc.html">
<meta name="docfx:rel" content="../../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="holder-panel">Holder Panel</h1>
<p>This section describes the user interface and behavior for managing different types of tool holders in the application. Tool holders are crucial components in defining a complete tool assembly.</p>
<div class="NOTE">
<h5>Note</h5>
<p>While tool holders are essential components in real-world machining operations, some users may choose not to define them in simulation environments for convenience, particularly when collision detection is not a primary concern. The system allows for this flexibility, though it's recommended to include holders for accurate representation and comprehensive collision analysis.</p>
</div>
<p>The primary models involved are subclasses of <a class="xref" href="../../../../api/Hi.NcMech.Holders.IHolder.html">IHolder</a>. Two common types are:</p>
<ul>
<li><strong><a href="cylindroid-holder-panel.html">Cylindroid Holder</a></strong>: Represents holders with a cylindrical geometry. See <a class="xref" href="../../../../api/Hi.NcMech.Holders.CylindroidHolder.html">CylindroidHolder</a>.</li>
<li><strong><a href="freeform-holder-panel.html">Freeform Holder</a></strong>: Represents holders with more complex, freeform geometry, often defined by STL files. See <a class="xref" href="../../../../api/Hi.NcMech.Holders.FreeformHolder.html">FreeformHolder</a>.</li>
</ul>
<p>Each holder type will have its own specific user interface elements for defining its geometry and properties.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Holder Panel
<ul>
<li>Head Line
<ul>
<li><a href="../../widget/object-management-menu-button.html">Object Management Menu Button</a>
<ul>
<li>file extension is Holder</li>
<li>The pointed Editor Panel is Holder Management Panel.</li>
</ul>
</li>
<li>Title Label</li>
</ul>
</li>
<li>Holder Management Panel
<ul>
<li>Holder Type Selection Bar</li>
<li>Holder Sub Management Panel
The content varied by the Holder Type.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/ToolHouse/HolderPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/holder/holder-panel.js</li>
<li>Controller/Mech/MechController.cs</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,174 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Machine Tool Page | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Machine Tool Page | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="machine-tool-page">Machine Tool Page</h1>
<ul>
<li>Key Model:
<ul>
<li><a class="xref" href="../../../api/Hi.Mech.IMachiningChain.html">IMachiningChain</a>
The model is managed by the getter function and setter function (see <a href="../widget/object-management-menu-button.html">Object Management Menu Button</a> for the design pattern).</li>
</ul>
</li>
<li>Assistant Model:
<ul>
<li><a class="xref" href="../../../api/Hi.Numerical.NcEnv.html">NcEnv</a></li>
</ul>
</li>
</ul>
<h2 id="layout">Layout</h2>
<ul>
<li>Head Line
<ul>
<li><a href="../widget/object-management-menu-button.html">Object Management Menu Button</a>
<ul>
<li>file extension is <code>mt</code>.</li>
<li>The pointed Editor Panel is Management Panel</li>
</ul>
</li>
<li>Title Label &ldquo;Machine Tool&rdquo;</li>
</ul>
</li>
<li>Management Panel
<ul>
<li>If the key model inherits <a class="xref" href="../../../api/Hi.Common.INameNote.html">INameNote</a>:
<ul>
<li>Name Setting Line
<ul>
<li>Name Label</li>
<li>Name TextField</li>
</ul>
</li>
<li>Note Setting Line
<ul>
<li>Note Label</li>
<li>Note TextField</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/MachiningChains/MachiningChainPage</li>
<li>Mech/MachiningChains/MachiningChainWindow</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/machining-chain-page.js</li>
<li>Controller/Mech/MechController.cs</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,188 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Stick Tool Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Stick Tool Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../../public/main.css">
<meta name="docfx:navrel" content="../../../../toc.html">
<meta name="docfx:tocrel" content="../../../toc.html">
<meta name="docfx:rel" content="../../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="stick-tool-panel">Stick Tool Panel</h1>
<p>The term stick is for not only milling, but other remover like electric discharge machining tool.</p>
<p>The key model is MillingTool.
Other model: <a class="xref" href="../../../../api/Hi.HiNcKits.UserService.html">UserService</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Head Line
<ul>
<li><a href="../../widget/object-management-menu-button.html">Object Management Menu Button</a>
<ul>
<li>file extension is MillingTool</li>
<li>the pointed Editor Panel is Stick Tool Management Panel</li>
</ul>
</li>
<li>Title Label</li>
</ul>
</li>
<li>Stick Tool Management Panel
<ul>
<li>Cutter Tab
<ul>
<li><a href="../cutter/index.html">Cutter Panel</a></li>
</ul>
</li>
<li>Holder Tab
<ul>
<li><a href="../holder/index.html">Holder Panel</a></li>
</ul>
</li>
<li>Clamping Tab
<ul>
<li>Exposed-Cutter-Height TextField</li>
<li>Preserved-Distance-Between-Flute-and-Spindle-Nose TextField</li>
</ul>
</li>
<li>Intelligent Holder Tab
Visible if <a class="xref" href="../../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</li>
<li>Info Tab
<ul>
<li>Abstract Note TextField (readonly)</li>
<li>Note TextField (editable)</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p>The Exposed-Cutter-Height and Preserved-Distance-Between-Flute-and-Spindle-Nose are directly related. Each value changed if each other value is changed.</p>
</div>
<h2 id="step-by-step-build-guide">Step by Step Build Guide</h2>
<ol>
<li>Build the Stick Tool Panel Layout framework. Since the framework helps to check of the child componenet.</li>
<li>Build accessory part of the framework.
<ol>
<li>Object Management Menu Button</li>
<li>Info Tab</li>
<li>Clamping Tab</li>
</ol>
</li>
<li>Build <a href="../holder/index.html">Holder Panel</a> and the related holder type panel.</li>
<li>Build <a href="../cutter/index.html">Cutter Panel</a> and the related cutter type panel.</li>
</ol>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/ToolHouse/StickToolPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/stick-tool-panel.js</li>
<li>Controller/Mech/MechController.cs</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,244 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Tool House Page | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Tool House Page | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="tool-house-page">Tool House Page</h1>
<p>The page triggers by <a href="../main-panel.html">Main Panel</a>.</p>
<p>The key model is MachiningToolHouse.
The model <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a> is delivered by the host GUI.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Tool House Page
<ul>
<li>Tool List Panel
The panel has CRUD (and Duplicate) of the tools. Read and Update the selected tool by the Selected Tool Editor Panel.
<ul>
<li>Head Line
<ul>
<li><a href="../widget/object-management-menu-button.html">Object Management Menu Button</a>
<ul>
<li>file extension is MachiningToolHouse</li>
<li>The pointed Editor Panel is Tool List</li>
</ul>
</li>
<li>Title Label</li>
</ul>
</li>
<li>Batch Action Menu
<ul>
<li>Select All Button</li>
<li>De-Select All Button</li>
<li>(splition bar)</li>
<li>Duplication Button</li>
<li>Remove Button</li>
</ul>
</li>
<li>Create Tool Button</li>
<li>Tool List
<ul>
<li>Selection Checkbox (for batch action)</li>
<li>Editable Tool ID TextField</li>
<li>Editable Note/Abstract TextField</li>
</ul>
</li>
</ul>
</li>
<li>Selected Tool Editor Panel
<ul>
<li><a href="stick-tool-panel/index.html">Stick Tool Panel</a></li>
</ul>
</li>
<li>Viewer Panel
<ul>
<li>Viewer ToolBar
<ul>
<li>Title Label</li>
<li><a href="../renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a></li>
<li>EditorDisplayee Options ToolBar
<ul>
<li>EditorDisplayee Options Menu Dropdown
<ul>
<li>Head Label: Cutter</li>
<li>Show Cutter CheckBox</li>
<li>(Options of <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutterEditorDisplayee.html">MillingCutterEditorDisplayee</a>)
<ul>
<li>Shape Mode SubMenu
Set <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutterEditorDisplayee.html#Hi_Milling_Cutters_MillingCutterEditorDisplayee_ShapeMode">ShapeMode</a> to Solid Bounding Shape if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is false on GUI initialization.
<ul>
<li>Solid Bounding Shape Ratio Button</li>
<li>Detail Physics Shape Ratio Button
Visible if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.</li>
</ul>
</li>
</ul>
</li>
<li>(spliter)</li>
<li>Head Label: Holder</li>
<li>Show Holder CheckBox</li>
<li>(Options of <a class="xref" href="../../../api/Hi.NcMech.Holders.HolderEditorDisplayee.html">HolderEditorDisplayee</a>)
<ul>
<li>Show Geometry Anchor CheckBox</li>
<li>Show Spindle Buckle CheckBox</li>
<li>Show Cutter Buckle CheckBox</li>
<li>Rendering Mode SubMenu
<ul>
<li>Solid CheckBox</li>
<li>Edge CheckBox</li>
<li>Hide CheckBox</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>RenderingCanvas
<ul>
<li>The <a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a> is <a class="xref" href="../../../api/Hi.Milling.MillingTools.MillingToolEditorDisplayee.html">MillingToolEditorDisplayee</a>.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<ul>
<li>Do not apply new window for tool creation. Assume the workflow is user create a default content tool and then user setup it in by the edit panel.</li>
<li>Add a resizable splition bar between Tool List Panel, Selected Tool Editor Panel and Viewer Panel.</li>
<li>The options of <a class="xref" href="../../../api/Hi.Milling.Cutters.MillingCutterEditorDisplayee.html">MillingCutterEditorDisplayee</a> and <a class="xref" href="../../../api/Hi.NcMech.Holders.HolderEditorDisplayee.html">HolderEditorDisplayee</a> is enabled only if the upper level options are enabled, i.e. <a class="xref" href="../../../api/Hi.Milling.MillingTools.MillingToolEditorDisplayee.html#Hi_Milling_MillingTools_MillingToolEditorDisplayee_ShowCutter">ShowCutter</a> and <a class="xref" href="../../../api/Hi.Milling.MillingTools.MillingToolEditorDisplayee.html#Hi_Milling_MillingTools_MillingToolEditorDisplayee_ShowHolder">ShowHolder</a>.</li>
<li>Use less layer of EditorDisplayee Options ToolBar for user convenient. Flatten the options of the children displayee except the ratio button group.</li>
</ul>
</div>
<p>The Tool ID can not be repeated. When create new tool, assign a new tool ID (maybe the largest ID plus 1).</p>
<p>When a tool is entered, call the renderingCanvas.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToHomeView">SetViewToHomeView()</a>.</p>
<h3 id="duplication-button">Duplication Button</h3>
<p>Use <a class="xref" href="../../../api/Hi.Milling.MillingTools.MillingTool.html#Hi_Milling_MillingTools_MillingTool_Duplicate_System_Object___">Duplicate(params object[])</a> to duplicate the tool.</p>
<h3 id="noteabstract-textfield">Note/Abstract TextField</h3>
<p>The Note/Abstract TextField shows note if note existed and is not empty string; otherwise it shows the <a class="xref" href="../../../api/Hi.Milling.MillingTools.MillingTool.html#Hi_Milling_MillingTools_MillingTool_AbstractNote">AbstractNote</a>. The tooltip is the abstract note.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/ToolHouse/ToolHousePage</li>
<li>Mech/ToolHouse/ToolHouseWindow</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/tool-house-page.js</li>
<li>Controller/Mech/MechController.cs</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,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Transformers GUI | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Transformers GUI | 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="transformers-gui">Transformers GUI</h1>
<p>Each <a href="../../../basic/mechanism/transformers/index.html">Transformers</a> has GUI component.</p>
<h2 id="transformer-manage-panel">Transformer Manage Panel</h2>
<p>Use Transformer Manage Panel to setup the <a class="xref" href="../../../../api/Hi.Mech.Topo.ITransformer.html">ITransformer</a>.</p>
<h3 id="layout">Layout</h3>
<ul>
<li>Transformer Manage Panel
<ul>
<li>Transformer Type Selection Bar</li>
<li>Transformer Content Panel (vary by the selected Transformer)</li>
</ul>
</li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p><a class="xref" href="../../../../api/Hi.Mech.Topo.GeneralTransform.html">GeneralTransform</a> control uses its own layout with direct API calls and &lt;xref:Hi.Vec3d&gt; components, instead of embedding <a class="xref" href="../../../../api/Hi.Mech.Topo.StaticRotation.html">StaticRotation</a> and <a class="xref" href="../../../../api/Hi.Mech.Topo.StaticTranslation.html">StaticTranslation</a> as sub-components. This avoids redundant title display when nested.</p>
</div>
<h3 id="transformer-type-selection-bar">Transformer Type Selection Bar</h3>
<p>Transformer Type Selection Bar get or set <a class="xref" href="../../../../api/Hi.Mech.Topo.ITransformer.html">ITransformer</a>.</p>
<p>The Transformer Type Selection Bar has code-behind option to choose what the transformer options to show.</p>
<p>If the original model (i.e. source model) transformer conflicts with the restricted transformers, show the model.</p>
<div class="TIP">
<h5>Tip</h5>
<p>Consider one line layout to save the space for the selection bar.</p>
</div>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/Topo/TransformerSelectPanel</li>
<li>Mech/Topo/StaticTranslationPanel</li>
<li>Mech/Topo/StaticFreeformPanel</li>
<li>Mech/Topo/DynamicTranslationPanel</li>
<li>Mech/Topo/DynamicRotationPanel</li>
<li>Mech/Topo/GeneralTransformPanel</li>
<li>Mech/Topo/TransformerDemoWindow</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/topo/transformer-select-panel.js</li>
<li>wwwroot/mech/topo/static-translation-control.js</li>
<li>wwwroot/mech/topo/static-rotation-control.js</li>
<li>wwwroot/mech/topo/static-freeform-control.js</li>
<li>wwwroot/mech/topo/dynamic-translation-control.js</li>
<li>wwwroot/mech/topo/dynamic-rotation-control.js</li>
<li>wwwroot/mech/topo/general-transform-control.js</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,284 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Workpiece Page | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Workpiece Page | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="workpiece-page">Workpiece Page</h1>
<p>The page triggers by <a href="../main-panel.html">Main Panel</a>.</p>
<p>The key model is <a class="xref" href="../../../api/Hi.NcMech.Workpieces.Workpiece.html">Workpiece</a> and <a class="xref" href="../../../api/Hi.NcMech.Workpieces.WorkpieceEditorDisplayeeConfig.html">WorkpieceEditorDisplayeeConfig</a>.
Which is assigned from the Main Panel's <a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_Workpiece">Workpiece</a>.</p>
<p><a class="xref" href="../../../api/Hi.NcMech.Fixtures.FixtureEditorDisplayeeConfig.html">FixtureEditorDisplayeeConfig</a> is from <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_UserConfig">UserConfig</a> which assigned from the parent component.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Workpiece Page
<ul>
<li>Management Panel
<ul>
<li>Head Line
<ul>
<li><a href="../widget/object-management-menu-button.html">Object Management Menu Button</a>
<ul>
<li>file extension is Workpiece</li>
<li>The pointed Editor Panel is Management Tabs Panel</li>
</ul>
</li>
<li>Title Label</li>
</ul>
</li>
<li>Management Tabs Panel
<ul>
<li>Raw Shape Tab
<ul>
<li>Raw Geometry Source DropDown (Common Geometry and Runtime Geometry are EXCLUSIVE)
<ul>
<li>Common Geometry
Apply <a href="../geom/geom-manage-control.html">Geometry Management Control</a></li>
<li>Runtime Geometry
Apply <a href="../geom/runtime-geom-panel.html">Runtime Geometry Panel</a></li>
</ul>
</li>
</ul>
</li>
<li>Target Shape Tab
<ul>
<li>Geometry Management Control</li>
</ul>
</li>
<li>Anchor Tab
<ul>
<li>Geom To Fixture Tab
<ul>
<li><a href="topo/transformers.html">Transformer Manage Panel</a></li>
</ul>
</li>
<li>Geom To Program-Zero Tab
<ul>
<li>Transformer Manage Panel</li>
</ul>
</li>
</ul>
</li>
<li>Runtime Tab
<ul>
<li>Initial Resolution Dropdown (powers of 2)
<ul>
<li>0.0009765625</li>
<li>0.001953125</li>
<li>0.00390625</li>
<li>0.0078125</li>
<li>0.015625</li>
<li>0.03125</li>
<li>0.0625</li>
<li>0.125</li>
<li>0.25</li>
<li>0.5</li>
<li>1</li>
<li>2</li>
<li>4</li>
<li>8</li>
<li>16</li>
</ul>
</li>
</ul>
</li>
<li>Material Tab
Visible if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.
<ul>
<li>Workpiece Material File Selector
<ul>
<li>Browse Button
The initial directory is the project directory.</li>
<li>Browse Resource Button
The directory is the Default Resource directory.</li>
<li>Readonly File Path TextBox</li>
<li>Readonly Name TextBox (<a class="xref" href="../../../api/Hi.Common.INameNote.html#Hi_Common_INameNote_Name">Name</a>)
<ul>
<li>ToolTip: <a class="xref" href="../../../api/Hi.Common.INameNote.html#Hi_Common_INameNote_Note">Note</a></li>
</ul>
</li>
</ul>
</li>
<li>Cutting Parameter File Selector
<ul>
<li>Browse Button
The initial directory is the project directory.</li>
<li>Browse Resource Button
The directory is the Default Resource directory.</li>
<li>Readonly File Path TextBox</li>
<li>Readonly Name TextBox (<a class="xref" href="../../../api/Hi.Common.INameNote.html#Hi_Common_INameNote_Name">Name</a>)
<ul>
<li>ToolTip: <a class="xref" href="../../../api/Hi.Common.INameNote.html#Hi_Common_INameNote_Note">Note</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Viewer Panel
<ul>
<li>Viewer ToolBar
<ul>
<li><a href="../renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a></li>
<li>SetupDisplayee Options ToolBar
<ul>
<li>Options of <a class="xref" href="../../../api/Hi.NcMech.Workpieces.WorkpieceEditorDisplayee.html">WorkpieceEditorDisplayee</a></li>
</ul>
</li>
</ul>
</li>
<li>RenderingCanvas
<ul>
<li>The <a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a> is <a class="xref" href="../../../api/Hi.NcMech.Workpieces.WorkpieceEditorDisplayee.html">WorkpieceEditorDisplayee</a> (Apply the model <a class="xref" href="../../../api/Hi.NcMech.Workpieces.WorkpieceEditorDisplayeeConfig.html">WorkpieceEditorDisplayeeConfig</a>).</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>Add a resizable splition bar between Manage Panel and Viewer Panel.</p>
</div>
<h2 id="default-resource">Default Resource</h2>
<p>The default resources of Workpiece Material and Cutting Parameter exist in <code>Resource</code> folder under application folder (Not project folder). Set the default folder of the File Selector to the <code>Resource</code> sub folder:</p>
<ul>
<li>&ldquo;Resource/WorkpieceMaterial&rdquo;</li>
<li>&ldquo;Resource/CuttingParameter&rdquo;</li>
</ul>
<h2 id="behavior">Behavior</h2>
<ul>
<li><p>Call <a class="xref" href="../../../api/Hi.NcMech.Workpieces.WorkpieceEditorDisplayee.html">WorkpieceEditorDisplayee</a>.<a class="xref" href="../../../api/Hi.NcMech.Workpieces.WorkpieceEditorDisplayee.html#Hi_NcMech_Workpieces_WorkpieceEditorDisplayee_ClearRawGeomCache">ClearRawGeomCache()</a> on Raw Shape set or changed.</p>
</li>
<li><p>Call <a class="xref" href="../../../api/Hi.NcMech.Workpieces.WorkpieceEditorDisplayee.html">WorkpieceEditorDisplayee</a>.<a class="xref" href="../../../api/Hi.NcMech.Workpieces.WorkpieceEditorDisplayee.html#Hi_NcMech_Workpieces_WorkpieceEditorDisplayee_ClearIdealGeomCache">ClearIdealGeomCache()</a> on Target Shape set or changed.</p>
</li>
<li><p>Call RenderCanvas.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToIsometricView">SetViewToIsometricView()</a> on Raw Shape set or Target Shape set. (Since the assumption of the shape set raise larger viewer changed than content changed, only adjust view of the setter event.)</p>
</li>
<li><p>Keep <a href="../widget/gui-file-path-assignment.html#portability">Portability</a> of the Material properties.</p>
</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mech/Workpieces/WorkpiecePage</li>
<li>Mech/Workpieces/WorkpieceWindow</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mech/workpiece-page.js</li>
<li>Controller/Mech/MechController.cs</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,183 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Message Section | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Message Section | 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="message-section">Message Section</h1>
<p>The Message Section displays application messages and logs at the bottom of the Main Panel.</p>
<h2 id="message-handling">Message Handling</h2>
<p>The Message Section is connected to <a class="xref" href="../../api/Hi.Common.Messages.MessageHost.html">MessageHost</a>.<a class="xref" href="../../api/Hi.Common.Messages.MessageHost.html#Hi_Common_Messages_MessageHost_Default">Default</a> through the <code>OnAdding</code> event. When a message is added:</p>
<ol>
<li>The <code>Brief Message Text Field</code> content is updated</li>
<li>The message is appended to the daily log file at <code>logs/log-{DateTime.Now:yyyy-MM-dd}.txt</code></li>
</ol>
<h3 id="message-types">Message Types</h3>
<p>The <a class="xref" href="../../api/Hi.Common.Messages.MessageFlag.html">MessageFlag</a> determines the display behavior:</p>
<table>
<thead>
<tr>
<th>Flag</th>
<th>Display Behavior</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../../api/Hi.Common.Messages.MessageFlag.html#Hi_Common_Messages_MessageFlag_Exception">Exception</a></td>
<td>Alert style, shown in Message Section</td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.Common.Messages.MessageFlag.html#Hi_Common_Messages_MessageFlag_Warning">Warning</a> and above</td>
<td>Shown in Message Section</td>
</tr>
<tr>
<td><a class="xref" href="../../api/Hi.Common.Messages.MessageFlag.html#Hi_Common_Messages_MessageFlag_Info">Info</a> and below</td>
<td>Logged only, not shown in Message Section</td>
</tr>
</tbody>
</table>
<div class="NOTE">
<h5>Note</h5>
<p>When the message is an <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.exception">Exception</a>, the brief message shows <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.exception.message">Message</a> while the full exception details are logged to file.</p>
</div>
<h2 id="platform-specific-layouts">Platform-Specific Layouts</h2>
<h3 id="wpf-application">WPF Application</h3>
<p>The WPF version uses a fixed bottom bar:</p>
<ul>
<li><strong>Message Section Bottom Bar</strong>
<ul>
<li>Brief Message Text Field (selectable for copy)</li>
<li>Show Log Button</li>
</ul>
</li>
</ul>
<h3 id="web-application">Web Application</h3>
<p>The Web version uses Bootstrap-style stacking toasts:</p>
<ul>
<li><strong>Message Section Stacking Toast</strong>
<ul>
<li>Brief Message Text Field</li>
<li>Auto-hide enabled only for low-priority messages</li>
</ul>
</li>
</ul>
<h4 id="log-page">Log Page</h4>
<p>The Log Page provides access to daily logs:</p>
<ul>
<li><strong>Header</strong>: Log Label, Refresh Button, Download Button</li>
<li><strong>Content</strong>: Log TextArea</li>
</ul>
<h2 id="show-log-button">Show Log Button</h2>
<p>The Show Log Button opens a modal or editor view displaying the current day's log content.</p>
<div class="NOTE">
<h5>Note</h5>
<p>The log file may not exist if no messages have been recorded yet.</p>
</div>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,258 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>List Command Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="List Command Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="list-command-panel">List Command Panel</h1>
<p>The key model is <a class="xref" href="../../../api/Hi.ShellCommands.ListCommand.html">ListCommand</a>.</p>
<ul>
<li>Assistant Model
<ul>
<li><a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></li>
<li><a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a></li>
</ul>
</li>
</ul>
<h2 id="layout">Layout</h2>
<ul>
<li>Columns Layout (Two column with one splition bar)
<ul>
<li>Command Entry List Panel
Provide entrys for selection
The model is <a class="xref" href="../../../api/Hi.ShellCommands.ListCommand.html#Hi_ShellCommands_ListCommand_CommandEntryList">CommandEntryList</a>.
<ul>
<li>Head Line
<ul>
<li>Add Command Dropdown Button
(Note that Dropdown is not combobox.)
<ul>
<li>Buttons for adding:
<ul>
<li><a class="xref" href="../../../api/Hi.ShellCommands.PreSettingCommand.html">PreSettingCommand</a>
<ul>
<li>Content Panel: <a href="PreSettingCommand-panel.html">PreSetting Command Panel</a></li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p>This command sets up initial parameters before NC simulation which attempt to take the effect.</p>
</div>
</li>
<li><a class="xref" href="../../../api/Hi.ShellCommands.NcOptOptionCommand.html">NcOptOptionCommand</a>
<ul>
<li>Content Panel: <a href="NcOptOption-panel.html">NcOptOption Panel</a></li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p>This command is also a type of pre-setting that should be applied before NC simulation which attempt to take the effect.</p>
</div>
</li>
<li><a class="xref" href="../../../api/Hi.ShellCommands.NcFileCommand.html">NcFileCommand</a>
<ul>
<li>Content Panel: <a href="NcFileCommand-panel.html">NcFile Command Panel</a></li>
</ul>
</li>
<li><a class="xref" href="../../../api/Hi.ShellCommands.NcCodeCommand.html">NcCodeCommand</a></li>
<li><a class="xref" href="../../../api/Hi.ShellCommands.ScriptCommand.html">ScriptCommand</a>
<ul>
<li>Content Panel: <a href="script-command-panel.html">Script Command Panel</a></li>
</ul>
</li>
<li><a class="xref" href="../../../api/Hi.ShellCommands.PostExecutionCommand.html">PostExecutionCommand</a>
<ul>
<li>Content Panel: <a href="PostExecutionCommand-panel.html">PostExecution Command Panel</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Remove Command Button</li>
<li>Move Up Command Button</li>
<li>Move Down Command Button</li>
</ul>
</li>
<li>Command Entrys Selection Panel
<ul>
<li>(Each) Command Entry Box:
The boxes are multi-selectable for re-order, remove and etc..
The boxes are draggable for re-order.
<ul>
<li>Enable CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.EnablingWrapper.html#Hi_ShellCommands_EnablingWrapper_IsEnabled">IsEnabled</a>.</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>Show the label text.</p>
</div>
</li>
<li>Title Label
<ul>
<li>Apply <a class="xref" href="../../../api/Hi.ShellCommands.ITitleCommand.html#Hi_ShellCommands_ITitleCommand_GetCommandTitle_">GetCommandTitle</a> if the command is inherited from <a class="xref" href="../../../api/Hi.ShellCommands.ITitleCommand.html">ITitleCommand</a>; otherwise, show the class name.</li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>Apply style changed if the entry is selected.</p>
</div>
<ul>
<li>If there is only one <a class="xref" href="../../../api/Hi.ShellCommands.PreSettingCommand.html">PreSettingCommand</a> in the list and at the begining, Keep it at begining when items adding, shows a &ldquo;pin at begining&rdquo; label with a pin icon.</li>
<li>If there is only one <a class="xref" href="../../../api/Hi.ShellCommands.PostExecutionCommand.html">PostExecutionCommand</a> in the list and at the end, Keep it at end when items adding, shows a &ldquo;pin at end&rdquo; label a pin icon.</li>
</ul>
</li>
</ul>
</li>
<li>Support file drag from the external application (such as file explorer), files drag into the Command Entrys List Panel is equivalent to create <a class="xref" href="../../../api/Hi.ShellCommands.NcFileCommand.html">NcFileCommand</a>s (with the <a class="xref" href="../../../api/Hi.ShellCommands.EnablingWrapper.html">EnablingWrapper</a>) and set the file into the NC File Command.</li>
</ul>
</li>
<li>Vertical Splition Bar
<ul>
<li>The bar can be drag to tune the width.</li>
</ul>
</li>
<li>Selected Command Content Panel
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.EnablingWrapper.html#Hi_ShellCommands_EnablingWrapper_Command">Command</a>.</li>
<li>The panel is based on command type</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>The width of the entry block should expand to fulfill the content block.</p>
</div>
</li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>Use Disabled Style for command panels if the Enable checkbox is not checked.</p>
</div>
<div class="NOTE">
<h5>Note</h5>
<p>Each command entry can be individually enabled or disabled without removing it from the list.</p>
</div>
<h2 id="features">Features</h2>
<p>Update the Title Label if the Command is updated by the Command Content Panel.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mission/ListCommandPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mission/panels/list-command-panel.html (Component HTML)</li>
<li>wwwroot/mission/panels/list-command-panel.css (Component styles)</li>
<li>wwwroot/mission/panels/list-command-panel.js (JavaScript component with full ListCommand logic)</li>
<li>Controller/MissionController.cs (REST API - ListCommand CRUD operations)</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,160 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>NcCodeCommand Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="NcCodeCommand Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="nccodecommand-panel">NcCodeCommand Panel</h1>
<p>The key model is <a class="xref" href="../../../api/Hi.ShellCommands.NcCodeCommand.html">NcCodeCommand</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Head Line
<ul>
<li>NC Code Label</li>
</ul>
</li>
<li>NC Code Editor Area
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.NcCodeCommand.html#Hi_ShellCommands_NcCodeCommand_NcText">NcText</a>.</li>
<li>Multi-line text editor for NC code input</li>
<li>Monospace font for better code readability</li>
<li>Line numbers display (optional)</li>
</ul>
</li>
</ul>
<h2 id="features">Features</h2>
<ul>
<li>Direct NC code input without file</li>
<li>Syntax highlighting for NC code (optional)</li>
<li>Real-time validation (optional)</li>
<li>Code statistics (line count, character count)</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>The NC Code editor should expand to fill available space in the panel.</p>
</div>
<div class="NOTE">
<h5>Note</h5>
<p>Unlike NcFileCommand, this command stores the NC code directly in memory.</p>
</div>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mission/NcCodeCommandPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mission/panels/nccode-command-panel.html (Component HTML)</li>
<li>wwwroot/mission/panels/nccode-command-panel.css (Component styles)</li>
<li>wwwroot/mission/panels/nccode-command-panel.js (JavaScript component)</li>
<li>Controller/MissionController.cs (REST API - NcCode command endpoints)</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,180 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>NcFileCommand Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="NcFileCommand Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="ncfilecommand-panel">NcFileCommand Panel</h1>
<p>The key model is <a class="xref" href="../../../api/Hi.ShellCommands.NcFileCommand.html">NcFileCommand</a>.</p>
<ul>
<li>Other Model: string BaseDirectory.</li>
</ul>
<h2 id="layout">Layout</h2>
<ul>
<li>NcFileCommand Panel
<ul>
<li>Head Line
<ul>
<li>NC File Setting
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.NcFileCommand.html#Hi_ShellCommands_NcFileCommand_NcFile">NcFile</a>.</li>
<li>NC File Label</li>
<li>NC File Text Field
<ul>
<li>About 20 charactor width</li>
</ul>
</li>
<li>Load File Browser Button
<ul>
<li>Apply universal file filter for the NC files.
Since NC File has too many extensions, such as but not limits to: nc, h, mpf, ptp.</li>
<li>Follow the <a href="../widget/gui-file-path-assignment.html">Load Pattern</a>.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>NC File Editor
The editor only available for text file.
If the file lines within 20000 line, enable the NC File Editor;
Otherwise, just preview the first 20000 line of the file and show the message to the Head Message Place.
Auto-Save the file if the content changed.
<ul>
<li>Head Message Place
<ul>
<li>Show the error or exception of the File.</li>
</ul>
</li>
<li>NC Code TextArea</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>Fix the height of NC Code TextArea to the panel bottom.
Set NC Code TextArea height resizable.</p>
</div>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mission/NcFileCommandPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mission/panels/ncfile-command-panel.html (Component HTML)</li>
<li>wwwroot/mission/panels/ncfile-command-panel.css (Component styles)</li>
<li>wwwroot/mission/panels/ncfile-command-panel.js (JavaScript component)</li>
<li>Controller/MissionController.cs (REST API - NcFile command endpoints)</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,245 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>NC Optimization Option Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="NC Optimization Option Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="nc-optimization-option-panel">NC Optimization Option Panel</h1>
<p>Key model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html">NcOptOption</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li><p>General Optimization Section</p>
<ul>
<li>Enable Optimization CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_EnableOpt">EnableOpt</a>.</li>
</ul>
</li>
<li>Enable Feedrate Optimization CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_EnableOptFeedrate">EnableOptFeedrate</a>.</li>
</ul>
</li>
<li>Enable Depth Splitting CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_EnableDepthSplition">EnableDepthSplition</a>.</li>
</ul>
</li>
<li>Enable Interpolation CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_EnableInterpolation">EnableInterpolation</a>.</li>
</ul>
</li>
</ul>
</li>
<li><p>Distance Settings Section</p>
<ul>
<li>Extended Pre-Distance Floating Number Field (with Unit)
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_ExtendedPreDistance_mm">ExtendedPreDistance_mm</a>.</li>
</ul>
</li>
<li>Extended Post-Distance Floating Number Field (with Unit)
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_ExtendedPostDistance_mm">ExtendedPostDistance_mm</a>.</li>
</ul>
</li>
</ul>
</li>
<li><p>Feedrate Limits Section</p>
<ul>
<li>Minimum Feedrate Floating Number Field (with Unit)
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_MinFeedrate_mmdmin">MinFeedrate_mmdmin</a>.</li>
</ul>
</li>
<li>Maximum Feedrate Floating Number Field (with Unit)
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_MaxFeedrate_mmdmin">MaxFeedrate_mmdmin</a>.</li>
</ul>
</li>
<li>Rapid Feed Floating Number Field (with Unit)
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_RapidFeed_mmdmin">RapidFeed_mmdmin</a>.</li>
</ul>
</li>
</ul>
</li>
<li><p>Motion Dynamics Section</p>
<ul>
<li>Maximum Acceleration Floating Number Field (with Unit)
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_MaxAcceleration_mmds2">MaxAcceleration_mmds2</a>.</li>
</ul>
</li>
<li>Maximum Jerk Floating Number Field (with Unit)
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_MaxJerk_mmds3">MaxJerk_mmds3</a>.</li>
</ul>
</li>
</ul>
</li>
<li><p>Force and Safety Section</p>
<ul>
<li>Preferred Force Floating Number Field (with Unit)
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_PreferedForce_N">PreferedForce_N</a>.</li>
</ul>
</li>
<li>Spindle Torque Safety Factor Floating Number Field
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_SpindleTorqueSafetyFactor">SpindleTorqueSafetyFactor</a>.</li>
</ul>
</li>
<li>Spindle Power Safety Factor Floating Number Field
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_SpindlePowerSafetyFactor">SpindlePowerSafetyFactor</a>.</li>
</ul>
</li>
</ul>
</li>
<li><p>Compensation Section</p>
<ul>
<li>Enable Forward Compensation CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_EnableForwardCompensation">EnableForwardCompensation</a>.</li>
</ul>
</li>
<li>Enable Side Compensation CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_EnableSideCompensation">EnableSideCompensation</a>.</li>
</ul>
</li>
<li>Enable Depth Compensation CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.NcOpt.NcOptOption.html#Hi_NcOpt_NcOptOption_EnableDepthCompensation">EnableDepthCompensation</a>.</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>Use XmlConvert.ToDouble and FromDouble to parse the <code>double</code> value for dealing with the inf value.</p>
</div>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>NcOpt/NcOptOptionPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mission/panels/ncoptoption-command-panel.html (Component HTML)</li>
<li>wwwroot/mission/panels/ncoptoption-command-panel.css (Component styles)</li>
<li>wwwroot/mission/panels/ncoptoption-command-panel.js (JavaScript component)</li>
<li>Controller/MissionController.cs (REST API - NcOptOption command endpoints)</li>
</ul>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,215 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PostExecutionCommand Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="PostExecutionCommand Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="postexecutioncommand-panel">PostExecutionCommand Panel</h1>
<ul>
<li>Key Model
<ul>
<li><a class="xref" href="../../../api/Hi.ShellCommands.PostExecutionCommand.html">PostExecutionCommand</a></li>
</ul>
</li>
<li>Assistant Model
<ul>
<li><a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></li>
<li><a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a></li>
</ul>
</li>
</ul>
<h2 id="layout">Layout</h2>
<ul>
<li>Output Step Files Section
<ul>
<li>Enable Write Step Files CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PostExecutionCommand.html#Hi_ShellCommands_PostExecutionCommand_EnableWriteStepFiles">EnableWriteStepFiles</a>.</li>
</ul>
</li>
<li>Step File Template Label</li>
<li>Step File Template Text Field
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PostExecutionCommand.html#Hi_ShellCommands_PostExecutionCommand_StepFileTemplate">StepFileTemplate</a>.</li>
<li>Default value: &ldquo;Output/[NcName].step.csv&rdquo;</li>
</ul>
</li>
<li>Apply one line layout to the label and the text field.</li>
</ul>
</li>
<li>Output Shot Files Section
Visible if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.
<ul>
<li>Enable Write Shot Files CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PostExecutionCommand.html#Hi_ShellCommands_PostExecutionCommand_EnableWriteShotFiles">EnableWriteShotFiles</a>.</li>
</ul>
</li>
<li>Shot File Template Text Field
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PostExecutionCommand.html#Hi_ShellCommands_PostExecutionCommand_ShotFileTemplate">ShotFileTemplate</a>.</li>
<li>Default value: <code>Output/[NcName].shot.csv</code></li>
</ul>
</li>
<li>Shot File Time Resolution (ms) Number Field
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PostExecutionCommand.html#Hi_ShellCommands_PostExecutionCommand_ShotFileTimeResolution_ms">ShotFileTimeResolution_ms</a>.</li>
<li>Default value: 1</li>
</ul>
</li>
</ul>
</li>
<li>Optimization Files Section
Visible if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_EnablePhysics">EnablePhysics</a> is true.
<ul>
<li>Enable Optimize To Files CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PostExecutionCommand.html#Hi_ShellCommands_PostExecutionCommand_EnableOptimizeToFiles">EnableOptimizeToFiles</a>.</li>
</ul>
</li>
<li>Optimization File Template Text Field
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PostExecutionCommand.html#Hi_ShellCommands_PostExecutionCommand_OptimizationFileTemplate">OptimizationFileTemplate</a>.</li>
<li>Default value: &ldquo;Output/Opt-[NcName]&rdquo;</li>
</ul>
</li>
</ul>
</li>
<li>Geometry Difference Section
<ul>
<li>Enable Geom Diff CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PostExecutionCommand.html#Hi_ShellCommands_PostExecutionCommand_EnableGeomDiff">EnableGeomDiff</a>.</li>
</ul>
</li>
<li>Geom Diff Detect Radius Number Field (with Unit)
<ul>
<li>One Line layout</li>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PostExecutionCommand.html#Hi_ShellCommands_PostExecutionCommand_GeomDiffDetectRadius_mm">GeomDiffDetectRadius_mm</a>.</li>
<li>Default value: 1</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mission/PostExecutionCommandPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mission/panels/postexecution-command-panel.html (Component HTML)</li>
<li>wwwroot/mission/panels/postexecution-command-panel.css (Component styles)</li>
<li>wwwroot/mission/panels/postexecution-command-panel.js (JavaScript component)</li>
<li>Controller/MissionController.cs (REST API - PostExecution command endpoints)</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,213 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PreSettingCommand Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="PreSettingCommand Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="presettingcommand-panel">PreSettingCommand Panel</h1>
<ul>
<li>Key Model
<ul>
<li><a class="xref" href="../../../api/Hi.ShellCommands.PreSettingCommand.html">PreSettingCommand</a></li>
</ul>
</li>
<li>Assistant Model
<ul>
<li><a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></li>
<li><a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a></li>
</ul>
</li>
</ul>
<h2 id="layout">Layout</h2>
<ul>
<li>Machining Resolution Label (with Unit)</li>
<li>Machining Resolution ComboBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PreSettingCommand.html#Hi_ShellCommands_PreSettingCommand_MachiningResolution_mm">MachiningResolution_mm</a>.</li>
<li>Default value: 0.125</li>
<li>Options (powers of 2)
<ul>
<li>0.0009765625</li>
<li>0.001953125</li>
<li>0.00390625</li>
<li>0.0078125</li>
<li>0.015625</li>
<li>0.03125</li>
<li>0.0625</li>
<li>0.125</li>
<li>0.25</li>
<li>0.5</li>
<li>1</li>
<li>2</li>
<li>4</li>
<li>8</li>
<li>16</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p>The Machining Resolution is initialized from workpiece's InitResolution if available.</p>
</div>
<ul>
<li><p>Machining Motion Resolution Setting</p>
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PreSettingCommand.html#Hi_ShellCommands_PreSettingCommand_MachiningMotionResolution">MachiningMotionResolution</a>.</li>
<li>Motion Resolution Label</li>
<li>Type ComboBox (Feed Per Cycle, Feed Per Tooth, Fixed)</li>
</ul>
</li>
<li><p>FixedMachiningMotionResolution Section
If <a class="xref" href="../../../api/Hi.ShellCommands.PreSettingCommand.html#Hi_ShellCommands_PreSettingCommand_MachiningMotionResolution">MachiningMotionResolution</a> is <a class="xref" href="../../../api/Hi.Numerical.MachiningMotionResolutionUtils.FixedMachiningMotionResolution.html">FixedMachiningMotionResolution</a>, show the panel.</p>
<ul>
<li>Linear Resolution Label (with Unit)</li>
<li>Linear Resolution Number Input Field</li>
<li>Angle Resolution Label (with Unit)</li>
<li>Angle Resolution Number Input Field</li>
</ul>
</li>
<li><p>Detection Settings Setting</p>
<ul>
<li>Enable Collision Detection CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PreSettingCommand.html#Hi_ShellCommands_PreSettingCommand_EnableCollisionDetection">EnableCollisionDetection</a>.</li>
<li>Default value: true</li>
</ul>
</li>
<li>Enable Pause On Failure CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PreSettingCommand.html#Hi_ShellCommands_PreSettingCommand_EnablePauseOnFailure">EnablePauseOnFailure</a>.</li>
<li>Default value: false</li>
</ul>
</li>
</ul>
</li>
<li><p>Enable Physics CheckBox</p>
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.PreSettingCommand.html#Hi_ShellCommands_PreSettingCommand_EnablePhysics">EnablePhysics</a>.</li>
</ul>
</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mission/PreSettingCommandPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mission/panels/presetting-command-panel.html (Component HTML)</li>
<li>wwwroot/mission/panels/presetting-command-panel.css (Component styles)</li>
<li>wwwroot/mission/panels/presetting-command-panel.js (JavaScript component)</li>
<li>Controller/MissionController.cs (REST API - PreSetting command endpoints)</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,246 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Classic Session Command Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Classic Session Command Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="classic-session-command-panel">Classic Session Command Panel</h1>
<p>The key model is <a class="xref" href="../../../api/Hi.ShellCommands.SimpleSessionCommand.html">SimpleSessionCommand</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Head Line
<ul>
<li><a href="../widget/object-management-menu-button.html">Object Management Menu Button</a>
<ul>
<li>file extension is ShellCommand</li>
<li>The pointed Editor Panel is Session Management Panel</li>
</ul>
</li>
</ul>
</li>
<li>Title Label</li>
<li>Session Management Panel
<ul>
<li>NC/Command List Tab
<ul>
<li>Shell Commands ListBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.SimpleSessionCommand.html#Hi_ShellCommands_SimpleSessionCommand_NcCommandList">NcCommandList</a>.</li>
<li>Support add, remove, reorder commands.</li>
<li>The items are multi-selectable.</li>
<li>Support file drag from the external application (such as file explorer), files drag into the Shell Commands List is equivalent to create <a class="xref" href="../../../api/Hi.ShellCommands.NcFileCommand.html">NcFileCommand</a>s.</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>don't use file filter to the drag behavior</p>
</div>
<ul>
<li>On each NC File Command:
<ul>
<li>Only one line for each entry.</li>
<li>Batch Selection CheckBox with &lsquo;Select&rsquo; Text Label</li>
<li><a href="NcFileCommand-panel.html">NC File Command Panel</a>.</li>
</ul>
</li>
<li>The horizontal auto scroll bar is required.</li>
</ul>
</li>
</ul>
</li>
<li>Output Tab
<ul>
<li>Output Shot Files Tab
<ul>
<li>Enable Write Shot Files CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.SimpleSessionCommand.html#Hi_ShellCommands_SimpleSessionCommand_EnableWriteShotFiles">EnableWriteShotFiles</a>.</li>
</ul>
</li>
<li>Shot File Template Text Field
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.SimpleSessionCommand.html#Hi_ShellCommands_SimpleSessionCommand_ShotFileTemplate">ShotFileTemplate</a>.</li>
<li>Default value: <code>Output/[NcName].shot.csv</code></li>
</ul>
</li>
<li>Shot File Time Resolution (ms) Number Field
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.SimpleSessionCommand.html#Hi_ShellCommands_SimpleSessionCommand_ShotFileTimeResolution_ms">ShotFileTimeResolution_ms</a>.</li>
<li>Default value: 1</li>
</ul>
</li>
</ul>
</li>
<li>Output Step Files Tab
<ul>
<li>Enable Write Step Files CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.SimpleSessionCommand.html#Hi_ShellCommands_SimpleSessionCommand_EnableWriteStepFiles">EnableWriteStepFiles</a>.</li>
</ul>
</li>
<li>Step File Template Label</li>
<li>Step File Template Text Field
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.SimpleSessionCommand.html#Hi_ShellCommands_SimpleSessionCommand_StepFileTemplate">StepFileTemplate</a>.</li>
<li>Default value: &ldquo;Output/[NcName].step.csv&rdquo;</li>
</ul>
</li>
<li>Apply one line layout to the label and the text field.</li>
</ul>
</li>
<li>Optimization Files Tab
<ul>
<li>Enable Optimize To Files CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.SimpleSessionCommand.html#Hi_ShellCommands_SimpleSessionCommand_EnableOptimizeToFiles">EnableOptimizeToFiles</a>.</li>
</ul>
</li>
<li>Optimization File Template Text Field
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.SimpleSessionCommand.html#Hi_ShellCommands_SimpleSessionCommand_OptimizationFileTemplate">OptimizationFileTemplate</a>.</li>
<li>Default value: &ldquo;Output/Opt-[NcName]&rdquo;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Geometry Difference Tab
<ul>
<li>Enable Geom Diff CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.SimpleSessionCommand.html#Hi_ShellCommands_SimpleSessionCommand_EnableGeomDiff">EnableGeomDiff</a>.</li>
</ul>
</li>
<li>Geom Diff Detect Radius (mm) Number Field
<ul>
<li>One Line layout</li>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.SimpleSessionCommand.html#Hi_ShellCommands_SimpleSessionCommand_GeomDiffDetectRadius_mm">GeomDiffDetectRadius_mm</a>.</li>
<li>Default value: 1</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>Use Disabled Style if the section key checkbox is not checked.</p>
</div>
<div class="TIP">
<h5>Tip</h5>
<p>The file templates support placeholder <code>[NcName]</code> which will be replaced with actual NC program name.</p>
</div>
<h2 id="wpf-application-source-code-path">WPF Application Source Code Path</h2>
<ul>
<li>Mission/SimpleSessionCommandPanel</li>
</ul>
<p>see <a href="../index.html">this page</a> for git repository.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,178 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Mission Page | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Mission Page | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="mission-page">Mission Page</h1>
<p>The Mission Page manages machining mission commands and execution settings.</p>
<h2 id="key-models">Key Models</h2>
<ul>
<li><strong>Primary</strong>: <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProject.html#Hi_MachiningProcs_MachiningProject_PlayerCommand">PlayerCommand</a></li>
<li><strong>Supporting</strong>:
<ul>
<li><a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></li>
<li><a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a></li>
</ul>
</li>
</ul>
<h2 id="layout">Layout</h2>
<ul>
<li>Mission Page
<ul>
<li>Head Line
<ul>
<li><a href="../widget/object-management-menu-button.html">Object Management Menu Button</a>
<ul>
<li>file extension is ShellCommand</li>
<li>The pointed Editor Panel is Mission Edit Panel</li>
</ul>
</li>
<li>Mission Type Selection Section
<ul>
<li>Mission Type Label</li>
<li>Mission Type ComboBox</li>
</ul>
</li>
</ul>
</li>
<li>Mission Edit Panel
<ul>
<li>Content depends on the Mission Type Selection.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="mission-type-selection-combobox">Mission Type Selection ComboBox</h2>
<p>The options:</p>
<ul>
<li><a href="script-command-panel.html">Script Command Panel</a> for <a class="xref" href="../../../api/Hi.ShellCommands.ScriptCommand.html">ScriptCommand</a>.</li>
<li><a href="ListCommand-panel.html">List Command Panel</a> for <a class="xref" href="../../../api/Hi.ShellCommands.ListCommand.html">ListCommand</a>.</li>
</ul>
<h2 id="source-code-locations">Source Code Locations</h2>
<p>See <a href="../index.html">HiNC GUI Architecture</a> for git repository links.</p>
<div class="TIP">
<h5>Tip</h5>
<p><strong>Implementation Order</strong>: When building a new Mission Page, create the page window/panel first, then implement the command panels (List Command Panel, Script Command Panel).</p>
</div>
<h3 id="wpf-application">WPF Application</h3>
<ul>
<li><code>Mission/MissionWindow</code></li>
<li><code>Mission/MissionPanel</code></li>
</ul>
<h3 id="web-application">Web Application</h3>
<ul>
<li><code>wwwroot/mission/mission-panel.html</code> - Main panel HTML</li>
<li><code>wwwroot/mission/mission-panel.css</code> - Styles</li>
<li><code>wwwroot/mission/mission-panel.js</code> - JavaScript component</li>
<li><code>Controller/MissionController.cs</code> - REST API endpoints</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,143 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Script Command Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Script Command Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="script-command-panel">Script Command Panel</h1>
<p>The key model is <a class="xref" href="../../../api/Hi.ShellCommands.ScriptCommand.html">ScriptCommand</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Head Line
<ul>
<li>Script Title Label</li>
<li>Script Title Text Field</li>
</ul>
</li>
<li>C# Rich Text Editor Area
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.ShellCommands.ScriptCommand.html#Hi_ShellCommands_ScriptCommand_ScriptText">ScriptText</a>.</li>
</ul>
</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Mission/ScriptCommandPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/mission/panels/script-command-panel.html (Component HTML)</li>
<li>wwwroot/mission/panels/script-command-panel.css (Component styles)</li>
<li>wwwroot/mission/panels/script-command-panel.js (JavaScript component with Ace.js integration)</li>
<li>Controller/MissionController.cs (REST API - Script command endpoints)</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,196 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Player Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Player Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="player-panel">Player Panel</h1>
<p>The Player Panel is the primary visualization component for machining simulation playback.</p>
<h2 id="key-models">Key Models</h2>
<ul>
<li><a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> - Project data service</li>
<li><a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a> - User service</li>
</ul>
<h2 id="associated-tool-bars">Associated Tool Bars</h2>
<ul>
<li><a href="player-tool-bar.html">Player Tool Bar</a></li>
<li><a href="../renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a></li>
<li><a href="player-extended-renderingcanvas-tool-bar.html">Player extended RenderingCanvas Tool Bar</a></li>
</ul>
<h2 id="layout-structure">Layout Structure</h2>
<p>The Player Panel consists of:</p>
<ul>
<li><strong>Central Area</strong>: <a href="../../basic/rendering/rendering-canvas/index.html">RenderingCanvas</a> for 3D visualization</li>
<li><strong>Vertical Splitter</strong>: Draggable bar to resize widths</li>
<li><strong>Side Panel</strong>:
<ul>
<li>Upper: <a href="selected-step-info-panel.html">Selected-Step Info Panel</a></li>
<li>Horizontal Splitter: Draggable bar to resize heights</li>
<li>Lower: <a href="../session-message-panel/index.html">Session Message Panel</a></li>
</ul>
</li>
</ul>
<h2 id="default-panel-configuration">Default Panel Configuration</h2>
<p>The Player Panel is set as the default panel on the <code>Page Panel</code> when the main window opens. The associated toolbars (Player Tool Bar, RenderingCanvas Tool Bar, Player Extended RenderingCanvas Tool Bar) are also configured accordingly.</p>
<h2 id="player-extended-renderingcanvas-tool-bar-behavior">Player Extended RenderingCanvas Tool Bar Behavior</h2>
<p>The <a href="player-extended-renderingcanvas-tool-bar.html">Player Extended RenderingCanvas Tool Bar</a> provides additional controls:</p>
<ul>
<li><a href="player-extended-renderingcanvas-tool-bar.html#behavior-of-cl-strip-buttons-and-fit-view-button">CL Strip Buttons and Fit View Button</a> - Controls for CL strip display and view fitting</li>
<li><a href="player-extended-renderingcanvas-tool-bar.html#behavior-of-project-rendering-items-dropdown">Project Rendering Items DropDown</a> - Selection of rendering items</li>
</ul>
<p>The toolbar receives notifications when the project is changed from <a href="../main-panel.html">Main Panel</a>.</p>
<h2 id="related-preference">Related Preference</h2>
<ul>
<li><a href="../preference/step-present-preference-page.html">Step Present Preference Page</a> - Controls step presentation settings</li>
</ul>
<h2 id="renderingcanvas-behavior">RenderingCanvas Behavior</h2>
<p>The RenderingCanvas displays the machining project visualization:</p>
<ol>
<li>On initialization, a <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a> is created and assigned to <code>RenderingCanvas</code>.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a>.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a></li>
<li>The displayee receives project data from <a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a></li>
<li>The RenderingCanvas is disposed when the Player Panel is disposed</li>
</ol>
<h2 id="source-code-locations">Source Code Locations</h2>
<p>See <a href="../index.html">HiNC GUI Architecture</a> for git repository links.</p>
<h3 id="wpf-application">WPF Application</h3>
<ul>
<li><code>Play/PlayerPanel</code></li>
</ul>
<h3 id="web-application">Web Application</h3>
<p><strong>Frontend:</strong></p>
<ul>
<li><code>wwwroot/player/player-panel.js</code></li>
<li><code>wwwroot/player/player-panel.html</code></li>
</ul>
<p><strong>Backend:</strong></p>
<ul>
<li><code>Players/PlayerController.cs</code></li>
<li><code>Players/PlayerStatusHub.cs</code></li>
<li><code>Players/PlayerStatusService.cs</code></li>
<li><code>Players/SessionMessageHub.cs</code></li>
<li><code>Players/SessionMessageService.cs</code></li>
<li><code>Players/SelectedStepInfoHub.cs</code></li>
<li><code>Players/SelectedStepInfoService.cs</code></li>
</ul>
<h2 id="implementation-checklist">Implementation Checklist</h2>
<div class="TIP">
<h5>Tip</h5>
<p>When building a new Player Panel implementation:</p>
<ol>
<li>Create the layout with RenderingCanvas</li>
<li>Set up RenderingCanvas behavior</li>
<li>Create <a href="player-tool-bar.html">Player Tool Bar</a></li>
<li>Create <a href="player-extended-renderingcanvas-tool-bar.html">Player Extended RenderingCanvas Tool Bar</a> with CL Strip, Fit View, and Rendering Items behaviors</li>
<li>Connect to Navigation Menu on <a href="../main-panel.html">Main Panel</a></li>
<li>Set Player Panel as default panel with associated toolbars</li>
<li>Build <a href="../session-message-panel/index.html">Session Message Panel</a>, <a href="selected-step-info-panel.html">Selected-Step Info Panel</a>, and <a href="../preference/step-present-preference-page.html">Step Present Preference Page</a></li>
</ol>
</div>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,157 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Player extended RenderingCanvas Tool Bar | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Player extended RenderingCanvas Tool Bar | 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="player-extended-renderingcanvas-tool-bar">Player extended RenderingCanvas Tool Bar</h1>
<p>The model of the tool bar is <a class="xref" href="../../../api/Hi.Disp.DispEngine.html">DispEngine</a> which is assigned from the RenderingCanvas of <a href="index.html">Player Panel</a>.</p>
<p>The content of DispEngine.<a class="xref" href="../../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_Displayee">Displayee</a> here is <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a>. the key content of the <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a> is <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a>.</p>
<p>The sub-model is <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a> and <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li><code>Player extended RenderingCanvas Tool Bar</code>
<ul>
<li><code>Show CL Strip Button</code></li>
<li><code>Show CL Strip Dots Button</code>
Only editable if the <a class="xref" href="../../../api/Hi.MachiningProcs.RenderingFlag.html#Hi_MachiningProcs_RenderingFlag_ClStrip">ClStrip</a> in <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html#Hi_MachiningProcs_MachiningProjectDisplayee_RenderingFlagBitArray">RenderingFlagBitArray</a> is true.</li>
<li><code>Fit View Button</code></li>
<li><code>Rendering Items SubMenu</code>
<a class="xref" href="../../../api/Hi.MachiningProcs.RenderingFlag.html">RenderingFlag</a>-based checkboxes that deal the boolean value in <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html#Hi_MachiningProcs_MachiningProjectDisplayee_RenderingFlagBitArray">RenderingFlagBitArray</a>, such as &ldquo;Show Machine&rdquo;, &ldquo;Show Workpiece&rdquo;, etc..
Except the ClStrip option since there has already be managed by the Show CL Strip Button.
Show HeidenhainCoordinate checkbox only if <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a>.<a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProject.html#Hi_MachiningProcs_MachiningProject_NcEnv">NcEnv</a>.<a class="xref" href="../../../api/Hi.Numerical.NcEnv.html#Hi_Numerical_NcEnv_CncBrand">CncBrand</a> is <a class="xref" href="../../../api/Hi.Numerical.CncBrand.html#Hi_Numerical_CncBrand_Heidenhain">Heidenhain</a>.
Create the submenu component class since the other GUI component also use it. See <a href="../controller/index.html">controller page</a></li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>checkboxs in Project Rendering Items SubMenu can be classified by the category of <a class="xref" href="../../../api/Hi.MachiningProcs.RenderingFlag.html">RenderingFlag</a> (see the hyperlink for the categories).</p>
</div>
<h2 id="behavior-of-cl-strip-buttons-and-fit-view-button">Behavior of CL Strip Buttons and Fit View Button</h2>
<p>Apply <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html#Hi_MachiningProcs_MachiningProjectDisplayee_RenderingFlagBitArray">RenderingFlagBitArray</a> to set the Project Rendering Items.</p>
<div class="TIP">
<h5>Tip</h5>
<p>Extract the <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> From the <a class="xref" href="../../../api/Hi.MachiningProcs.MachiningProjectDisplayee.html">MachiningProjectDisplayee</a> and use it to set the behaviors.</p>
</div>
<h2 id="behavior-of-project-rendering-items-dropdown">Behavior of <code>Project Rendering Items DropDown</code></h2>
<p>See <a class="xref" href="../../../sample/Sample.Machining.DemoRenderingMachiningProcessAndStripPosSelection.html">DemoRenderingMachiningProcessAndStripPosSelection</a> for the sample code to complete the behavior of the buttons.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Play/PlayerExtendedRenderingCanvasToolBar</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/player/player-extended-toolbar.js</li>
<li>Players/PlayerController.cs</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,404 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Player Tool Bar | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Player Tool Bar | 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="player-tool-bar">Player Tool Bar</h1>
<h2 id="layout">Layout</h2>
<ul>
<li><code>Player Tool Bar</code>
<ul>
<li><code>Status Text Field</code></li>
<li><code>Start Button</code></li>
<li><code>Pause Button</code></li>
<li><code>Run-One-Line Button</code></li>
<li><code>Run-One-Step Button</code></li>
<li><code>Stop Button</code></li>
<li><code>Reset Button</code></li>
</ul>
</li>
</ul>
<h2 id="behavior-of-player-tool-bar">Behavior of <code>Player Tool Bar</code></h2>
<p>See the example code to:</p>
<ul>
<li>complete the behavior of the buttons and <code>Status Text Field</code>.</li>
<li>The rapidly used buttons should has hotkey. At least the following buttons:
<ul>
<li>Run One Line Button</li>
<li>Run One Step Button</li>
<li>Start/Continue</li>
<li>Pause</li>
</ul>
</li>
<li>Both webservice and win-desktop applications use <a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> events for monitoring <a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_PacePlayer">PacePlayer</a> status changes.</li>
<li>In webservice applications, the <code>PlayerStatusService</code> subscribes to these <a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> events and broadcasts status changes via <code>PlayerStatusHub</code> using SignalR for real-time communication.</li>
<li>Win-desktop applications can directly subscribe to <a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> events for status updates.</li>
<li>Alter the background color of the <code>Status Text Field</code> if the status changed.
<ul>
<li>Warning style color
<ul>
<li>Running</li>
</ul>
</li>
<li>Secondary style color
<ul>
<li>Paused</li>
<li>No Project</li>
</ul>
</li>
<li>Success style color
<ul>
<li>Finished</li>
<li>Ready</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>The action of <code>Reset Button</code> should be async for user experience.</p>
<div class="TIP">
<h5>Tip</h5>
<p>Use icon instead of text to the tool bar button. Run One Line Button and Run One Step Button use the same icon, use the different color to resolve them.</p>
<ul>
<li>Run One Line Button &gt; default color with green seasoned</li>
<li>Run One Step Button &gt; default color with blue seasoned</li>
</ul>
<p>The other button use the default color is enough.</p>
</div>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Play/PlayerToolBar</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/player/player-tool-bar.js</li>
<li>Players/PlayerController.cs</li>
<li>Players/PlayerStatusHub.cs</li>
<li>Players/PlayerStatusService.cs</li>
</ul>
<h4 id="signalr-implementation-webapi-only">SignalR Implementation (Webapi Only)</h4>
<p><code>PlayerStatusHub</code> provides real-time player status updates, with methods <code>GetPlayerStatus()</code> and event <code>PlayerStatusUpdated</code>. <code>PlayerStatusService</code> monitors <a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_PacePlayer">PacePlayer</a> events (<a class="xref" href="../../../api/Hi.Common.PacePlayer.html#Hi_Common_PacePlayer_IsRunningChangedEvent">IsRunningChangedEvent</a>, <a class="xref" href="../../../api/Hi.Common.PacePlayer.html#Hi_Common_PacePlayer_IsLockedChangedEvent">IsLockedChangedEvent</a>, <a class="xref" href="../../../api/Hi.Common.PacePlayer.html#Hi_Common_PacePlayer_IsFinishedChangedEvent">IsFinishedChangedEvent</a>, <a class="xref" href="../../../api/Hi.Common.PacePlayer.html#Hi_Common_PacePlayer_ResetedEvent">ResetedEvent</a>) and broadcasts changes via SignalR. The JavaScript component connects to <code>/playerStatusHub</code> and listens for status updates. API endpoints include <code>/api/player/start</code>, <code>/api/player/pause</code>, <code>/api/player/resume</code>, <code>/api/player/run-line</code>, <code>/api/player/run-step</code>, <code>/api/player/stop</code>, and <code>/api/player/reset</code>.</p>
<h3 id="razor-page-source-code">Razor Page Source Code</h3>
<pre><code class="lang-csharp" name="SampleCode-razor">@using Hi.Common.PathUtils;
@using Hi.HiNcKits;
@using Hi.MachiningProcs
@using Hi.MillingProcs;
@using Hi.Numerical.FilePlayers;
@inject HiNcHost hiNcHost
@{
MachiningProject machiningProject = hiNcHost.MachiningProject;
var localProjectService = hiNcHost.LocalProjectService;
bool disabledByMachiningProject = machiningProject == null;
}
&lt;div class=&quot;btn-group&quot; role=&quot;group&quot;&gt;
&lt;div class=&quot; btn-group&quot;
data-bs-toggle=&quot;collapse&quot; data-bs-target=&quot;#player-@Tid&quot;&gt;
&lt;button class=&quot;btn btn-outline-info text-nowrap &quot;
disabled=&quot;@disabledByMachiningProject&quot;
data-bs-toggle=&quot;button&quot;&gt;
&lt;span class=&quot;me-1&quot;&gt;@Loc[&quot;Player&quot;]&lt;/span&gt;
&lt;div class=&quot;d-inline-block&quot; style=&quot;width: 4rem&quot;&gt;
@{
if (machiningProject == null) { }
else if (localProjectService.PacePlayer.IsRunning)
{
&lt;span class=&quot;badge text-bg-warning&quot;&gt;@Loc[&quot;Running&quot;]&lt;/span&gt;
}
else if (localProjectService.PacePlayer.IsLocked)
{
&lt;span class=&quot;badge text-bg-secondary&quot;&gt;@Loc[&quot;Pause&quot;]&lt;/span&gt;
}
else if (localProjectService.PacePlayer.IsFinished)
{
&lt;span class=&quot;badge text-bg-success&quot;&gt;@Loc[&quot;Finish&quot;]&lt;/span&gt;
}
else
{
&lt;span class=&quot;badge text-bg-primary&quot;&gt;@Loc[&quot;Unlocked&quot;]&lt;/span&gt;
}
}
&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;div id=&quot;player-@Tid&quot; class=&quot;btn-group collapse collapse-horizontal show&quot; role=&quot;group&quot;&gt;
@if (machiningProject == null) { }
else if (!localProjectService.PacePlayer.IsLocked)
{
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Start&quot;] (S)&quot;
accesskey=&quot;s&quot;
disabled=&quot;@(disabledByMachiningProject||localProjectService.PacePlayer.IsFinished)&quot;
@onclick=&quot;StartOrContinue&quot;&gt;
&lt;span class=&quot;oi oi-media-play me-1&quot;&gt;&lt;/span&gt;
&lt;/button&gt;
}
else
{
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Continue&quot;] (S)&quot;
accesskey=&quot;s&quot;
@onclick=&quot;StartOrContinue&quot;
disabled=&quot;@(disabledByMachiningProject||localProjectService.PacePlayer.IsFinished||localProjectService.PacePlayer.IsRunning)&quot;&gt;
&lt;span class=&quot;oi oi-media-play me-1&quot;&gt;&lt;/span&gt;
&lt;/button&gt;
}
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Pause&quot;] (P)&quot;
accesskey=&quot;p&quot;
@onclick=&quot;Pause&quot;
disabled=&quot;@(disabledByMachiningProject||!localProjectService.PacePlayer.IsRunning)&quot;&gt;
&lt;span class=&quot;oi oi-media-pause me-1&quot;&gt;&lt;/span&gt;
&lt;/button&gt;
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Run One Line&quot;] (L)&quot;
accesskey=&quot;l&quot;
@onclick=&quot;RunToLineEnd&quot;
disabled=&quot;@(disabledByMachiningProject||localProjectService.PacePlayer.IsFinished)&quot;&gt;
&lt;span class=&quot;oi oi-media-step-forward me-1&quot;&gt;&lt;/span&gt;
&lt;/button&gt;
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Run One Step&quot;] (K)&quot;
accesskey=&quot;k&quot;
@onclick=&quot;RunToNextPace&quot;
disabled=&quot;@(disabledByMachiningProject||localProjectService.PacePlayer.IsFinished)&quot;&gt;
&lt;CommonRcl.Shared.CombinedIcon&gt;
&lt;IconA&gt;
&lt;span class=&quot;oi oi-media-step-forward me-1&quot;&gt;&lt;/span&gt;
&lt;/IconA&gt;
&lt;IconB&gt;
&lt;span class=&quot;badge rounded-pill bg-primary-subtle text-primary-emphasis&quot;&gt;
step
&lt;/span&gt;
&lt;/IconB&gt;
&lt;/CommonRcl.Shared.CombinedIcon&gt;
&lt;/button&gt;
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Break&quot;]&quot;
@onclick=&quot;@Break&quot;
disabled=&quot;@(disabledByMachiningProject||!(localProjectService.PacePlayer.IsLocked||localProjectService.PacePlayer.IsFinished))&quot;&gt;
&lt;span class=&quot;oi oi-media-stop me-1&quot;&gt;&lt;/span&gt;
&lt;/button&gt;
&lt;button class=&quot;btn btn-primary text-nowrap&quot; title=&quot;@Loc[&quot;Reset&quot;]&quot;
disabled=&quot;@disabledByMachiningProject&quot;
@onclick=&quot;Reset&quot;&gt;
&lt;span class=&quot;bi bi-backspace&quot;&gt;&lt;/span&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
</code></pre><pre><code class="lang-csharp" name="SampleCode-razor.cs">using Hi.Common;
using Hi.MachiningProcs;
using Hi.Parallels;
using Microsoft.AspNetCore.Components;
namespace HiNcRcl.Areas.Player
{
public partial class PlayerButtonGroup : IAsyncDisposable
{
[Parameter]
public string Tid { set; get; } = System.Guid.NewGuid().ToString();
StringLocalizer Loc { get; } = new StringLocalizer(typeof(PlayerDiv));
SemaphoreSlim DisposeSemaphore { get; } = new SemaphoreSlim(1);
MachiningProject MachiningProject =&gt; hiNcHost.MachiningProject;
LocalProjectService LocalProjectService =&gt; hiNcHost.LocalProjectService;
bool disposedValue = false;
/// &lt;inheritdoc/&gt;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
base.OnAfterRender(firstRender);
if (firstRender)
{
using var _ = await DisposeSemaphore.EmbraceAsync();
if (disposedValue) return;
LocalProjectService.PacePlayer.IsLockedChangedEvent
+= EnumerablePlayer_IsLockedEventHandler;
LocalProjectService.PacePlayer.IsRunningChangedEvent
+= EnumerablePlayer_IsLockedEventHandler;
LocalProjectService.PacePlayer.IsFinishedChangedEvent
+= EnumerablePlayer_IsLockedEventHandler;
}
}
/// &lt;inheritdoc/&gt;
public async ValueTask DisposeAsync()
{
using var _ = await DisposeSemaphore.EmbraceAsync();
LocalProjectService.PacePlayer.IsLockedChangedEvent
-= EnumerablePlayer_IsLockedEventHandler;
LocalProjectService.PacePlayer.IsRunningChangedEvent
-= EnumerablePlayer_IsLockedEventHandler;
LocalProjectService.PacePlayer.IsFinishedChangedEvent
-= EnumerablePlayer_IsLockedEventHandler;
disposedValue = true;
await ValueTask.CompletedTask;
}
private void EnumerablePlayer_IsLockedEventHandler(bool obj)
{
InvokeAsync(StateHasChanged).ConfigureAwait(false);
}
public async Task StartOrContinue()
{
await Task.Run(() =&gt;
{
var pacePlayer = LocalProjectService.PacePlayer;
if (!pacePlayer.IsLocked)
{
pacePlayer.Start();
}
else if (!pacePlayer.IsRunning
&amp;&amp; !pacePlayer.IsFinished)
{
pacePlayer.Resume();
}
}).ShowIfCatched(this);
}
public async Task Pause()
{
await Task.Run(() =&gt;
{
LocalProjectService.PacePlayer.Pause();
}).ShowIfCatched(this);
}
public async Task RunToLineEnd()
{
await Task.Run(() =&gt;
{
LocalProjectService.NcRunner.RunToLineEnd();
}).ShowIfCatched(this);
}
public async Task RunToNextPace()
{
await Task.Run(() =&gt;
{
LocalProjectService.PacePlayer.RunToNextPace();
}).ShowIfCatched(this);
}
public async Task Break()
{
await Task.Run(() =&gt;
{
LocalProjectService.PacePlayer.Terminate();
}).ShowIfCatched(this);
}
public async Task Reset()
{
await Task.Run(() =&gt;
{
LocalProjectService.PacePlayer.Reset();
}).ShowIfCatched(this);
}
}
}
</code></pre>
</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,149 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Selected-Step Info Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Selected-Step Info Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="selected-step-info-panel">Selected-Step Info Panel</h1>
<p>The panel locates on the <a href="index.html">Player Panel</a>.</p>
<p>The model is <a class="xref" href="../../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a> and <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a>.</p>
<p>The <a class="xref" href="../../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a> is assigned by <a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_ClStrip">ClStrip</a>.<a class="xref" href="../../../api/Hi.CutterLocations.ClStrips.ClStrip.html#Hi_CutterLocations_ClStrips_ClStrip_PosSelected">PosSelected</a>.</p>
<p>Show step infomation from <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_DisplayedStepPresentAccessList">DisplayedStepPresentAccessList</a>.</p>
<p>The resx of <a class="xref" href="../../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a> contains the translation of <a class="xref" href="../../../api/Hi.MachiningSteps.PresentAttribute.html">PresentAttribute</a>.<a class="xref" href="../../../api/Hi.MachiningSteps.PresentAttribute.html#Hi_MachiningSteps_PresentAttribute_Name">Name</a>, apply the translation to the GUI. If the translation not existed, use the original value.</p>
<p>See Also <a href="../preference/step-present-preference-page.html">Step Present Preference Page</a>.</p>
<h2 id="sample-code">Sample Code</h2>
<p>Refer the code to show step infomation.</p>
<pre><code class="lang-csharp" name="SampleCode-ShowStepPresent">internal static void ShowStepPresent(
UserService userEnv, MachiningStep machiningStep)
{
foreach (var entry in userEnv.DisplayedStepPresentAccessList)
{
var present = entry.Value.Present;
var valueText = string.Format(&quot;{0:&quot; + present.DataFormatString + &quot;}&quot;, entry.Value.GetValueFunc.Invoke(machiningStep));
Console.WriteLine($&quot;{present.ShortName}: {valueText} {present.TailUnitString} ({present.Name} [{entry.Key}])&quot;);
}
}
</code></pre><h2 id="signalr-implementation-webapi-only">SignalR Implementation (Webapi Only)</h2>
<p><code>SelectedStepInfoHub</code> provides real-time step updates with method <code>GetSelectedStepInfo()</code> and event <code>SelectedStepInfoUpdated</code>. <code>SelectedStepInfoService</code> monitors <a class="xref" href="../../../api/Hi.CutterLocations.ClStrips.ClStrip.html#Hi_CutterLocations_ClStrips_ClStrip_PosSelected">PosSelected</a> and <a class="xref" href="../../../api/Hi.CutterLocations.ClStrips.ClStrip.html#Hi_CutterLocations_ClStrips_ClStrip_MachiningStepSelected">MachiningStepSelected</a> events and broadcasts updates. The JavaScript component connects to <code>/selectedStepInfoHub</code> to receive step change notifications and update the UI accordingly.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Play/SelectedStepInfoPanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/player/selected-step-info-panel.js (Vue component)</li>
<li>wwwroot/player/selected-step-info-panel.css (Styles)</li>
<li>Players/PlayerController.cs (REST API - GetSelectedStepInfo endpoint)</li>
<li>Players/SelectedStepInfoService.cs (Business logic)</li>
<li>Players/SelectedStepInfoHub.cs (SignalR Hub for real-time updates)</li>
</ul>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,141 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Graphic-Cache SubMenu | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Graphic-Cache SubMenu | 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="graphic-cache-submenu">Graphic-Cache SubMenu</h1>
<p>The submenu locates on the <a href="index.html">Preference Menu Dropdown</a>.</p>
<p>The model <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a> is from its parent component.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Graphic-Cache SubMenu
<ul>
<li><code>Graphic-Cache Lower Limit Input Text Field</code></li>
<li><code>Graphic-Cache Upper Limit Input Text Field</code></li>
<li><code>Graphic-Cache Input Text Field</code></li>
<li><code>Graphic-Cache Slider</code></li>
</ul>
</li>
</ul>
<h2 id="behavior">Behavior</h2>
<p><code>Graphic-Cache Input Text Field</code> and <code>Graphic-Cache Slider</code> bind the <a class="xref" href="../../../api/Hi.HiNcKits.UserConfig.html#Hi_HiNcKits_UserConfig_GraphicCacheMb">GraphicCacheMb</a>. The limit text fields also bind to the properties of <a class="xref" href="../../../api/Hi.HiNcKits.UserConfig.html">UserConfig</a>.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>MainWindow (be included in preference menu)</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/player/player-extended-toolbar.js (includes graphic cache dropdown)</li>
<li>Environments/PreferenceController.cs</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,148 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Preference Menu Dropdown | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Preference Menu Dropdown | 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="preference-menu-dropdown">Preference Menu Dropdown</h1>
<p>The model of the UI is <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a>.
<a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a> contains <a class="xref" href="../../../api/Hi.HiNcKits.UserConfig.html">UserConfig</a>, which is rapidly used in the GUI.</p>
<p>The dropdown is on the <a href="../main-panel.html">Main Panel</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Preference Menu Dropdown
<ul>
<li><a href="step-present-preference-page.html">Step Present Preference</a> Button</li>
<li><a href="graphic-cache-dropdown.html">Graphic-Cache Dropdown</a></li>
<li><a href="language-selection-submenu.html">Language Selection SubMenu</a></li>
<li>Show Physics Options CheckBox
<ul>
<li>The model is <a class="xref" href="../../../api/Hi.HiNcKits.UserConfig.html#Hi_HiNcKits_UserConfig_ShowPhysicsOptions">ShowPhysicsOptions</a>.</li>
<li>The checkbox is disabled and unchecked if <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_IsPhysicsLicensed">IsPhysicsLicensed</a> is false.</li>
</ul>
</li>
<li>Show Log Button
See <a href="../message-section-on-main-panel.html">Message Section</a>.
The button does not exist on WPF application.</li>
</ul>
</li>
</ul>
<h2 id="source-code-locations">Source Code Locations</h2>
<p>See <a href="../index.html">HiNC GUI Architecture</a> for git repository links.</p>
<h3 id="wpf-application">WPF Application</h3>
<ul>
<li><code>MainWindow</code> (includes preference menu)</li>
</ul>
<h3 id="web-application">Web Application</h3>
<ul>
<li><code>wwwroot/preference/preference-menu.js</code></li>
<li><code>Environments/PreferenceController.cs</code></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,143 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Language Selection SubMenu | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Language Selection SubMenu | 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="language-selection-submenu">Language Selection SubMenu</h1>
<p>The submenu locates on the <a href="index.html">Preference Menu Dropdown</a>.</p>
<p>The model <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a> is from its parent component.</p>
<p>Load the language preference on application start.</p>
<div class="NOTE">
<h5>Note</h5>
<p>Keep language resource on each UI componenets.</p>
</div>
<h2 id="layout">Layout</h2>
<ul>
<li>Language Selection SubMenu
<ul>
<li>English Radio CheckBox</li>
<li>Simlified Chinese Radio CheckBox</li>
<li>Traditional Chinese Radio CheckBox</li>
</ul>
</li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>MainWindow (In the preference menu)</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/preference/preference-menu.js</li>
<li>Controller/Preference/PreferenceController.cs</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,489 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Step Present Preference Page | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Step Present Preference Page | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="step-present-preference-page">Step Present Preference Page</h1>
<p>The model <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html">UserService</a> is from its parent component. The <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_UserConfig">UserConfig</a> is rapidly used.</p>
<p>The model of Candidate Keys Panel is <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_CandidateStepPresentKeyList">CandidateStepPresentKeyList</a>.
The model of Displayed Keys Panel is <a class="xref" href="../../../api/Hi.HiNcKits.UserConfig.html#Hi_HiNcKits_UserConfig_DisplayedStepPresentKeyList">DisplayedStepPresentKeyList</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Step Present Preference Page (or window)
<ul>
<li>Candidate Keys Panel
<ul>
<li>Category A Panel
<ul>
<li>Key a ToggleButton</li>
<li>Key b ToggleButton</li>
<li>...</li>
</ul>
</li>
<li>Category B Panel
<ul>
<li>...</li>
</ul>
</li>
<li>...</li>
<li>Category Other Panel</li>
</ul>
</li>
<li>Displayed Keys Panel
<ul>
<li>Key 1</li>
<li>Key 2</li>
<li>...</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>The categories are not defined for programming logic but only for user experience. So decide and define the categories in the GUI here only.</p>
<p>Since the Keys are not all come from the properties of <a class="xref" href="../../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a>, a category panel (Category Other Panel) for the uncategoried keys is required.</p>
<p>The keys in the Displayed Keys Panel is in sequence of <a class="xref" href="../../../api/Hi.HiNcKits.UserConfig.html#Hi_HiNcKits_UserConfig_DisplayedStepPresentKeyList">DisplayedStepPresentKeyList</a>. User tune the sequence and remove key by the Displayed Keys Panel. User add and remove the key from the ToggleButtons in Candidate Keys Panel. Those UI control items are required.</p>
<p>To both Candidate Keys Panel and Displayed Keys Panel:
Apply <a class="xref" href="../../../api/Hi.MachiningSteps.PresentAttribute.html">PresentAttribute</a>.<a class="xref" href="../../../api/Hi.MachiningSteps.PresentAttribute.html#Hi_MachiningSteps_PresentAttribute_Name">Name</a> as Key label by <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_StepPresentAccessDictionary">StepPresentAccessDictionary</a>. Apply the key to the button tooltip.</p>
<p>The resx of <a class="xref" href="../../../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a> contains the translation of <a class="xref" href="../../../api/Hi.MachiningSteps.PresentAttribute.html">PresentAttribute</a>.<a class="xref" href="../../../api/Hi.MachiningSteps.PresentAttribute.html#Hi_MachiningSteps_PresentAttribute_Name">Name</a>, apply the translation to the GUI. If the translation not existed, use the original value.</p>
<h3 id="categories">Categories</h3>
<p>Refer the code to design Categories:</p>
<pre><code class="lang-csharp" name="SampleCode-StepDiv">@using Hi.Common
@using Hi.Geom
@using Hi.Mech.Topo
@{
string pCalss = &quot;d-flex flex-wrap gap-2&quot;;
string cardTextClass = $&quot;card-text {pCalss}&quot;;
}
&lt;div class=&quot;card&quot; style=&quot;overflow-y: hidden; height:100%; &quot;&gt;
&lt;div style=&quot;overflow-y: scroll; &quot;&gt;
&lt;div style=&quot;height: auto&quot;&gt;
&lt;div class=&quot;card-header py-0&quot; data-bs-toggle=&quot;collapse&quot; data-bs-target=&quot;#fileLineFlagTime-@Tid&quot;&gt;@Loc[&quot;File&quot;] / @Loc[&quot;Command&quot;] / @Loc[&quot;Flag&quot;] / @Loc[&quot;Time&quot;] / @Loc[&quot;System&quot;]&lt;/div&gt;
&lt;div class=&quot;collapse show &quot; id=&quot;fileLineFlagTime-@Tid&quot;&gt;
&lt;div class=&quot;card-body &quot;&gt;
&lt;div class=&quot;@cardTextClass&quot;&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;File No.&quot;] : @Loc[&quot;Line No.&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;F.L.No.&quot;]&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.FileNo : @MillingStep?.LineNo&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;File&quot;]&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.FilePath&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Accumulated Time&quot;]&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.AccumulatedTime.ToString(&quot;G&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Line Text&quot;]&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.LineText&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Flags&quot;]&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.FlagsText&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Step Index&quot;]&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.StepIndex&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;card-header py-0&quot; data-bs-toggle=&quot;collapse&quot; data-bs-target=&quot;#toolFeedrateSpindleSpeed-@Tid&quot;&gt;@Loc[&quot;Tool&quot;] / @Loc[&quot;Feedrate&quot;] / @Loc[&quot;Spindle Speed&quot;]&lt;/div&gt;
&lt;div class=&quot;collapse show &quot; id=&quot;toolFeedrateSpindleSpeed-@Tid&quot;&gt;
&lt;div class=&quot;card-body &quot;&gt;
&lt;div class=&quot;@cardTextClass&quot;&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Tool ID&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;T&quot;]&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.ToolId&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;S&quot;] (rpm)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.SpindleSpeed_rpm.ToString(&quot;G5&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;F&quot;] (mm/min)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.Feedrate_mmdmin.ToString(&quot;G5&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Feed per Tooth&quot;] (mm)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.FeedPerTooth_mm.ToString(&quot;G5&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Feed per Cycle&quot;] (mm)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.FeedPerCycle_mm.ToString(&quot;G5&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Tooth Arc Duration&quot;] (s)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.ToothArcDuration_s.ToString(&quot;G4&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Spindle Cycle Period&quot;] (s)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.SpindleCyclePeriod_s.ToString(&quot;G4&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Cutting Speed&quot;] (mm/s)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.CuttingSpeed_mmds?.ToString(&quot;G4&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;card-header py-0&quot; data-bs-toggle=&quot;collapse&quot; data-bs-target=&quot;#coordinateAndMove-@Tid&quot;&gt;@Loc[&quot;Coordinate&quot;] / @Loc[&quot;Move&quot;]&lt;/div&gt;
&lt;div class=&quot;collapse show &quot; id=&quot;coordinateAndMove-@Tid&quot;&gt;
&lt;div class=&quot;card-body &quot;&gt;
&lt;div class=&quot;@cardTextClass&quot;&gt;
&lt;p class=&quot;@pCalss&quot;&gt;
@{
var mcCodes = LocalProjectService.MachiningEquipment?.GetMachiningChain()?.McCodes;
if (mcCodes != null)
{
var mcTransformers = LocalProjectService
?.MachiningEquipment?.GetMachiningChain()?.McTransformers;
for (int i = 0; i &lt; mcCodes.Length; i++)
{
if (mcTransformers[i] == null)
continue;
if (mcTransformers[i] is DynamicRotation)
{
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Machine Coordinate&quot;] @mcCodes[i] (deg)&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;MC.@mcCodes[i] (deg)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;
@MillingStep?.GetMcValue(i)?.SelfInvoke(v =&gt; MathUtil.ToDeg(v)).ToString(&quot;F5&quot;)
&lt;/span&gt;
&lt;/div&gt;
}
else
{
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Machine Coordinate&quot;] @mcCodes[i] (mm)&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;MC.@mcCodes[i] (mm)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;
@MillingStep?.GetMcValue(i)?.ToString(&quot;F5&quot;)
&lt;/span&gt;
&lt;/div&gt;
}
}
}
}
&lt;/p&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Cutter Location Point&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;CL.XYZ (mm)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.Cl?.Point?.ToString(&quot;F5&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Cutter Location Normal&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;CL.IJK&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.Cl?.Normal?.ToString(&quot;F5&quot;))&lt;/span&gt;
&lt;/div&gt;
@{
var moveDirection = MillingStep?.MoveOnProgramCoordinate.GetNormalized();
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Move Direction&quot;] (@Loc[&quot;Workpiece Coordinate&quot;])&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Move Direction&quot;] [W]&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(moveDirection?.ToString(&quot;F4&quot;))&lt;/span&gt;
&lt;/div&gt;
}
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;card-header py-0&quot; data-bs-toggle=&quot;collapse&quot; data-bs-target=&quot;#gcgr-@Tid&quot;&gt;@Loc[&quot;Cutting Geometry&quot;] / @Loc[&quot;Chip&quot;] / @Loc[&quot;Bias&quot;] / @Loc[&quot;Roughness&quot;]&lt;/div&gt;
&lt;div class=&quot;collapse show &quot; id=&quot;gcgr-@Tid&quot;&gt;
&lt;div class=&quot;card-body &quot;&gt;
&lt;div class=&quot;@cardTextClass&quot;&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Is Touched&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Is Touched&quot;]&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@Loc[(MillingStep?.IsTouched)?.ToString()]&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Cutting Width&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;ae (mm)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.CuttingWidth_mm.ToString(&quot;G3&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Cutting Depth&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;ap (mm)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.CuttingDepth_mm.ToString(&quot;G3&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Material Removal Rate&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;MRR (mm&lt;sup&gt;3&lt;/sup&gt;/s)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.Mrr_mm3ds.ToString(&quot;G3&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Chip Thickness&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Chip Thickness&quot;] (um)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.ChipThickness_um?.ToString(&quot;G3&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Chip Volume&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Chip Volume&quot;] (mm&lt;sup&gt;3&lt;/sup&gt;)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.ChipVolume_mm3?.ToString(&quot;G3&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Chip Mass&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Chip Mass&quot;] (mg)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.ChipMass_mg?.ToString(&quot;G3&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Program Side Cusp&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Program Side Cusp&quot;] (um)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.ProgramSideCusp_um.ToString(&quot;G4&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Re-Cut Depth&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Re-Cut Depth&quot;] (um)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.ReCutDepth_um.ToString(&quot;G4&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Delta Tip Deflection&quot;] (@Loc[&quot;Tool Running Coordinate&quot;])&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Delta Tip Deflection&quot;] [TR] (um)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.DeltaTipDeflectionOnToolRunningCoordinate_um?.ToString(&quot;G3&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Max Tip Deflection&quot;] (@Loc[&quot;Tool Running Coordinate&quot;])&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Max Tip Deflection&quot;] [TR] (um)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(MillingStep?.MaxTipDeflectionOnToolRunningCoordinate_um?.ToString(&quot;G3&quot;))&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;card-header py-0&quot; data-bs-toggle=&quot;collapse&quot; data-bs-target=&quot;#phe-@Tid&quot;&gt;
@Loc[&quot;Mechanics&quot;] / @Loc[&quot;Power&quot;] / @Loc[&quot;Energy&quot;]
&lt;/div&gt;
&lt;div class=&quot;collapse show &quot; id=&quot;phe-@Tid&quot;&gt;
&lt;div class=&quot;card-body &quot;&gt;
&lt;div class=&quot;@cardTextClass&quot;&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Max Force&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Max Force&quot;] (N)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.MaxAbsForce_N?.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Max Force&quot;] (@Loc[&quot;Tool Running Coordinate&quot;])&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Max Force&quot;] [TR] (N)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.MaxForceOnToolRunningCoordinate_N?.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Average Moment about Sensor&quot;] (@Loc[&quot;Spindle Rotation Coordinate&quot;])&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Avg Moment about Sensor&quot;] [SR] (Nm)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.AvgMomentAboutSensor_Nm?.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Average Absolute Moment about Sensor&quot;] (@Loc[&quot;Spindle Rotation Coordinate&quot;])&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Avg Abs Moment about Sensor&quot;] [SR] (Nm)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.AvgAbsMomentAboutSensorVec3d_Nm?.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Thermal Stress&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Thermal Stress&quot;] (MPa)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.ThermalStress_MPa?.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Workpiece Plastic Depth&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Workpiece Plastic Depth&quot;] (um)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.WorkpiecePlasticDepth_um.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Spindle Input Power&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Spindle Input Power&quot;] (W)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.SpindleInputPower_W.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Spindle Output Power&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Spindle Output Power&quot;] (W)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.SpindleOutputPower_W.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Accumulated Spindle Energy Consumption From Spindle Input Power&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Accumulated Spindle Energy Consumption&quot;] (kWh)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.AccumulatedSpindleEnergyConsumption_kWh.ToString(&quot;G6&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;card-header py-0&quot; data-bs-toggle=&quot;collapse&quot; data-bs-target=&quot;#tw-@Tid&quot;&gt;@Loc[&quot;Temperature&quot;] / @Loc[&quot;Wear&quot;]&lt;/div&gt;
&lt;div class=&quot;collapse show &quot; id=&quot;tw-@Tid&quot;&gt;
&lt;div class=&quot;card-body &quot;&gt;
&lt;div class=&quot;@cardTextClass&quot;&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Chip Temperature&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Chip Temperature&quot;] (&lt;sup&gt;o&lt;/sup&gt;C)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.ChipTemperature_C?.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Cutter Dermis Temperature&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Cutter Dermis Temperature&quot;] (&lt;sup&gt;o&lt;/sup&gt;C)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.CutterDermisTemperature_C?.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Cutter Body Temperature&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Cutter Body Temperature&quot;] (&lt;sup&gt;o&lt;/sup&gt;C)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.CutterBodyTemperature_C?.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Workpiece Dermis Temperature&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Workpiece Dermis Temperature&quot;] (&lt;sup&gt;o&lt;/sup&gt;C)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.WorkpieceDermisTemperature_C?.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Instant Crater Wear&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Instant Crater Wear&quot;] (um)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.InstantCraterWear_um?.ToString(&quot;G3&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Accumulated Crater Wear&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Accumulated Crater Wear&quot;] (um)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.AccumulatedCraterWear_um.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Accumulated Flank Wear Depth&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@Loc[&quot;Accumulated Flank Wear Depth&quot;] (um)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.AccumulatedFlankWearDepth_um.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;w-auto&quot; title=&quot;@Loc[&quot;Accumulated Flank Wear Width&quot;]&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;VB (um)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@MillingStep?.AccumulatedFlankWearWidth_um.ToString(&quot;G4&quot;)&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;card-header py-0&quot; data-bs-toggle=&quot;collapse&quot; data-bs-target=&quot;#custom-@Tid&quot;&gt;@Loc[&quot;Custom&quot;]&lt;/div&gt;
&lt;div class=&quot;collapse show &quot; id=&quot;custom-@Tid&quot;&gt;
&lt;div class=&quot;card-body &quot;&gt;
&lt;div class=&quot;@cardTextClass&quot;&gt;
@{
var flexDictionary=MillingStep?.FlexDictionary;
if (flexDictionary != null)
{
foreach(var entry in flexDictionary)
{
if(LocalProjectService.StepPropertyAccessDictionary.TryGetValue(
entry.Key, out var stepPropertyAccess)==true)
{
&lt;div class=&quot;w-auto&quot; title=&quot;@(stepPropertyAccess.PresentAttribute?.Name)&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@(stepPropertyAccess.PresentAttribute?.ShortName)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(stepPropertyAccess.GetValueText(MillingStep))&lt;/span&gt;
&lt;/div&gt;
}
else
{
&lt;div class=&quot;w-auto&quot; title=&quot;@(entry.Key) (@Loc[&quot;Not Registered&quot;])&quot;&gt;
&lt;span class=&quot;form-label&quot;&gt;@(entry.Key)&lt;/span&gt;
&lt;span class=&quot;form-control readonly w-auto&quot;&gt;@(entry.Value)&lt;/span&gt;
&lt;/div&gt;
}
}
}
}
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</code></pre>
<p>Refer the code to apply <a class="xref" href="../../../api/Hi.MachiningSteps.PresentAttribute.html">PresentAttribute</a>.</p>
<pre><code class="lang-csharp" name="SampleCode-ShowStepPresent">internal static void ShowStepPresent(
UserService userEnv, MachiningStep machiningStep)
{
foreach (var entry in userEnv.DisplayedStepPresentAccessList)
{
var present = entry.Value.Present;
var valueText = string.Format(&quot;{0:&quot; + present.DataFormatString + &quot;}&quot;, entry.Value.GetValueFunc.Invoke(machiningStep));
Console.WriteLine($&quot;{present.ShortName}: {valueText} {present.TailUnitString} ({present.Name} [{entry.Key}])&quot;);
}
}
</code></pre><h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Preference/StepPresentPreferenceWindow</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/preference/step-present-preference.js</li>
<li>Environments/PreferenceController.cs</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,175 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>RenderingCanvas Tool Bar | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="RenderingCanvas Tool Bar | 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="renderingcanvas-tool-bar">RenderingCanvas Tool Bar</h1>
<p>The RenderingCanvas Tool Bar provides view control buttons for the 3D rendering canvas. It operates on <a class="xref" href="../../api/Hi.Disp.DispEngine.html">DispEngine</a>.</p>
<h2 id="view-buttons">View Buttons</h2>
<p>The toolbar includes standard view buttons:</p>
<table>
<thead>
<tr>
<th>Button</th>
<th>API Method</th>
</tr>
</thead>
<tbody>
<tr>
<td>Front View</td>
<td><a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToFrontView">SetViewToFrontView()</a></td>
</tr>
<tr>
<td>Back View</td>
<td><a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToFrontView">SetViewToFrontView()</a> + <a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_TurnBackView">TurnBackView()</a></td>
</tr>
<tr>
<td>Right View</td>
<td><a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToRightView">SetViewToRightView()</a></td>
</tr>
<tr>
<td>Left View</td>
<td><a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToRightView">SetViewToRightView()</a> + <a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_TurnBackView">TurnBackView()</a></td>
</tr>
<tr>
<td>Top View</td>
<td><a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToTopView">SetViewToTopView()</a></td>
</tr>
<tr>
<td>Bottom View</td>
<td><a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToTopView">SetViewToTopView()</a> + <a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_TurnBackView">TurnBackView()</a></td>
</tr>
<tr>
<td>Isometric View</td>
<td><a class="xref" href="../../api/Hi.Disp.DispEngine.html#Hi_Disp_DispEngine_SetViewToIsometricView">SetViewToIsometricView()</a></td>
</tr>
</tbody>
</table>
<h3 id="back-view-implementation">Back View Implementation</h3>
<pre><code class="lang-csharp" name="SampleCode">DispEngine.SetViewToFrontView();
DispEngine.TurnBackView();
</code></pre><h2 id="source-code-locations">Source Code Locations</h2>
<p>See <a href="index.html">HiNC GUI Architecture</a> for git repository links.</p>
<h3 id="wpf-application">WPF Application</h3>
<ul>
<li><code>Disp/RenderingCanvasToolBar</code></li>
</ul>
<h3 id="web-application">Web Application</h3>
<p><strong>Frontend:</strong></p>
<ul>
<li><code>wwwroot/disp/rendering-canvas-tool-bar.js</code></li>
</ul>
<p><strong>Backend:</strong></p>
<ul>
<li><code>Disp/RenderingHub.cs</code> - Handles view changes from the toolbar</li>
<li><code>Disp/RenderingService.cs</code> - Manages DispEngine instances</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,204 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Session Message Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Session Message Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="session-message-panel">Session Message Panel</h1>
<p>The model is <a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_SessionMessageHost">SessionMessageHost</a>.</p>
<p><a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> is obtained via dependency injection.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Top Message Filter ToolBar
<ul>
<li>Message Type Filter SubMenu
<ul>
<li>NC CheckBox</li>
<li>Progress CheckBox</li>
<li>Error CheckBox</li>
</ul>
</li>
<li>Message Text Filter Input
<ul>
<li>Message Text Filter Input Text Area</li>
<li>Message Text Filter Reset Button</li>
</ul>
</li>
<li>Export Button</li>
</ul>
</li>
<li>Central Message Table</li>
</ul>
<h2 id="central-message-table">Central Message Table</h2>
<p>The model of Central Message Table is <a class="xref" href="../../../api/Hi.MachiningProcs.SessionMessageHost.html">SessionMessageHost</a>.<a class="xref" href="../../../api/Hi.MachiningProcs.SessionMessageHost.html#Hi_MachiningProcs_SessionMessageHost_MessageCollection">MessageCollection</a>.</p>
<p>Only take last 1000 filtered elements in the <a class="xref" href="../../../api/Hi.MachiningProcs.SessionMessageHost.html#Hi_MachiningProcs_SessionMessageHost_MessageCollection">MessageCollection</a> by <a class="xref" href="../../../api/Hi.MachiningProcs.SessionMessageHost.html#Hi_MachiningProcs_SessionMessageHost_GetFliteredList_Hi_MachiningProcs_SessionMessageHost_FilterFlag_System_String_">GetFliteredList(FilterFlag, string)</a> to show for user experience. Find the usage example in the code:</p>
<pre><code class="lang-csharp" name="Demo_UseSessionMessageHost">internal static void DemoUseSessionMessageHost(LocalProjectService localProjectService)
{
SessionMessageHost sessionMessageHost = localProjectService.SessionMessageHost;
SessionMessageHost.FilterFlag filterFlags =
SessionMessageHost.FilterFlag.NC |
SessionMessageHost.FilterFlag.Progress |
SessionMessageHost.FilterFlag.Error;
string filterText = null;
var filteredSessionMessageList = sessionMessageHost
.GetFliteredList(filterFlags, filterText);
foreach (var sessionMessage in filteredSessionMessageList)
{
//M.I.: Message Index.
Console.Write($&quot;M.I.: {sessionMessage.Index}; Role: {sessionMessage.MessageRoleText}&quot;);
// For SessionMessageHost.FilterFlag.NC
var nc = sessionMessage.DirectInstantSourceCommand;
if (nc != null)
Console.Write($&quot;Message/NC: {nc.Line}; File: {nc.FilePath}; LineNo: {nc.GetLineNo()}; &quot;);
// For SessionMessageHost.FilterFlag.Progress or Error.
var multiTagMessage = sessionMessage.MultiTagMessage;
if (multiTagMessage != null)
Console.WriteLine($&quot;Message/NC: {multiTagMessage.Message}&quot;);
var exception = sessionMessage.Exception;
if (exception != null)
Console.WriteLine($&quot;Message/NC: {exception.Message}&quot;);
}
File.WriteAllLines(&quot;output-session-messages.txt&quot;,
filteredSessionMessageList.Select(m =&gt;
$&quot;Msg[{m.Index}][{m.MessageRoleText}]: {m}&quot;));
}
</code></pre>
<p>In the table, show the columns: <code>Role</code>, <code>NC/Message</code>.</p>
<p>Add update table event to <a class="xref" href="../../../api/Hi.MachiningProcs.SessionMessageHost.html#Hi_MachiningProcs_SessionMessageHost_CollectionItemChanged">CollectionItemChanged</a>. The updating process has to be called by <a href="../general-rules.html">Loose Manner</a> for user experience.</p>
<div class="TIP">
<h5>Tip</h5>
<p>On window desktop application (WPF), consider use textarea instead of datagrid to MessageTable for better performance. Use padding to show the different columns. And use the font in the textarea that with consistent width.</p>
</div>
<div class="NOTE">
<h5>Note</h5>
<p>The message display should be real-time.</p>
</div>
<h2 id="behavior-of-export-button">Behavior of Export Button</h2>
<p>Export ALL filtered elements in the <a class="xref" href="../../../api/Hi.MachiningProcs.SessionMessageHost.html#Hi_MachiningProcs_SessionMessageHost_MessageCollection">MessageCollection</a> by <a class="xref" href="../../../api/Hi.MachiningProcs.SessionMessageHost.html#Hi_MachiningProcs_SessionMessageHost_GetFliteredList_Hi_MachiningProcs_SessionMessageHost_FilterFlag_System_String_">GetFliteredList(FilterFlag, string)</a>.</p>
<h2 id="signalr-implementation-webapi-only">SignalR Implementation (Webapi Only)</h2>
<p><code>SessionMessageHub</code> provides real-time message updates with method <code>GetSessionMessages(string filterFlags, string filterText, int limit)</code> and event <code>SessionMessagesUpdated</code>. <code>SessionMessageService</code> monitors <a class="xref" href="../../../api/Hi.MachiningProcs.SessionMessageHost.html#Hi_MachiningProcs_SessionMessageHost_CollectionItemChanged">CollectionItemChanged</a> and broadcasts updates. The service uses <a class="xref" href="../../../api/Hi.Common.LooseRunner.html">LooseRunner</a> for non-blocking async operations. The JavaScript component connects to <code>/sessionMessageHub</code> to receive real-time message updates.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Play/SessionMessagePanel</li>
</ul>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/player/session-message-panel.js (Vue component)</li>
<li>Players/PlayerController.cs (REST API - GetSessionMessages endpoint)</li>
<li>Players/SessionMessageService.cs (Business logic)</li>
<li>Players/SessionMessageHub.cs (SignalR Hub for real-time updates)</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,164 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Translation Remarks | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Translation Remarks | 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="translation-remarks">Translation Remarks</h1>
<p>The translation terminology and convention has to keep consistency.</p>
<ul>
<li><p>Anchor 定位</p>
</li>
<li><p>Cutter 刀具</p>
<ul>
<li>Insert Cutter 刀片式刀具
<ul>
<li>Insert 刀片</li>
</ul>
</li>
</ul>
</li>
<li><p>Holder 刀把</p>
<ul>
<li>Cylindroid Holder 柱狀刀把</li>
<li>Freeform Holder 任意形刀把</li>
</ul>
</li>
<li><p>Shank 刀柄</p>
</li>
<li><p>Fixture 夾具</p>
</li>
<li><p>Milling Cutter 銑刀</p>
</li>
<li><p>Freeform Remover 任意移除工具</p>
</li>
<li><p>Flute 刀刃</p>
<ul>
<li>Flute-Profile 刃包絡型</li>
<li>Flute-Contours 刃型</li>
<li>Flute-Inner-Beam 刃中芯</li>
</ul>
</li>
<li><p>Upper-Beam 夾持柱</p>
</li>
<li><p>Integral Mode 組裝形式</p>
<ul>
<li>Solid End 一體式</li>
<li>Insert End 刀片式</li>
</ul>
</li>
<li><p>Preset 前設置</p>
</li>
<li><p>Runtime Geometry 運行時幾何</p>
</li>
<li><p>Machining Resolution 加工解析度</p>
</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,123 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Machine Tool Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Machine Tool Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="machine-tool-panel"><code>Machine Tool Panel</code></h1>
<h2 id="layout-of-machine-tool-panel">Layout of <code>Machine Tool Panel</code></h2>
<ul>
<li>Top Item: <code>Load</code> button and the Loaded Machine Tool File Name readonly textarea.</li>
<li>Central Panel: RenderingCanvas</li>
</ul>
<h2 id="behavior-of-machine-tool-panel">Behavior of Machine Tool Panel</h2>
<p>RenderingCanvas.Displayee is the machine tool (<a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_MachiningEquipment">MachiningEquipment</a>.<a class="xref" href="../../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_MachiningChain">MachiningChain</a>)</p>
<p><code>Load</code> button load the machine tool to <a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_MachiningChain">MachiningChain</a> and <a class="xref" href="../../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_MachiningChainFile">MachiningChainFile</a> by <a class="xref" href="../../../api/Hi.Common.XmlUtils.XFactory.html#Hi_Common_XmlUtils_XFactory_GenByFile_">GenByFile</a>.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,400 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Mission Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Mission Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="mission-panel">Mission Panel</h1>
<p>The <code>Mission Panel</code> manages NC program loading, editing, and preparation for simulation in the geometry-only HiNC application.</p>
<h2 id="panel-layout">Panel Layout</h2>
<ul>
<li><p>Left side: <code>NC Program Management Panel</code></p>
<ul>
<li><code>Program Files Section</code>
<ul>
<li><code>Load NC File</code> button</li>
<li><code>New NC File</code> button</li>
<li>List view of loaded NC programs</li>
<li><code>Remove</code> button (to remove selected program)</li>
</ul>
</li>
<li><code>Program Properties Section</code>
<ul>
<li>File name and path display</li>
<li>Program description input field</li>
<li>Program size and line count display</li>
</ul>
</li>
<li><code>Program Association Section</code>
<ul>
<li>Tool mapping controls:
<ul>
<li>Dropdown to select T-code</li>
<li>Dropdown to select corresponding tool from Tool House</li>
<li><code>Apply Mapping</code> button</li>
</ul>
</li>
<li>Work offset mapping controls:
<ul>
<li>Dropdown to select work offset code (G54, G55, etc.)</li>
<li>X, Y, Z offset value inputs</li>
<li><code>Apply Offset</code> button</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Right side: <code>NC Program Editor/Viewer</code></p>
<ul>
<li>Syntax-highlighted G-code editor</li>
<li>Line numbers</li>
<li><code>Save</code> button</li>
<li><code>Validate</code> button</li>
<li>Validation results display area</li>
<li><code>Show Toolpath Preview</code> toggle button</li>
</ul>
</li>
<li><p>Bottom: <code>Toolpath Preview Panel</code> (shown when preview is toggled on)</p>
<ul>
<li>3D view of the toolpath</li>
<li>Color-coded display based on operation type or feed rate</li>
<li>Basic camera controls</li>
</ul>
</li>
</ul>
<h2 id="behavior">Behavior</h2>
<h3 id="loading-nc-program-files">Loading NC Program Files</h3>
<p>When the user clicks the <code>Load NC File</code> button:</p>
<ol>
<li>Open a file selection dialog showing NC files (*.nc, *.cnc, *.ngc, etc.)</li>
<li>After selection, validate the file format</li>
<li>Add the file to the list of NC programs</li>
<li>Display the file in the editor/viewer</li>
<li>Update program properties display</li>
</ol>
<pre><code class="lang-csharp">// Example code
public void LoadNCFile(string filePath)
{
if (File.Exists(filePath))
{
// Read and validate NC file
string programContent = File.ReadAllText(filePath);
// Create a new program object
NCProgram program = new NCProgram
{
FilePath = filePath,
FileName = Path.GetFileName(filePath),
Content = programContent,
LineCount = programContent.Split('\n').Length,
FileSize = new FileInfo(filePath).Length
};
// Add to the project's mission
machiningProject.MachiningMission.Programs.Add(program);
// Update the NC program list view
UpdateProgramListView();
// Select the newly added program
SelectProgram(program);
// Display the program in the editor
LoadProgramIntoEditor(program);
}
}
</code></pre>
<h3 id="creating-a-new-nc-program">Creating a New NC Program</h3>
<p>When the user clicks the <code>New NC File</code> button:</p>
<ol>
<li>Create a new empty NC program object</li>
<li>Add it to the list of programs</li>
<li>Load it into the editor with minimal template content</li>
<li>Allow the user to start editing</li>
</ol>
<pre><code class="lang-csharp">public void CreateNewNCProgram()
{
// Create a basic template for a new NC program
string templateContent = &quot;%\nO0001\n(NEW PROGRAM)\n\nG90 G40 G17\nG21 (MM)\n\n(PROGRAM BODY)\n\nM30\n%&quot;;
// Create a new program object
NCProgram program = new NCProgram
{
FileName = &quot;NewProgram.nc&quot;,
Content = templateContent,
LineCount = templateContent.Split('\n').Length,
IsNew = true
};
// Add to the project's mission
machiningProject.MachiningMission.Programs.Add(program);
// Update the NC program list view
UpdateProgramListView();
// Select the newly added program
SelectProgram(program);
// Display the program in the editor
LoadProgramIntoEditor(program);
}
</code></pre>
<h3 id="tool-mapping">Tool Mapping</h3>
<p>When the user sets up a tool mapping and clicks <code>Apply Mapping</code>:</p>
<ol>
<li>Extract the T-code from the selected dropdown</li>
<li>Get the corresponding tool from the Tool House based on the selection</li>
<li>Add or update the mapping in the mission's tool map</li>
<li>Update the display to show the active mapping</li>
</ol>
<pre><code class="lang-csharp">public void ApplyToolMapping(string tCodeStr, int toolHousePosition)
{
if (int.TryParse(tCodeStr.Substring(1), out int tCode))
{
// Get the tool from the tool house
var tool = machiningProject.MachiningToolHouse[toolHousePosition];
if (tool != null)
{
// Update or add the mapping
machiningProject.MachiningMission.ToolMap[tCode] = toolHousePosition;
// Update the display
UpdateToolMappingDisplay();
}
}
}
</code></pre>
<h3 id="work-offset-mapping">Work Offset Mapping</h3>
<p>When the user sets up a work offset and clicks <code>Apply Offset</code>:</p>
<ol>
<li>Extract the offset code (G54, G55, etc.)</li>
<li>Create a vector from the X, Y, Z input values</li>
<li>Add or update the offset in the mission's work offset map</li>
<li>Update the display to show the active offset</li>
</ol>
<pre><code class="lang-csharp">public void ApplyWorkOffset(string offsetCode, double x, double y, double z)
{
// Create the offset vector
Vec3d offset = new Vec3d(x, y, z);
// Update or add the mapping
machiningProject.MachiningMission.WorkOffsetMap[offsetCode] = offset;
// Update the display
UpdateWorkOffsetDisplay();
}
</code></pre>
<h3 id="validating-nc-program">Validating NC Program</h3>
<p>When the user clicks the <code>Validate</code> button:</p>
<ol>
<li>Parse the current program content in the editor</li>
<li>Check for syntax errors</li>
<li>Verify tool references against the tool map</li>
<li>Check for unsupported G/M codes</li>
<li>Display validation results in the results area</li>
</ol>
<pre><code class="lang-csharp">public void ValidateProgram()
{
// Get the current content from the editor
string programContent = GetEditorContent();
// Create a validator
NCProgramValidator validator = new NCProgramValidator(machiningProject);
// Perform validation
ValidationResult result = validator.Validate(programContent);
// Display results
ClearValidationResultsDisplay();
if (result.IsValid)
{
DisplayValidationSuccess(&quot;Program validation successful.&quot;);
}
else
{
foreach (var error in result.Errors)
{
DisplayValidationError(error);
}
}
}
</code></pre>
<h3 id="displaying-toolpath-preview">Displaying Toolpath Preview</h3>
<p>When the user toggles the <code>Show Toolpath Preview</code>:</p>
<ol>
<li>If toggled on:
a. Parse the NC program
b. Generate a toolpath using the geometry-only simulation engine
c. Render the toolpath in the preview panel
d. Show the preview panel</li>
<li>If toggled off:
a. Hide the preview panel</li>
</ol>
<pre><code class="lang-csharp">public void ToggleToolpathPreview(bool showPreview)
{
if (showPreview)
{
// Get the current program
NCProgram program = GetSelectedProgram();
// Generate toolpath (simplified for geometry-only)
Toolpath toolpath = ToolpathGenerator.GenerateFromNCProgram(
program.Content,
machiningProject.MachiningMission.ToolMap,
machiningProject.MachiningMission.WorkOffsetMap,
machiningProject.MachiningEquipment);
// Render the toolpath
RenderToolpathPreview(toolpath);
// Show the preview panel
toolpathPreviewPanel.Visibility = Visibility.Visible;
}
else
{
// Hide the preview panel
toolpathPreviewPanel.Visibility = Visibility.Collapsed;
}
}
</code></pre>
<h3 id="data-structure">Data Structure</h3>
<p>The panel operates primarily on the <code>MachiningMission</code> of the <code>MachiningProject</code>:</p>
<pre><code class="lang-csharp">public class MachiningMission
{
public List&lt;NCProgram&gt; Programs { get; set; } = new List&lt;NCProgram&gt;();
public Dictionary&lt;int, int&gt; ToolMap { get; set; } = new Dictionary&lt;int, int&gt;();
public Dictionary&lt;string, Vec3d&gt; WorkOffsetMap { get; set; } = new Dictionary&lt;string, Vec3d&gt;();
// Other mission-related properties
}
public class NCProgram
{
public string FilePath { get; set; }
public string FileName { get; set; }
public string Content { get; set; }
public long FileSize { get; set; }
public int LineCount { get; set; }
public bool IsNew { get; set; }
public string Description { get; set; }
// Other program-related properties
}
</code></pre>
<h2 id="integration-with-main-application">Integration with Main Application</h2>
<p>The <code>Mission Panel</code> is activated when the user selects the <code>Mission</code> item in the <code>Navigation Menu</code>. It accesses and modifies the <code>MachiningMission</code> component of the current <code>MachiningProject</code> instance.</p>
<p>When changes are made in this panel, the following notifications should be sent:</p>
<ol>
<li><code>ProgramListChanged</code> - When programs are added or removed</li>
<li><code>ProgramContentChanged</code> - When program content is edited</li>
<li><code>ToolMapChanged</code> - When tool mappings are updated</li>
<li><code>WorkOffsetMapChanged</code> - When work offsets are updated</li>
</ol>
<p>These notifications allow other components (particularly the Player panel) to update their behavior accordingly when preparing for or executing the simulation.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,158 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>GUI File Path Assignment | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="GUI File Path Assignment | 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="gui-file-path-assignment">GUI File Path Assignment</h1>
<p>See the remarks of <a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html#Hi_Common_XmlUtils_IMakeXmlSource_MakeXmlSource_System_String_System_String_System_Boolean_">MakeXmlSource(string, string, bool)</a> to know the design pattern of file path treatment.</p>
<p>if the assigned file path is descendent of the configuration directory, it is straight forward that set the <code>baseDirectory</code> to the configuration directory and apply relative path to <code>relFile</code>; if not, set <code>baseDirectory</code> to null and set <code>relFile</code> to absolute path.</p>
<p>GUI that needs to assign file generally requires a code-behind <code>BaseDirectory</code> property as assistent model. The property is assigned by the parent model from the parent GUI.</p>
<p>In most cases, the first <code>BaseDirectory</code> is the project directory if the project has assigned (created or loaded).</p>
<h2 id="portability">Portability</h2>
<p>To maintain For the portability of project or the other folder-based unit, if the sub-item is loaded by absolute path outside the folder-based unit directory, redirect the saving path to the folder-based unit directory, i.e. the SubItemFile below.</p>
<div class="NOTE">
<h5>Note</h5>
<p>You have no need to do an additional action to create a duplicate in the folder-based unit directory. Since the file-writing pattern of <a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html#Hi_Common_XmlUtils_IMakeXmlSource_MakeXmlSource_System_String_System_String_System_Boolean_">MakeXmlSource(string, string, bool)</a> create files when user call to save. In other perspective, if user does not call to save, the local duplicate should be created.</p>
</div>
<p>The design pattern is usually saw in the HiAPI program, a object contains the properties:</p>
<ul>
<li>object SubItem;</li>
<li>string SubItemFile;</li>
</ul>
<p>Then you should keep the Protability.</p>
<h2 id="file-path-of-load-button-and-save-button">File Path of Load Button and Save Button</h2>
<p>The genneral convention of the File Path of Load and Save is different by the single-user desktop application and web page application.</p>
<div class="TIP">
<h5>Tip</h5>
<p>Always preserve an empty filter ( * . * ) for the browser.</p>
</div>
<h3 id="single-user-desktop-application">Single-User Desktop Application</h3>
<p>The default directory of the Save/Load button are generally:</p>
<ul>
<li>System Default Directory or Project Directory (default, if not explicitly indicated)
The initial directory is the project directory.</li>
<li>Resource Directory
The path always point to <code>&lt;application path&gt;/Resource/&lt;classification&gt;</code> directory.
The button label has to explicitly show &lsquo;Load Resource&rsquo;.</li>
</ul>
<p>The kinds of buttons are not exclusive, they can be existed on the same tool bar.</p>
<p>If the selected file path is under the project directory, apply the relative path from the project, i.e. baseDirectory is project directory and relFile is the relative path.</p>
<h3 id="web-page-application">Web Page Application</h3>
<p>The default directory of the Save/Load button are generally:</p>
<ul>
<li>Admin Directory</li>
<li>Project Directory</li>
<li>Resource Directory</li>
</ul>
<p>The Resource Directory and Project Directory are generally under the Admin Directory. And the admin directory is generally set in the appsettings.json file.</p>
<h2 id="typical-action-if-exhibitiononly-false">Typical Action if <code>exhibitionOnly</code> false</h2>
<p>On <a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html">IMakeXmlSource</a>.<a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html#Hi_Common_XmlUtils_IMakeXmlSource_MakeXmlSource_System_String_System_String_System_Boolean_">MakeXmlSource(string, string, bool)</a> with <code>exhibitionOnly</code> false, the argument (<code>baseDirectory</code> and <code>relFile</code>) should be the same from object's host (if exist) XML output function.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,145 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Mat4dControl Component | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Mat4dControl Component | 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="mat4dcontrol-component">Mat4dControl Component</h1>
<p>Mat4dControl is a user control for <a class="xref" href="../../../../api/Hi.Geom.Mat4d.html">Mat4d</a> editing and display.</p>
<h2 id="main-features">Main Features</h2>
<ol>
<li><p>Dual Input Modes</p>
<ul>
<li>Grid Mode: Input 4x4 matrix elements in a grid layout (formatted display with 4 significant digits)</li>
<li>Text Mode: Input complete matrix in text format (full precision, no information loss)</li>
</ul>
</li>
<li><p>Matrix Operations</p>
<ul>
<li>Identity: Set matrix to identity matrix</li>
<li>Transpose: Transpose the matrix</li>
<li>Inverse: Compute the inverse matrix</li>
</ul>
</li>
<li><p>Special Value Handling (Web)</p>
<ul>
<li>Supports Infinity, -Infinity, and NaN values</li>
<li>Uses <a href="../numeric-io-utilities.html">Numeric Input/Output Utilities</a> for display and parsing</li>
</ul>
</li>
</ol>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../../index.html">this page</a> for git repository.</p>
<h3 id="web-service-application-source-code-path">Web Service Application Source Code Path</h3>
<ul>
<li>wwwroot/widget/mat4d-control.js</li>
<li>Widget/Mat4dHub.cs</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,162 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Numeric Input/Output Utilities | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Numeric Input/Output Utilities | 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="numeric-inputoutput-utilities">Numeric Input/Output Utilities</h1>
<p>Handle special numeric values (Infinity, -Infinity, NaN) in web forms to prevent JSON serialization issues between JavaScript frontend and C# backend.</p>
<h2 id="implementation-requirements">Implementation Requirements</h2>
<p>Your <code>numeric-utils.js</code> module should:</p>
<ul>
<li>Convert special values for display: Infinity → &ldquo;INF&rdquo;, -Infinity → &ldquo;-INF&rdquo;, NaN → &ldquo;NaN&rdquo;</li>
<li>Parse display strings back to numeric values</li>
<li>Format regular numbers with 4 significant digits (for standard display mode)</li>
<li>Provide full precision output without information loss (for text mode editing)</li>
<li>Provide Vue mixin for component integration</li>
</ul>
<h2 id="required-exports">Required Exports</h2>
<ul>
<li><code>numericToDisplay(value)</code> - Converts numeric to display string (4 significant digits)</li>
<li><code>numericToFullPrecision(value)</code> - Converts numeric to full precision string (no information loss, for text mode)</li>
<li><code>displayToNumeric(displayValue, defaultValue)</code> - Parses display to numeric</li>
<li><code>NumericInputMixin</code> - Vue mixin with formatNumericDisplay, toFullPrecision, and parseNumericDisplay methods</li>
</ul>
<h2 id="usage-guidelines">Usage Guidelines</h2>
<ul>
<li>Use <code>numericToDisplay()</code> for standard input fields where formatted display is preferred</li>
<li>Use <code>numericToFullPrecision()</code> for text mode inputs (e.g., array-like number editors) where users need to see/edit exact values without precision loss</li>
</ul>
<h2 id="avoiding-precision-loss">Avoiding Precision Loss</h2>
<p>When a component has multiple numeric inputs (e.g., <a class="xref" href="../../../api/Hi.Geom.Vec3d.html">Vec3d</a> with X, Y, Z or <a class="xref" href="../../../api/Hi.Geom.Mat4d.html">Mat4d</a> with 16 elements), parsing display values back to numeric on unchanged fields will cause precision loss due to the 4-digit formatting.</p>
<p><strong>Problem</strong>: If user only edits X, but <code>displayToNumeric()</code> is called on all fields (X, Y, Z), the unchanged Y and Z values lose precision.</p>
<p><strong>Solution</strong>: Update only the edited field by:</p>
<ol>
<li>Each input field should have its own <code>@change</code> handler (e.g., <code>onXChanged</code>, <code>onYChanged</code>, <code>onZChanged</code>)</li>
<li>Backend should provide single-element update API (e.g., <code>UpdateAt(key, index, value)</code>)</li>
<li>Only parse and send the edited value to backend</li>
</ol>
<p><strong>Example</strong> (Vec3d):</p>
<ul>
<li>Frontend: <code>@change=&quot;onXChanged&quot;</code> calls <code>/api/Vec3d/UpdateAt?index=0&amp;value=...</code></li>
<li>Backend: <code>vec3d.At(index) = value;</code></li>
</ul>
<p><strong>Example</strong> (Mat4d):</p>
<ul>
<li>Frontend: <code>@change=&quot;onCellChanged(row, col)&quot;</code> calls <code>/api/Mat4d/UpdateAt?index=...&amp;value=...</code></li>
<li>Backend: <code>mat4d.m[index] = value;</code></li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="web-page-application-source-code-path">Web Page Application Source Code Path</h3>
<ul>
<li>wwwroot/common/numeric-utils.js</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,211 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Object Management Menu Button | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Object Management Menu Button | 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="object-management-menu-button">Object Management Menu Button</h1>
<p>The menu button represent the target object with getter function and setter function. The target object generally is <a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html">IMakeXmlSource</a>.</p>
<p>the target object with getter function and setter function is such like:</p>
<pre><code class="lang-csharp">object TargetObject{get=&gt;TargetObjectGetter?.Invoke();set=&gt;TargetObjectSetter?.Invoke(value);}
Func&lt;TargetObject&gt; TargetObjectGetter{get;set;}
Action&lt;TargetObject&gt; TargetObjectSetter{get;set;}
</code></pre>
<p>The target object has the following functions:</p>
<ul>
<li>File Save/Load
<ul>
<li>See <a href="gui-file-path-assignment.html">GUI File Path Assignment</a></li>
</ul>
</li>
<li>Object Copy/Paste</li>
<li>Editor Panel Mode Selection
<ul>
<li>GUI (user-friendly)</li>
<li>XML
<ul>
<li>Get XML by <a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html">IMakeXmlSource</a> with <code>exhibitionOnly</code> true.</li>
<li>Set XML by <a class="xref" href="../../../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a>.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>If the target object is not <a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html">IMakeXmlSource</a>, then the XML Editor Panel Mode should not appear. The other functions are still buildable.</p>
<p>Don't use <a class="xref" href="../../../api/Hi.Common.XmlUtils.GenMode.html">GenMode</a>.<a class="xref" href="../../../api/Hi.Common.XmlUtils.GenMode.html#Hi_Common_XmlUtils_GenMode_Default">Default</a> on <a class="xref" href="../../../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> functions. Use <a class="xref" href="../../../api/Hi.Common.XmlUtils.GenMode.html">GenMode</a>.<a class="xref" href="../../../api/Hi.Common.XmlUtils.GenMode.html#Hi_Common_XmlUtils_GenMode_Rebase">Rebase</a>. Since <a class="xref" href="../../../api/Hi.Common.XmlUtils.GenMode.html">GenMode</a>.Default pass the inner exception silently.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Object Management Menu Button
<ul>
<li>Load Button</li>
<li>Load Resource Button</li>
<li>Save As Button</li>
<li>(splitter)</li>
<li>Copy Button (with hotkey support if the Object Management Menu Button is focused)</li>
<li>Paste Button (with hotkey support if the Object Management Menu Button is focused)</li>
<li>(splitter)</li>
<li>GUI Ratio Button</li>
<li>XML Ratio Button</li>
</ul>
</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<ul>
<li>Since the Object Management Menu Button has special meaning, use icon instead of text label.</li>
<li>Do not use icon on the other child buttons. The icons gains nothing but hard to keep style to the full application.</li>
<li>If the model is selected, show a different style (may be color) on the menu button.</li>
<li>The model should contain a ResourceDirectory property.</li>
<li>Do not show Load Resource Button if Resource directory not explicitly gave.</li>
</ul>
</div>
<h2 id="copy--paste">Copy &amp; Paste</h2>
<ul>
<li>Object Copy/Paste (i.e. Select/Set or Duplicated-Set)
<ul>
<li>Copy (i.e. Select)
Set the model to <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_SelectedItem">SelectedItem</a>.</li>
<li>Paste
Set <a class="xref" href="../../../api/Hi.HiNcKits.UserService.html#Hi_HiNcKits_UserService_SelectedItem">SelectedItem</a> to the model.
Set by reference is default. Apply Duplicated-Set if explicitly required.</li>
</ul>
</li>
</ul>
<p>While a object is copied (selected) here, it can also be paste (drag) to:</p>
<ul>
<li>Text editor
Use <a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html">IMakeXmlSource</a>.<a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html#Hi_Common_XmlUtils_IMakeXmlSource_MakeXmlSource_System_String_System_String_System_Boolean_">MakeXmlSource(string, string, bool)</a> with <code>exhibitionOnly</code> false and the argument (<code>baseDirectory</code> and <code>relFile</code>) from object's host to paste the text, it should be the same text content by the host XML output.</li>
<li>File browser
Use <a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html">IMakeXmlSource</a>.<a class="xref" href="../../../api/Hi.Common.XmlUtils.IMakeXmlSource.html#Hi_Common_XmlUtils_IMakeXmlSource_MakeXmlSource_System_String_System_String_System_Boolean_">MakeXmlSource(string, string, bool)</a> with <code>exhibitionOnly</code> true, <code>baseDirectory</code> destination folder, <code>relFile</code> destination file name (maybe xxx.class-name) to paste the file.</li>
</ul>
<p>Show message when paste action success or failed. See <a href="../general-rules.html">Handle Message and Exception</a>.</p>
<p>If the data type is not matched, show the un-matched message.</p>
<h2 id="editor-panel-mode-ratio-button">Editor Panel Mode Ratio Button</h2>
<p>The Editor Panel switched by the Editor Panel Mode Ratio Button.</p>
<p>The BaseDirectory and RelFile properties should exist. Use the RelFile property if the object's host has the corresponding property like XXXFile.</p>
<p>The Apply action should be well-set. Include <a class="xref" href="../../../api/Hi.Common.XmlUtils.SetFileDelegate.html">SetFileDelegate</a> from <a class="xref" href="../../../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a>.<a class="xref" href="../../../api/Hi.Common.XmlUtils.XFactory.html#Hi_Common_XmlUtils_XFactory_Gen__1_System_Xml_Linq_XElement_System_String_Hi_Common_XmlUtils_SetFileDelegate_Hi_Common_XmlUtils_GenMode_System_Object___">Gen&lt;T&gt;(XElement, string, SetFileDelegate, GenMode, params object[])</a> function.
The last argument should also be delivered by the host. So there must exist an property to pass the argument.</p>
<h3 id="xml-editor-panel-layout">XML Editor Panel Layout</h3>
<ul>
<li>XML Editor Panel
<ul>
<li>Cancel Button</li>
<li>Apply Button</li>
<li>XML TextArea</li>
</ul>
</li>
</ul>
<p>Shows error message if the xml-parsing or object creation failed on XML Editor Panel Apply Button applied.</p>
<h2 id="wpf-application-source-code-path">WPF Application Source Code Path</h2>
<ul>
<li>Common/ObjectManagementMenuButton</li>
</ul>
<p>see <a href="../index.html">this page</a> for git repository.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,152 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Polar Resolution 2D Panel | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Polar Resolution 2D Panel | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../../toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &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="polar-resolution-2d-panel">Polar Resolution 2D Panel</h1>
<p>The model is <a class="xref" href="../../../api/Hi.Geom.Resolution.PolarResolution2d.html">PolarResolution2d</a>.</p>
<h2 id="layout">Layout</h2>
<ul>
<li>Polar Resolution 2D Panel
<ul>
<li>Enable Custom Resolution CheckBox
<ul>
<li>enabled if host.model is not null.</li>
<li>set host.model to null if not enabled.</li>
</ul>
</li>
<li>Linear Resolution (mm) Input Field
<ul>
<li>enabled if model not null</li>
</ul>
</li>
<li>Angle Resolution (deg) Input Field
<ul>
<li>enabled if model not null</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="feature">Feature</h2>
<p>There is a code-behind property to set visibility of Enable CheckBox.</p>
<p>If the host.model is null, it may mean the resolution applied the default value.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Geom/PolarResolution2dPanel</li>
</ul>
<h3 id="web-service-application-source-code-path">Web Service Application Source Code Path</h3>
<ul>
<li>wwwroot/widget/polar-resolution-2d-panel.js</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,142 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Resizable Bar Component | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Resizable Bar Component | 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="resizable-bar-component">Resizable Bar Component</h1>
<p>A Vue component that provides draggable dividers for resizing adjacent panels in web applications.</p>
<h2 id="overview">Overview</h2>
<p>The ResizableBar component creates a draggable bar that allows users to resize panels by clicking and dragging. It supports both horizontal and vertical orientations.</p>
<h2 id="key-features">Key Features</h2>
<ul>
<li><strong>Directional Support</strong>: Works in both horizontal (for width adjustment) and vertical (for height adjustment) orientations</li>
<li><strong>Unit Flexibility</strong>: Supports pixel, percentage, and custom unit systems through converters</li>
<li><strong>Visual Feedback</strong>: Changes appearance on hover and during drag operations</li>
<li><strong>Constraint System</strong>: Enforces minimum and maximum size limits</li>
</ul>
<h2 id="usage-pattern">Usage Pattern</h2>
<p>The component should be placed between two panels that need to be resizable. The resize events provide size information that parent components use to adjust panel dimensions.</p>
<h2 id="unit-modes">Unit Modes</h2>
<ol>
<li><strong>Pixel Mode</strong> (default): Direct pixel value manipulation</li>
<li><strong>Percentage Mode</strong>: Automatic calculation relative to parent container</li>
<li><strong>Custom Mode</strong>: User-defined unit converters for specialized requirements</li>
</ol>
<h2 id="integration-example">Integration Example</h2>
<p>See the player-panel.js implementation for a practical example of using ResizableBar to create adjustable layouts between rendering canvas and side panels.</p>
<h2 id="web-application-source-code-path">Web Application Source Code Path</h2>
<ul>
<li>common/resizable-bar</li>
<li>common/resizable-bar-example</li>
<li>player/player-panel</li>
</ul>
<p>See this page <a href="../index.html">~/dev-doc/build-hinc/index.md</a> for git repository.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,604 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vec3dControl Component | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Vec3dControl Component | 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="vec3dcontrol-component">Vec3dControl Component</h1>
<p>Vec3dControl is a user control for <a class="xref" href="../../../../api/Hi.Geom.Vec3d.html">Vec3d</a> and display.</p>
<h2 id="main-features">Main Features</h2>
<ol>
<li><p>Dual Input Modes</p>
<ul>
<li>Standard Mode: Input X, Y, Z components separately (formatted display with 4 significant digits)</li>
<li>Text Mode: Input complete vector in text format (full precision, no information loss)</li>
</ul>
</li>
<li><p>Vector Normalization</p>
<ul>
<li>Normalization button (optional)</li>
<li>Button visibility controlled by <code>ShowNormalizeButton</code> property</li>
</ul>
</li>
<li><p>Special Value Handling (Web)</p>
<ul>
<li>Supports Infinity, -Infinity, and NaN values</li>
<li>Uses <a href="../numeric-io-utilities.html">Numeric Input/Output Utilities</a> for display and parsing</li>
</ul>
</li>
</ol>
<h2 id="refer-sample-code">Refer Sample Code</h2>
<pre><code class="lang-csharp" name="SampleCode-xaml">&lt;UserControl x:Class=&quot;HiNC_2025_win_desktop.Geom.Vec3dControl&quot;
xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;
xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;
mc:Ignorable=&quot;d&quot;
d:DesignHeight=&quot;30&quot; d:DesignWidth=&quot;200&quot;&gt;
&lt;Grid&gt;
&lt;Grid.ColumnDefinitions&gt;
&lt;ColumnDefinition Width=&quot;*&quot;/&gt;
&lt;ColumnDefinition Width=&quot;*&quot;/&gt;
&lt;ColumnDefinition Width=&quot;*&quot;/&gt;
&lt;ColumnDefinition Width=&quot;Auto&quot;/&gt;
&lt;ColumnDefinition Width=&quot;Auto&quot;/&gt;
&lt;/Grid.ColumnDefinitions&gt;
&lt;!-- Standard Mode Panel --&gt;
&lt;StackPanel x:Name=&quot;StandardModePanel&quot; Orientation=&quot;Horizontal&quot; Grid.ColumnSpan=&quot;5&quot;&gt;
&lt;TextBox x:Name=&quot;XTextBox&quot; Width=&quot;60&quot; Margin=&quot;0,0,2,0&quot; TextChanged=&quot;XTextBox_TextChanged&quot; IsReadOnly=&quot;{Binding IsReadOnly}&quot;/&gt;
&lt;TextBox x:Name=&quot;YTextBox&quot; Width=&quot;60&quot; Margin=&quot;0,0,2,0&quot; TextChanged=&quot;YTextBox_TextChanged&quot; IsReadOnly=&quot;{Binding IsReadOnly}&quot;/&gt;
&lt;TextBox x:Name=&quot;ZTextBox&quot; Width=&quot;60&quot; Margin=&quot;0,0,2,0&quot; TextChanged=&quot;ZTextBox_TextChanged&quot; IsReadOnly=&quot;{Binding IsReadOnly}&quot;/&gt;
&lt;Button Content=&quot;{DynamicResource Vec3d_TextMode_Toggle}&quot; Width=&quot;20&quot; Click=&quot;TextModeToggle_Click&quot; Margin=&quot;0,0,2,0&quot; ToolTip=&quot;{DynamicResource Vec3d_TextMode_Tooltip}&quot;/&gt;
&lt;Button Content=&quot;{DynamicResource Vec3d_Normalize}&quot; Width=&quot;20&quot; Click=&quot;NormalizeButton_Click&quot; Visibility=&quot;{Binding ShowNormalizeButton, Converter={StaticResource BooleanToVisibilityConverter}}&quot; ToolTip=&quot;{DynamicResource Vec3d_Normalize_Tooltip}&quot;/&gt;
&lt;/StackPanel&gt;
&lt;!-- Text Mode Panel --&gt;
&lt;StackPanel x:Name=&quot;TextModePanel&quot; Orientation=&quot;Horizontal&quot; Grid.ColumnSpan=&quot;5&quot; Visibility=&quot;Collapsed&quot;&gt;
&lt;TextBox x:Name=&quot;VectorTextBox&quot; Width=&quot;180&quot; Margin=&quot;0,0,2,0&quot; TextChanged=&quot;VectorTextBox_TextChanged&quot; IsReadOnly=&quot;{Binding IsReadOnly}&quot;
ToolTip=&quot;{DynamicResource Vec3d_TextMode_Format_Tooltip}&quot;/&gt;
&lt;Button Content=&quot;{DynamicResource Vec3d_StandardMode_Toggle}&quot; Width=&quot;20&quot; Click=&quot;StandardModeToggle_Click&quot; Margin=&quot;0,0,2,0&quot; ToolTip=&quot;{DynamicResource Vec3d_StandardMode_Tooltip}&quot;/&gt;
&lt;Button Content=&quot;{DynamicResource Vec3d_Normalize}&quot; Width=&quot;20&quot; Click=&quot;NormalizeButton_Click&quot; Visibility=&quot;{Binding ShowNormalizeButton, Converter={StaticResource BooleanToVisibilityConverter}}&quot; ToolTip=&quot;{DynamicResource Vec3d_Normalize_Tooltip}&quot;/&gt;
&lt;/StackPanel&gt;
&lt;/Grid&gt;
&lt;/UserControl&gt;
</code></pre><pre><code class="lang-csharp" name="SampleCode-xaml.cs">using System;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows;
using Hi.Geom;
using System.Text.RegularExpressions;
using System.ComponentModel;
using Hi.Common;
using Hi.Common.Messages;
namespace HiNC_2025_win_desktop.Geom
{
/// &lt;summary&gt;
/// Vec3dControl.xaml 的交互逻辑
/// &lt;/summary&gt;
public partial class Vec3dControl : UserControl, INotifyPropertyChanged
{
private bool _isUpdating = false;
private Func&lt;Vec3d&gt; _getterFunc;
private Func&lt;Task&gt; _updateByContentFunc;
private bool _showNormalizeButton = false;
private bool _isTextMode = false;
private bool _isReadOnly = false;
private static readonly Regex VectorRegex = new Regex(@&quot;^\s*[\(\[\{]?\s*(-?\d*\.?\d+)\s*,\s*(-?\d*\.?\d+)\s*,\s*(-?\d*\.?\d+)\s*[\)\]\}]?\s*$&quot;, RegexOptions.Compiled);
private static readonly Regex MatrixRegex = new Regex(@&quot;\{(?:\s*\{?\s*(-?\d*\.?\d+)\s*,\s*(-?\d*\.?\d+)\s*,\s*(-?\d*\.?\d+)\s*,\s*(-?\d*\.?\d+)\s*\}?\s*,){3}\s*\{?\s*(-?\d*\.?\d+)\s*,\s*(-?\d*\.?\d+)\s*,\s*(-?\d*\.?\d+)\s*,\s*(-?\d*\.?\d+)\s*\}?\s*\}&quot;, RegexOptions.Compiled);
public event PropertyChangedEventHandler PropertyChanged;
public string ControlId { get; set; } = Guid.NewGuid().ToString();
public Func&lt;Vec3d&gt; GetterFunc
{
get =&gt; _getterFunc;
set
{
_getterFunc = value;
UpdateUI();
}
}
public Func&lt;Task&gt; UpdateByContentFunc
{
get =&gt; _updateByContentFunc;
set =&gt; _updateByContentFunc = value;
}
public bool ShowNormalizeButton
{
get =&gt; _showNormalizeButton;
set
{
if (_showNormalizeButton != value)
{
_showNormalizeButton = value;
OnPropertyChanged(nameof(ShowNormalizeButton));
}
}
}
public bool IsTextMode
{
get =&gt; _isTextMode;
set
{
if (_isTextMode != value)
{
_isTextMode = value;
UpdateModeVisibility();
OnPropertyChanged(nameof(IsTextMode));
}
}
}
public bool IsReadOnly
{
get =&gt; _isReadOnly;
set
{
if (_isReadOnly != value)
{
_isReadOnly = value;
OnPropertyChanged(nameof(IsReadOnly));
}
}
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public Vec3dControl()
{
InitializeComponent();
DataContext = this;
}
private void UpdateModeVisibility()
{
if (IsTextMode)
{
StandardModePanel.Visibility = Visibility.Collapsed;
TextModePanel.Visibility = Visibility.Visible;
UpdateVectorTextFromXYZ();
}
else
{
StandardModePanel.Visibility = Visibility.Visible;
TextModePanel.Visibility = Visibility.Collapsed;
}
}
private void UpdateVectorTextFromXYZ()
{
if (_isUpdating) return;
if (double.TryParse(XTextBox.Text, out double x) &amp;&amp;
double.TryParse(YTextBox.Text, out double y) &amp;&amp;
double.TryParse(ZTextBox.Text, out double z))
{
VectorTextBox.Text = $&quot;{x},{y},{z}&quot;;
}
}
private void TextModeToggle_Click(object sender, RoutedEventArgs e)
{
IsTextMode = true;
}
private void StandardModeToggle_Click(object sender, RoutedEventArgs e)
{
IsTextMode = false;
}
private async void NormalizeButton_Click(object sender, RoutedEventArgs e)
{
if (_isUpdating || _getterFunc == null || IsReadOnly)
return;
try
{
_isUpdating = true;
var vec = _getterFunc();
if (vec != null)
{
vec.Normalize();
XTextBox.Text = vec.X.ToString(&quot;F3&quot;);
YTextBox.Text = vec.Y.ToString(&quot;F3&quot;);
ZTextBox.Text = vec.Z.ToString(&quot;F3&quot;);
if (IsTextMode)
{
VectorTextBox.Text = $&quot;{vec.X:F3},{vec.Y:F3},{vec.Z:F3}&quot;;
}
if(_updateByContentFunc != null)
await _updateByContentFunc();
}
}
catch (Exception ex)
{
MessageHost.AddError(string.Format(Application.Current.FindResource(&quot;Vec3d_Update_Error&quot;).ToString(), ex.Message));
ex.ShowException(this);
}
finally
{
_isUpdating = false;
}
}
public void UpdateUI()
{
if (_isUpdating || _getterFunc == null)
return;
try
{
_isUpdating = true;
var vec = _getterFunc();
if (vec != null)
{
XTextBox.Text = vec.X.ToString(&quot;F3&quot;);
YTextBox.Text = vec.Y.ToString(&quot;F3&quot;);
ZTextBox.Text = vec.Z.ToString(&quot;F3&quot;);
if (IsTextMode)
{
VectorTextBox.Text = $&quot;{vec.X},{vec.Y},{vec.Z}&quot;;
}
}
else
{
XTextBox.Text = &quot;&quot;;
YTextBox.Text = &quot;&quot;;
ZTextBox.Text = &quot;&quot;;
VectorTextBox.Text = &quot;&quot;;
}
}
finally
{
_isUpdating = false;
}
}
private async void XTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
await HandleTextChanged();
}
private async void YTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
await HandleTextChanged();
}
private async void ZTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
await HandleTextChanged();
}
private async void VectorTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (_isUpdating || _getterFunc == null || IsReadOnly)
return;
try
{
string text = VectorTextBox.Text.Trim();
// 如果文本为空或太短,不做处理
if (string.IsNullOrWhiteSpace(text) || text.Length &lt; 3)
return;
_isUpdating = true;
// 尝试解析为向量格式
if (TryParseVector(text, out double x, out double y, out double z))
{
await UpdateVectorValues(x, y, z);
}
// 尝试解析为变换矩阵格式(仅提取位移分量)
else if (TryParseTransformMatrix(text, out double tx, out double ty, out double tz))
{
await UpdateVectorValues(tx, ty, tz);
}
// 尝试作为单值解析每个字段(宽松模式)
else if (TryParseLooseVector(text, out double lx, out double ly, out double lz))
{
await UpdateVectorValues(lx, ly, lz);
}
}
catch (Exception ex)
{
MessageHost.AddError(string.Format(Application.Current.FindResource(&quot;Vec3d_Update_Error&quot;).ToString(), ex.Message));
ex.ShowException(this);
}
finally
{
_isUpdating = false;
}
}
private bool TryParseVector(string text, out double x, out double y, out double z)
{
x = y = z = 0;
// 使用正则表达式匹配向量格式
Match match = VectorRegex.Match(text);
if (match.Success &amp;&amp; match.Groups.Count &gt;= 4)
{
if (double.TryParse(match.Groups[1].Value, out x) &amp;&amp;
double.TryParse(match.Groups[2].Value, out y) &amp;&amp;
double.TryParse(match.Groups[3].Value, out z))
{
return true;
}
}
return false;
}
private bool TryParseTransformMatrix(string text, out double tx, out double ty, out double tz)
{
tx = ty = tz = 0;
// 移除所有换行和多余空格,便于匹配
text = Regex.Replace(text, @&quot;\s+&quot;, &quot; &quot;);
// 尝试匹配变换矩阵格式
Match match = MatrixRegex.Match(text);
if (match.Success &amp;&amp; match.Groups.Count &gt;= 8)
{
// 变换矩阵的第4列通常是位移分量
if (double.TryParse(match.Groups[4].Value, out tx) &amp;&amp;
double.TryParse(match.Groups[8].Value, out ty) &amp;&amp;
double.TryParse(match.Groups[12].Value, out tz))
{
return true;
}
}
// 尝试匹配更宽松的变换矩阵表示(例如从界面复制的数据)
var numbers = Regex.Matches(text, @&quot;(-?\d*\.?\d+)&quot;);
if (numbers.Count &gt;= 16)
{
// 假设这是一个4x4矩阵,提取位移分量(第4、8、12个数字)
if (double.TryParse(numbers[3].Value, out tx) &amp;&amp;
double.TryParse(numbers[7].Value, out ty) &amp;&amp;
double.TryParse(numbers[11].Value, out tz))
{
return true;
}
}
return false;
}
private bool TryParseLooseVector(string text, out double x, out double y, out double z)
{
x = y = z = 0;
// 移除所有非数字和小数点以外的字符,然后按空白分割
string cleanText = Regex.Replace(text, @&quot;[^\d\.\-\s,;]+&quot;, &quot; &quot;);
string[] parts = Regex.Split(cleanText, @&quot;[\s,;]+&quot;);
// 尝试从分割后的部分获取三个数字
var numbers = new System.Collections.Generic.List&lt;double&gt;();
foreach (var part in parts)
{
if (!string.IsNullOrWhiteSpace(part) &amp;&amp; double.TryParse(part, out double value))
{
numbers.Add(value);
if (numbers.Count &gt;= 3) break; // 最多取3个数字
}
}
// 如果获取到了三个数字,就认为解析成功
if (numbers.Count &gt;= 3)
{
x = numbers[0];
y = numbers[1];
z = numbers[2];
return true;
}
return false;
}
private async Task UpdateVectorValues(double x, double y, double z)
{
XTextBox.Text = x.ToString(&quot;F3&quot;);
YTextBox.Text = y.ToString(&quot;F3&quot;);
ZTextBox.Text = z.ToString(&quot;F3&quot;);
var vec = _getterFunc?.Invoke();
if (vec != null)
{
vec.X = x;
vec.Y = y;
vec.Z = z;
if (_updateByContentFunc != null)
{
await _updateByContentFunc();
}
}
}
private async Task HandleTextChanged()
{
if (_isUpdating || _getterFunc == null || IsReadOnly)
return;
try
{
_isUpdating = true;
// 尝试解析每个文本框的值
bool allValid = true;
allValid &amp;= double.TryParse(XTextBox.Text, out double x);
allValid &amp;= double.TryParse(YTextBox.Text, out double y);
allValid &amp;= double.TryParse(ZTextBox.Text, out double z);
if (allValid)
{
if (IsTextMode)
{
VectorTextBox.Text = $&quot;{x},{y},{z}&quot;;
}
var vec = _getterFunc();
if (vec != null)
{
vec.X = x;
vec.Y = y;
vec.Z = z;
if(_updateByContentFunc != null)
await _updateByContentFunc();
}
}
else
{
// 如果有无效输入,不进行更新但也不显示错误
// 这允许用户在输入过程中有不完整的状态
}
}
catch (Exception ex)
{
// 记录异常但不中断用户操作
MessageHost.AddError(string.Format(Application.Current.FindResource(&quot;Vec3d_Update_Error&quot;).ToString(), ex.Message));
ex.ShowException(this);
}
finally
{
_isUpdating = false;
}
}
}
}
</code></pre><h2 id="source-code-path">Source Code Path</h2>
<p>See <a href="../../index.html">this page</a> for git repository.</p>
<h3 id="wpf-application-source-code-path">WPF Application Source Code Path</h3>
<ul>
<li>Geom/Vec3dControl</li>
</ul>
<h3 id="web-service-application-source-code-path">Web Service Application Source Code Path</h3>
<ul>
<li>wwwroot/widget/vec3d-control.js</li>
<li>Widget/Vec3dHub.cs</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,195 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>General HiNC Workflow | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="General HiNC Workflow | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="general-hinc-workflow">General HiNC Workflow</h1>
<p>The following diagram illustrates the overall HiNC workflow:</p>
<pre><code class="lang-mermaid">graph TD
A[&quot;Create MachiningProject&quot;] --&gt; B[&quot;Setting Environment&quot;]
B --&gt; C[&quot;Setting Project Tasks&quot;]
C --&gt; D[&quot;Run Tasks&quot;]
D --&gt; E[&quot;View Analysis Results&quot;]
</code></pre>
<p>For a complete implementation example, see: <a class="xref" href="../../sample/Sample.Machining.DemoBuildMachiningProject.html">DemoBuildMachiningProject</a></p>
<h2 id="1-create-">1. Create <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></h2>
<p>Creating a machining project is the first step in the HiNC workflow, accomplished by initializing a <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> object.</p>
<h2 id="2-setting-environment-in-">2. Setting Environment In <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></h2>
<ul>
<li>Set <a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html">MachiningEquipment</a>:
<ul>
<li>Usually one-time settings:
<ul>
<li><a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_MachiningChain">MachiningChain</a> - Configure the complete machine tool including geometry, kinematic chain, and coordinate transformations</li>
<li><a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_SpindleCapability">SpindleCapability</a> - Configure <a class="xref" href="../../api/Hi.Milling.SpindleCapability.html">SpindleCapability</a></li>
<li><a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipment.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipment_CoolantHeatCondition">CoolantHeatCondition</a> - Configure coolant heat conditions</li>
<li>BackgroundTemperature - Configure environment background temperature</li>
</ul>
</li>
<li>Variable settings:
<ul>
<li><a class="xref" href="../../api/Hi.NcMech.Fixtures.Fixture.html">Fixture</a> - Configure fixture</li>
<li><a class="xref" href="../../api/Hi.NcMech.Workpieces.Workpiece.html">Workpiece</a> - Configure workpiece</li>
</ul>
</li>
</ul>
</li>
<li>Set <a class="xref" href="../../api/Hi.Machining.MachiningToolHouse.html">MachiningToolHouse</a> - Configure tool house</li>
<li>Set <a class="xref" href="../../api/Hi.Numerical.NcEnv.html">NcEnv</a> (Controller) - Configure NC system environment parameters</li>
</ul>
<h2 id="3-setting-project-tasks">3. Setting Project Tasks</h2>
<p>Set sequential tasks using <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html#Hi_MachiningProcs_MachiningProject_PlayerCommand">PlayerCommand</a>:</p>
<ul>
<li>Set NC Files - Set the file path and customize simulation and optimization settings for each NC file</li>
<li>Configure NC optimization - Configure NC code optimization parameters</li>
<li>Set <a class="xref" href="../../api/Hi.ShellCommands.GeomDiffCommand.html">GeomDiffCommand</a> - Configure geometry comparison functionality to compare target workpiece shape with simulated shape</li>
<li>Set <a class="xref" href="../../api/Hi.MillingForces.Training.MillingTraining.html">MillingTraining</a> - Configure milling parameter training to calibrate simulation parameters based on actual machining data</li>
<li>Other task configurations&hellip;</li>
</ul>
<p>The PlayerCommand is typically a <a class="xref" href="../../api/Hi.ShellCommands.ListCommand.html">ListCommand</a> that contains a sequence of command entries to be executed during the simulation.</p>
<h2 id="4-run-the-tasks-simulation-and-optimization">4. Run the Tasks (Simulation and Optimization)</h2>
<p>Run <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html#Hi_MachiningProcs_MachiningProject_PlayerCommand">PlayerCommand</a> through <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_PacePlayer">PacePlayer</a>.</p>
<p>At this stage, the simulation process is similar to video playback, which can be:</p>
<ul>
<li>Started</li>
<li>Stopped</li>
<li>Paused</li>
<li>Run one line</li>
<li>Run one step</li>
<li>Reset</li>
</ul>
<p>The <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_PacePlayer">PacePlayer</a> controls the execution pace of the simulation, allowing you to observe the machining process in detail or run it at full speed.</p>
<h3 id="view-the-analysis-during-process-or-result">View the Analysis During Process or Result</h3>
<p><a class="xref" href="../../api/Hi.MachiningProcs.SessionMessageHost.html">SessionMessageHost</a> contains a sequence of simulation messages and step data, which can be used to monitor and analyze the simulation process and results.</p>
<h2 id="ui-pattern">UI Pattern</h2>
<p>The user interface navigation bar matches the workflow. Top-level navigation items include:</p>
<ul>
<li><a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a>
<ul>
<li>New</li>
<li>Save</li>
<li>Load</li>
</ul>
</li>
<li>Environment
<ul>
<li>...</li>
</ul>
</li>
<li>Task
<ul>
<li>...</li>
</ul>
</li>
<li>Sim (Simulation)</li>
</ul>
<p>This UI structure makes it intuitive to follow the HiNC workflow from project creation to simulation execution.</p>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>
@@ -0,0 +1,193 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Getting Started with HiAPI | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Getting Started with HiAPI | 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="getting-started-with-hiapi">Getting Started with HiAPI</h1>
<p>This guide will help you get started with HiAPI development.</p>
<h2 id="installation">Installation</h2>
<ol>
<li><p>Create a dotnet project.</p>
</li>
<li><p>Setting the nuget server and account.</p>
<p>The HiAPI installation is typical Nuget Package installation. You can apply global or local nuget setting.</p>
<p>Here apply the local solution for startup. Create a file and name it to <code>nuget.config</code> in the same folder of your dotnet project file. the content of the file is as the following:</p>
<pre><code class="lang-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;configuration&gt;
&lt;packageSources&gt;
&lt;add key=&quot;HiAPI&quot; value=&quot;https://superhightech-gitea.webredirect.org/api/packages/HiAPI/nuget/index.json&quot; /&gt;
&lt;add key=&quot;nuget.org&quot; value=&quot;https://api.nuget.org/v3/index.json&quot; protocolVersion=&quot;3&quot; /&gt;
&lt;/packageSources&gt;
&lt;packageSourceCredentials&gt;
&lt;HiAPI&gt;
&lt;add key=&quot;Username&quot; value=&quot;xxxxxx&quot; /&gt;
&lt;add key=&quot;ClearTextPassword&quot; value=&quot;xxxxxx&quot; /&gt;
&lt;/HiAPI&gt;
&lt;/packageSourceCredentials&gt;
&lt;/configuration&gt;
</code></pre>
</li>
<li><p>In the dotnet project file, add the package reference.</p>
<pre><code class="lang-xml">&lt;ItemGroup&gt;
&lt;PackageReference Include=&quot;HiNc&quot; Version=&quot;3.1.*&quot; /&gt;
&lt;!--optional--&gt;
&lt;PackageReference Include=&quot;Hi.WpfPlus&quot; Version=&quot;*&quot; /&gt;
&lt;/ItemGroup&gt;
</code></pre>
</li>
<li><p>In the program file, setting the HiNC application initialization and finalization.</p>
<pre><code class="lang-csharp" name="SampleCode">using Hi.Disp;
using Hi.HiNcKits;
using Hi.Licenses;
using Hi.MongoUtils;
using System;
namespace Sample
{
/// &lt;summary&gt;
/// A sample class demonstrating initialization and usage of the HiAPI framework.
/// Shows the basic setup of display engine, MongoDB server, licensing, and other core functionality.
/// &lt;/summary&gt;
/// &lt;remarks&gt;
/// This example serves as an entry point for those getting started with HiAPI.
/// It demonstrates proper initialization and teardown of key components.
/// ### Source Code
/// [!code-csharp[SampleCode](~/../Hi.Sample/HelloHiAPI.cs)]
/// &lt;/remarks&gt;
public static class HelloHiAPI
{
static int Main(string[] args)
{
Console.WriteLine(&quot;HiAPI starting.&quot;);
LocalApp.AppBegin();
Console.WriteLine(&quot;Hello World! HiAPI.&quot;);
LocalApp.AppEnd();
Console.WriteLine(&quot;HiAPI exited.&quot;);
return 0;
}
}
}
</code></pre></li>
</ol>
<h2 id="sample-code-to-start-a-">Sample Code to Start a <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a></h2>
<p>See the following sample code to start a HiAPI application.</p>
<ul>
<li><a class="xref" href="../../sample/Sample.Machining.DemoBuildMachiningProject.html">DemoBuildMachiningProject</a>
Build a <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a>.</li>
<li><a class="xref" href="../../sample/Sample.Machining.DemoUseMachiningProject.html">DemoUseMachiningProject</a>
Load a <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> and run NC simulation.</li>
<li><a class="xref" href="../../sample/Sample.Machining.DemoRenderingMachiningProcessAndStripPosSelection.html">DemoRenderingMachiningProcessAndStripPosSelection</a>
Apply <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> to 3D canvas with user-interaction in windows platform.</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,180 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HiAPI Overview | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="HiAPI Overview | 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="hiapi-overview">HiAPI Overview</h1>
<p>HiAPI is a C# software development kit for machining simulation. It provides libraries for NC motion simulation, collision detection, geometry removal simulation, milling force simulation, optimization, and more.</p>
<h2 id="nuget-packages">Nuget Packages</h2>
<p>The HiAPI is applied by the form of Nuget Packages. You have to apply <code>HiNc</code> nuget package and its dependencies. They include all the functionality of the HiNC software, but do not include the GUI components.</p>
<p>The packages can be downloaded and installed from the HiAPI NuGet Server. The server URL is:</p>
<p><a href="%5Bhttps://superhightech-gitea.webredirect.org/api/packages/HiAPI/nuget/index.json">https://superhightech-gitea.webredirect.org/api/packages/HiAPI/nuget/index.json</a></p>
<div class="NOTE">
<h5>Note</h5>
<ul>
<li>Authentication is required to access the server (username and password)</li>
<li>Direct browser access to the URL will not show meaningful content. Since the server is designed for Visual Studio NuGet package management. For more information about NuGet, visit <a href="https://www.nuget.org/">NuGet.org</a></li>
</ul>
</div>
<h3 id="package-dependencies">Package Dependencies</h3>
<p>The <code>HiNc</code> package has the following dependency chain:</p>
<pre><code class="lang-mermaid">graph LR
HiGeom --&gt; HiDisp
HiDisp --&gt; HiCbtr
HiCbtr --&gt; HiMech
HiMech --&gt; HiUniNc
HiUniNc --&gt; HiNc
HiDisp --&gt; Hi.WinForm
HiDisp --&gt; Hi.WpfPlus
style HiNc fill:#d3d,stroke:#333,stroke-width:2px
</code></pre>
<h3 id="ui-framework-support">UI Framework Support</h3>
<p>If you need to develop Windows desktop applications:</p>
<ul>
<li>For Windows Forms applications, use the <code>Hi.WinForm</code> package.</li>
<li>For WPF applications, use the <code>Hi.WpfPlus</code> package.</li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p>See <a href="basic/rendering/rendering-canvas/custom-implementation.html">Building Your Own Rendering Canvas</a> to build the rendering canvas cross-platform.</p>
</div>
<h2 id="rendering-canvas-source-code-repositories">Rendering Canvas Source Code Repositories</h2>
<ul>
<li>Hi.WinForm
<ul>
<li><a href="https://superhightech-gitea.webredirect.org/HiNC-Deploy/Hi.WinForm.git">https://superhightech-gitea.webredirect.org/HiNC-Deploy/Hi.WinForm.git</a></li>
</ul>
</li>
<li>Hi.WpfPlus
<ul>
<li><a href="https://superhightech-gitea.webredirect.org/HiNC-Deploy/Hi.WpfPlus.git">https://superhightech-gitea.webredirect.org/HiNC-Deploy/Hi.WpfPlus.git</a></li>
</ul>
</li>
</ul>
<h2 id="hiapi-sample-code">HiAPI Sample Code</h2>
<p>See <a href="../sample/Sample.Machining.html">Sample Code</a> or download the repositories to get more samples. The following sample repository demonstrate various aspects of using HiAPI for machining simulation:</p>
<ul>
<li>Hi.Sample
<ul>
<li><a href="https://superhightech-gitea.webredirect.org/HiNC-Deploy/Hi.Sample.git">https://superhightech-gitea.webredirect.org/HiNC-Deploy/Hi.Sample.git</a></li>
<li>The repository generally contains the sample codes without using rendering canvas.</li>
</ul>
</li>
<li>Hi.Sample.Wpf
<ul>
<li><a href="https://superhightech-gitea.webredirect.org/HiNC-Deploy/Hi.Sample.Wpf.git">https://superhightech-gitea.webredirect.org/HiNC-Deploy/Hi.Sample.Wpf.git</a></li>
<li>The repository generally contains the sample code that requires rendering canvas.</li>
</ul>
</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,193 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Release Note | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Release Note | 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="release-note">Release Note</h1>
<h2 id="hinc-packages-version-31106">HiNc Packages Version 3.1.106</h2>
<ul>
<li>Rename mapping API for clearer naming:
<ul>
<li><code>ReadCsvByTimeInterpolation</code><a class="xref" href="../../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_MapSingleByCsvFile_">MapSingleByCsvFile</a> (one-to-one mapping)</li>
<li><code>MapByActualTime</code><a class="xref" href="../../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_MapSeriesByCsvFile_">MapSeriesByCsvFile</a> (one-to-many mapping)</li>
</ul>
</li>
<li>Rename CSV column prefix <code>Spindle</code> to <code>Holder</code> for sensor data mapping</li>
<li>Unify CSV column tags to <a class="xref" href="../../api/Hi.Mapping.MappingUtil.html">MappingUtil</a> for consistent data mapping</li>
<li>Fix <a class="xref" href="../../api/Hi.CutterLocations.ClStrips.ClStrip.html#Hi_CutterLocations_ClStrips_ClStrip_ChartRange">ChartRange</a> manipulation to be time-based instead of step-based for more accurate time chart display</li>
<li>Tune thread priority for machining parallel processing to improve UI responsiveness during simulation</li>
<li>Various code cleanup and improvements</li>
</ul>
<h2 id="hinc-packages-version-31102">HiNc Packages Version 3.1.102</h2>
<ul>
<li>Separate resource files (Resource, wwwroot, Doc) to HiNc-Resource nuget package for smaller package size</li>
<li>Add <a class="xref" href="../../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_ScaledFeedPerCycle_">ScaledFeedPerCycle</a> function for scaled feed-per-cycle machining motion resolution</li>
<li>Upgrade target framework to .NET 10.0</li>
<li>Various code cleanup and improvements</li>
</ul>
<h2 id="hinc-packages-version-31100">HiNc Packages Version 3.1.100</h2>
<ul>
<li>Refactor project architecture: split runtime functions from <a class="xref" href="../../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> to <a class="xref" href="../../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> for better separation of concerns</li>
<li>Improve <a class="xref" href="../../api/Hi.MillingForces.Training.MillingTraining.html">MillingTraining</a> module with separate lead and result parameter templates for more accurate cutting parameter training</li>
<li>Separate C++ library for code protection</li>
<li>Add UTF-8 file path support for runtime geometry IO operations</li>
<li>Improve <a class="xref" href="../../api/Hi.Numerical.FilePlayers.CsvRunner.html">CsvRunner</a> with enhanced time mapping pattern</li>
<li>Various architecture improvements and bug fixes</li>
</ul>
<h2 id="hinc-packages-version-3191">HiNc Packages Version 3.1.91</h2>
<ul>
<li>Add <a class="xref" href="../../api/Hi.NcOpt.NcOptimizationEmbeddedLogMode.html">NcOptimizationEmbeddedLogMode</a> to control embedded log detail level (None/SimpleLog/FullLog) (see <a href="../../user-guide/zh-Hant/script/NcOptimization/index.html#%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%97%A5%E8%AA%8C%E8%A8%BB%E8%A7%A3">嵌入式日誌註解</a>).</li>
<li>Fix bug of <a class="xref" href="../../api/Hi.NcOpt.NcOptProc.html">NcOptProc</a> duplicated feedrate assignment</li>
</ul>
<h2 id="hinc-packages-version-3190">HiNc Packages Version 3.1.90</h2>
<ul>
<li>Rename optimization log API <a class="xref" href="../../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_EnableIndividualStepAdjustmentLog_">EnableIndividualStepAdjustmentLog</a></li>
<li>Fix crash from workpiece displaying with specific mechanical topology setting</li>
<li>Improve <code>.flatproc.log</code> output to maintain step order during parallel computation</li>
<li>Various stability improvements and bug fixes</li>
</ul>
<h2 id="hinc-packages-version-3186">HiNc Packages Version 3.1.86</h2>
<ul>
<li>Re-build <a class="xref" href="../../api/Hi.NcOpt.NcOptProc.html">NcOptProc</a> with stricter optimization logics</li>
<li>Add optimization logging features (see <a href="../../user-guide/zh-Hant/script/NcOptimization/index.html#%E5%84%AA%E5%8C%96%E6%97%A5%E8%AA%8C">優化日誌</a>):
<ul>
<li><code>.flatproc.log</code> file output for optimization process analysis</li>
<li>Embedded log comments in optimized NC file marking source lines with <code>(src)</code> suffix</li>
</ul>
</li>
<li>Fix cutting depth and width accuracy by bounding-box method with workpiece surface</li>
<li>Fix collision check error during concurrent changing collidable object</li>
<li>Various stability improvements and bug fixes</li>
</ul>
<h2 id="hinc-packages-version-3184">HiNc Packages Version 3.1.84</h2>
<ul>
<li>Optimize memory usage by shrinking map-size of clStripPos</li>
<li>Fix design pattern of cutting parameter training module (<a class="xref" href="../../api/Hi.MillingForces.Training.MillingTraining.html">MillingTraining</a>)</li>
<li>Add <a class="xref" href="../../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_LoadCuttingParaByFile_">LoadCuttingParaByFile</a> function to load cutting parameters from file</li>
<li>Improve <a class="xref" href="../../api/Hi.Numerical.FilePlayers.CsvRunner.html">CsvRunner</a> actual time parsing: automatically calculate step duration from actual time when duration is not provided</li>
<li>Enhance message handling in <a class="xref" href="../../api/Hi.MachiningProcs.RuntimeApi.html">RuntimeApi</a> by unifying SessionMessageHost usage</li>
<li>Improve optimization performance with better task scheduling</li>
<li>Various performance improvements and bug fixes</li>
</ul>
<h2 id="hinc-packages-version-3175">HiNc Packages Version 3.1.75</h2>
<ul>
<li>Add actual time tracking functionality (<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_ActualTime_">ActualTime</a>)</li>
<li>Various stability improvements and bug fixes</li>
</ul>
<h2 id="hinc-packages-version-3174">HiNc Packages Version 3.1.74</h2>
<ul>
<li>Rename class <code>MillingCutterOptLimit</code> to <a class="xref" href="../../api/Hi.NcOpt.MillingCutterOptOption.html">MillingCutterOptOption</a></li>
<li>Add physics simulation function for relief face collision depth detection (<a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_ReliefFaceCollidingDepth_mm_">ReliefFaceCollidingDepth_mm</a>) and optimization (<a class="xref" href="../../api/Hi.NcOpt.MillingCutterOptOption.html#Hi_NcOpt_MillingCutterOptOption_EnableLimitByReliefAngle_">EnableLimitByReliefAngle</a>)</li>
<li>Add <a class="xref" href="../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_UpdateNcOptOption_">UpdateNcOptOption</a> function to step processing</li>
<li>Fix step ordering bug from concurrent processing</li>
<li>Fix ClStrip shrinking to zero issue</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,137 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>System Requirements | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="System Requirements | 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="system-requirements">System Requirements</h1>
<ul>
<li><strong>Operating System</strong>:
<ul>
<li>Windows 10 or later</li>
<li>Ubuntu 22.04 LTS</li>
</ul>
</li>
<li><strong>CPU Architecture</strong>: x64 (ARM not yet supported)</li>
<li><strong>Runtime</strong>: .NET 9.0 or later</li>
<li><strong>Memory (RAM)</strong>:
<ul>
<li>Minimum: 8GB RAM (suitable for low-resolution models)</li>
<li>Recommended: 128GB RAM or higher (for large and detailed models)</li>
</ul>
</li>
<li><strong>Graphics</strong>:
<ul>
<li>OpenGL 4.4 compatible graphics card or integrated graphics</li>
<li>Most computers manufactured within the last 15 years meet this requirement</li>
</ul>
</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>
+259
View File
@@ -0,0 +1,259 @@
<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="release-note/index.html" name="" title="Release Note">Release Note</a>
</li>
<li>
<a href="system-requirements.html" name="" title="System Requirements">System Requirements</a>
</li>
<li>
<a href="getting-started/index.html" name="" title="Getting Started">Getting Started</a>
</li>
<li>
<span class="expand-stub"></span>
<a href="build-hinc/index.html" name="" title="HiNC GUI Architecture">HiNC GUI Architecture</a>
<ul class="nav level2">
<li>
<a href="build-hinc/general-rules.html" name="" title="General Rules">General Rules</a>
</li>
<li>
<span class="expand-stub"></span>
<a href="build-hinc/index.html" name="" title="Common Patterns">Common Patterns</a>
<ul class="nav level3">
<li>
<a href="build-hinc/common/dictionary-service-pattern.html" name="" title="DictionaryService and DictionaryHub Pattern">DictionaryService and DictionaryHub Pattern</a>
</li>
</ul>
</li>
<li>
<span class="expand-stub"></span>
<a href="build-hinc/index.html" name="" title="Web Service Architecture">Web Service Architecture</a>
<ul class="nav level3">
<li>
<a href="build-hinc/hinc-web-service/disp-web-service.html" name="" title="Rendering Canvas on Web Service">Rendering Canvas on Web Service</a>
</li>
</ul>
</li>
<li>
<a href="build-hinc/initialize-hiapi.html" name="" title="Initialize HiAPI">Initialize HiAPI</a>
</li>
<li>
<a href="build-hinc/main-panel.html" name="" title="Main Panel">Main Panel</a>
</li>
<li>
<a href="build-hinc/message-section-on-main-panel.html" name="" title="Bottom Message Bar">Bottom Message Bar</a>
</li>
<li>
<a href="build-hinc/renderingcanvas-tool-bar.html" name="" title="RenderingCanvas Tool Bar">RenderingCanvas Tool Bar</a>
</li>
<li>
<span class="expand-stub"></span>
<a href="build-hinc/player/index.html" name="" title="Player Panel">Player Panel</a>
<ul class="nav level3">
<li>
<a href="build-hinc/player/player-tool-bar.html" name="" title="Player Tool Bar">Player Tool Bar</a>
</li>
<li>
<a href="build-hinc/player/player-extended-renderingcanvas-tool-bar.html" name="" title="Player Extended RenderingCanvas Tool Bar">Player Extended RenderingCanvas Tool Bar</a>
</li>
<li>
<a href="build-hinc/player/selected-step-info-panel.html" name="" title="Selected-Step Info Panel">Selected-Step Info Panel</a>
</li>
</ul>
</li>
<li>
<a href="build-hinc/session-message-panel/index.html" name="" title="Session Message Panel">Session Message Panel</a>
</li>
<li>
<span class="expand-stub"></span>
<a href="build-hinc/index.html" name="" title="Preference">Preference</a>
<ul class="nav level3">
<li>
<a href="build-hinc/preference/index.html" name="" title="Preference Menu">Preference Menu</a>
</li>
<li>
<a href="build-hinc/preference/graphic-cache-dropdown.html" name="" title="Graphic-Cache Dropdown">Graphic-Cache Dropdown</a>
</li>
<li>
<a href="build-hinc/preference/language-selection-submenu.html" name="" title="Language Selection">Language Selection</a>
</li>
<li>
<a href="build-hinc/preference/step-present-preference-page.html" name="" title="Step Present Preference">Step Present Preference</a>
</li>
</ul>
</li>
<li>
<span class="expand-stub"></span>
<a href="build-hinc/index.html" name="" title="Widget">Widget</a>
<ul class="nav level3">
<li>
<a href="build-hinc/widget/vec3d/index.html" name="" title="Vec3d Control">Vec3d Control</a>
</li>
<li>
<a href="build-hinc/widget/object-management-menu-button.html" name="" title="Object Management Menu Button">Object Management Menu Button</a>
</li>
<li>
<a href="build-hinc/widget/gui-file-path-assignment.html" name="" title="GUI File Path Assignment">GUI File Path Assignment</a>
</li>
<li>
<a href="build-hinc/widget/polar-resolution-2d-panel.html" name="" title="Polar Resolution 2D Panel">Polar Resolution 2D Panel</a>
</li>
<li>
<a href="build-hinc/widget/numeric-io-utilities.html" name="" title="Numeric Input/Output Utilities">Numeric Input/Output Utilities</a>
</li>
<li>
<a href="build-hinc/widget/resizable-bar.html" name="" title="Resizable Bar">Resizable Bar</a>
</li>
</ul>
</li>
<li>
<span class="expand-stub"></span>
<a href="build-hinc/geom/index.html" name="" title="Geometry Panels">Geometry Panels</a>
<ul class="nav level3">
<li>
<a href="build-hinc/geom/box3d-control.html" name="" title="Box3d Control">Box3d Control</a>
</li>
<li>
<a href="build-hinc/geom/cylindroid-control.html" name="" title="Cylindroid Control">Cylindroid Control</a>
</li>
<li>
<a href="build-hinc/geom/geom-combination-control.html" name="" title="Geometry Combination Control">Geometry Combination Control</a>
</li>
<li>
<a href="build-hinc/geom/geom-manage-control.html" name="" title="Geometry Management Panel">Geometry Management Panel</a>
</li>
<li>
<a href="build-hinc/geom/runtime-geom-panel.html" name="" title="Runtime Geometry Panel">Runtime Geometry Panel</a>
</li>
<li>
<a href="build-hinc/geom/stlfile-control.html" name="" title="STL File Control">STL File Control</a>
</li>
<li>
<a href="build-hinc/geom/transformation-geom-control.html" name="" title="Transformation Geometry Control">Transformation Geometry Control</a>
</li>
</ul>
</li>
<li>
<span class="expand-stub"></span>
<a href="build-hinc/index.html" name="" title="Mechanism">Mechanism</a>
<ul class="nav level3">
<li>
<a href="build-hinc/mech/topo/transformers.html" name="" title="Transformers">Transformers</a>
</li>
<li>
<a href="build-hinc/mech/fixture-page.html" name="" title="Fixture Page">Fixture Page</a>
</li>
<li>
<a href="build-hinc/mech/workpiece-page.html" name="" title="Workpiece Page">Workpiece Page</a>
</li>
</ul>
</li>
<li>
<a href="build-hinc/controller/index.html" name="" title="Controller Page">Controller Page</a>
</li>
<li>
<span class="expand-stub"></span>
<a href="build-hinc/mission/index.html" name="" title="Mission Page">Mission Page</a>
<ul class="nav level3">
<li>
<a href="build-hinc/mission/script-command-panel.html" name="" title="Script Command Panel">Script Command Panel</a>
</li>
<li>
<a href="build-hinc/mission/ListCommand-panel.html" name="" title="List Command Panel">List Command Panel</a>
</li>
<li>
<a href="build-hinc/mission/PreSettingCommand-panel.html" name="" title="PreSetting Command Panel">PreSetting Command Panel</a>
</li>
<li>
<a href="build-hinc/mission/NcOptOption-panel.html" name="" title="NcOptOption Panel">NcOptOption Panel</a>
</li>
<li>
<a href="build-hinc/mission/NcFileCommand-panel.html" name="" title="NcFile Command Panel">NcFile Command Panel</a>
</li>
<li>
<a href="build-hinc/mission/NcCodeCommand-panel.html" name="" title="NcCode Command Panel">NcCode Command Panel</a>
</li>
<li>
<a href="build-hinc/mission/PostExecutionCommand-panel.html" name="" title="PostExecution Command Panel">PostExecution Command Panel</a>
</li>
</ul>
</li>
</ul>
</li>
<li>
<span class="expand-stub"></span>
<a>Logic</a>
<ul class="nav level2">
<li>
<a href="basic/geom/basic-geometry.html" name="" title="Basic Geometry">Basic Geometry</a>
</li>
<li>
<span class="expand-stub"></span>
<a href="basic/rendering/index.html" name="" title="Rendering">Rendering</a>
<ul class="nav level3">
<li>
<a href="basic/rendering/rendering-canvas/index.html" name="" title="Using RenderingCanvas with DispEngine">Using RenderingCanvas with DispEngine</a>
</li>
<li>
<a href="basic/rendering/rendering-canvas/custom-implementation.html" name="" title="Building Your Own Rendering Canvas">Building Your Own Rendering Canvas</a>
</li>
<li>
<a href="basic/rendering/drawing/index.html" name="" title="Drawing">Drawing</a>
</li>
</ul>
</li>
<li>
<span class="expand-stub"></span>
<a>Mechanism Topology</a>
<ul class="nav level3">
<li>
<a href="basic/mechanism/index.html" name="" title="Overview">Overview</a>
</li>
<li>
<a href="basic/mechanism/Topo/index.html" name="" title="Topology Structure">Topology Structure</a>
</li>
<li>
<a href="basic/mechanism/transformers/index.html" name="" title="Transformers">Transformers</a>
</li>
<li>
<a href="basic/mechanism/render-topology/index.html" name="" title="Render Topology">Render Topology</a>
</li>
</ul>
</li>
<li>
<a href="basic/common/xml-io.html" name="" title="XML IO">XML IO</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
File diff suppressed because one or more lines are too long