Tool House Page
The Tool House is a page of its own at /tool-house/:toolId?/:tab?/:subtab?, reached from the menu bar's Page ▾ dropdown.
The key model is MachiningToolHouse.
The model UserService is the server-side Environments/UserService.cs, which Mech/ToolHouseDisplayController.cs reads EnablePhysics from.
Layout
Three columns, left to right, in two nested resizable splitters — the tool house and its tool list, the selected tool's editor tabs, and the tool canvas. Creating a tool opens no window of its own: New Tool adds a default tool and the user sets it up in the editor tabs.
- Tool House Page
- Tool List Column
- Tool House Root Panel
- Object Management Menu Button
- file extension is
.MachiningToolHouse, load typeHi.Machining.MachiningToolHouse, HiMech - The managed object is the whole tool house, not one tool
- file extension is
- New Tool Button (disabled until the project has a tool house)
- Ready / No-Project Badge
- Tool-count caption with the pick hint — replaced, while the project has no tool house, by an empty-state block naming New Tool and the Object Management button's
.MachiningToolHouseextension
- Object Management Menu Button
- Tool List
- one router-link row per tool: the Tool ID badge, then the tool's note — or the auto abstract note as an italic caption when the note is empty
- Tool House Root Panel
- Selected Tool Editor Column
- Stick Tool Panel — the tool's five tabs: General, Cutter, Holder, Clamping, Int. Holder
- Viewer Column
- Viewer ToolBar
- RenderingCanvas Tool Bar
- Display Options Menu Dropdown — three flat groups, no submenus
- Head Label: Cutter
- Show Cutter CheckBox
- Head Label: Holder
- Show Holder CheckBox
- Show Geometry Anchor CheckBox
- Show Spindle Buckle CheckBox
- Show Cutter Buckle CheckBox
- Head Label: Holder Rendering Mode
- Solid / Edge / Hide Radio Buttons
- Head Label: Cutter
- Selected-Tool Badge
- Rendering-Connection Badge
- RenderingCanvas
- Viewer ToolBar
- Tool List Column
The three anchor-and-buckle flags of HolderEditorDisplayee and the Holder Rendering Mode radios are all disabled while Show Holder is off, so a child option is reachable only when its parent is on. The menu is one flat list of labelled groups rather than nested submenus, which is what keeps it one click deep.
The cutter's shape mode is not a control here. The server picks it when the canvas binds: InitializeDisplay sets ShapeMode to Solid Bounding Shape whenever UserService.EnablePhysics is false, and the Display Options dropdown offers no switch for it.
The left column carries no editing of its own. Tool ID and Note are edited on the selected tool's General tab, where Duplicate and Delete are per-tool icon buttons, so the list stays a plain navigation column of router links. There is no batch selection and no batch action.
The Tool ID can not be repeated. Create Tool takes the largest existing ID plus 1 (or 1 in an empty house), Duplicate Tool inserts the clone at the first free ID past both the source and the largest existing ID, and renaming a tool onto an ID the house already holds is refused as a conflict.
When the canvas first binds, InitializeDisplay attaches the MillingToolEditorDisplayee and snaps the camera to the isometric view. Each later tool selection re-points that displayee's MillingToolGetter at the chosen tool and calls the renderingCanvas.DispEngine.SetViewToHomeView().
Duplication Button
Use Duplicate(params object[]) to duplicate the tool; the clone joins the house under a fresh ID.
Tool Row Note
A tool's row shows its note when the note exists and is not an empty string; otherwise it shows the AbstractNote, set in an italic caption so the auto-derived text reads as a fallback.
Source Code Path
See HiNC App Anatomy for git repository links.
HiNC-2025-webservice (Quasar CLI SPA). The page is built on the shared Control Tree: the tool nodes on the left, the selected node's tab cascade in the middle, the canvas on the right.
wwwroot-src/src/router/routes.ts— declares the route itself: pathtool-house/:toolId(\d+)?/:tab?/:subtab?, nametool-house.wwwroot-src/src/components/AppMenuBar.vue— thePage ▾dropdown; its first item targets thetool-houseroute.wwwroot-src/src/router/treeRoutes.ts— declaresTOOL_TABS,CUTTER_SECTIONSandHOLDER_SECTIONS, androuteForTreeId/migrateLegacyTreeId, which map a Control-Tree id onto this page's tab params.wwwroot-src/src/composables/useRouteTabs.ts— the:tab?/:subtab?URL sync, defaulting togeneral, and toprofileunder Cutter /geometryunder Holder.wwwroot-src/src/composables/useToolHouse.ts— the module-singleton state every tool-house panel and the canvas share: the tool list, the active tool, the tool-house key and the rendering connection id.wwwroot-src/src/pages/ToolHousePage.vue— routed page:ToolHouseRootPanel+ tool list on the left, the tool's own five-tab strip in the middle,ToolHouseSetupPanelon the right, in two nested resizable<q-splitter>panes. Cutter and Holder grow a second, URL-synced sub-tab strip from the tab node's children, andNodeTabCascade.vuehosts the active tab's panel and the levels nested below it.wwwroot-src/src/components/controlTree/NodeTabCascade.vue— the nested-level host the page mounts inside the active tab.wwwroot-src/src/components/toolhouse/ToolHouseSetupPanel.vue— the canvas column: one RenderingCanvas bound server-side toMillingToolEditorDisplayee, following the page's selected tool, with the Display Options dropdown (Show Cutter / Show Holder + the 3 anchor-and-buckle flags + the Holder Rendering Mode radios).wwwroot-src/src/components/widgets/DisplayOptionsMenu.vue— the generic groups/items dropdown that panel feeds, which is why the menu is flat groups rather than nested submenus.wwwroot-src/src/components/controlTree/toolHouseItemTypes.ts— the tool house's ItemType registry: one tool node per tool, and each tool node's…/cutter,…/holder,…/clamping,…/intelligentchildren.wwwroot-src/src/components/controlTree/toolhouse/ToolHouseRootPanel.vue— the tool-house root node: Object Management over theMachiningToolHouse+ New Tool. The button's own entries are Load, Save As, Copy, Paste and XML; the Load Resource entry is conditional on aresourceDirectoryprop this panel does not pass, so it is absent here.wwwroot-src/src/components/controlTree/toolhouse/ToolNodePanel.vue— one tool's General tab: Tool ID / Note / auto Abstract Note + Duplicate / Delete. Mounting it points the tool canvas at that tool.wwwroot-src/src/components/controlTree/toolhouse/ToolCutterPanel.vue— the Cutter stem: cutter type selector plus the MillingCutter identity fields (Shank Mass / Hone Radius / Relief Angle).wwwroot-src/src/components/controlTree/toolhouse/CutterSectionPanel.vue— the cutter's inner tabs, keyed off the node's role path (material/profile/upper-beam/opt). Flute Profile is edited inline; the others dispatch towwwroot-src/src/components/toolhouse/MaterialDiv.vue(which growsCoatingLayersDiv.vue),wwwroot-src/src/components/toolhouse/UpperBeamDiv.vueandwwwroot-src/src/components/toolhouse/MillingCutterOptLimitDiv.vue.wwwroot-src/src/components/controlTree/toolhouse/CutterContoursPanel.vue— the Flute Contours stem: the fluting type selector only. The selected fluting's editor grows below it.wwwroot-src/src/components/controlTree/toolhouse/FlutingPanel.vue— the concrete fluting node and its fluting-level fields; uniform fluting grows one Baseline Contour, free fluting one tab per flute.wwwroot-src/src/components/controlTree/toolhouse/FluteContourPanel.vue— one flute contour node (baseline, orflute-<i>for a free fluting): hosts Setup Angle, with Side Contour and Bottom Contour as sub-tabs.fluteContourNode.tscarries the shared re-commit.wwwroot-src/src/components/controlTree/toolhouse/FluteSideContourPanel.vue/FluteBottomContourPanel.vue— kind selector + editor, dispatching towwwroot-src/src/components/toolhouse/fluting/ConstHelixSideContourDiv.vue,FreeformSideContourDiv.vue,SlideBottomContourDiv.vueandFreeformBottomContourDiv.vue; the two freeform editors shareSpanContourPosListDiv.vuefor the per-flute position list.wwwroot-src/src/components/controlTree/toolhouse/ToolHolderPanel.vue— the Holder stem: holder type selector plus the holder's Name / Note / auto Abstract Note, committed through the per-type holder controller.wwwroot-src/src/components/controlTree/toolhouse/HolderSectionPanel.vue— the Cylindroid holder's Geometry (the Z-R profile, viawwwroot-src/src/components/geom/CylindroidEditor.vue) and both holders' Resolution tabs; resyncs the Cylindroid holder (UpdateByCylindroid()) after each geometry edit. A Freeform holder's Geometry / Geom To Spindle / Geom To Cutter tabs are the genericGeometry/TransformerControl-Tree slots (wwwroot-src/src/components/controlTree/GeometrySlotPanel.vue/TransformerSlotPanel.vue), wired bytoolHouseItemTypes.tstoFreeformHolderController's keys and resync.wwwroot-src/src/components/controlTree/toolhouse/ToolClampingPanel.vue— the Clamping tab:ExposedCutterHeight=PreservedDistance+FluteHeight; changing either field updates the other on the server.wwwroot-src/src/components/controlTree/toolhouse/ToolIntelligentPanel.vue— the Intelligent Holder tab; a thin wrapper overwwwroot-src/src/components/toolhouse/IntelligentHolderDiv.vue(Observation Location:ObservationAnchorReferencedropdown + relative Z + ring radius).wwwroot-src/src/api/toolHouse.ts— typed wrapper over three server modules:ToolHouseController(/api/ToolHouse),CutterController(/api/Cutter) andToolHouseDisplayController(/api/mech/tool-house-display).wwwroot-src/src/api/cylindroidHolder.ts/wwwroot-src/src/api/freeformHolder.ts— typed wrappers overCylindroidHolderController/FreeformHolderController.Mech/ToolHouseController.cs— the tool-house collection and the tool-level fields. REST endpoints:GET /,GET /{id},GET /GetHolder,GET/PUT /{id}/observation,PUT /{id}/note | exposed-height | preserved-distance,POST /Initialize | Update | SelectTool | CreateTool | DuplicateTool | RenameTool | SetHolderType | ClearToolCache,DELETE /DeleteTool.Mech/CutterController.cs— cutter editing, the/api/Cuttersibling ofToolHouseController. REST endpoints at/api/Cutter/*:POST EnsureCutter | ClearCutter,PUT /{id}/shaper-profile | fluting | general | opt-limit,FreeFlutingchild CRUD at/{id}/fluting/contours[/{index}],GET/POST /{id}/upper-beam[/create | /resync], and the material endpoints/{id}/flute-material/*,/{id}/shank-material/*,/{id}/coating-layers/*.Mech/ToolHouseDisplayController.cs— REST endpoints at/api/mech/tool-house-display/*for display options (initialize, select-tool, show-cutter / show-holder / show-geom-anchor / show-spindle-buckle / show-cutter-buckle, holder-rendering-mode, cutter-shape-mode, clear-cache).initializeattaches theMillingToolEditorDisplayeeand snaps to the isometric view;select-toolre-points theMillingToolGetterand snaps to the home view. It also reportsenablePhysicsfromUserService.Mech/CylindroidHolderController.cs— holder-aware layer over a tool'sCylindroidHolder. REST endpoints at/api/CylindroidHolder/*:GET Get(returns name / note / abstract note / resolution + indexes the holder'sCylindroid),POST UpdateGeometryContent | SetName | SetNote | SetPolarResolution.UpdateGeometryContentis the post-edit resync (UpdateByCylindroid()+ClearCache()) that the genericCylindroidControllercannot perform.Mech/FreeformHolderController.cs— the Freeform counterpart. REST endpoints at/api/FreeformHolder/*:GET Get(name / note / abstract note / resolution + indexes the holder's geometry and two placement transformers under per-session keys),POST CreateGeometry | UpdateGeometry | IndexCurrentGeometry | UpdateGeometryContent | UpdateGeomToSpindleTransformer | UpdateGeomToCutterTransformer | SetName | SetNote | SetPolarResolution. Every shape edit ends inUpdateByGeom()+ClearCache()+AlignAnchorByExposedCutterHeight(), the resync the generic geometry and transformer controllers cannot perform.Environments/UserService.cs— the web client's own per-user service, living on the server;ToolHouseDisplayControllerreadsEnablePhysicsfrom it.
Note
The fluting type is named loosely on the wire, and every spelling resolves. PUT /{id}/fluting accepts UniformFluting / uniform and FreeFluting / free, and equally UniformContourTray / FreeContourTray. A Control-Tree id whose cutter branch reads …/contours/tray… resolves to the …/contours/fluting… node.
One cutter type has no editor here, and the app says so where the type is chosen: the FreeformRemover. Selecting it keeps the existing model intact and shows a note — No FreeformRemover editor here. The existing model is kept unchanged; edit one in HiNcRcl.
Three smaller surfaces are absent for the same reason: the InsertCutter and FluteInnerBeam physics groups, and the CustomSpinningProfile shaper-profile type — the profile tab offers the five APT types (General / Ball / Column / Cone / Taper).
See Also
- Cutter Tab — the cutter half of a tool, and the editors each cutter type grows
- Holder Tab — the holder half, and the editors each holder type grows
- Stick Tool Panel — the selected tool’s tab cascade, which those two tabs belong to
- General Setup Page — the equipment these tools are mounted into