Table of Contents

Milling Cutter Panel

The key model is MillingCutter, the one cutter type edited here in full.

This cutter is not one panel but the section tabs the Cutter Panel grows once a Milling Cutter is assigned: the Control-Tree nodes under toolhouse/tool-<id>/cutter, reached at /tool-house/:toolId/cutter/:subtab under the page route /tool-house/:toolId?/:tab?/:subtab?. The five :subtab values are material, profile, contours, upper-beam and opt. The cutter's General fields — Shank Mass, Hone Radius, Relief Angle — are not among them: they sit on the Cutter node's own panel.

Layout

Web Layout

Material is the only physics-gated section. Flute Profile, Flute Contours, Upper Beam and Optimization grow for every Milling Cutter. The preference behind the gate is the SPA's Advanced Physics option, held as isShowPhysicsOptions in the app-state store and read from the server's preference endpoint, which reports it as on only while the physics feature is licensed.

Integral mode is read-only. The cutter DTO reports it, and the Material section reads it to decide whether the Shank Material picker applies, but no endpoint sets it.

Material Section

  • Material Section (.../cutter/material)
    • Flute Material Applies CutterMaterial
      • Intro caption naming the .CutterMaterial extension
      • Material File Selector
        • Menu Dropdown — Browse Resource…, plus Clear once a file is picked
        • Readonly path TextBox with the placeholder “No flute material selected”
      • Name and note caption beneath the picker, the two joined on one line
    • Shank Material, rendered only while the cutter's integral mode is Insert End Applies IStructureMaterial
      • Intro caption naming the .xml structure material and the .CutterMaterial alternative
      • Material File Selector, filtered to .xml — same Browse Resource… menu, with the placeholder “Default: AlloySteel42CrMo”
      • Name and note caption beneath the picker
    • Solid-End Note, shown in place of that block for a solid-end cutter — the shank material mirrors the flute material, so it has no separate setting
    • Coating Layers Manages CoatingLayerList
      • Add Layer Button
      • One sequence hint above the whole list: the sequence starts from the surface, #0 is the outermost / air-exposing layer, and each layer is a .CoatingMaterial plus a thickness in um
      • One row per ThermalLayer1D, all controls on that one line
        • Index Badge #i
        • Coating Material File Selector — Browse Resource…, placeholder “No coating material”
        • Thickness Input Field (um) — Length_um
        • Move Toward Surface Button, disabled on the first row
        • Move Toward Body Button, disabled on the last row
        • Delete Layer Button
      • Empty state caption “No coating layers.”

All three pickers are resource-only, which is what leaves the dropdown with a single browse entry: the absolute Browse item is hidden and only Browse Resource… remains. The picked material's name and note are rendered as a caption line under the picker rather than as a tooltip on a readonly name box.

The mirroring for a solid-end cutter is enforced server-side: loading a flute material onto a solid-end cutter assigns the same material as the shank material, and unsetting it clears both. For an insert-end cutter, unsetting the shank material resets it to the built-in AlloySteel42CrMo rather than to nothing.

Every coating endpoint answers with the whole cutter DTO, so the row list re-renders from the server's own ordering after an add, a move or a delete.

Default Resource

The default resources of Material live in the built-in Resource folder the server exposes as a named root of its own — not in the project folder. Each picker opens Browse Resource… into its own subfolder of that root:

  • StructureMaterial — the Shank Material picker
  • CutterMaterial — the Flute Material picker
  • CoatingMaterial — the coating rows' pickers

Flute Profile Section

  • Flute Profile Section (.../cutter/profile)

The five types are all wrapped by AptProfile, with a different Apt assigned; which fields appear depends on the type. See APT Profile Panel for the field list and the per-type table that drives it.

See the DemoBuildMachiningProject sample in the Hi.Sample repository for creating the APT profile and setting it on the cutter.

CustomSpinningProfile is not offered here; the five APT types are.

Flute Contours Section

