Freeform Remover Panel
The key model is FreeformRemover: a cutter whose removal volume comes from two referenced geometries — a non-cutting strut and a cutting shaper — anchored to the holder buckle.
This cutter is offered in the Cutter Type selector and nowhere else. There is no Freeform Remover editor here and no freeform-remover endpoint in the backend, so nothing on this surface can create or change one — the shipped caption says as much, and names HiNcRcl as the place to edit one.
Layout
Web Layout
- Cutter Node Panel, the Cutter tab of the Tool House Page at
/tool-house/:toolId/cutter— the Control-Tree nodetoolhouse/tool-<id>/cutter- Cutter Type Selector — its second option, Freeform Remover, is this cutter
- Freeform Remover Caption (
toolhouse.cutter.freeformRemoverUnavailable) — the panel's whole body while that option is showing
Nothing else on this surface belongs to this cutter. The Shank Mass / Hone Radius / Relief Angle fields on that panel are gated to the Milling Cutter branch, and the cutter's child builder grows section tabs only for a MillingCutter, so the Cutter node is a leaf here: no Material, Flute Profile, Flute Contours, Upper Beam or Optimization section appears. See Cutter Panel for the panel these live on.
Geometry Definitions
- Strut Geometry — The non-cutting portion (holder/shank)
- Used for collision detection
- Shaper Geometry — The cutting portion
- Defines cutting surfaces
- Used for material removal simulation
Features
Picking Freeform Remover is a no-op that does not stick. The panel makes no API call for that option — it sets the selector locally, clears the tool cache, then re-reads the tool, and the re-read is what puts the selector back to Milling Cutter or None. The model on the tool is left exactly as it was.
A tool that already carries a freeform remover reads as None. The tool detail casts the tool's cutter to a MillingCutter and reports both hasCutter and the embedded cutter DTO from that one cast, so a non-milling cutter comes back as no cutter at all, and the selector — which derives its value from those two fields — shows None. The Freeform Remover option is therefore reachable by the user's click but never by a load.
That makes one sequence worth knowing before using the web page on such a tool: picking Milling Cutter calls EnsureCutter, which returns the tool's existing cutter only when it is already a MillingCutter and otherwise assigns a new one — so on a tool holding a freeform remover, that choice replaces it. Leaving the selector alone leaves the freeform remover intact, which is what a round trip through the web page does by default.
Cache clearing needs no user action: there is nothing to clear for this cutter, since no endpoint mutates it, and the tool-cache clear the selector performs only drops the tool's and the holder's cached solids so the canvas redraws.
Source Code Path
See HiNC App Anatomy for git repository links.
HiNC-2025-webservice (Quasar CLI SPA):
wwwroot-src/src/components/controlTree/toolhouse/ToolCutterPanel.vue— the only web surface this cutter has: the selector option, the caption shown in its place, and the branch of the type handler that makes no call.wwwroot-src/src/components/controlTree/toolHouseItemTypes.ts— its cutter child builder grows sections only for a MillingCutter, so this cutter's Cutter node is a leaf.wwwroot-src/src/i18n/en/toolhouse.ts—toolhouse.cutter.freeformRemover, the option label, andtoolhouse.cutter.freeformRemoverUnavailable, the caption; the zh-Hans and zh-Hant files carry the same keys.Mech/ToolHouseController.cs— the tool detail, which casts the cutter to a MillingCutter and reportshasCutterfrom that cast; this is why the selector cannot come back showing Freeform Remover.Mech/CutterController.cs—EnsureCutter/ClearCutterand every cutter mutation, all MillingCutter-only; the backend has no freeform-remover endpoint.