Archived
472 lines
43 KiB
HTML
472 lines
43 KiB
HTML
<!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 "{query}"">
|
||
<meta name="loc:searchNoResults" content="No results for "{query}"">
|
||
<meta name="loc:tocFilter" content="Filter by title">
|
||
<meta name="loc:nextArticle" content="Next">
|
||
<meta name="loc:prevArticle" content="Previous">
|
||
<meta name="loc:themeLight" content="Light">
|
||
<meta name="loc:themeDark" content="Dark">
|
||
<meta name="loc:themeAuto" content="Auto">
|
||
<meta name="loc:changeTheme" content="Change theme">
|
||
<meta name="loc:copy" content="Copy">
|
||
<meta name="loc:downloadPdf" content="Download PDF">
|
||
|
||
<script type="module" src="./../public/docfx.min.js"></script>
|
||
|
||
<script>
|
||
const theme = localStorage.getItem('theme') || 'auto'
|
||
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
|
||
</script>
|
||
|
||
</head>
|
||
|
||
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
|
||
<header class="bg-body border-bottom">
|
||
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
|
||
<div class="container-xxl flex-nowrap">
|
||
<a class="navbar-brand" href="../index.html">
|
||
<img id="logo" class="svg" src="../img/HiAPI.logo.png" alt="">
|
||
|
||
</a>
|
||
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
|
||
<i class="bi bi-three-dots"></i>
|
||
</button>
|
||
<div class="collapse navbar-collapse" id="navpanel">
|
||
<div id="navbar">
|
||
<form class="search" role="search" id="search">
|
||
<i class="bi bi-search"></i>
|
||
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
</header>
|
||
|
||
<main class="container-xxl">
|
||
<div class="toc-offcanvas">
|
||
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
|
||
<div class="offcanvas-header">
|
||
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
|
||
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
|
||
</div>
|
||
<div class="offcanvas-body">
|
||
<nav class="toc" id="toc"></nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="content">
|
||
<div class="actionbar">
|
||
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
|
||
<i class="bi bi-list"></i>
|
||
</button>
|
||
|
||
<nav id="breadcrumb"></nav>
|
||
</div>
|
||
|
||
<article data-uid="">
|
||
<h1 id="release-note">Release Note</h1>
|
||
|
||
<h2 id="hinc-packages-32">HiNc Packages 3.2</h2>
|
||
<h3 id="at-a-glance">At a glance</h3>
|
||
<p>3.2 is largely one piece of work: the NC interpreter that reads a controller program is now composed
|
||
from configurable parts rather than written into one class, and most of this release is the brand
|
||
coverage that made possible. A Siemens or Heidenhain program that 3.1.175 could not interpret past
|
||
its first computed coordinate or subprogram call now replays end to end.</p>
|
||
<p><strong>Control-language coverage.</strong> The figure is <strong>how far our own verification has reached</strong> on that
|
||
dialect — it is not the share of the language that is implemented, and it is not a guarantee for a
|
||
program we have not seen:</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Control language</th>
|
||
<th>Verification reached</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>Cutter location (NX CLSF / APT source)</td>
|
||
<td>~90%</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Fanuc</td>
|
||
<td>~80%</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Siemens SINUMERIK</td>
|
||
<td>~60%</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Heidenhain (klartext and DIN/ISO)</td>
|
||
<td>~40%</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>Syntec and Mazak run on the Fanuc-family vocabulary; their brand-specific syntax has not been worked
|
||
through and they are not covered by the figures above. The per-construct picture — including what is
|
||
recognized and deliberately <em>not</em> simulated — is in the
|
||
<a href="../technique/nc-dialects/nc-parsing.html#brand-support">brand support matrix</a>.</p>
|
||
<p><strong>Failures say what went wrong.</strong> The class of defect this release spent most effort on is the
|
||
silent one: a Siemens tool offset with no table row that resolved to zero and machined a whole
|
||
program one tool length low, a G68 rotation that did nothing while reporting itself active, a tilted
|
||
plane the machine could not reach. Each of those is now a named, searchable diagnostic rather than a
|
||
plausible-looking wrong result — see the <a href="upgrading-to-3.2/new-diagnostics.html">diagnostic id
|
||
table</a>.</p>
|
||
<p><strong>Simulation is faster and holds a bigger program.</strong> Physics moved into the native kernel (a paired
|
||
play: 59.3 s / 16.1 GB allocated → 40.6 s / 3.4 GB), building the topology of a large STL is linear
|
||
rather than quadratic in triangle count, and a long program no longer degrades as it plays. Figures
|
||
and their conditions are under
|
||
<a href="upgrading-to-3.2/performance-and-footprint.html">Performance and footprint</a>.</p>
|
||
<p><strong>The application product moves to the web API.</strong> The web service is the application the product
|
||
line is built on, and its source is the same <a href="../technique/api-foundations/packages-and-samples.html#hiapi-sample-code"><code>HiNC-2025-webservice</code></a>
|
||
sample we publish — what you read there is what the product runs. The WPF desktop client is
|
||
retired with this line: it was a demo of the same packages rather than a product surface, it takes
|
||
no feature work, and it is no longer documented here. The Blazor front end builds against the same
|
||
3.2 packages but is not published as a product.</p>
|
||
<div class="IMPORTANT">
|
||
<h5>Important</h5>
|
||
<p><strong>Adoption status.</strong> This drop is published for review. Verification is still in progress across
|
||
most areas, and the coverage figures above are the honest state of it.</p>
|
||
<p><strong>Do not put 3.2 NC optimization into production.</strong> It is not finished on this line. Work that
|
||
depends on optimization should stay on the 3.1 line, which is serviced as <code>3.1.175.<patch></code>. The
|
||
Blazor front end tracks the 3.2 packages, so it is not a way to stay on the 3.1 behaviour.</p>
|
||
</div>
|
||
<h3 id="what-changed">What changed</h3>
|
||
<p><strong>This one entry covers everything since 3.1.175.</strong> The 3.1 line is closed at the 3.1.175 package
|
||
set and is serviced only as <code>3.1.175.<patch></code>; <code>master</code> moved all ten packages onto the <strong>3.2</strong> line
|
||
on 2026-08-24 and restarted their build counters. So a 3.2 build number starts low, the two
|
||
counters are not comparable, and the gap between the last 3.1 number a feed served and the first
|
||
3.2 one is expected rather than a missing upload. The versions in between were never published as a
|
||
release set, which is why they are merged here rather than listed separately. Each package's build
|
||
counter advances on its own, so no single number is common to all ten; a set is named by its HiNc
|
||
package version — see <a href="upgrading-to-3.2/the-package-line.html">The package line</a>.</p>
|
||
<p>Everything below therefore lands at once on a caller moving a 3.1.175 reference to 3.2.
|
||
<strong>See <a href="upgrading-to-3.2/index.html">Upgrading from 3.1.175 to 3.2</a> for the full detail</strong> — the summary here
|
||
is the shape of the upgrade, not the whole of it.</p>
|
||
<h3 id="breaking-changes">Breaking changes</h3>
|
||
<p>In the order they will bite. Full table with replacements on the upgrade page.</p>
|
||
<ul>
|
||
<li><strong>Registration:</strong> <code>XFactory.Generators</code> becomes a <code>ConcurrentDictionary</code> (a caller declaring the
|
||
old type breaks at compile time), and <code>LocalProjectService.Reg()</code> must still be called once at
|
||
startup before any project XML is deserialized</li>
|
||
<li><strong>Messages:</strong> <code>MixedProgress0</code>, <code>MultiTagMessage</code> and <code>MultiTagMessageUtil</code> are removed; every
|
||
message parameter is retyped from <code>IProgress<object></code> to <code>IProgress<IMessage></code>; <code>Category.General</code>
|
||
is deleted and <code>NcDiagnostic.Text</code> renames to <code>Notification</code></li>
|
||
<li><strong>Session lifetime:</strong> <code>LocalProjectService.SessionShell</code> is null outside a session and
|
||
<code>ShellProgress</code> is recreated per session — hold no long-lived reference; <code>MachiningSession</code> takes
|
||
an injected <code>IMachiningService</code>, and <code>IMachiningService</code> replaces
|
||
<code>PlayerCancellationToken</code> / <code>PausePlayer</code> with one <code>PacePlayer</code></li>
|
||
<li><strong>Play verbs:</strong> <code>PlayNcFile</code> / <code>RunNcFile</code> gain an <code>NcKind kind = NcKind.Auto</code> parameter and
|
||
dispatch by extension; the old narrow verbs become <code>PlayBrandNcFile</code> / <code>RunBrandNcFile</code>. The
|
||
“Control” vocabulary retires with them (<code>IControlRunner</code> → <code>INcRunner</code>, <code>RunControlLines</code> →
|
||
<code>RunNcLines</code>, <code>ControlKind</code> → <code>NcKind</code>)</li>
|
||
<li><strong>Hard renames, no shim:</strong> runtime geom → <strong>meshed geom</strong> across <code>WorkpieceService</code>;
|
||
<code>IContourTray</code> / <code>UniformContourTray</code> / <code>FreeContourTray</code> → <strong><code>IFluting</code> / <code>UniformFluting</code> /
|
||
<code>FreeFluting</code></strong> and <code>MillingCutter.FluteContourTray</code> → <code>Fluting</code>; HiNc's <code>Hi.Common.ResourceUtil</code>
|
||
→ <code>ResourceLayout</code> (it was shadowing HiGeom's same-named type); the native topo-STL wrappers move
|
||
to <code>Hi.Geom.Topo</code>; <code>ITimeGetter</code> → <code>ITimecoded</code>; <code>ClStrip.DrawingRefreshing</code> →
|
||
<code>DrawingRefreshed</code>; <code>SoftNcRunner.NcDependencyList</code> → <code>PipelineNcDependencyList</code></li>
|
||
<li><strong>Removals:</strong> <code>CsvRunner0</code> and <code>EnableSoftCsvRunner</code>, <code>RawCsvRunner</code>, <code>IndexedSentence</code>,
|
||
<code>SimpleSessionCommand</code>, <code>LsStl</code>; the GUI-layer types <code>MachiningProjectDisplayee</code>,
|
||
<code>IsoCoordinateEntryDisplayee</code>, <code>HeidenhainCoordinateEntryDisplayee</code>, <code>UserConfig</code>, <code>UserService</code>
|
||
and <code>PlayerDivConfig</code>; the managed physics kernel types <code>FluteZData</code>,
|
||
<code>MillingForceUtil.RuntimePack</code> / <code>LayerPack</code> / <code>AnglePack</code> and
|
||
<code>MillingPhysicsBrief.YieldStressMinHeight_mm</code>; <code>CultureUtil.SupportedCultureNames</code> and
|
||
<code>SetCurrentCulture(string)</code>; eight <code>gl*</code> P/Invoke declarations that had no backing export; and
|
||
<code>PostExecutionCommand</code>'s meshed-geometry output pair (use <code>RecordMeshedGeomCommand</code> /
|
||
<code>ExportMeshedGeomToStlCommand</code> instead)</li>
|
||
<li><strong>Shapes:</strong> <code>MachiningToolHouse</code> derives from <code>Dictionary<int, IMachiningTool></code>;
|
||
<code>MachiningStep.ActualTimecode</code> / <code>ActualDateTime</code> become get-only views onto the new
|
||
<code>ActualTime</code>; <code>PreSettingCommand</code> becomes a legacy bundle that expands on load into five
|
||
single-setting commands and is never written back; <code>ToPresentDto</code> wire keys change</li>
|
||
<li><strong>Defaults:</strong> <code>EnableSoftNcRunner</code> is <code>true</code> — SoftNc is the NC engine and <code>HardNcRunner</code> is the
|
||
opt-out fallback; <code>EnableNativeMillingPhysics</code> is <code>true</code> and a shipping build throws if you set
|
||
it <code>false</code>; <code>YieldingStressRatio</code> reports <strong><code>NaN</code></strong> instead of <code>0</code> when it cannot be evaluated, so
|
||
a caller reading <code>0</code> as “no constraint” must add a <code>NaN</code> branch</li>
|
||
<li><strong>New licence feature <code>NcComposition</code> (id 22)</strong> gates registering a non-built-in unit into a
|
||
<code>SoftNcRunner</code> pipeline and executing an NC-embedded C# script. Degradation is silent and
|
||
functional — the unit is skipped with one <code>Composition--NotLicensed</code> — so an unlicensed
|
||
installation produces a <em>different simulation</em>, not an error</li>
|
||
<li><strong>Packaging:</strong> x64 only; the shipped machine-tool packages are renamed and now carry the <code>.default</code>
|
||
marker (<code>MachineTool/Table-B1.default</code>, <code>MachineTool/CT-350.default</code>), so a project that refers to
|
||
one by its earlier path must be repointed; HiNcServer pins request localization to English and
|
||
HiNcRcl drops the inert <code>HiNC:DisplayEngine:FontFile</code> key</li>
|
||
</ul>
|
||
<p>Some results change without any code change — the pivot-transform anchor, a G68 rotation that was a
|
||
silent no-op, blank lines resetting G90/G91, Heidenhain absolute arc centres, five-axis IK about
|
||
1000× tighter, and MC-linear moves stepping by euclidean tip travel. They are listed with their
|
||
symptoms under
|
||
<a href="upgrading-to-3.2/results-that-change-on-upgrade.html">Results that change on upgrade</a>.</p>
|
||
<h3 id="new-in-this-release">New in this release</h3>
|
||
<ul>
|
||
<li><strong>Siemens SINUMERIK programs replay end to end</strong> — real <code>.mpf</code> / <code>.spf</code> files rather than an ISO
|
||
subset: modal vocabulary and <code>T="name"</code> tool calls, an expression evaluator over R-parameters and
|
||
<code>$</code>-system variables, programmable frames and <code>$P_UIFR</code>, <code>TRAORI</code> RTCP and <code>CYCLE800</code> swivel,
|
||
subprogram and <code>MCALL</code> cycle calls, full control flow with iteration watchdogs, the
|
||
<code>AC()</code> / <code>IC()</code> / <code>DC()</code> per-word coordinate functions and the coded-position family</li>
|
||
<li><strong>Heidenhain plays both dialects on one preset</strong> — klartext motion, datums, tool calls, arcs and
|
||
cycles; Q-parameter evaluation with FN 9–12 conditional jumps; the <code>PLANE</code> / <code>FUNCTION TCPM</code> /
|
||
<code>M128</code> tilt and RTCP stack; subprogram and <code>CALL PGM</code> calls; post-processed spellings written
|
||
without separators; and the DIN/ISO dialect with its absolute <code>I</code> / <code>J</code> / <code>K</code> arc centres</li>
|
||
<li><strong>Fanuc Custom Macro B and polar interpolation</strong> — <code>#var</code> expressions, <code>IF</code> / <code>GOTO</code> / <code>WHILE</code>,
|
||
<code>M98</code> / <code>M99</code> subprograms and <code>G65</code> / <code>G66</code> macro calls; <code>G12.1</code> / <code>G13.1</code> polar coordinate
|
||
interpolation with <code>G41</code> / <code>G42</code> compensation on the hypothetical plane</li>
|
||
<li><strong><a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> is the default NC pipeline.</strong> See
|
||
<a class="xref" href="../technique/nc-dialects/nc-parsing.html">NC Parsing Engine</a> for its architecture and the per-brand
|
||
support matrix</li>
|
||
<li><strong>NC optimization runs on that pipeline</strong> — <em>not finished on this line, see Adoption status above</em>
|
||
— regenerating text as anchored token edits over the verbatim source block, so lines the optimizer
|
||
does not touch round-trip byte-identically. Output follows the source's decimal digits and is
|
||
written back in the source file's encoding, so a GBK or Big5 program keeps its comments</li>
|
||
<li><strong>Cutter-location files drive a real machine chain</strong>, not only a <code>ClMillingDevice</code>, and a played CL
|
||
program converts to Fanuc NC through <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ConvertClToNcFiles_">ConvertClToNcFiles</a></li>
|
||
<li><strong>Milling physics moved into the native kernel</strong> — engagement, force and the sequential thermal
|
||
chain — with the tool's scalar physics frozen once per session into
|
||
<a class="xref" href="../api/Hi.Milling.MillingTools.MillingToolPhysicsPack.html">MillingToolPhysicsPack</a>, which also makes force waveforms
|
||
reproducible between two plays of the same program</li>
|
||
<li><strong>Session commands declare themselves</strong> through
|
||
<a class="xref" href="../api/Hi.SessionCommands.CommandCatalogAttribute.html">CommandCatalogAttribute</a> and
|
||
<a class="xref" href="../api/Hi.SessionCommands.CommandFieldAttribute.html">CommandFieldAttribute</a>, so a generic editor renders them without a
|
||
hand-written form; the HTTP surface answers a no-session or no-project call with 409 and an
|
||
<a class="xref" href="../api/Hi.MachiningProcs.ApiActionResult.html">ApiActionResult</a> envelope carrying the call's notifications</li>
|
||
<li><strong>Diagnostics carry a template and its arguments</strong>, so a front end can re-render a notification in
|
||
its own language, and repeats fold into one per-run summary instead of one message per block</li>
|
||
<li><strong>Shipped resources carry a <code>.default</code> marker</strong> distinguishing system territory from user files,
|
||
and HiNc-Resource ships the five brand controller presets and three coolant presets so those load
|
||
browsers start populated</li>
|
||
<li><strong>A parser configuration is a file, and it is shareable.</strong> <a class="xref" href="../api/Hi.NcParsers.NcRunnerSuit.html">NcRunnerSuit</a> bundles
|
||
a runner with its per-case data as one loadable unit, and per-case data now travels as proxy
|
||
placeholders that resolve against the owning project — so one controller configuration is no longer
|
||
welded to the job it was first built for</li>
|
||
<li><strong>A long program no longer degrades as it plays.</strong> A dead equality guard made the session append an
|
||
NC-optimization option entry for every played act instead of only at change points, and reading the
|
||
last one walked the whole map — together, quadratic. On a 2.35-million-line Siemens program the
|
||
per-100,000-line rate now stays flat instead of climbing from 73 s to about 11 minutes. It applied
|
||
to every runner, including sessions doing no optimization at all</li>
|
||
<li><strong>Performance and footprint, measured</strong> — physics in the native kernel takes a paired play from
|
||
59.3 s / 16.1 GB allocated to 40.6 s / 3.4 GB; building the topology of a large STL is linear
|
||
instead of quadratic in triangle count (18.7× at 300k triangles, and it was 99.6% of the load);
|
||
re-triangulating after a cut is about 2.2× faster; and a long program no longer exhausts client
|
||
memory (session retention on a 25,000-block play: 406 MB → 142 MB). Every figure with its
|
||
conditions — including the two things that cost more on purpose — is under
|
||
<a href="upgrading-to-3.2/performance-and-footprint.html">Performance and footprint</a></li>
|
||
<li><strong>Stability and data integrity</strong> — the native crashes from disposing a display or geometry object
|
||
still in use, the intermittent “No cut / No data for step” on freshly-simulated steps, the
|
||
project-file race between a Load and a Save, and non-reproducible milling-force waveforms are all
|
||
fixed; large geometry now builds its display topology off-thread instead of freezing the UI</li>
|
||
</ul>
|
||
<h2 id="hinc-packages-version-31175">HiNc Packages Version 3.1.175</h2>
|
||
<ul>
|
||
<li><a class="xref" href="../api/Hi.NcMech.Workpieces.WorkpieceService.html">WorkpieceService</a> file IO now takes <strong>relative</strong> paths and resolves them against a base-directory <code>Func<string></code> injected by <a class="xref" href="../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> — the runtime-geometry write/read no longer requires the caller to pre-combine an absolute path. <code>WorkpieceService.ReadRuntimeGeom</code> (now <code>ReadMeshedGeom</code>) now returns whether the source file existed (the not-found notice moves to the calling shell)</li>
|
||
<li>Rename runtime-geometry mesh-export methods to the <code>Export*</code> convention (STL/OBJ/PLY are foreign interchange formats, not native writes): <code>WriteRuntimeGeomToStl/Obj/Ply</code> → <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ExportRuntimeGeomToStl_">ExportRuntimeGeomToStl</a> / <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ExportRuntimeGeomToObj_">ExportRuntimeGeomToObj</a> / <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ExportRuntimeGeomToPly_">ExportRuntimeGeomToPly</a>; the session command <code>WriteRuntimeGeomToStlCommand</code> → <code>ExportRuntimeGeomToStlCommand</code> (now <a class="xref" href="../api/Hi.SessionCommands.ExportMeshedGeomToStlCommand.html">ExportMeshedGeomToStlCommand</a>) keeps the old <code><WriteRuntimeGeomToStlCommand></code> element name as a back-compat alias so existing projects still load</li>
|
||
</ul>
|
||
<h2 id="hinc-packages-version-31173">HiNc Packages Version 3.1.173</h2>
|
||
<ul>
|
||
<li>Improve <a class="xref" href="../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_Mrr_mm3ds">Mrr_mm3ds</a> precision: the material-removal-rate now sums each cut contour's signed area-vector (fan triangulation, skipping non-finite triangles) projected on the feed direction, replacing the per-contour bounding-box area that over-estimated the cut cross-section</li>
|
||
<li>Add <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_AlignWorkpieceProgramZeroToIso_">AlignWorkpieceProgramZeroToIso</a> script command: resolves a G54/G55/… entry from the project ISO coordinate table and places workpiece + fixture so the program zero coincides with that machine coordinate (topology math delegated to the new <a class="xref" href="../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipmentUtil.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipmentUtil_AlignWorkpieceProgramZeroToIso_">AlignWorkpieceProgramZeroToIso</a> extension)</li>
|
||
<li>Drop gRPC plumbing from the HiNc package: remove <code>Hi.Grpcs.*</code> ClStrip/Player service runners and protos, <code>MachiningProjectGrpcServer</code>, <code>MonitoringPlayer</code>, and <code>UniversalNcMonitorClient</code>; fold <code>CsvRunnerConfig</code> back into <code>CsvRunner0</code> (gRPC services now ship in HiNcRcl and a downstream RCL package)</li>
|
||
</ul>
|
||
<h2 id="hinc-packages-version-31172">HiNc Packages Version 3.1.172</h2>
|
||
<ul>
|
||
<li>Replace implicit XFactory registration (private <code>static <ClassName>()</code> constructors + <code>_ = X.XName</code> wake-up touches) with explicit <code>public static void Reg(XFactory factory = null)</code> methods across ~270 classes. <a class="xref" href="../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> becomes an instance class with a process-wide <code>Default</code> singleton; <code>Generators</code> is renamed from <code>Regs</code> and now an instance property; the delegate type is renamed <code>XGeneratorDelegate</code> from <code>GenByXElementDelegate</code>. Composite types chain <code>X.Reg(factory)</code> on dependents in place of the old wake-up touches; multi-name (legacy alias) registrations keep the current XName first and group aliases under a <code>//legacy aliases</code> comment. Entry points (web service, test fixtures) <strong>must call <a class="xref" href="../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_Reg_">Reg</a> once at startup before any project XML is deserialized</strong> — registration no longer happens by accident when the type is first touched. See <a class="xref" href="../technique/api-foundations/xml-io.html">XML IO</a>.</li>
|
||
</ul>
|
||
<h2 id="hinc-packages-version-31171">HiNc Packages Version 3.1.171</h2>
|
||
<ul>
|
||
<li><strong>Rename <code>RuntimeApi</code> → <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html">SessionShell</a></strong> (the runtime entry point exposed to scripting); <code>IShellCommand</code> → <code>ISessionCommand</code> and <code>RuntimeController</code> → <code>SessionShellController</code>; the <code>Hi.ShellCommands</code> namespace moves to <code>Hi.SessionCommands</code>, and every command implementer's <code>Run()</code> parameter renames <code>scriptApi</code> → <code>sessionShell</code></li>
|
||
<li>Tri-state milling-physics contract: <a class="xref" href="../api/Hi.MachiningSteps.MachiningStep.html">MachiningStep</a> physics getters converge on a tri-state result, non-null <a class="xref" href="../api/Hi.MillingForces.MillingPhysicsBrief.html">MillingPhysicsBrief</a> on no-cut steps under <code>EnablePhysics</code>; silently skip thermal physics on null FluteMaterial / WorkpieceMaterial; lazy first-equip warning; align relief-face null-sentinel across NoCut + producer (in NcOpt and forces)</li>
|
||
<li>Rename <code>IMachiningStepHost</code> → <a class="xref" href="../api/Hi.MachiningSteps.IMachiningService.html">IMachiningService</a> (drops the <code>ICsScriptApi</code> seam)</li>
|
||
<li>Fixes: rotary IK round-trip anchored to pre-FK interpolated angle; <code>ForceAccelShot.ReadRows</code> skips blank lines</li>
|
||
</ul>
|
||
<h2 id="hinc-packages-version-31167">HiNc Packages Version 3.1.167</h2>
|
||
<ul>
|
||
<li>Introduce <a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> as a pluggable NC parser/runner replacing the legacy <code>HardNcRunner</code>, opt-in at the time via <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableSoftNcRunner">EnableSoftNcRunner</a>. It became the default pipeline in 3.2 — see <a class="xref" href="../technique/nc-dialects/nc-parsing.html">NC Parsing Engine</a></li>
|
||
<li>Extend coolant model to <a class="xref" href="../api/Hi.Numerical.CoolantMode.html">CoolantMode</a> Flood/Mist/Off and refactor <a class="xref" href="../api/Hi.Physics.CoolantHeatCondition.html">CoolantHeatCondition</a> / <code>MillingTemperatureUtil</code> for multi-mode coolant</li>
|
||
<li>Bind session events to <a class="xref" href="../api/Hi.MachiningProcs.MachiningSession.html">MachiningSession</a> lifetime: <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SessionStepBuilt">SessionStepBuilt</a>, <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SessionStepSelected">SessionStepSelected</a>, <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SessionSyntaxPieceRan">SessionSyntaxPieceRan</a>, <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_SessionSourcedActEntry">SessionSourcedActEntry</a> (legacy aliases kept as <code>[Obsolete]</code>); add <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_RegisterWriteSyntaxPieces_">RegisterWriteSyntaxPieces</a> / <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_RegisterWriteSyntaxPiecesWithActs_">RegisterWriteSyntaxPiecesWithActs</a> for syntax-piece debug tracing</li>
|
||
<li>Add <a class="xref" href="../api/Hi.Common.XmlUtils.ProjectApiVersion.html">ProjectApiVersion</a> carrier through <a class="xref" href="../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> deserialization for project-XML version negotiation; resolve <a class="xref" href="../api/Hi.NcMech.Workpieces.Workpiece.html">Workpiece</a> through a lazy <code>Func</code> getter in <a class="xref" href="../api/Hi.NcMech.Workpieces.WorkpieceService.html">WorkpieceService</a></li>
|
||
</ul>
|
||
<h2 id="hinc-packages-version-31162">HiNc Packages Version 3.1.162</h2>
|
||
<ul>
|
||
<li>Refactor message management into three independent categories: <strong>Diagnostic</strong> (<code>IProgress<object></code>), <strong>UI Notification</strong> (<code>MessageBoardUtil</code>), <strong>App Log</strong> (<code>ILogger</code>); remove <code>MessageUtil</code> class entirely and remove <code>ExceptionUtil.ShowException</code> / <code>ExceptionUtil.OnShown</code> (see <a class="xref" href="../technique/api-foundations/message-management.html">Message Management</a>)</li>
|
||
<li>Thread <code>IProgress<object></code> through <a class="xref" href="../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> deserialization chain and <a class="xref" href="../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> loading; remove <code>GenMode</code> enum entirely (see <a class="xref" href="../technique/api-foundations/xml-io.html">XML IO</a>)</li>
|
||
<li>Add <a class="xref" href="../api/Hi.Common.Messages.ActionProgress-1.html">ActionProgress<T></a>.<a class="xref" href="../api/Hi.Common.Messages.ActionProgress-1.html#Hi_Common_Messages_ActionProgress_1_FromLogger_">FromLogger</a> to bridge <code>IProgress<object></code> APIs to <code>ILogger</code></li>
|
||
<li>Rename <code>ShowIfCatched</code> → <a class="xref" href="../api/Hi.Common.Messages.ExceptionUtil.html#Hi_Common_Messages_ExceptionUtil_CatchExceptions_">CatchExceptions</a> with explicit <code>Action<Exception></code> handler; remove <code>RoutineBlocker0</code></li>
|
||
<li>Extract <a class="xref" href="../api/Hi.NcMech.Workpieces.WorkpieceService.html">WorkpieceService</a> from <a class="xref" href="../api/Hi.NcMech.Workpieces.Workpiece.html">Workpiece</a> for runtime geometry operations</li>
|
||
<li>Update ISO coordinate rendering for 3+2 axis machines: coordinate position now uses <code>IsoCoordinateEntryDisplayee</code> with full machining chain anchor instead of table-buckle-only anchor</li>
|
||
<li>Rename <code>SessionMessageHost</code> → <code>SessionProgress</code> on both <a class="xref" href="../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_ShellProgress">ShellProgress</a> and <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ShellProgress">ShellProgress</a> (<code>SessionShell.SessionMessageHost</code> is kept as <code>[Obsolete]</code>)</li>
|
||
<li>Remove obsolete <code>HiLog</code> logging utility and <code>DynamicMachiningProjectDisplayee0</code></li>
|
||
</ul>
|
||
<h2 id="hinc-packages-version-31160">HiNc Packages Version 3.1.160</h2>
|
||
<ul>
|
||
<li>Fix NC optimization R-format arc interpolation with negative R values (follow-up to v158 R-format arc fix)</li>
|
||
<li>Fix cubetree construction defect when a triangle edge passes through a wire corner</li>
|
||
<li>Mech Builder: geometry (STL) file picker for anchored transformation now offers <strong>Project</strong> directory in addition to <strong>Resource</strong> directory.</li>
|
||
<li>Rename XML IO utilities: <code>XmlSourceAndFile<T></code> → <a class="xref" href="../api/Hi.Common.XmlUtils.FileRefSource-1.html">FileRefSource<T></a>, <code>CombineAsSubDirectory</code> → <a class="xref" href="../api/Hi.Common.PathUtils.PathUtil.html#Hi_Common_PathUtils_PathUtil_GetResourceDirectory_">GetResourceDirectory</a>, <code>MakeXmlSourceWithRebaseFile</code> → <a class="xref" href="../api/Hi.Common.XmlUtils.XmlUtil.html#Hi_Common_XmlUtils_XmlUtil_MakeXmlSourceToFileRef_">MakeXmlSourceToFileRef</a></li>
|
||
</ul>
|
||
<h2 id="hinc-packages-version-31158">HiNc Packages Version 3.1.158</h2>
|
||
<ul>
|
||
<li>Fix G53.1 tool height compensation behavior: replace <code>NcEnv.SetToolHeightCompensationOnFeatureNormal</code> configuration with automatic detection via NC flag state</li>
|
||
<li>Make <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_EnableIntegerShrinkOnPositionCommand">EnableIntegerShrinkOnPositionCommand</a> configurable via project settings (previously hard-coded by CNC brand, now defaults to <code>false</code> with XML IO support)</li>
|
||
<li>Fix NC optimization splitting R-format arcs (G02/G03 with R parameter) by converting to IJK format, since R sign meaning does not apply correctly to individual fragments</li>
|
||
<li>Fix step.csv reading crash on null or malformed values</li>
|
||
<li>Fix XML IO sub-base directory not applied in some project file operations</li>
|
||
<li>Improve CSV actual time parsing to support <code>DateTime</code> format in addition to <code>TimeSpan</code> (see <a class="xref" href="../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a>)</li>
|
||
<li>Fix CSV title parsing to trim surrounding quotes</li>
|
||
</ul>
|
||
<h2 id="hinc-packages-version-31156">HiNc Packages Version 3.1.156</h2>
|
||
<ul>
|
||
<li>Fix G68 coordinate rotation transformation for non-origin rotation centers</li>
|
||
<li>Fix NC optimization arc/circle offset when splitting arc fragments across multiple lines</li>
|
||
<li>Fix optimization rotation code jumping at ±180° cycle boundary by applying cyclic angle comparison</li>
|
||
<li>Fix RTCP on unmatched tool offset</li>
|
||
<li>Fix blocking issue when time-mapping file not found</li>
|
||
<li>Fix <a class="xref" href="../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_FlagsText">FlagsText</a> always null after NC parser refactoring</li>
|
||
</ul>
|
||
<h2 id="hinc-packages-version-31150">HiNc Packages Version 3.1.150</h2>
|
||
<ul>
|
||
<li>Add cubetree geometry defect scanning (<a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ScanRuntimeGeomInfDefect_">ScanRuntimeGeomInfDefect</a>) and clearing (<a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_ClearDefectDisplayee_">ClearDefectDisplayee</a>) for detecting and visualizing geometry anomalies in workpieces (see <a class="xref" href="../workflows/geometry-validation.html">Workflow: Geometry Validation</a>)</li>
|
||
<li>Upgrade internal fraction representation to float128 precision for improved cubetree geometry accuracy and numerical stability</li>
|
||
<li>Refactor messaging system from <code>IMessageHost</code> to standard <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iprogress-1">IProgress<T></a> pattern; <a class="xref" href="../api/Hi.MachiningProcs.ShellProgress.html">ShellProgress</a> (formerly <code>SessionMessageHost</code>) now implements <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iprogress-1">IProgress<T></a>, and all messaging methods renamed from <code>Add*</code> to <code>Report*</code> (e.g., <code>AddProgress</code> → <code>MultiTagMessageUtil.ReportProgress</code>)</li>
|
||
<li>Fix cubetree initialization crash</li>
|
||
<li>Improve postprocess precision by applying sin–cos parameterization instead of direct angle-based formulation for rotary axis numerical solving in <a class="xref" href="../api/Hi.Numerical.Xyzabc.XyzabcSolver.html">XyzabcSolver</a></li>
|
||
<li>Add asynchronous anchor solid preparation on project load for improved startup performance</li>
|
||
</ul>
|
||
<h2 id="hinc-packages-version-31144">HiNc Packages Version 3.1.144</h2>
|
||
<ul>
|
||
<li>Enhance Siemens Sinumerik support:
|
||
<ul>
|
||
<li>Siemens CYCLE800 coordinate transform and reset</li>
|
||
<li>Siemens MCALL CYCLE81() drilling cycle parsing</li>
|
||
<li>Siemens TRAORI/TRAFOOF/SUPA flag parsing</li>
|
||
</ul>
|
||
</li>
|
||
<li>Fix Siemens TRAFOOF plain rotation coordinate transform issue</li>
|
||
<li>Fix Siemens coordinate transform for successive file running</li>
|
||
<li>Fix relief face collision floating-point precision issue</li>
|
||
<li>Replace MongoDB with SQLite for local step data storage (significant package size reduction)</li>
|
||
<li>Add machining and motion resolution dynamic adjustment functions</li>
|
||
</ul>
|
||
<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.SessionShell.html#Hi_MachiningProcs_SessionShell_MapSingleByCsvFile_">MapSingleByCsvFile</a> (one-to-one mapping)</li>
|
||
<li><code>MapByActualTime</code> → <a class="xref" href="../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_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.SessionShell.html#Hi_MachiningProcs_SessionShell_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 <code>CsvRunner0</code> 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="../workflows/nc-optimization.html#embedded-log-comments">Embedded Log Comments</a>).</li>
|
||
<li>Fix bug of <code>NcOptProc</code> 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.SessionShell.html#Hi_MachiningProcs_SessionShell_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 <code>NcOptProc</code> with stricter optimization logics</li>
|
||
<li>Add optimization logging features (see <a href="../workflows/nc-optimization.html#optimization-logs">Optimization Logs</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.SessionShell.html#Hi_MachiningProcs_SessionShell_LoadCuttingParaByFile_">LoadCuttingParaByFile</a> function to load cutting parameters from file</li>
|
||
<li>Improve <code>CsvRunner0</code> 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.SessionShell.html">SessionShell</a> by unifying <a class="xref" href="../api/Hi.MachiningProcs.ShellProgress.html">ShellProgress</a> 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_ActualTimecode_">ActualTimecode</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 detection (<a class="xref" href="../api/Hi.MillingForces.MillingPhysicsBrief.html#Hi_MillingForces_MillingPhysicsBrief_ReliefFaceCollidingSpeed_mmds">ReliefFaceCollidingSpeed_mmds</a>, <a class="xref" href="../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_IsReliefFaceCollided">IsReliefFaceCollided</a>) and optimization (<a class="xref" href="../api/Hi.NcOpt.MillingCutterOptOption.html#Hi_NcOpt_MillingCutterOptOption_EnableLimitByReliefAngle">EnableLimitByReliefAngle</a>)</li>
|
||
<li>Add <code>UpdateNcOptOption</code> 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>
|