This part manages Fluting. It is a stem, not a leaf: the section node carries only the type selector, and the fluting itself is a sub-tree of nodes below it.

  • Flute Contours Section (.../cutter/contours)
    • Title Label — Fluting
    • Fluting Type Selection Dropdown
    • A caption describing the chosen kind, or “Fluting unset.” while none is set
    • Fluting Node, grown only once a fluting is set — labelled Uniform Fluting or Free Fluting
      • For a uniform fluting: Flute Number Input Field (minimum 1)
      • For a free fluting: a “Flutes: n” caption and an Add Flute Button, with a “No flutes yet” hint while the list is empty
      • Flute Contour Node(s)
        • One Baseline Contour node (.../fluting/baseline) for a uniform fluting; one Flute n node (.../fluting/flute-{i}) per flute for a free fluting
        • Setup Angle Input Field (deg)
        • Delete This Flute Button — free fluting only
        • Side Contour Sub-Node (.../baseline/side, .../flute-{i}/side)
          • Kind Selector — Const Helix / Freeform / — unset —
          • Const Helix Side Contour form: Helix Angle (deg), Radial Rake Angle (deg), Radial Relief Angle (deg)
          • Freeform Side Contour form: the span-position table, ordered by Z
        • Bottom Contour Sub-Node (.../baseline/bottom, .../flute-{i}/bottom)
          • Kind Selector — Slide / Freeform / — unset —
          • Slide Bottom Contour form: Outer Radius (mm), Cutter Length on Bottom Projection (mm), Eccentric Angle (deg), Disk Angle (deg), Axial Rake Angle (deg)
          • Freeform Bottom Contour form: the span-position table, ordered by R

Both freeform forms share one span-position table: four numeric columns — R (mm), A (deg), Z (mm), R.Ang (deg) — one row per 4D span position, with an insert-next button that clones the row and a double-click to remove it. The header wording mirrors the CSV field order the wire format uses, and the R.Ang column carries a tooltip explaining that the radial angle feeds the bottom-surface loft.

A flute contour is always committed as a whole. Editing a Setup Angle, a side contour or a bottom contour re-sends the entire contour: a uniform fluting re-sends the fluting with its current flute number, and a free fluting updates the slot at its index. Free flute node ids are positional, so adding or deleting a flute rebuilds the branch to re-point them.

Picking — unset — in the Fluting Type selector is inert — the panel returns without a call, because the backend exposes no way to null a fluting. Picking — unset — on a Side or Bottom Contour, in contrast, does commit: it clears that contour on the flute.

Upper Beam Section

The upper beam is the cutter's shank / body above the flute.

The banner is persistent rather than a transient toast: the same unreasonable settings fail thermal physics at run time as configuration errors, so they are surfaced at edit time. Creating a geometry here is container-aware — the server builds it, sets it as the cutter's upper-beam geometry, auto-links an ExtendedCylinder to the flute with a valid seed length, and indexes it under the same key so the per-kind editor edits it in place. Each later edit resyncs the cutter and refreshes the warning list.

Optimization Section

This part manages MillingCutterOptOption.

  • Optimization Section (.../cutter/opt)
    • Enable Optimization Checkbox
      • Controls whether the limits below are shown and active
    • When optimization is enabled:
      • Limit by Theoretical Minimum Feed Per Tooth Checkbox
      • Limit by Relief Angle Checkbox
      • Min Feed Per Tooth Input Field (mm)
      • Max Feed Per Tooth Input Field (mm)
      • Yielding Utilization Factor Input Field
        • The reciprocal of the Yielding Safety Factor the server stores; the panel converts in both directions
      • Hint caption: typical values run 0.33 (conservative) to 1.0 (aggressive)

Both checkboxes are plain labelled checkboxes — neither displays a computed value. The server's defaults when a limit set is written without them are a Yielding Safety Factor of 3 (a utilization factor of about 0.33), a Max Feed Per Tooth of 999, and both limit flags on.

The minimum uncut chip thickness itself is not on this surface: no cutter endpoint returns it, and no field displays it.

Features

Every web edit is a whole-object commit followed by a cache clear. The Flute Profile panel re-sends the entire shaper profile on any field change — only the fields the selected APT type carries are included — then clears the tool cache. The contour panels re-send the whole flute contour. The optimization panel re-sends the whole limit set. The material and coating endpoints each answer with the full cutter DTO, which the panels re-render from.

A blanked numeric box commits nothing. The shared numeric field emits null for an empty entry, and every cutter panel returns on null rather than writing a zero, so clearing a field leaves the stored value alone.

Source Code Path

See HiNC App Anatomy for git repository links.

