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 nodes the Cutter Panel grows once a Milling Cutter is assigned: the Control-Tree children of the Cutter node toolhouse/tool-{toolId}/cutter, each reached at /tool-house/<toolId>/cutter/<section> under the page route /tool-house/:toolId?/:node*. The section segments are insert, material, profile, contours, inner-beam, upper-beam and opt, and Flute Contours grows a sub-tree of its own below them. The cutter's General fields — Integral Mode, Shank Mass, Hone Radius, Relief Angle — are not among them: they sit on the Cutter node's own panel.
Layout
Web Layout
- Cutter Section Nodes, children of the Cutter node in this order
- Insert Section — grows only while Show Physics Options is on and the cutter is Insert End
- Material Section — grows only while Show Physics Options is on
- Flute Profile Section
- Flute Contours Section
- Inner Beam Section — grows only while Show Physics Options is on
- Upper Beam Section
- Optimization Section — grows only while Show Physics Options is on
Flute Profile, Flute Contours and Upper Beam grow for every Milling Cutter. Insert, Material, Inner Beam and Optimization are read only by the milling physics — the mass, deflection and thermal models, and the physics-driven NC optimization — so they grow only while the Preference menu's Show Physics Options is on, 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. Flipping the preference rebuilds the tree; an address naming a gated section while it is off selects the Cutter node instead, and the URL is rewritten to it.
Integral Mode is set on the Cutter node, where its selector is likewise shown only while Show Physics Options is on. It decides two things here: the Insert node grows only for an Insert End cutter, and the Material section offers a Shank Material picker only for one. Switching the mode regrows the Cutter node's children.
Insert Section
- Insert Section (
.../cutter/insert)- Insert Number Input Field (minimum 1) — InsertNum
- Single Insert Mass Input Field (g) — SingleInsertMass_g
- Insert Thickness Input Field (mm) — InsertThickness_mm
- Total Insert Mass Input Field (g), read-only — SumInsertMass_g, the insert count times the mass of one insert
- A caption in place of the fields once the cutter is solid-end, pointing at the Cutter node's Integral Mode
Each field commits alone, and the endpoint leaves a field it does not receive unchanged. The server refuses a solid-end cutter, an insert count below 1, and a mass or thickness that is not a positive finite number, and a refused request changes nothing; the refusal is reported in a toast and followed by a re-read, so the box returns to the value the server holds. An Infinity or NaN entry, and a fractional insert count, are refused in the panel the same way before anything is sent.
Material Section
- Material Section (
.../cutter/material)- Flute Material
Applies CutterMaterial
- Intro caption naming the
.CutterMaterialextension - Material File Selector
- Menu Dropdown — Browse Resource…, plus Clear once a file is picked
- Readonly path TextBox with the placeholder “No flute material selected”, or “In the cutter itself (no file)” while the material is held inside the cutter with no file named (a loaded cutter file's)
- Name and note caption beneath the picker, the two joined on one line
- Intro caption naming the
- Shank Material, rendered only while the cutter's integral mode is Insert End
Applies IStructureMaterial
- Intro caption naming the
.xmlstructure material and the.CutterMaterialalternative - Material File Selector, filtered to
.xml— same Browse Resource… menu, with the placeholder “Default: AlloySteel42CrMo”, or “No shank material selected” while the cutter holds no shank material and names no file (an older project's, saved with none, or a cutter loaded, pasted or applied as XML whose shank material file could not be read — a.Cutterloaded without its<name>.Cutter-srcfolder; the tool's thermal step is skipped,Tool-ShankMaterial--Missing), when Clear is offered as well and sets the default - Name and note caption beneath the picker
- Intro caption naming the
- 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,
#0is the outermost / air-exposing layer, and each layer is a.CoatingMaterialplus 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
- Index Badge
- Empty state caption “No coating layers.”
- Flute Material
Applies CutterMaterial
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, and a switch to insert end does the same for a shank that holds no material and names no file (a solid-end cutter's whose flute material was unset); a shank file that could not be read keeps its reference.
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.
A material is installed as its file writes it. The flute, shank and coating loads check the loaded material's thermal constants — HeatConductivity_WdmK (W/(m·K)), Density_gdcm3 (g/cm³) and HeatCapacity_JdgK (J/(g·K)) — and one that is not a finite positive number, or lies outside the range of a dense solid (a density typed in kg/m³, say), comes back as a warning in the DTO's messages, which the panel shows as a notification (Material-ThermalConstants--NotFinitePositive, Material-ThermalConstants--OutOfRange); the value is used as given. One whose element the file lacks is not given, and no default stands in: the material is installed all the same and named by the same route (Material-ThermalConstants--NotGiven), and the thermal model is skipped for the tool — its temperatures stay at ambient and its wear at zero. The flute and coating loads also check the two wear curves a cutter material carries — TemperatureVsHardnessCurve and TemperatureVsWearCoefficientCurve — and name one the file lacks, or writes empty, by the same route (Material-WearCurves--NotGiven): the material is installed, and the native thermal session does not model the tool. The runner says the same warnings again at the tool change and when a session or a play begins.
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 pickerCutterMaterial— the Flute Material pickerCoatingMaterial— the coating rows' pickers
Flute Profile Section
- Flute Profile Section (
.../cutter/profile)- Profile Type Selection Dropdown
- General APT (GeneralApt)
- Ball APT (BallApt)
- Column APT (ColumnApt)
- Cone APT (ConeApt)
- Taper APT (TaperApt)
- The APT fields themselves, rendered inline in this same panel
- Profile Type Selection Dropdown
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. It is offered as an Inner Beam profile instead.
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
- Uniform (shared baseline) — UniformFluting
- Free (per-flute) — FreeFluting
— unset —
- A caption describing the chosen kind, or “Fluting unset.” while none is set
- Fluting Node (
.../contours/fluting), grown only once a fluting is set — labelled Uniform Fluting or Free Fluting, under the same id for both kinds- 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 - Flute Offset Angle Input Field (deg), with a hint naming the tool's Setup Angle
- 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
- Kind Selector — Const Helix / Freeform /
- 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
- Kind Selector — Slide / Freeform /
- One Baseline Contour node (
The flute index i in a free flute's id counts from 0, while its label counts from 1: .../fluting/flute-0 is Flute 1.
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.
The Flute Offset Angle is a property of the cutter's design: where that flute sits on the cutter body, about the cutter axis. How far the whole cutter is turned in the holder is a property of the clamping instead, the tool's own Setup Angle on the Clamping node, and no field here carries it.
A flute contour is always committed as a whole. Editing a Flute Offset 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; an added flute is selected, and a deleted one hands the selection to the Fluting node.
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.
Inner Beam Section
This part manages InnerBeamProfile, the equivalent solid core inside the flute. The yielding stress ratio, the cutter deflection, the shank-mass estimate and the shank thermal model read it; it does not change the cut shape.
- Inner Beam Section (
.../cutter/inner-beam)- Intro caption
- Profile Type Selection Dropdown
- Flute Dependent Ratio Profile — FluteDependentRatioProfile
- Const Ratio Profile — ConstRatioProfile
- Custom Spinning Profile — CustomSpinningProfile
- None
- For a flute-dependent profile: Radius Ratio, read-only, with a hint naming the flute count it follows
- For a constant ratio: Radius Ratio Input Field (at most 1), with a hint giving its (0, 1] range
- For a custom spinning profile: a caption, then the Geometry Management Control, limited to Cylindroid and StlFile plus None, with no Transform picker
- “No inner beam is set.” while the profile is None
The radius ratio is the core radius over the flute profile's radius. The server refuses a ratio outside (0, 1] and changes nothing, and the panel then re-reads, so the box returns to the ratio the cutter holds. Switching to Const Ratio Profile starts from the ratio the flute-dependent profile had, or from 0.5, and re-picking the kind already set keeps the profile as it is.
A custom profile is spun about the tool axis from its geometry's Z-R list — a Cylindroid, or, from an older file, a Cylindroid under an identity transform — and falls back to the mesh's contour otherwise, which is why this slot offers no Transform picker. Its geometry is created container-aware, the same way as the Upper Beam's, and each later edit through the per-kind editor resyncs the cutter. Every inner-beam commit re-places the cutter under the holder, because the core changes the cutter's geometry.
Upper Beam Section
The upper beam is the cutter's shank / body above the flute, UpperBeamGeom.
- Upper Beam Section (
.../cutter/upper-beam)- Intro caption
- Warnings Banner — one orange banner per geometry issue the backend reports, e.g. an ExtendedCylinder beam whose FullLength sits below the flute top
- Geometry Management Control, limited to the five IGetStl kinds an upper beam can be
- Transform picker under the kind picker — No Transform or a transformer kind, put on the beam geometry in place through
POST api/Cutter/{id}/upper-beam/set-transform; absent under an ExtendedCylinder, whose start section the cutter wires itself. The transformer's editor renders beneath the geometry's.
Upper Beam is not physics-gated: it is the shank geometry the holder-collision display needs with or without the physics.
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)
- Enable Optimization Checkbox
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 commits at once, and the server clears the cutter's cache before it answers; where the flute, inner-beam or upper-beam geometry changes, it does so through the resync that also re-places the cutter under the holder. What a commit carries differs by section. The Flute Profile panel re-sends the entire shaper profile on any field change — only the fields the selected APT type carries are included. The contour nodes re-send the whole flute contour, and the optimization panel the whole limit set. The Insert section sends only the edited field, and the Inner Beam the profile kind with, for a constant ratio, the ratio. The Flute Profile and Insert panels then also clear the tool cache from the client. The insert, material and coating endpoints each answer with the full cutter DTO, which the panels re-render from. While the pace player is locked — a run in progress or paused — no edit commits: the server answers 409 ToolEditRefusedWhileRunning, and the page's banner says so, with Stop and Reset.
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 seven sections with their gates (Show Physics Options for Insert, Material, Inner Beam and Optimization; an insert-end cutter for Insert), and the fluting / flute / side / bottom sub-tree.wwwroot-src/src/router/treeRoutes.ts—routeForTreeId, which turns a node id such astoolhouse/tool-{toolId}/cutter/contours/fluting/flute-0/sideinto the route's tool number plus node path (the path half throughtoolNodePathOf), andtoolTreeId, which rebuilds the id from the two. The node ids are exactly the ones the tree builds — the seven section ids above and the Flute Contours sub-tree — with no separate list of valid names. ItsmigrateLegacyTreeIdrenames a…/contours/tray…id onto…/contours/fluting…, children included, so a?tree=link to a tool-house id on the Execution or Equipment page, which redirects to the Tool House path, and a remembered selection both reach the same node in either spelling. A Tool House path itself is taken as written:…/cutter/contours/trayin it lands on the Flute Contours node, its deepest built ancestor. Thetrayspelling matches the…ContourTrayXML element names the engine also reads for the Fluting types.wwwroot-src/src/components/controlTree/toolhouse/ToolCutterPanel.vue— the parent Cutter node: the type selector, the Integral Mode selector and the cutter's General fields.wwwroot-src/src/components/controlTree/toolhouse/CutterSectionPanel.vue— the one panel shared by the insert / material / profile / inner-beam / upper-beam / opt sections, keyed off the node's last role segment. It renders the Insert and Flute Profile fields inline and delegates the other four.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; it shows themessagesa flute or shank load answers as notifications.wwwroot-src/src/components/toolhouse/CoatingLayersDiv.vue— the coating rows: index badge, material picker, thickness, move toward surface / body, delete; it shows themessagesa coating load answers as notifications.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: Flute Offset Angle, and Delete This Flute for a free flute.wwwroot-src/src/components/controlTree/toolhouse/FluteSideContourPanel.vueandwwwroot-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.vueandwwwroot-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/InnerBeamDiv.vue— the Inner Beam section: the profile-kind selector, the read-only or editable Radius Ratio, and the custom profile's geometry editor with its container-aware create and resync-on-edit.wwwroot-src/src/components/toolhouse/UpperBeamDiv.vue— the Upper Beam section: the five allowed geometry kinds, the container-aware create, the Transform picker'sset-transformhook, the resync-on-edit and the warnings banner.wwwroot-src/src/components/geom/GeometryEditor.vue— the shared geometry editor the Inner Beam and Upper Beam sections reuse.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: noG4, commit on blur or Enter, and an unparseable or out-of-range entry flagged in the field and never committed.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— holdsisShowPhysicsOptions, the Show Physics Options preference that gates the Insert, Material, Inner Beam and Optimization sections.wwwroot-src/src/i18n/en/toolhouse.ts— the section labels undernode.*and every field label quoted above:cutter.*,material.*,contour.*,fluting.*,innerBeam.*,upperBeam.*andopt.*.wwwroot-src/src/i18n/en/common.ts— “Fluting unset.” (common.empty.flutingUnset) and the Inner Beam's None option (common.options.none).wwwroot-src/src/i18n/en/menu.ts— the Show Physics Options label (menu.preference.showPhysics).wwwroot-src/src/api/toolHouse.ts— the typed wrapper over/api/Cutter: integral mode, inserts, shaper profile, fluting, the free-contour CRUD, the material and coating endpoints, the inner beam, the upper beam and the opt limit.Mech/CutterController.cs— the cutter backend: the APT construction from the profile DTO, the fluting builders, the insert and inner-beam endpoints with their refusals, the opt-limit defaults, the solid-end shank-material mirroring, and the cache clear every field and geometry mutator performs; every one of those mutators answers 409ToolEditRefusedWhileRunningwhile the pace player is locked, the two POST reads/{id}/inner-beamand/{id}/upper-beamexcepted.Mech/CutterDtoBuilder.cs— the read-side cutter DTO: integral mode, inserts, inner beam, general, shaper profile, fluting, opt limit and material, plus themessagesof a material or coating load (empty on every other endpoint).Mech/MaterialLoadMessages.cs— the thermal-constant check of a loaded material, as the reply'smessages.Mech/ToolHouseController.cs— the tool detail that embeds that DTO, which the cutter's sections re-read, except Inner Beam and Upper Beam, which read their own endpoints.
HiAPI Engine
HiMech/Milling/Cutters/MillingCutter.cs— the insert fields withSumInsertMass_gas the insert count times the single-insert mass, the inner- and upper-beam members, and theFluteContourTraychild element it also reads as the fluting.HiMech/Physics/MaterialThermalConstantCheck.cs— the thermal-constant check behind thosemessagesand the runner's warning: the ranges and the two message ids.HiMech/Milling/FluteContours/UniformFluting.csandHiMech/Milling/FluteContours/FreeFluting.cs— the two Fluting types, also registered under theUniformContourTray,FreeContourTrayandGeneralContourTrayelement names.HiMech/Milling/Cutters/CustomSpinningProfile.cs— the custom inner beam's Z-R list: a Z-R host, a TransformationGeom holding one under an identity transform, else the mesh's contour.
See Also
- Cutter Panel — the Cutter node whose type selector grows these sections, and which holds the cutter's General fields and Integral Mode
- APT Profile Panel — the field list and per-type table behind the Flute Profile section
- ExtendedCylinder Editor — the Upper Beam's kind that exists for this cutter, and the one surface that gives it a start section
- Cutter Adjustment Levers — the Inner Beam's core radius ratio as a lever against force peaks