This commit is contained in:
2026-09-09 18:06:21 +08:00
parent 161af68fe3
commit 45b9f9ed5d
79 changed files with 1167 additions and 1532 deletions
@@ -323,6 +323,11 @@ public XElement MakeXmlSource(string baseDirectory, string relFile, bool exhibit
return new XElement(XName,
this.GetNameNoteXElementList(),
new XElement(nameof(EnergyEfficiency), EnergyEfficiency),
//the constructor reads this element; without the matching write a
//save/load round trip through the web API silently reverted a
//non-default bound to the 65 C default.
new XElement(nameof(WorkingTemperatureUpperBoundary_C),
WorkingTemperatureUpperBoundary_C),
new XElement(nameof(GearShiftSpindleSpeed_rpm), GearShiftSpindleSpeed_rpm),
new XElement(nameof(DryRunFrictionPowerCoefficient_mWdrpm),
DryRunFrictionPowerCoefficient_mWdrpm),
@@ -188,7 +188,7 @@
<li><code>TMV-720A-STD-8000RPM.SpindleCapability</code></li>
<li><code>VP-8--Fanuc-10000RPM.SpindleCapability</code></li>
</ul>
<p>To edit values interactively, see <a class="xref" href="../../anatomy/general-setup/spindle-capability.html">Spindle Capability Page</a> in the Quasar webservice. The desktop WPF app does not yet have a dedicated editor; load capabilities through the equipment's <code>ObjectManagementMenuButton</code> instead.</p>
<p>To edit values interactively, see <a class="xref" href="../../anatomy/general-setup/spindle-capability.html">Spindle Capability Page</a>.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../milling-physics/machinability.html">Process Machinability</a> — uses <code>MaxSpindleTorqueRatio</code> / <code>MaxSpindlePowerRatio</code> for tool-breakage prediction</li>
@@ -136,10 +136,9 @@
<p>To make the Color Guide effective in a project, implement the <a class="xref" href="../../api/Hi.Coloring.IColorGuide.html">IColorGuide</a> interface and register it in the project's color guide dictionary.</p>
<h2 id="xml-serialization">XML Serialization</h2>
<p>See <a class="xref" href="../api-foundations/xml-io.html">About XML IO</a> for details on XML serialization implementation.</p>
<h2 id="wpf-application-source-and-sample-code-path">WPF Application Source And Sample Code Path</h2>
<h2 id="source-code-path">Source Code Path</h2>
<ul>
<li>HiMech/Coloring/IColorGuide</li>
<li>HiNC-2025-win-desktop/Demo/DemoColorGuide</li>
<li><code>HiMech/Coloring/IColorGuide.cs</code></li>
</ul>
<p>See <a class="xref" href="../../anatomy/index.html">HiNC App Anatomy</a> for git repository links.</p>
<h2 id="see-also">See Also</h2>
@@ -153,9 +153,87 @@ than the run needs, the next value that changes anything is 0.5 mm — and going
0.125 mm is another eight times the voxels, not a small step.</p>
<p>The ladder bottoms out at <strong>0.001953125 mm</strong>. A finer request is clamped to it, so the finest entry
offered in the workpiece's Initial Resolution list builds the same mesh as the one above it.</p>
<h2 id="the-width-only-ever-goes-finer">The width only ever goes finer</h2>
<p>A mesh that exists cannot be coarsened. Every cut takes the <strong>finer</strong> of the width already built and
the width being asked for, so raising Machining Resolution above the mesh the workpiece was built at
does not simplify anything — the request is dropped and the run keeps the mesh it has.</p>
<p>This is why the two settings are not interchangeable. The workpiece's <strong>Initial Resolution</strong> is what
builds the mesh and is therefore the memory setting; <strong>Machining Resolution</strong> gates how fine a
<em>newly cut</em> surface may go, and can only ever refine. To make a run cheaper in memory, coarsen the
Initial Resolution — coarsening Machining Resolution alone changes nothing about the stock that is
already there.</p>
<p>It still changes the <em>time</em>, and by a lot, because the same number sizes two other things: the
tessellation of the cutter's own solid, and the number of engagement layers per step. Both are
per-step work that is thrown away again, so a coarser Machining Resolution can cut the run time
several-fold while the memory figure does not move at all. A run that got faster without getting
smaller is this, not a mystery.</p>
<p>Pick from the ladder and the number shown in the mission row is the number the run used. That
matters beyond tidiness: a recorded mesh is built at whatever resolution is in force when the
record runs, so an off-ladder value is silently baked into the cache as its rounded neighbour.</p>
<h2 id="what-it-costs-in-memory">What It Costs in Memory</h2>
<p>Far less than it costs in time, which is the opposite of what four rungs of the ladder — sixteen
times finer, and so four thousand times the voxels — leads most people to expect. Measured by
sweeping one case across five rungs with the program and the step count held fixed — a cylindrical
blank, one roughing program, 199,242 steps every run:</p>
<table>
<thead>
<tr>
<th>Mesh width</th>
<th>Play time</th>
<th>Process memory outside the managed heap</th>
</tr>
</thead>
<tbody>
<tr>
<td>2 mm</td>
<td>10.5 s</td>
<td>665 MB</td>
</tr>
<tr>
<td>1 mm</td>
<td>15.3 s</td>
<td>688 MB</td>
</tr>
<tr>
<td>0.5 mm</td>
<td>31.2 s</td>
<td>722 MB</td>
</tr>
<tr>
<td>0.25 mm</td>
<td>76.6 s</td>
<td>826 MB</td>
</tr>
<tr>
<td>0.125 mm</td>
<td>242.9 s</td>
<td>1,456 MB</td>
</tr>
</tbody>
</table>
<p>Sixteen times finer costs <strong>23 times the time and 2.2 times the memory</strong>. Two things flatten that
second column, and it is worth separating them:</p>
<ul>
<li><strong>Most of the figure is a baseline the mesh does not set.</strong> The coarsest run in the sweep already
sits at 665 MB, and the whole sixteen-fold refinement adds 791 MB on top of it. Read the column as
increments rather than as totals: the ratio at the bottom of the table is diluted by everything in
the figure that would be there at any mesh width.</li>
<li><strong>The increments grow slowly at coarse widths and then accelerate.</strong> Halving the width added
23 MB, then 34, then 104, then 630 — each increment about 1.5, then 3.1, then 6.1 times the one
before it, a local exponent climbing from roughly 0.6 to 2.6. A cube stops subdividing as soon as
the surface inside it is a single flat facet, so while the mesh is coarser than the part's facets
and curvature, refining mostly buys nothing. The volume-scaling intuition is not wrong; it only
arrives once the width is below the feature scale, and by then it arrives fast.</li>
</ul>
<p>A big <em>workpiece</em> moves the same curve up: where the stock is a large imported solid rather than a
small procedural blank, there is far more surface to subdivide and the mesh-dependent part dominates
much earlier.</p>
<p><strong>Do not judge the mesh by the process's peak memory.</strong> On a long run most of that figure is the
per-step data the run accumulates, which lives on the managed heap, scales with the number of steps
and not with the mesh at all — and it moves the <em>other</em> way when the mesh is refined, because a
slower run allocates more slowly and the collector commits less. The two cancel: measured on a
larger case across a four-fold refinement, peak memory fell slightly while the mesh's own footprint
grew by nearly 40%. Read the two apart before concluding anything.</p>
<h2 id="what-the-mesh-does-not-change">What the Mesh Does Not Change</h2>
<p>For a representative test case — downward circular slot milling with varying width and depth —
the <strong>physical</strong> values move within about <strong>20%</strong> across the full range of mesh widths. The