comments: point prop.js mentions at the web/prop/ module that owns the code

finworker, solids, cutout, fins, draw, tails.test, check_stl, the Onshape
port and PERFORMANCE-SPEC named prop.js for things that now live in
prop/config.js, sweep.js, contact.js, surface.js or clearance.js. The dated
notes in ROADMAP and IMPLEMENTATION-PLAN are left as written.
This commit is contained in:
matthewtrahan authored and Matthew Trahan committed 2026-09-26 17:46:36 -05:00
1 parent fdec9c9dce
commit f5aa212db7
9 files changed
+17 -16

No files matched your search

+4 -3
View File
@@ -12,9 +12,10 @@ is pure mesh math (no DOM/three.js), so it profiles and runs headless with Deno.
- `web/fins.js` — `buildFins()` entry; auto mode recurses to `mode:'prop'`, then
adds wedges (`buildPerpFins`) and the bed pad (`buildPad`).
- `web/prop.js` — `buildProps()` and the per-wall pipeline: `splitRegion`,
`patchTracks`, `sweep`, `settleTop`/`contourTop`/`lowerSag`, `stationIsClear`,
`stationCertified`, `emitTines`, `surfaceZAt` (already grid-accelerated).
- `web/prop.js` — `buildProps()`, which drives the per-wall pipeline in `web/prop/`:
`splitRegion`/`patchTracks` (tracks.js), `sweep` (sweep.js),
`settleTop`/`contourTop`/`lowerSag` (contact.js), `stationIsClear`/`stationCertified`
(clearance.js), `emitTines` (tines.js), `surfaceZAt` (surface.js, already grid-accelerated).
- `web/inside.js` — `insidePart`, `nearestPart` (both grid-accelerated, 64² YZ grid).
Run headless: `deno run --allow-read <script.js>` (see profiling harness below).
+1 -1
View File
@@ -174,7 +174,7 @@ const BED_EPS = 0.35 * millimeter; // a face this close to the pl
const MIN_REGION_AREA = 12.0 * millimeter ^ 2; // ignore slivers
const ANGLE_EPS = 1e-4; // a face exactly on the threshold is self-supporting
// Overhang prop -- web/prop.js PROP
// Overhang prop -- web/prop/config.js PROP
const PROP_TH = 1.0 * millimeter; // stem thickness
const PROP_TIP = 0.6 * millimeter; // contact tip thickness
const PROP_TIP_H = 1.5 * millimeter; // height of the necked tip
+2 -2
View File
@@ -28,7 +28,7 @@ TINE_MAX_H = 0.45 # mm; a tine is one layer (tineH 0.2) -- two layers is alrea
STANDOFF = 0.2
# The project's own non-fusing clearance, same number as the breakaway gap: if
# 0.2mm is enough for the part to bridge over the top without welding, it is
# enough beside a flank. prop.js targets 0.35 so there is margin to lose.
# enough beside a flank. PROP.sideClear targets 0.35 so there is margin to lose.
FLANK_MIN = 0.20
# Mirrors web/overhangs.js constant-for-constant, same as spike_overhangs.py.
@@ -164,7 +164,7 @@ def check(case):
pq = trimesh.proximity.ProximityQuery(part)
walls = [b for b in added if b.volume > WALL_MIN_VOL]
# A tine is ONE LAYER tall by design (prop.js tineH) -- so small AND flat.
# A tine is ONE LAYER tall by design (PROP.tineH) -- so small AND flat.
# Volume alone misread a short squat wall (a 5mm low-ledge wall is ~5mm3,
# ~1mm tall) as a tine that "bites nothing, detached from wall" (torus X45).
# Anything small but taller than a tine is wall-like: it joins `walls` for
+1 -1
View File
@@ -1,5 +1,5 @@
// Low TAILS: a tall wall now runs on down the slope to the squat floor instead of
// stopping at the first station >= minHeight (see prop.js withLowTails). That fix
// stopping at the first station >= minHeight (see prop/clearance.js withLowTails). That fix
// reached the part's bottom edge on the first try, but a sweep of every model x
// pose x coverage against the pre-tail build turned up six side effects -- each
// pinned here so it can't creep back. Values are what the pre-tail build did; the
+2 -2
View File
@@ -1,7 +1,7 @@
/**
* WALL CUTOUTS (issue #34) -- holes through a breakaway wall to save filament.
*
* prop.js sweeps each wall as per-station cross-sections and hands them here;
* prop/sweep.js sweeps each wall as per-station cross-sections and hands them here;
* cutWall either emits the wall with holes or returns false, and the caller
* emits it solid as before. Everything is in the wall's own (s, z) plane: s runs
* along the wall, z up. The pattern choice lives here (CUT.pattern), set by the
@@ -313,7 +313,7 @@ function stripSolid(s0, s1, zb, zt, obst) {
* Emit `st` (per-station wall data from sweep / sweepBetween) as a wall with
* CUT.pattern holes, or return false to have the caller emit its solid ribbon.
* `full` is the caller's solid sections, reused for the end posts; `wall` the
* wall's own numbers (prop.js PROP: th, tip, minStations).
* wall's own numbers (prop/config.js PROP: th, tip, minStations).
*/
export function cutWall(st, full, out, wall) {
const kind = CUT.pattern;
+3 -3
View File
@@ -13,7 +13,7 @@
*
* Geometry only. The interaction (picking the two endpoints, live preview, undo)
* lives in ui/walls.js; this module turns two surface points plus the part's triangles
* into a watertight wall, reusing prop.js's proven `sweep` and its three
* into a watertight wall, reusing prop/sweep.js's proven `sweep` and its three
* line-settling passes verbatim.
*/
import { PROP, PART_BAND, sweep, sweepBetween, floorLine, contourTop, lowerSag, settleTop, emitTines, tineStepFor } from './prop.js';
@@ -21,7 +21,7 @@ import { PROP, PART_BAND, sweep, sweepBetween, floorLine, contourTop, lowerSag,
/**
* Every surface height directly above (x, y), as a list.
*
* `surfaceZAt` in prop.js returns only the LOWEST, which is what an auto-placer
* `surfaceZAt` in prop/surface.js returns only the LOWEST, which is what an auto-placer
* wants (the underside a wall props to). A hand-drawn wall instead wants the
* surface the user actually clicked, so this keeps them all and the caller picks
* the one nearest the line the user drew -- otherwise a wall under a shallow
@@ -48,7 +48,7 @@ function surfaceZsAt(tris, x, y) {
* The contact polyline for a wall drawn from `a` to `b` (both surface points in
* PRINT space, [x, y, z]). Straight in XY by construction. Each station's height
* is the part surface nearest the line the user drew -- not the global lowest,
* which would jump to another feature -- and then the three prop.js passes pull
* which would jump to another feature -- and then the three prop/contact.js passes pull
* the top to a clean `gap` below the part exactly as the auto-placer does.
*/
export function drawnLine(a, b, tris, step = PROP.stationStep, band = Infinity) {
+2 -2
View File
@@ -37,7 +37,7 @@ export const FIN = {
// --- from docs/FIN-SPEC.md, stated on camera. Do not "tune" these. ---
gap: 0.2, // standoff from the part face
tineH: 0.2, // = slicer layer height: a tine must be ONE layer so it prints
// as a single continuous bead (see prop.js tineH / FIN-SPEC)
// as a single continuous bead (see prop/config.js tineH / FIN-SPEC)
tineW: 0.5, // between one nozzle pass (0.4) and out-and-back (0.8)
baseH: 1.0, // base disc thickness
rowsLow: 8, // tine rows in the dense zone -- "7 or 8 low down"
@@ -1522,7 +1522,7 @@ function propServesPatch(p, props) {
const m = 8;
for (const q of props) {
for (const pt of (q.line ?? [])) {
// A tall wall's low TAIL (prop.js withLowTails) runs down into the corner
// A tall wall's low TAIL (prop/clearance.js withLowTails) runs down into the corner
// where this face may meet the one the wall serves; its sub-minHeight tip
// landing in the margin is not a wall under this face (it dropped the wedge
// on a steep cube face). Squat props are low by design and still count.
+1 -1
View File
@@ -1,6 +1,6 @@
// Off-main-thread support generation.
//
// buildFins -- and everything it imports (prop.js, inside.js, planes.js,
// buildFins -- and everything it imports (prop.js + web/prop/, inside.js, planes.js,
// overhangs.js) -- is pure mesh math with no DOM or three.js dependency; that is
// exactly why prototype/verify_fins.js can run it headless. So the whole build
// moves into a Worker. On a large or badly-posed part a single build can take a
+1 -1
View File
@@ -1,5 +1,5 @@
/**
* Closed-solid emitters shared by the wall builders (prop.js) and the wall
* Closed-solid emitters shared by the wall builders (web/prop/) and the wall
* cutouts (cutout.js). Pure mesh math: each takes cross-sections or a polygon
* and pushes outward-wound triangles, as vertex triples, onto `out`.
*/