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
@@ -87,10 +87,10 @@
<article data-uid="Anatomy-GeomCombinationControl">
<h1 id="geometry-combination-control">Geometry Combination Control</h1>
<p>A <a class="xref" href="../../api/Hi.Geom.GeomCombination.html">GeomCombination</a> is several geometries treated as one, and it has <strong>two faces on the
web</strong>: an inline editor that renders every child's own editor at once, and a Control-Tree panel that
manages the list only and puts each child on its own node. The desktop client has the inline shape
alone. There is no selection model on any of them — every child carries its own remove button.</p>
<p>A <a class="xref" href="../../api/Hi.Geom.GeomCombination.html">GeomCombination</a> is several geometries treated as one, and it has <strong>two faces</strong>: an
inline editor that renders every child's own editor at once, and a Control-Tree panel that manages
the list only and puts each child on its own node. There is no selection model on either — every
child carries its own remove button.</p>
<h2 id="layout">Layout</h2>
<h3 id="the-inline-editor">The inline editor</h3>
<ul>
@@ -103,33 +103,23 @@ editable at once.</li>
<p>Deliberately shallow: a list of read-only rows with Add, a per-row remove and Clear all, and a
standing hint that an <strong>Item</strong> child node is where a child is actually edited. No editor is embedded
here; each child is its own <code>Item</code> node — <code>.../item-{index}</code> — under this one.</p>
<h3 id="the-desktop-control">The desktop control</h3>
<p>A title, then an <strong>Add</strong> and a <strong>Clear All</strong> button over a scrolling list of bordered cards, each
holding that child's own geometry management panel and a remove button — no index badge and no type
caption. Below the list sits a collapsed <strong>Combination Information</strong> expander reporting the aggregate
triangle count and bounding box, the latter as a read-only box control.</p>
<h2 id="adding-a-child">Adding a Child</h2>
<p>The two clients differ here, and the web is the one that gained something:</p>
<ul>
<li><strong>Web</strong> — pick the kind first, then Add; the request carries the kind.</li>
<li><strong>Desktop</strong> — Add takes no kind and always appends a 100 mm cube. The kind is switched afterwards,
on that child's own Geometry Type combo.</li>
</ul>
<p>Pick the kind first, then Add; the request carries the kind.</p>
<p>Five kinds may be children — Box3d, Cylindroid, StlFile, TransformationGeom and a <strong>nested</strong>
GeomCombination, so combinations nest arbitrarily deep. <code>CubeTreeFile</code> and <code>ExtendedCylinder</code> are
accepted by neither client's switch.</p>
accepted by neither switch.</p>
<h2 id="behavior">Behavior</h2>
<ul>
<li><strong>A type switch rewires the slot, not just the alias.</strong> Changing a child's kind goes through
<code>SetItemAt</code>, which replaces the entry in <a class="xref" href="../../api/Hi.Geom.GeomCombination.html#Hi_Geom_GeomCombination_StlSources">StlSources</a> itself.</li>
<li><strong>The aggregate STL is cached, and a child's own controller does not invalidate it.</strong> Editing a
child through its own endpoints leaves the combination returning the mesh it had already built, so
both web faces call <code>CleanCache</code> before bubbling the change, and compose that call into the
ancestor chain. This is the behavioural fact the rest of the page depends on.</li>
both faces call <code>CleanCache</code> before bubbling the change, and compose that call into the ancestor
chain. This is the behavioural fact the rest of the page depends on.</li>
<li><strong>Removing a child does not renumber the ones after it.</strong> Item keys are minted as
<code>{key}-item-{index}</code> and the remove endpoint leaves later indices pointing at the old aliases,
which is why every structural change rebuilds the branch and re-mints them.</li>
<li><strong>Clear all confirms only on the desktop.</strong> The web posts it directly.</li>
<li><strong>Clear all is posted directly, with no confirmation.</strong></li>
</ul>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a class="xref" href="../index.html">HiNC App Anatomy</a> for git repository links.</p>
@@ -175,7 +165,7 @@ cache.</li>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="geom-manage-control.html">Geometry Management Panel</a> — the switchboard that offers this kind, and
the panel each desktop child card embeds</li>
the panel each child card embeds</li>
</ul>
</article>