@hatiolab/figure-model 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/authoring-fastening.d.ts +19 -10
- package/dist/authoring-fastening.d.ts.map +1 -1
- package/dist/authoring-fastening.js +129 -356
- package/dist/authoring-fastening.js.map +1 -1
- package/dist/authoring-geometry.d.ts +9 -45
- package/dist/authoring-geometry.d.ts.map +1 -1
- package/dist/authoring-geometry.js +25 -184
- package/dist/authoring-geometry.js.map +1 -1
- package/dist/authoring-occupancy.d.ts +3 -3
- package/dist/authoring-occupancy.d.ts.map +1 -1
- package/dist/authoring-occupancy.js +11 -9
- package/dist/authoring-occupancy.js.map +1 -1
- package/dist/authoring-proportion.js +2 -2
- package/dist/authoring-proportion.js.map +1 -1
- package/dist/authoring-types.d.ts +37 -35
- package/dist/authoring-types.d.ts.map +1 -1
- package/dist/authoring-types.js +12 -0
- package/dist/authoring-types.js.map +1 -1
- package/dist/command-preview.d.ts +11 -33
- package/dist/command-preview.d.ts.map +1 -1
- package/dist/command-preview.js +2 -66
- package/dist/command-preview.js.map +1 -1
- package/dist/contract.d.ts +1 -1
- package/dist/contract.d.ts.map +1 -1
- package/dist/examples.js +4 -4
- package/dist/examples.js.map +1 -1
- package/dist/face-overhang.d.ts +105 -0
- package/dist/face-overhang.d.ts.map +1 -0
- package/dist/face-overhang.js +357 -0
- package/dist/face-overhang.js.map +1 -0
- package/dist/fasten-place.d.ts +35 -0
- package/dist/fasten-place.d.ts.map +1 -0
- package/dist/fasten-place.js +91 -0
- package/dist/fasten-place.js.map +1 -0
- package/dist/gate.d.ts.map +1 -1
- package/dist/gate.js +7 -4
- package/dist/gate.js.map +1 -1
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +16 -2
- package/dist/graph.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/joint-fields.d.ts +12 -0
- package/dist/joint-fields.d.ts.map +1 -0
- package/dist/joint-fields.js +20 -0
- package/dist/joint-fields.js.map +1 -0
- package/dist/joint-writing.d.ts.map +1 -1
- package/dist/joint-writing.js +86 -125
- package/dist/joint-writing.js.map +1 -1
- package/dist/kernel-version.d.ts +1 -1
- package/dist/kernel-version.js +1 -1
- package/dist/proposal.js +3 -3
- package/dist/proposal.js.map +1 -1
- package/dist/recipe.js +1 -1
- package/dist/recipe.js.map +1 -1
- package/dist/resize-plan.js +1 -1
- package/dist/resize-plan.js.map +1 -1
- package/dist/robots.d.ts.map +1 -1
- package/dist/robots.js +18 -17
- package/dist/robots.js.map +1 -1
- package/dist/shape-edit.js +4 -5
- package/dist/shape-edit.js.map +1 -1
- package/dist/shape-extreme.d.ts +49 -0
- package/dist/shape-extreme.d.ts.map +1 -0
- package/dist/shape-extreme.js +262 -0
- package/dist/shape-extreme.js.map +1 -0
- package/dist/shape-ops.d.ts +6 -7
- package/dist/shape-ops.d.ts.map +1 -1
- package/dist/shape-ops.js +72 -37
- package/dist/shape-ops.js.map +1 -1
- package/dist/size-edit.d.ts.map +1 -1
- package/dist/size-edit.js +33 -12
- package/dist/size-edit.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { type FigureFastenAlignment, type FigureFastenTarget } from './fasten-place.ts';
|
|
2
|
+
import type { FigureAsset } from './asset-types.ts';
|
|
3
|
+
import type { FigureFacing } from './authoring-types.ts';
|
|
4
|
+
import { type Axis } from './words.ts';
|
|
5
|
+
/** A place to try the part at: on another face or the plane, by another facing, lined up another way. Unsaid, as it is. */
|
|
6
|
+
export interface FigureFaceTry {
|
|
7
|
+
on?: FigureFastenTarget;
|
|
8
|
+
facing?: FigureFacing;
|
|
9
|
+
align?: Partial<Record<Axis, FigureFastenAlignment>>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* What is measured once for a part on a face, in the receiving part's own frame (the plane's: the figure's), on the two
|
|
13
|
+
* axes across the face: where a fastening lines it up to (`edges`, as the fastening reads them: the receiving part's
|
|
14
|
+
* own extent, the figure's declared size on the plane), the face's own outline when it is read (`outline`), and the
|
|
15
|
+
* part where it stands -- its real extent and, per copy, where it touches. Moving it across the face moves all of these
|
|
16
|
+
* together; nothing is measured again.
|
|
17
|
+
*/
|
|
18
|
+
export interface FigureFaceMeasure {
|
|
19
|
+
part: string;
|
|
20
|
+
on: FigureFastenTarget;
|
|
21
|
+
facing: FigureFacing;
|
|
22
|
+
axes: [Axis, Axis];
|
|
23
|
+
edges: Partial<Record<Axis, {
|
|
24
|
+
lo: number;
|
|
25
|
+
hi: number;
|
|
26
|
+
}>>;
|
|
27
|
+
/**
|
|
28
|
+
* The face's outline: a rectangle, a disc or ellipse (`round`), or the line a plane touches a curved side along
|
|
29
|
+
* (`line`). Absent where it is not read -- a drawn section's side, an end the inside opens through -- and on the plane
|
|
30
|
+
* (it is `edges`).
|
|
31
|
+
*/
|
|
32
|
+
outline?: {
|
|
33
|
+
centre: Partial<Record<Axis, number>>;
|
|
34
|
+
size: Partial<Record<Axis, number>>;
|
|
35
|
+
round?: boolean;
|
|
36
|
+
line?: boolean;
|
|
37
|
+
};
|
|
38
|
+
extent: Record<Axis, {
|
|
39
|
+
lo: number;
|
|
40
|
+
hi: number;
|
|
41
|
+
}>;
|
|
42
|
+
/** Per copy, the points whose hull touches the face (or, by its middle, the middle); absent when not known. */
|
|
43
|
+
contact?: Array<Array<[number, number]>>;
|
|
44
|
+
/** The extent is the real shape's; a mesh's is its box, exact only when it stands square to the face. */
|
|
45
|
+
exact: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** How a fastened part lies on its face: within its edges, past them, perhaps past them, wider than it, or not known. */
|
|
48
|
+
export interface FigureFaceOverhang {
|
|
49
|
+
part: string;
|
|
50
|
+
on: FigureFastenTarget;
|
|
51
|
+
/**
|
|
52
|
+
* `inside` -- within the face's edges; `out` -- past them where it would fit; `possible` -- a mesh turned on the face,
|
|
53
|
+
* its box past them, so it may be; `larger` -- past them only along axes where it is wider than the face, as a bench
|
|
54
|
+
* top is wider than its leg: said as a fact, with its numbers, not as a fault (designer 2026-09-27); `unknown` -- the
|
|
55
|
+
* face's outline is not read here, or it is round and the part lies within its square. Never beyond what was measured.
|
|
56
|
+
*/
|
|
57
|
+
state: 'inside' | 'out' | 'possible' | 'larger' | 'unknown';
|
|
58
|
+
/** Where, and how far past the edge, in mm, along the receiving part's own axes -- every axis, the wider ones too. */
|
|
59
|
+
sides: Array<{
|
|
60
|
+
axis: Axis;
|
|
61
|
+
side: 'low' | 'high';
|
|
62
|
+
mm: number;
|
|
63
|
+
}>;
|
|
64
|
+
/** The axes along which it is wider than the face. */
|
|
65
|
+
wider: Axis[];
|
|
66
|
+
/** Along a wider axis, it comes past one edge more than the other: off to one side. */
|
|
67
|
+
lopsided: Axis[];
|
|
68
|
+
/** The part's middle from the middle of the face's edges, per axis across it. */
|
|
69
|
+
at: Partial<Record<Axis, number>>;
|
|
70
|
+
/** Whether any of its footprint lies over the face at all. */
|
|
71
|
+
over: boolean;
|
|
72
|
+
/** (나) Whether what touches the face -- a point, a line, a face; by its middle, the middle -- lies on it. */
|
|
73
|
+
contact: 'on' | 'off' | 'unknown';
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* What a part on a face is measured by (see `FigureFaceMeasure`): on the face it is fastened to, or the one tried. Nothing
|
|
77
|
+
* when it is fastened to nothing and nothing is tried, when it is fastened at a part's origin (on no face, ADR-0107
|
|
78
|
+
* decision 4), or when the face names no axis.
|
|
79
|
+
*/
|
|
80
|
+
export declare function figureFaceMeasureOf(source: FigureAsset, part: string, values?: Record<string, number>, place?: Omit<FigureFaceTry, 'align'>): FigureFaceMeasure | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* How the measured part lies on the face, where it stands or lined up by `align` (the fastening's own words; an axis
|
|
83
|
+
* left out stays where it is): moved across the face as a fastening would move it, the outline and the edges compared
|
|
84
|
+
* with its real extent, and what touches compared with the outline.
|
|
85
|
+
*/
|
|
86
|
+
export declare function figureFaceOverhangAt(measure: FigureFaceMeasure, align?: Partial<Record<Axis, FigureFastenAlignment>>): FigureFaceOverhang;
|
|
87
|
+
/**
|
|
88
|
+
* Whether a part fastened to a face lies within its edges and touches it (ADR-0097 §5.5, ADR-0140 3.8): measured on
|
|
89
|
+
* the face it is fastened to, or tried on another, lined up as `place` says. Past the edges is not wrong in itself -- a
|
|
90
|
+
* device may overhang a bench top -- and not the figure's room: it is said apart, and nothing is moved.
|
|
91
|
+
*/
|
|
92
|
+
export declare function figureFaceOverhangOf(source: FigureAsset, part: string, values?: Record<string, number>, place?: FigureFaceTry): FigureFaceOverhang | undefined;
|
|
93
|
+
/**
|
|
94
|
+
* The alignment that brings the part inside the face, for 정렬·간격 고치기: on each axis it comes past an edge, the
|
|
95
|
+
* least move -- level with that edge from inside (`min` / `max` where the face's edges are the ones a fastening lines up
|
|
96
|
+
* to and `lineUp` offers them, else that distance from the middle) -- or the centre when it is wider than the face and
|
|
97
|
+
* cannot be inside. `inside` when nothing of it is past an edge; `unmeasured` when the face's edges are not read.
|
|
98
|
+
*/
|
|
99
|
+
export declare function figureFaceInsideAlignOf(measure: FigureFaceMeasure, align: Partial<Record<Axis, FigureFastenAlignment>>, lineUp?: Partial<Record<Axis, boolean>>): {
|
|
100
|
+
align: Partial<Record<Axis, FigureFastenAlignment>>;
|
|
101
|
+
moved: Axis[];
|
|
102
|
+
} | {
|
|
103
|
+
cannot: 'inside' | 'unmeasured';
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=face-overhang.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"face-overhang.d.ts","sourceRoot":"","sources":["../src/face-overhang.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
/*
|
|
5
|
+
* How a fastened part lies on the face it is fastened to (ADR-0140 3.8, stage 1, D3): whether what touches the face is
|
|
6
|
+
* on it (나) and how far the part comes past its edges (다), measured by the part's real shape in the receiving part's
|
|
7
|
+
* own frame -- the reach a fastening stands it by, row copies and all. The modeller measured this by boxes of its own;
|
|
8
|
+
* it asks here, so the drawing, the editor's words and 정렬·간격 고치기 say one thing.
|
|
9
|
+
*/
|
|
10
|
+
import { figurePlacementOf, upgradeFigurePlacement } from "./asset.js";
|
|
11
|
+
import { evaluate, figureBodyOwnerOf, figurePartFaceOf } from "./command-preview.js";
|
|
12
|
+
import { compileFigureGraph, figureShapeFaces } from "./graph.js";
|
|
13
|
+
import { ownSpansOf, mul3, mv3, transpose3, IDENTITY } from "./authoring-geometry.js";
|
|
14
|
+
import { figureReachValue, figureShapeExtremeAlong } from "./shape-extreme.js";
|
|
15
|
+
import { figureShapeContactOf } from "./shape-ops.js";
|
|
16
|
+
import { figureFastenAxesOf, figureFastenPlaceOf } from "./fasten-place.js";
|
|
17
|
+
import { AXES } from "./words.js";
|
|
18
|
+
const round1 = (v) => Math.round(v * 10) / 10;
|
|
19
|
+
const TOUCH = 0.05;
|
|
20
|
+
/**
|
|
21
|
+
* What a part on a face is measured by (see `FigureFaceMeasure`): on the face it is fastened to, or the one tried. Nothing
|
|
22
|
+
* when it is fastened to nothing and nothing is tried, when it is fastened at a part's origin (on no face, ADR-0107
|
|
23
|
+
* decision 4), or when the face names no axis.
|
|
24
|
+
*/
|
|
25
|
+
export function figureFaceMeasureOf(source, part, values = {}, place = {}) {
|
|
26
|
+
const asset = upgradeFigurePlacement(source);
|
|
27
|
+
const m = asset.document.model;
|
|
28
|
+
const joint = (asset.joints ?? []).find((j) => j.body1.part === part);
|
|
29
|
+
const on = place.on ??
|
|
30
|
+
(!joint
|
|
31
|
+
? undefined
|
|
32
|
+
: 'plane' in joint.body0
|
|
33
|
+
? 'plane'
|
|
34
|
+
: 'face' in joint.body0
|
|
35
|
+
? { part: joint.body0.part, face: joint.body0.face }
|
|
36
|
+
: undefined);
|
|
37
|
+
if (!on)
|
|
38
|
+
return undefined;
|
|
39
|
+
const facing = place.facing ?? joint?.origin?.facing ?? 'meet';
|
|
40
|
+
const axes = figureFastenAxesOf(source, on);
|
|
41
|
+
if (axes.length !== 2)
|
|
42
|
+
return undefined;
|
|
43
|
+
const geometry = evaluate(source, values);
|
|
44
|
+
const theirs = on === 'plane' ? { r: IDENTITY, t: [0, 0, 0] } : geometry.find(g => g.id === on.part)?.pose;
|
|
45
|
+
const bodies = geometry.filter(g => g.pose && g.shape && figureBodyOwnerOf(g.id) === part);
|
|
46
|
+
if (!theirs || !bodies.length)
|
|
47
|
+
return undefined;
|
|
48
|
+
const graph = compileFigureGraph(m).evaluate({ ...asset.designInputs, ...asset.stateDefaults, ...values })
|
|
49
|
+
.values;
|
|
50
|
+
const valueOf = (terms) => terms.reduce((s, t) => s + t.k * graph[t.ref], 0);
|
|
51
|
+
const toTheirs = transpose3(theirs.r);
|
|
52
|
+
const normal = AXES.find(a => !axes.includes(a));
|
|
53
|
+
/* Where a fastening lines it up to. */
|
|
54
|
+
const edges = {};
|
|
55
|
+
if (on === 'plane') {
|
|
56
|
+
for (const a of axes)
|
|
57
|
+
if (m.inputs.some((i) => i.id === `size.${a}` && i.role === 'design')) {
|
|
58
|
+
const size = graph[`size.${a}`] ?? asset.designInputs[`size.${a}`];
|
|
59
|
+
if (typeof size === 'number')
|
|
60
|
+
edges[a] = { lo: -size / 2, hi: size / 2 };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const spans = ownSpansOf(m, on.part, on.part);
|
|
65
|
+
for (const a of axes)
|
|
66
|
+
if (spans[a])
|
|
67
|
+
edges[a] = { lo: valueOf(spans[a].lo), hi: valueOf(spans[a].hi) };
|
|
68
|
+
}
|
|
69
|
+
/* The face's own outline, in their frame. */
|
|
70
|
+
let outline;
|
|
71
|
+
if (on !== 'plane') {
|
|
72
|
+
const face = figurePartFaceOf(source, on.part, on.face, values);
|
|
73
|
+
if (face) {
|
|
74
|
+
const centre = mv3(toTheirs, face.centre.map((v, i) => v - theirs.t[i]));
|
|
75
|
+
outline = {
|
|
76
|
+
centre: { [axes[0]]: centre[AXES.indexOf(axes[0])], [axes[1]]: centre[AXES.indexOf(axes[1])] },
|
|
77
|
+
size: { [axes[0]]: face.size.u, [axes[1]]: face.size.v },
|
|
78
|
+
...(face.round ? { round: true } : {}),
|
|
79
|
+
...(face.line ? { line: true } : {})
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/* The part, each copy as it stands: its real extent (the reach a fastening stands it by), and what touches the face. */
|
|
84
|
+
const extent = Object.fromEntries(AXES.map(a => [a, { lo: Infinity, hi: -Infinity }]));
|
|
85
|
+
const contact = [];
|
|
86
|
+
let known = true;
|
|
87
|
+
let exact = true;
|
|
88
|
+
const sign = on === 'plane' ? 1 : faceSignOf(m, on);
|
|
89
|
+
for (const body of bodies) {
|
|
90
|
+
const R = mul3(toTheirs, body.pose.r);
|
|
91
|
+
const o = mv3(toTheirs, body.pose.t.map((v, i) => v - theirs.t[i]));
|
|
92
|
+
const back = transpose3(R);
|
|
93
|
+
const reach = (k, s) => figureReachValue(figureShapeExtremeAlong(m, part, mv3(back, AXES.map((_, i) => (i === k ? s : 0))), part), graph);
|
|
94
|
+
const own = {};
|
|
95
|
+
for (const a of AXES) {
|
|
96
|
+
const k = AXES.indexOf(a);
|
|
97
|
+
own[a] = { lo: o[k] - reach(k, -1), hi: o[k] + reach(k, 1) };
|
|
98
|
+
extent[a] = { lo: Math.min(extent[a].lo, own[a].lo), hi: Math.max(extent[a].hi, own[a].hi) };
|
|
99
|
+
}
|
|
100
|
+
const square = R.every(row => row.filter(v => Math.abs(v) > 1e-9).length === 1);
|
|
101
|
+
if (body.shape.mesh && !square)
|
|
102
|
+
exact = false;
|
|
103
|
+
if (!known)
|
|
104
|
+
continue;
|
|
105
|
+
if (facing === 'centre') {
|
|
106
|
+
contact.push([[(own[axes[0]].lo + own[axes[0]].hi) / 2, (own[axes[1]].lo + own[axes[1]].hi) / 2]]);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
/* Meeting it, the end toward the face touches; flush with it, the far end lies on it. */
|
|
110
|
+
const toward = AXES.map(a => (a === normal ? (facing === 'meet' ? -sign : sign) : 0));
|
|
111
|
+
const points = figureShapeContactOf(body.shape, mv3(back, toward));
|
|
112
|
+
if (!points) {
|
|
113
|
+
known = false;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
contact.push(points.map(q => {
|
|
117
|
+
const p = mv3(R, q).map((v, i) => v + o[i]);
|
|
118
|
+
return [p[AXES.indexOf(axes[0])], p[AXES.indexOf(axes[1])]];
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
part,
|
|
123
|
+
on,
|
|
124
|
+
facing,
|
|
125
|
+
axes,
|
|
126
|
+
edges,
|
|
127
|
+
...(outline ? { outline } : {}),
|
|
128
|
+
extent,
|
|
129
|
+
...(known ? { contact } : {}),
|
|
130
|
+
exact
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/** The outward sign of a part's face along its axis, as the shape names it. */
|
|
134
|
+
function faceSignOf(m, on) {
|
|
135
|
+
const shape = m.nodes.find((n) => n.id === `${on.part}.shape`);
|
|
136
|
+
const face = shape && figureShapeFaces(shape, m)?.[on.face];
|
|
137
|
+
return face?.normal ?? 1;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* How the measured part lies on the face, where it stands or lined up by `align` (the fastening's own words; an axis
|
|
141
|
+
* left out stays where it is): moved across the face as a fastening would move it, the outline and the edges compared
|
|
142
|
+
* with its real extent, and what touches compared with the outline.
|
|
143
|
+
*/
|
|
144
|
+
export function figureFaceOverhangAt(measure, align) {
|
|
145
|
+
const { axes, edges, outline, extent } = measure;
|
|
146
|
+
const shift = {};
|
|
147
|
+
const at = {};
|
|
148
|
+
for (const a of axes) {
|
|
149
|
+
const e = edges[a];
|
|
150
|
+
const mid = e ? (e.lo + e.hi) / 2 : 0;
|
|
151
|
+
const now = (extent[a].lo + extent[a].hi) / 2;
|
|
152
|
+
const how = align?.[a];
|
|
153
|
+
const there = how === undefined
|
|
154
|
+
? now
|
|
155
|
+
: mid +
|
|
156
|
+
figureFastenPlaceOf({
|
|
157
|
+
align: { [a]: how },
|
|
158
|
+
face: { [a]: e ? e.hi - e.lo : undefined },
|
|
159
|
+
part: { [a]: extent[a].hi - extent[a].lo }
|
|
160
|
+
})[a];
|
|
161
|
+
shift[a] = there - now;
|
|
162
|
+
at[a] = round1(there - mid);
|
|
163
|
+
}
|
|
164
|
+
/* The edges it is judged against: the outline's where it is read, the plane's declared size on the plane. */
|
|
165
|
+
const judged = {};
|
|
166
|
+
for (const a of axes)
|
|
167
|
+
if (outline) {
|
|
168
|
+
const c = outline.centre[a], s = outline.size[a];
|
|
169
|
+
if (c !== undefined && s !== undefined)
|
|
170
|
+
judged[a] = { lo: c - s / 2, hi: c + s / 2 };
|
|
171
|
+
}
|
|
172
|
+
else if (measure.on === 'plane' && edges[a])
|
|
173
|
+
judged[a] = edges[a];
|
|
174
|
+
const sides = [];
|
|
175
|
+
const wider = [];
|
|
176
|
+
const lopsided = [];
|
|
177
|
+
let pastWhereItFits = false;
|
|
178
|
+
let over = true;
|
|
179
|
+
for (const a of axes) {
|
|
180
|
+
const j = judged[a];
|
|
181
|
+
if (!j)
|
|
182
|
+
continue;
|
|
183
|
+
const lo = extent[a].lo + shift[a], hi = extent[a].hi + shift[a];
|
|
184
|
+
if (lo >= j.hi || hi <= j.lo)
|
|
185
|
+
over = false;
|
|
186
|
+
const low = j.lo - lo, high = hi - j.hi;
|
|
187
|
+
if (low > TOUCH)
|
|
188
|
+
sides.push({ axis: a, side: 'low', mm: round1(low) });
|
|
189
|
+
if (high > TOUCH)
|
|
190
|
+
sides.push({ axis: a, side: 'high', mm: round1(high) });
|
|
191
|
+
if (hi - lo > j.hi - j.lo + TOUCH) {
|
|
192
|
+
wider.push(a);
|
|
193
|
+
if (Math.abs(low - high) > 0.5)
|
|
194
|
+
lopsided.push(a);
|
|
195
|
+
}
|
|
196
|
+
else if (low > TOUCH || high > TOUCH)
|
|
197
|
+
pastWhereItFits = true;
|
|
198
|
+
}
|
|
199
|
+
const unread = measure.on !== 'plane' && (!outline || outline.line);
|
|
200
|
+
const state = unread
|
|
201
|
+
? 'unknown'
|
|
202
|
+
: pastWhereItFits
|
|
203
|
+
? measure.exact
|
|
204
|
+
? 'out'
|
|
205
|
+
: 'possible'
|
|
206
|
+
: sides.length
|
|
207
|
+
? 'larger'
|
|
208
|
+
: outline?.round
|
|
209
|
+
? 'unknown'
|
|
210
|
+
: 'inside';
|
|
211
|
+
return {
|
|
212
|
+
part: measure.part,
|
|
213
|
+
on: measure.on,
|
|
214
|
+
state,
|
|
215
|
+
sides,
|
|
216
|
+
wider,
|
|
217
|
+
lopsided,
|
|
218
|
+
at,
|
|
219
|
+
over,
|
|
220
|
+
contact: contactOf(measure, judged, shift)
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/** (나): every copy's touching hull over the face's outline; the plane's declared size, or none, on the plane. */
|
|
224
|
+
function contactOf(measure, judged, shift) {
|
|
225
|
+
const [a, b] = measure.axes;
|
|
226
|
+
if (!measure.contact)
|
|
227
|
+
return 'unknown';
|
|
228
|
+
if (measure.on === 'plane') {
|
|
229
|
+
if (!judged[a] && !judged[b])
|
|
230
|
+
return 'on';
|
|
231
|
+
}
|
|
232
|
+
else if (!measure.outline || measure.outline.line || !judged[a] || !judged[b])
|
|
233
|
+
return 'unknown';
|
|
234
|
+
const box = {
|
|
235
|
+
lo: [judged[a]?.lo ?? -Infinity, judged[b]?.lo ?? -Infinity],
|
|
236
|
+
hi: [judged[a]?.hi ?? Infinity, judged[b]?.hi ?? Infinity]
|
|
237
|
+
};
|
|
238
|
+
const ellipse = measure.outline?.round;
|
|
239
|
+
for (const copy of measure.contact) {
|
|
240
|
+
const hull = hullOf(copy.map(([u, v]) => [u + shift[a], v + shift[b]]));
|
|
241
|
+
const touches = ellipse
|
|
242
|
+
? distanceToHull(hull.map(([u, v]) => [
|
|
243
|
+
(u - (box.lo[0] + box.hi[0]) / 2) / ((box.hi[0] - box.lo[0]) / 2),
|
|
244
|
+
(v - (box.lo[1] + box.hi[1]) / 2) / ((box.hi[1] - box.lo[1]) / 2)
|
|
245
|
+
])) <=
|
|
246
|
+
1 + 1e-6
|
|
247
|
+
: overlapsBox(hull, box);
|
|
248
|
+
if (!touches)
|
|
249
|
+
return 'off';
|
|
250
|
+
}
|
|
251
|
+
return 'on';
|
|
252
|
+
}
|
|
253
|
+
/** The convex hull of points in a plane, counter-clockwise; a point or a segment as itself. */
|
|
254
|
+
function hullOf(points) {
|
|
255
|
+
const ps = [...points].sort((p, q) => p[0] - q[0] || p[1] - q[1]);
|
|
256
|
+
const cross = (o, p, q) => (p[0] - o[0]) * (q[1] - o[1]) - (p[1] - o[1]) * (q[0] - o[0]);
|
|
257
|
+
const half = (list) => {
|
|
258
|
+
const out = [];
|
|
259
|
+
for (const p of list) {
|
|
260
|
+
while (out.length >= 2 && cross(out[out.length - 2], out[out.length - 1], p) <= 1e-9)
|
|
261
|
+
out.pop();
|
|
262
|
+
out.push(p);
|
|
263
|
+
}
|
|
264
|
+
return out;
|
|
265
|
+
};
|
|
266
|
+
const lower = half(ps);
|
|
267
|
+
const upper = half([...ps].reverse());
|
|
268
|
+
const all = [...lower.slice(0, -1), ...upper.slice(0, -1)];
|
|
269
|
+
return all.length ? all : ps.slice(0, 1);
|
|
270
|
+
}
|
|
271
|
+
/** Whether a convex hull and a box overlap (separating axes: the box's two and each side's normal), within a touch. */
|
|
272
|
+
function overlapsBox(hull, box) {
|
|
273
|
+
for (let k = 0; k < 2; k++) {
|
|
274
|
+
const vs = hull.map(p => p[k]);
|
|
275
|
+
if (Math.min(...vs) > box.hi[k] + TOUCH || Math.max(...vs) < box.lo[k] - TOUCH)
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
const corners = [
|
|
279
|
+
[box.lo[0], box.lo[1]],
|
|
280
|
+
[box.hi[0], box.lo[1]],
|
|
281
|
+
[box.hi[0], box.hi[1]],
|
|
282
|
+
[box.lo[0], box.hi[1]]
|
|
283
|
+
].map(([u, v]) => [Number.isFinite(u) ? u : Math.sign(u) * 1e12, Number.isFinite(v) ? v : Math.sign(v) * 1e12]);
|
|
284
|
+
for (let i = 0; i < hull.length && hull.length > 1; i++) {
|
|
285
|
+
const p = hull[i], q = hull[(i + 1) % hull.length];
|
|
286
|
+
const n = [q[1] - p[1], p[0] - q[0]];
|
|
287
|
+
const len = Math.hypot(n[0], n[1]);
|
|
288
|
+
if (len < 1e-12)
|
|
289
|
+
continue;
|
|
290
|
+
const along = (c) => (c[0] * n[0] + c[1] * n[1]) / len;
|
|
291
|
+
const mine = hull.map(along);
|
|
292
|
+
const theirs = corners.map(along);
|
|
293
|
+
if (Math.min(...theirs) > Math.max(...mine) + TOUCH || Math.max(...theirs) < Math.min(...mine) - TOUCH)
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
/** How far a convex hull lies from the origin: 0 when it covers it. */
|
|
299
|
+
function distanceToHull(hull) {
|
|
300
|
+
if (hull.length === 1)
|
|
301
|
+
return Math.hypot(hull[0][0], hull[0][1]);
|
|
302
|
+
const segment = (p, q) => {
|
|
303
|
+
const d = [q[0] - p[0], q[1] - p[1]];
|
|
304
|
+
const l = d[0] * d[0] + d[1] * d[1];
|
|
305
|
+
const t = l ? Math.max(0, Math.min(1, -(p[0] * d[0] + p[1] * d[1]) / l)) : 0;
|
|
306
|
+
return Math.hypot(p[0] + t * d[0], p[1] + t * d[1]);
|
|
307
|
+
};
|
|
308
|
+
if (hull.length >= 3 &&
|
|
309
|
+
hull.every((p, i) => {
|
|
310
|
+
const q = hull[(i + 1) % hull.length];
|
|
311
|
+
return (q[0] - p[0]) * -p[1] - (q[1] - p[1]) * -p[0] >= -1e-9;
|
|
312
|
+
}))
|
|
313
|
+
return 0;
|
|
314
|
+
return Math.min(...hull.map((p, i) => segment(p, hull[(i + 1) % hull.length])));
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Whether a part fastened to a face lies within its edges and touches it (ADR-0097 §5.5, ADR-0140 3.8): measured on
|
|
318
|
+
* the face it is fastened to, or tried on another, lined up as `place` says. Past the edges is not wrong in itself -- a
|
|
319
|
+
* device may overhang a bench top -- and not the figure's room: it is said apart, and nothing is moved.
|
|
320
|
+
*/
|
|
321
|
+
export function figureFaceOverhangOf(source, part, values = {}, place = {}) {
|
|
322
|
+
const measure = figureFaceMeasureOf(source, part, values, place);
|
|
323
|
+
return measure && figureFaceOverhangAt(measure, place.align);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* The alignment that brings the part inside the face, for 정렬·간격 고치기: on each axis it comes past an edge, the
|
|
327
|
+
* least move -- level with that edge from inside (`min` / `max` where the face's edges are the ones a fastening lines up
|
|
328
|
+
* to and `lineUp` offers them, else that distance from the middle) -- or the centre when it is wider than the face and
|
|
329
|
+
* cannot be inside. `inside` when nothing of it is past an edge; `unmeasured` when the face's edges are not read.
|
|
330
|
+
*/
|
|
331
|
+
export function figureFaceInsideAlignOf(measure, align, lineUp = {}) {
|
|
332
|
+
const now = figureFaceOverhangAt(measure, align);
|
|
333
|
+
if (now.state === 'unknown' || measure.axes.some(a => !measure.edges[a]))
|
|
334
|
+
return { cannot: 'unmeasured' };
|
|
335
|
+
const next = { align: { ...align }, moved: [] };
|
|
336
|
+
for (const a of measure.axes) {
|
|
337
|
+
const past = now.sides.filter(s => s.axis === a);
|
|
338
|
+
if (!past.length)
|
|
339
|
+
continue;
|
|
340
|
+
next.moved.push(a);
|
|
341
|
+
if (now.wider.includes(a)) {
|
|
342
|
+
next.align[a] = 'centre';
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
const low = past.some(s => s.side === 'low');
|
|
346
|
+
const e = measure.edges[a];
|
|
347
|
+
const o = measure.outline;
|
|
348
|
+
const j = o ? { lo: o.centre[a] - o.size[a] / 2, hi: o.centre[a] + o.size[a] / 2 } : e;
|
|
349
|
+
const part = measure.extent[a].hi - measure.extent[a].lo;
|
|
350
|
+
const middle = low ? j.lo + part / 2 : j.hi - part / 2;
|
|
351
|
+
const level = Math.abs((low ? j.lo : j.hi) - (low ? e.lo : e.hi)) < TOUCH;
|
|
352
|
+
next.align[a] =
|
|
353
|
+
level && (lineUp[a] ?? true) ? (low ? 'min' : 'max') : { mm: Math.round(middle - (e.lo + e.hi) / 2) };
|
|
354
|
+
}
|
|
355
|
+
return next.moved.length ? next : { cannot: 'inside' };
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=face-overhang.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"face-overhang.js","sourceRoot":"","sources":["../src/face-overhang.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { FigureAsset } from './asset-types.ts';
|
|
2
|
+
import { type Axis } from './words.ts';
|
|
3
|
+
/** What a part is fastened to: a face of another part, or the plane the figure is mounted on. */
|
|
4
|
+
export type FigureFastenTarget = {
|
|
5
|
+
part: string;
|
|
6
|
+
face: string;
|
|
7
|
+
} | 'plane';
|
|
8
|
+
/** An alignment across a face, its distance worked out: the centre, level with an edge, or millimetres from the centre. */
|
|
9
|
+
export type FigureFastenAlignment = 'centre' | 'min' | 'max' | {
|
|
10
|
+
mm: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* The axes across the face a part is fastened to: the two that are not its normal -- the plane's by the figure's
|
|
14
|
+
* placement (a floor's is Y, a wall's Z), a part's face by its shape. None for a face the shape does not name an axis
|
|
15
|
+
* for.
|
|
16
|
+
*/
|
|
17
|
+
export declare function figureFastenAxesOf(source: FigureAsset, to: FigureFastenTarget): Axis[];
|
|
18
|
+
/**
|
|
19
|
+
* The place that keeps a part where it stands when it is fastened to `to` (ADR-0140 3.7): on each axis across the face,
|
|
20
|
+
* in the target's own frame (3.11), the middle of the part's real extent (3.4) from the middle of the face -- the
|
|
21
|
+
* plane's is the origin -- to a tenth of a millimetre, at the values given. Nearer than half a millimetre is the centre
|
|
22
|
+
* and is left out. Fastened with it, the part does not move across the face, whatever way either stands (a door set
|
|
23
|
+
* 100 mm in front of its frame once slid into it, 2026-09-26; one beside a turned frame jumped to its middle).
|
|
24
|
+
*/
|
|
25
|
+
export declare function figureFastenKeptPlaceOf(source: FigureAsset, part: string, to: FigureFastenTarget, values?: Record<string, number>): Partial<Record<Axis, number>>;
|
|
26
|
+
/**
|
|
27
|
+
* Where an alignment puts a part's centre from the face's centre, on each axis given a part size: level with the low
|
|
28
|
+
* edge or the high one, where the face has a size on that axis; a distance as it is; anything else the centre.
|
|
29
|
+
*/
|
|
30
|
+
export declare function figureFastenPlaceOf(a: {
|
|
31
|
+
align: Partial<Record<Axis, FigureFastenAlignment | undefined>>;
|
|
32
|
+
face: Partial<Record<Axis, number | undefined>>;
|
|
33
|
+
part: Partial<Record<Axis, number>>;
|
|
34
|
+
}): Partial<Record<Axis, number>>;
|
|
35
|
+
//# sourceMappingURL=fasten-place.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fasten-place.d.ts","sourceRoot":"","sources":["../src/fasten-place.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAQ,KAAK,IAAI,EAAE,MAAM,YAAY,CAAA;AAI5C,iGAAiG;AACjG,MAAM,MAAM,kBAAkB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAA;AAEzE,2HAA2H;AAC3H,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7E;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,kBAAkB,GAAG,IAAI,EAAE,CAStF;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,kBAAkB,EACtB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAClC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CA2B/B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE;IACrC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,SAAS,CAAC,CAAC,CAAA;IAC/D,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IAC/C,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;CACpC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAiBhC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright © HatioLab Inc. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
/*
|
|
5
|
+
* Where a part lies across the face it is fastened to (ADR-0140 3.7, stage B): the place that keeps it where it stands
|
|
6
|
+
* when it is fastened, and the place an alignment puts it. The modeller drew and kept these by its own arithmetic; it
|
|
7
|
+
* now asks here, so a fastening's place is worked out in one place.
|
|
8
|
+
*/
|
|
9
|
+
import { figurePlacementOf, upgradeFigurePlacement } from "./asset.js";
|
|
10
|
+
import { evaluate } from "./command-preview.js";
|
|
11
|
+
import { compileFigureGraph, figureShapeFaces } from "./graph.js";
|
|
12
|
+
import { ownSpansOf, mul3, mv3, transpose3, IDENTITY } from "./authoring-geometry.js";
|
|
13
|
+
import { figureReachValue, figureShapeExtremeAlong } from "./shape-extreme.js";
|
|
14
|
+
import { AXES } from "./words.js";
|
|
15
|
+
/**
|
|
16
|
+
* The axes across the face a part is fastened to: the two that are not its normal -- the plane's by the figure's
|
|
17
|
+
* placement (a floor's is Y, a wall's Z), a part's face by its shape. None for a face the shape does not name an axis
|
|
18
|
+
* for.
|
|
19
|
+
*/
|
|
20
|
+
export function figureFastenAxesOf(source, to) {
|
|
21
|
+
const asset = upgradeFigurePlacement(source);
|
|
22
|
+
if (to === 'plane') {
|
|
23
|
+
const normal = figurePlacementOf(asset) === 'wall' ? 'z' : 'y';
|
|
24
|
+
return AXES.filter(a => a !== normal);
|
|
25
|
+
}
|
|
26
|
+
const shape = asset.document.model.nodes.find((n) => n.id === `${to.part}.shape`);
|
|
27
|
+
const along = (shape && figureShapeFaces(shape)?.[to.face]?.axis);
|
|
28
|
+
return along ? AXES.filter(a => a !== along) : [];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The place that keeps a part where it stands when it is fastened to `to` (ADR-0140 3.7): on each axis across the face,
|
|
32
|
+
* in the target's own frame (3.11), the middle of the part's real extent (3.4) from the middle of the face -- the
|
|
33
|
+
* plane's is the origin -- to a tenth of a millimetre, at the values given. Nearer than half a millimetre is the centre
|
|
34
|
+
* and is left out. Fastened with it, the part does not move across the face, whatever way either stands (a door set
|
|
35
|
+
* 100 mm in front of its frame once slid into it, 2026-09-26; one beside a turned frame jumped to its middle).
|
|
36
|
+
*/
|
|
37
|
+
export function figureFastenKeptPlaceOf(source, part, to, values = {}) {
|
|
38
|
+
const kept = {};
|
|
39
|
+
const asset = upgradeFigurePlacement(source);
|
|
40
|
+
const m = asset.document.model;
|
|
41
|
+
const geometry = evaluate(source, values);
|
|
42
|
+
const poseOf = (id) => geometry.find(g => g.id === id)?.pose;
|
|
43
|
+
const mine = poseOf(part);
|
|
44
|
+
if (!mine)
|
|
45
|
+
return kept;
|
|
46
|
+
const theirs = to === 'plane' ? { r: IDENTITY, t: [0, 0, 0] } : poseOf(to.part);
|
|
47
|
+
if (!theirs)
|
|
48
|
+
return kept;
|
|
49
|
+
const graph = compileFigureGraph(m).evaluate({ ...asset.designInputs, ...asset.stateDefaults, ...values }).values;
|
|
50
|
+
/* The part's pose and place in the target's frame. */
|
|
51
|
+
const R = mul3(transpose3(theirs.r), mine.r);
|
|
52
|
+
const o = mv3(transpose3(theirs.r), mine.t.map((v, i) => v - theirs.t[i]));
|
|
53
|
+
const spans = to === 'plane' ? {} : ownSpansOf(m, to.part, to.part);
|
|
54
|
+
for (const axis of figureFastenAxesOf(source, to)) {
|
|
55
|
+
const k = AXES.indexOf(axis);
|
|
56
|
+
const along = (sign) => figureReachValue(figureShapeExtremeAlong(m, part, mv3(transpose3(R), AXES.map((_, i) => (i === k ? sign : 0))), part), graph);
|
|
57
|
+
const middle = o[k] + (along(1) - along(-1)) / 2;
|
|
58
|
+
const span = spans[axis];
|
|
59
|
+
const at = (terms) => terms.reduce((s, t) => s + t.k * graph[t.ref], 0);
|
|
60
|
+
const face = span ? (at(span.lo) + at(span.hi)) / 2 : 0;
|
|
61
|
+
const off = Math.round((middle - face) * 10) / 10;
|
|
62
|
+
if (Math.abs(off) < 0.5)
|
|
63
|
+
continue;
|
|
64
|
+
kept[axis] = off;
|
|
65
|
+
}
|
|
66
|
+
return kept;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Where an alignment puts a part's centre from the face's centre, on each axis given a part size: level with the low
|
|
70
|
+
* edge or the high one, where the face has a size on that axis; a distance as it is; anything else the centre.
|
|
71
|
+
*/
|
|
72
|
+
export function figureFastenPlaceOf(a) {
|
|
73
|
+
const at = {};
|
|
74
|
+
for (const axis of AXES) {
|
|
75
|
+
const part = a.part[axis];
|
|
76
|
+
if (part === undefined)
|
|
77
|
+
continue;
|
|
78
|
+
const how = a.align[axis];
|
|
79
|
+
const face = a.face[axis];
|
|
80
|
+
at[axis] =
|
|
81
|
+
how === 'min' && face !== undefined
|
|
82
|
+
? -(face - part) / 2
|
|
83
|
+
: how === 'max' && face !== undefined
|
|
84
|
+
? (face - part) / 2
|
|
85
|
+
: how && typeof how === 'object'
|
|
86
|
+
? how.mm
|
|
87
|
+
: 0;
|
|
88
|
+
}
|
|
89
|
+
return at;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=fasten-place.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fasten-place.js","sourceRoot":"","sources":["../src/fasten-place.ts"],"names":[],"mappings":"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"}
|