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
@@ -88,16 +88,16 @@
<h1 id="transformation-geometry-control">Transformation Geometry Control</h1>
<p>A <a class="xref" href="../../api/Hi.Geom.TransformationGeom.html">TransformationGeom</a> is an inner geometry plus the transformer that places it, and the
editor is those two things side by side. It has two faces on the web: an embedded two-card editor,
editor is those two things side by side. It has two faces: an embedded two-card editor,
and a Control-Tree panel that shows only the status of each half and puts the editing on child
nodes.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p><strong>Choosing a kind here replaces, it does not wrap.</strong> Picking an inner geometry calls the
container-aware create endpoint, which constructs a fresh instance and discards whatever was
there. Wrapping an existing geometry into a transformation geometry, and extracting it back out,
exists only in the desktop client's
<a href="geom-manage-control.html">Geometry Management Panel</a> Convert menu.</p>
there. There is no operation anywhere that wraps an existing geometry into a transformation
geometry, or extracts it back out — see
<a href="geom-manage-control.html">Geometry Management Panel</a>.</p>
</div>
<h2 id="layout">Layout</h2>
<h3 id="the-embedded-editor">The embedded editor</h3>
@@ -117,22 +117,14 @@ its own default of <strong>all seven</strong> transformer kinds applies.</li>
<strong>Inner Geometry</strong> slot and an <strong>Inner Transformer</strong> slot as children, and each of those grows its
own kind child. The registry deliberately overrides the kind → editor map here, so the two-card
editor never appears inside a tree.</p>
<h3 id="the-desktop-control">The desktop control</h3>
<p>A geometry-type combo over the inner geometry's own control, and a transformer group box. Its lists
are narrower on both sides: three inner geometry kinds — Box3d, Cylindroid and StlFile, with no
unset entry — and a transformer list restricted to No Transform, Static Translation, Static Freeform
and General Transform. <strong>Static Rotation is unreachable there for a second reason</strong>: the desktop
transformer picker never builds it into its base list, so it is absent whatever the restriction says.</p>
<h2 id="behavior">Behavior</h2>
<ul>
<li><strong>The identity transformer is the floor on the web.</strong> The inner-transformer picker offers no null
entry, and the server installs a <code>NoTransform</code> whenever the field is null, so the slot is never
unset. The desktop panel instead carries a <strong>Not Set</strong> entry, shown by default and never removed by
its type filter, which leaves the slot holding a null transformer.</li>
<li><strong>The identity transformer is the floor.</strong> The inner-transformer picker offers no null entry, and
the server installs a <code>NoTransform</code> whenever the field is null, so the slot is never unset.</li>
<li><strong>Creation is container-aware on both halves.</strong> Both go through this type's own create endpoints
rather than the generic per-kind ones, so the owning field is rebound and not merely the store
entry.</li>
<li><strong>Neither client previews.</strong> There is no viewport on this control. It reports edits upward — one
<li><strong>The control does not preview.</strong> There is no viewport on it. It reports edits upward — one
event when a half is mutated, another when a half is replaced — and the hosting page's shared 3D
canvas re-renders from there.</li>
<li><strong>A null inner geometry has a deterministic key anyway.</strong> When the inner geometry is unset the