Transformation Geometry Control
A TransformationGeom 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, and a Control-Tree panel that shows only the status of each half and puts the editing on child nodes.
Important
Choosing a kind here replaces, it does not wrap. 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 Geometry Management Panel Convert menu.
Layout
The embedded editor
Two bordered cards, each badged with the live type behind it, over a short explanation of what a transformer applied to a geometry means:
- Inner Geometry (
.../inner-geom) — the full Geometry Management Panel, its dropdown labelled Inner geometry type, over five kinds: Box3d, Cylindroid, StlFile, a nested TransformationGeom and GeomCombination — which is what makes recursion and nesting legal — plus a None (unset) entry. - Inner Transformer — the Transformer Select Panel, mounted with no kind restriction at all, so its own default of all seven transformer kinds applies.
The Control-Tree panel
Status badges for the two halves and the same explanation, and nothing editable: the tree grows an Inner Geometry slot and an Inner Transformer 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.
The desktop control
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. Static Rotation is unreachable there for a second reason: the desktop transformer picker never builds it into its base list, so it is absent whatever the restriction says.
Behavior
- The identity transformer is the floor on the web. The inner-transformer picker offers no null
entry, and the server installs a
NoTransformwhenever the field is null, so the slot is never unset. The desktop panel instead carries a Not Set entry, shown by default and never removed by its type filter, which leaves the slot holding a null transformer. - Creation is container-aware on both halves. 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.
- Neither client previews. There is no viewport on this control. 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.
- A null inner geometry has a deterministic key anyway. When the inner geometry is unset the server returns no key, so the editor falls back to a derived alias; without it the picker could never create the first geometry.
Source Code Path
See HiNC App Anatomy for git repository links.
HiNC-2025-webservice (Quasar CLI SPA):
wwwroot-src/src/components/geom/TransformationGeomEditor.vue— the embedded editor: the two cards and their type badges, the two container-aware create hooks, and the fallback alias for a null inner geometry.wwwroot-src/src/components/controlTree/TransformationGeomTreePanel.vue— the Control-Tree face: status only.wwwroot-src/src/components/controlTree/itemTypes.ts— registers the kind against that panel with a child builder that grows the Inner Geometry and Inner Transformer slots, and is where the override of the kind → editor map lives.wwwroot-src/src/components/controlTree/GeometrySlotPanel.vue,wwwroot-src/src/components/controlTree/TransformerSlotPanel.vueandwwwroot-src/src/components/controlTree/SoleEditorPanel.vue— the two child slots' pickers and each kind grandchild's editor.wwwroot-src/src/components/geom/geometryEditors.tsandwwwroot-src/src/components/geom/GeometryEditor.vue— the kind map that reaches this editor, and the switchboard it re-enters for its own inner geometry.wwwroot-src/src/components/topo/TransformerSelectPanel.vueandwwwroot-src/src/components/topo/transformerEditors.ts— the inner-transformer picker and the seven kinds it offers, with the labels it renders them under.wwwroot-src/src/components/geom/GeomCombinationEditor.vue,wwwroot-src/src/pages/MechBuilderPage.vueandwwwroot-src/src/components/toolhouse/UpperBeamDiv.vue— the three embedders of the non-tree form.wwwroot-src/src/api/geometry.ts— the transformation-geometry DTO, the two index calls and the two create calls.wwwroot-src/src/api/transformer.ts— the transformer kind union and the per-kind endpoints the inner transformer's editors bind through.wwwroot-src/src/i18n/en/geom.tsandwwwroot-src/src/i18n/en/tree.ts— the card labels, the explanation, and the two child-node labels.Geom/TransformationGeomController.cs— REST endpoints at/api/TransformationGeom/*:New,Get,IndexGeom,IndexTransformer,CreateGeom,CreateTransformer,UpdateTransformer,GetGeomTypeandGetTransformerType.IndexGeomanswers empty for a null geometry, andIndexTransformeris where the identity default is installed.Geom/Box3dController.cs,Geom/CylindroidController.cs,Geom/StlFileController.csandGeom/GeomCombinationController.cs— the four other inner-geometry kinds' own surfaces.- The seven per-kind transformer controllers under
Mech/Topo/— reached by the inner transformer's editors for their own reads and writes, not for creation, which this type's own endpoint owns. Common/IndexController.csandCommon/IndexService.cs— the type probe both pickers use, and the store the two aliases are registered into.
See Also
- Transformers
- Geometry Management Panel — the switchboard this editor embeds for its inner geometry, and the only place a wrap or extract exists
- Transformer Select Panel — the inner-transformer picker and its seven kinds