Table of Contents

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.

The two clients divide this cutter between them. The WPF client owns the editing surface: both geometries, the anchor, the spinning flag and the identity fields. The web client offers the type in the Cutter Type selector and nothing more; there is no Freeform Remover editor on the web, and no freeform-remover endpoint in the backend, so a freeform remover is built and edited on the WPF client or through HiNcRcl.

Layout

WPF Layout

This panel calls ClearCache() itself after a geometry or anchor change, so the cached solids are dropped before the tool is redrawn.

Web Layout

  • Cutter Node Panel, the Cutter tab of the Tool House Page at /tool-house/:toolId/cutter — the Control-Tree node toolhouse/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, directing the reader to the WPF client or HiNcRcl

Nothing else on the web 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 on the web 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 on either client. The WPF panel clears the remover's cache after each geometry or anchor edit; on the web 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, and toolhouse.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 reports hasCutter from that cast; this is why the selector cannot come back showing Freeform Remover.
  • Mech/CutterController.cs — EnsureCutter / ClearCutter and every cutter mutation, all MillingCutter-only; the backend has no freeform-remover endpoint.