HiNC-2025-webservice (Quasar CLI SPA):

  • wwwroot-src/src/components/controlTree/toolHouseItemTypes.ts — the item-type registry and the child builders: the cutter's five sections, the Material physics gate, and the fluting / flute / side / bottom sub-tree.
  • wwwroot-src/src/router/treeRoutes.ts — role-path to route translation; CUTTER_SECTIONS pins material, profile, contours, upper-beam and opt, and it also translates a …/contours/tray… id onto the fluting segment the node carries, so both spellings of the engine's Fluting type family resolve.
  • wwwroot-src/src/components/controlTree/toolhouse/ToolCutterPanel.vue — the parent Cutter node: the type selector plus the cutter's General fields.
  • wwwroot-src/src/components/controlTree/toolhouse/CutterSectionPanel.vue — the one panel shared by the material / profile / upper-beam / opt sections, keyed off the node's last role segment. It renders the Flute Profile fields inline and delegates the other three.
  • wwwroot-src/src/components/toolhouse/MaterialDiv.vue — the Material section: flute material, the insert-end-only shank material, the solid-end note, and the coating list.
  • wwwroot-src/src/components/toolhouse/CoatingLayersDiv.vue — the coating rows: index badge, material picker, thickness, move toward surface / body, delete.
  • wwwroot-src/src/components/controlTree/toolhouse/CutterContoursPanel.vue — the Flute Contours stem: the Fluting Type selector.
  • wwwroot-src/src/components/controlTree/toolhouse/FlutingPanel.vue — the concrete fluting node: Flute Number for uniform, the flute count and Add Flute for free.
  • wwwroot-src/src/components/controlTree/toolhouse/FluteContourPanel.vue — one flute contour node: Setup Angle, and Delete This Flute for a free flute.
  • wwwroot-src/src/components/controlTree/toolhouse/FluteSideContourPanel.vue and wwwroot-src/src/components/controlTree/toolhouse/FluteBottomContourPanel.vue — the two sub-nodes: kind selector plus the matching form.
  • wwwroot-src/src/components/controlTree/toolhouse/fluteContourNode.ts — the shared load and commit logic behind those three panels, and the rule that a contour is committed whole.
  • wwwroot-src/src/components/toolhouse/fluting/ConstHelixSideContourDiv.vue, wwwroot-src/src/components/toolhouse/fluting/SlideBottomContourDiv.vue, wwwroot-src/src/components/toolhouse/fluting/FreeformSideContourDiv.vue and wwwroot-src/src/components/toolhouse/fluting/FreeformBottomContourDiv.vue — the four contour parameter forms.
  • wwwroot-src/src/components/toolhouse/fluting/SpanContourPosListDiv.vue — the R / A / Z / R.Ang span-position table both freeform forms share.
  • wwwroot-src/src/components/toolhouse/UpperBeamDiv.vue — the Upper Beam section: the six allowed geometry kinds, the container-aware create, the resync-on-edit and the warnings banner.
  • wwwroot-src/src/components/geom/GeometryEditor.vue — the shared geometry editor that section reuses.
  • wwwroot-src/src/components/toolhouse/MillingCutterOptLimitDiv.vue — the Optimization section, including the Yielding Utilization Factor conversion.
  • wwwroot-src/src/components/widgets/NumericInput.vue — the numeric field every cutter form uses: no G4, commit on blur or Enter, revert on an unparseable entry.
  • wwwroot-src/src/components/widgets/FilePathInput.vue — the picker behind the material selectors; its resource-only mode hides the absolute Browse item and leaves Browse Resource….
  • wwwroot-src/src/stores/appState.ts — holds isShowPhysicsOptions, the Advanced Physics preference that gates the Material section.
  • wwwroot-src/src/i18n/en/toolhouse.ts — every label quoted above: cutter.*, material.*, contour.*, fluting.*, upperBeam.* and opt.*.
  • wwwroot-src/src/api/toolHouse.ts — the typed wrapper over /api/Cutter: shaper profile, fluting, the free-contour CRUD, the material and coating endpoints, the upper beam and the opt limit.
  • Mech/CutterController.cs — the cutter backend: the APT construction from the profile DTO, the fluting builders, the opt-limit defaults, the solid-end shank-material mirroring, and the cache clear every field and geometry mutator performs.
  • Mech/CutterDtoBuilder.cs — the read-side cutter DTO: integral mode, general, shaper profile, fluting, opt limit and material.
  • Mech/ToolHouseController.cs — the tool detail that embeds that DTO, which every cutter section refreshes from.

See Also

  • ExtendedCylinder Editor — the Upper Beam's kind that exists for this cutter, and the one surface that gives it a start section