@hatiolab/figure-model 0.1.31 → 0.1.33
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/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/sizing.d.ts +11 -0
- package/dist/sizing.d.ts.map +1 -1
- package/dist/sizing.js +8 -4
- package/dist/sizing.js.map +1 -1
- package/dist/v3-asset-types.d.ts +24 -2
- package/dist/v3-asset-types.d.ts.map +1 -1
- package/dist/v3-asset.d.ts.map +1 -1
- package/dist/v3-asset.js +17 -3
- package/dist/v3-asset.js.map +1 -1
- package/dist/v3-capabilities.d.ts.map +1 -1
- package/dist/v3-capabilities.js +13 -1
- package/dist/v3-capabilities.js.map +1 -1
- package/dist/v3-create.d.ts +36 -0
- package/dist/v3-create.d.ts.map +1 -1
- package/dist/v3-create.js +108 -7
- package/dist/v3-create.js.map +1 -1
- package/dist/v3-editor-workspace.d.ts +34 -1
- package/dist/v3-editor-workspace.d.ts.map +1 -1
- package/dist/v3-editor-workspace.js +62 -13
- package/dist/v3-editor-workspace.js.map +1 -1
- package/dist/v3-from-v2.d.ts +70 -0
- package/dist/v3-from-v2.d.ts.map +1 -0
- package/dist/v3-from-v2.js +595 -0
- package/dist/v3-from-v2.js.map +1 -0
- package/dist/v3-gate.d.ts +35 -0
- package/dist/v3-gate.d.ts.map +1 -0
- package/dist/v3-gate.js +131 -0
- package/dist/v3-gate.js.map +1 -0
- package/dist/v3-graph-types.d.ts +1 -1
- package/dist/v3-graph-types.d.ts.map +1 -1
- package/dist/v3-graph.d.ts +8 -0
- package/dist/v3-graph.d.ts.map +1 -1
- package/dist/v3-graph.js +99 -10
- package/dist/v3-graph.js.map +1 -1
- package/dist/v3-part-edit.d.ts.map +1 -1
- package/dist/v3-part-edit.js +12 -4
- package/dist/v3-part-edit.js.map +1 -1
- package/docs/prototypes/v3-asset-samples.mjs +1 -1
- package/docs/prototypes/v3-asset.schema.json +1 -1
- package/docs/v3-asset-persistence.md +3 -1
- package/docs/v3-design.md +3 -0
- package/docs/v3-operator-contracts.md +4 -0
- package/docs/v3-review-2026-09-22.md +127 -0
- package/docs/v3-status.md +9 -0
- package/package.json +1 -1
package/dist/v3-create.js
CHANGED
|
@@ -3,17 +3,73 @@ import { V3ContractError } from "./v3-contract.js";
|
|
|
3
3
|
/** New assets start empty. A box is created only by an explicit authoring action. */
|
|
4
4
|
export function createV3Asset(name) {
|
|
5
5
|
const asset = {
|
|
6
|
-
version: 'figure-v3-asset-
|
|
6
|
+
version: 'figure-v3-asset-1',
|
|
7
|
+
name,
|
|
7
8
|
document: {
|
|
8
9
|
version: 'figure-v3-prototype-1',
|
|
9
10
|
model: { version: 'r3-spatial-1', inputs: [], constants: [], nodes: [] },
|
|
10
11
|
capabilities: { version: 'r3-capability-3', assetFrame: 'asset', bindings: [] }
|
|
11
12
|
},
|
|
12
|
-
designInputs: {},
|
|
13
|
+
designInputs: {},
|
|
14
|
+
stateDefaults: {},
|
|
15
|
+
palette: { 'palette.primary': '#477b9e' },
|
|
16
|
+
appearance: []
|
|
13
17
|
};
|
|
14
18
|
compileV3Asset(asset);
|
|
15
19
|
return asset;
|
|
16
20
|
}
|
|
21
|
+
/** Authoring recipes use existing providers; they introduce no extra evaluation rules. */
|
|
22
|
+
export function addV3Primitive(source, part) {
|
|
23
|
+
const recipes = {
|
|
24
|
+
box: { op: 'box-shape@1', keys: ['width', 'height', 'depth'] },
|
|
25
|
+
cylinder: { op: 'cylinder-shape@1', keys: ['radius', 'length'] },
|
|
26
|
+
'rounded-box': { op: 'rounded-box@1', keys: ['width', 'height', 'depth', 'round'] },
|
|
27
|
+
portal: {
|
|
28
|
+
op: 'portal-profile@1',
|
|
29
|
+
keys: ['left', 'right', 'bottom', 'top', 'openingLeft', 'openingRight', 'openingTop', 'depth']
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
if (!part || !Object.hasOwn(recipes, part.kind))
|
|
33
|
+
throw new V3ContractError('PROVIDER', 'part', 'unknown primitive');
|
|
34
|
+
const recipe = recipes[part.kind];
|
|
35
|
+
if (!part.dimensions ||
|
|
36
|
+
Object.keys(part.dimensions).length !== recipe.keys.length ||
|
|
37
|
+
recipe.keys.some(k => !Object.hasOwn(part.dimensions, k)))
|
|
38
|
+
throw new V3ContractError('SCHEMA', part.id, 'provider dimensions must match declared fields');
|
|
39
|
+
const asset = addV3Box(source, {
|
|
40
|
+
id: part.id,
|
|
41
|
+
size: { x: 1, y: 1, z: 1 },
|
|
42
|
+
position: part.position,
|
|
43
|
+
...(part.rotation ? { rotation: part.rotation } : {}),
|
|
44
|
+
...(part.material ? { material: part.material } : {})
|
|
45
|
+
});
|
|
46
|
+
const model = asset.document.model, removed = new Set(['x', 'y', 'z'].map(a => part.id + '.size.' + a));
|
|
47
|
+
model.inputs = model.inputs.filter(i => !removed.has(i.id));
|
|
48
|
+
for (const id of removed)
|
|
49
|
+
delete asset.designInputs[id];
|
|
50
|
+
const shape = model.nodes.find(n => n.id === part.id + '.shape');
|
|
51
|
+
shape.op = recipe.op;
|
|
52
|
+
shape.args = [];
|
|
53
|
+
const existing = new Set([
|
|
54
|
+
...model.inputs.map(i => i.id),
|
|
55
|
+
...model.constants.map(c => c.id),
|
|
56
|
+
...model.nodes.flatMap(n => [n.id, ...Object.values(n.outputs)])
|
|
57
|
+
]);
|
|
58
|
+
for (const key of recipe.keys) {
|
|
59
|
+
const id = part.id + '.dimension.' + key, value = part.dimensions[key];
|
|
60
|
+
if (existing.has(id))
|
|
61
|
+
throw new V3ContractError('DUPLICATE_WRITER', id, 'input already exists');
|
|
62
|
+
if (!Number.isFinite(value))
|
|
63
|
+
throw new V3ContractError('NON_FINITE', id, 'finite dimension required');
|
|
64
|
+
model.inputs.push({ id, unit: 'mm', min: -Number.MAX_VALUE, max: Number.MAX_VALUE, role: 'design' });
|
|
65
|
+
asset.designInputs[id] = value;
|
|
66
|
+
shape.args.push(id);
|
|
67
|
+
}
|
|
68
|
+
if (part.kind === 'cylinder')
|
|
69
|
+
asset.appearance.find(a => a.target === part.id).segments = 12;
|
|
70
|
+
compileV3Asset(asset);
|
|
71
|
+
return asset;
|
|
72
|
+
}
|
|
17
73
|
/** Pure authoring operation. Expands to standard graph operators, not a second runtime geometry model. */
|
|
18
74
|
export function addV3Box(source, box) {
|
|
19
75
|
compileV3Asset(source);
|
|
@@ -21,9 +77,31 @@ export function addV3Box(source, box) {
|
|
|
21
77
|
throw new V3ContractError('ID', 'box', 'letter-led part ID required');
|
|
22
78
|
}
|
|
23
79
|
const asset = structuredClone(source), model = asset.document.model, prefix = box.id;
|
|
24
|
-
const keys = [
|
|
25
|
-
|
|
26
|
-
|
|
80
|
+
const keys = [
|
|
81
|
+
'size.x',
|
|
82
|
+
'size.y',
|
|
83
|
+
'size.z',
|
|
84
|
+
'position.x',
|
|
85
|
+
'position.y',
|
|
86
|
+
'position.z',
|
|
87
|
+
'rotation.x',
|
|
88
|
+
'rotation.y',
|
|
89
|
+
'rotation.z'
|
|
90
|
+
];
|
|
91
|
+
const reserved = new Set([
|
|
92
|
+
prefix,
|
|
93
|
+
`${prefix}.shape`,
|
|
94
|
+
`${prefix}.shapeValue`,
|
|
95
|
+
`${prefix}.pose`,
|
|
96
|
+
`${prefix}.poseValue`,
|
|
97
|
+
`${prefix}.placed`,
|
|
98
|
+
...keys.map(k => `${prefix}.${k}`)
|
|
99
|
+
]);
|
|
100
|
+
const existing = [
|
|
101
|
+
...model.inputs.map(i => i.id),
|
|
102
|
+
...model.constants.map(c => c.id),
|
|
103
|
+
...model.nodes.flatMap(n => [n.id, ...Object.values(n.outputs)])
|
|
104
|
+
];
|
|
27
105
|
if (existing.some(id => reserved.has(id)))
|
|
28
106
|
throw new V3ContractError('DUPLICATE_PART', prefix, 'part IDs overlap existing graph identifiers');
|
|
29
107
|
const rotation = box.rotation ?? { x: 0, y: 0, z: 0 };
|
|
@@ -37,12 +115,35 @@ export function addV3Box(source, box) {
|
|
|
37
115
|
throw new V3ContractError('GEOMETRY_DOMAIN', `${prefix}.${group}.${axis}`, 'finite value and positive size required');
|
|
38
116
|
const id = `${prefix}.${group}.${axis}`;
|
|
39
117
|
// These are broad authoring limits, not a rendering safety/performance guarantee.
|
|
40
|
-
model.inputs.push({
|
|
118
|
+
model.inputs.push({
|
|
119
|
+
id,
|
|
120
|
+
unit: group === 'rotation' ? 'deg' : 'mm',
|
|
121
|
+
min: group === 'size' ? Number.MIN_VALUE : -Number.MAX_VALUE,
|
|
122
|
+
max: Number.MAX_VALUE,
|
|
123
|
+
role: 'design'
|
|
124
|
+
});
|
|
41
125
|
asset.designInputs[id] = value;
|
|
42
126
|
}
|
|
43
127
|
}
|
|
44
128
|
const local = `${prefix}.local`;
|
|
45
|
-
model.nodes.push({
|
|
129
|
+
model.nodes.push({
|
|
130
|
+
id: `${prefix}.shape`,
|
|
131
|
+
op: 'box-shape@1',
|
|
132
|
+
args: keys.slice(0, 3).map(k => `${prefix}.${k}`),
|
|
133
|
+
outputs: { shape: `${prefix}.shapeValue` },
|
|
134
|
+
params: { frame: local }
|
|
135
|
+
}, {
|
|
136
|
+
id: `${prefix}.pose`,
|
|
137
|
+
op: 'rigid@1',
|
|
138
|
+
args: keys.slice(3).map(k => `${prefix}.${k}`),
|
|
139
|
+
outputs: { pose: `${prefix}.poseValue` },
|
|
140
|
+
params: { from: local, to: asset.document.capabilities.assetFrame }
|
|
141
|
+
}, {
|
|
142
|
+
id: prefix,
|
|
143
|
+
op: 'place@1',
|
|
144
|
+
args: [`${prefix}.shapeValue`, `${prefix}.poseValue`],
|
|
145
|
+
outputs: { placed: `${prefix}.placed` }
|
|
146
|
+
});
|
|
46
147
|
asset.appearance.push({ target: prefix, material: structuredClone(box.material ?? { token: 'palette.primary' }) });
|
|
47
148
|
compileV3Asset(asset);
|
|
48
149
|
return asset;
|
package/dist/v3-create.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3-create.js","sourceRoot":"","sources":["../src/v3-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGlD,qFAAqF;AACrF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,KAAK,GAAY;QACrB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"v3-create.js","sourceRoot":"","sources":["../src/v3-create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { V3EditRequest, V3EditControl } from './v3-authoring-session.ts';
|
|
2
|
-
import type { V3BoxCreation } from './v3-create.ts';
|
|
2
|
+
import type { V3BoxCreation, V3PrimitiveCreation } from './v3-create.ts';
|
|
3
3
|
import type { V3PartEdit } from './v3-part-edit.ts';
|
|
4
4
|
export interface V3WorkspaceExport {
|
|
5
5
|
context: string;
|
|
@@ -197,6 +197,39 @@ export declare function createV3EditorWorkspace(): {
|
|
|
197
197
|
bindings: import("./v3-asset-types.ts").V3EvaluatedBinding[];
|
|
198
198
|
palette: Record<string, string>;
|
|
199
199
|
};
|
|
200
|
+
addPrimitive({ context, part, ...q }: V3EditControl & {
|
|
201
|
+
context: string;
|
|
202
|
+
part: V3PrimitiveCreation;
|
|
203
|
+
}): {
|
|
204
|
+
context: null;
|
|
205
|
+
name: null;
|
|
206
|
+
fields: never[];
|
|
207
|
+
geometry: never[];
|
|
208
|
+
bindings: never[];
|
|
209
|
+
dirty: boolean;
|
|
210
|
+
revision: null;
|
|
211
|
+
canUndo?: undefined;
|
|
212
|
+
canRedo?: undefined;
|
|
213
|
+
palette?: undefined;
|
|
214
|
+
} | {
|
|
215
|
+
context: string;
|
|
216
|
+
name: string;
|
|
217
|
+
revision: number;
|
|
218
|
+
dirty: boolean;
|
|
219
|
+
canUndo: boolean;
|
|
220
|
+
canRedo: boolean;
|
|
221
|
+
fields: {
|
|
222
|
+
value: number;
|
|
223
|
+
id: string;
|
|
224
|
+
unit: import("./v3-graph-types.ts").V3Unit;
|
|
225
|
+
min: number;
|
|
226
|
+
max: number;
|
|
227
|
+
role?: "design" | "state";
|
|
228
|
+
}[];
|
|
229
|
+
geometry: import("./v3-asset-types.ts").V3AssetGeometry[];
|
|
230
|
+
bindings: import("./v3-asset-types.ts").V3EvaluatedBinding[];
|
|
231
|
+
palette: Record<string, string>;
|
|
232
|
+
};
|
|
200
233
|
editPart({ context, edit, ...q }: V3EditControl & {
|
|
201
234
|
context: string;
|
|
202
235
|
edit: V3PartEdit;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3-editor-workspace.d.ts","sourceRoot":"","sources":["../src/v3-editor-workspace.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"v3-editor-workspace.d.ts","sourceRoot":"","sources":["../src/v3-editor-workspace.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE7E,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAExE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAGnD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AACD,MAAM,WAAW,cAAc;IAC7B,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAeD,+FAA+F;AAC/F,wBAAgB,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA4DxB,MAAM,6BAAoC,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAgB3B,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAM3B,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAGrC,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAO7B,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,aAAa,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CAQhD,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,mBAAmB,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCAQlE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAe/D,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAanC,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8CAgBxD;QACD,OAAO,EAAE,MAAM,CAAA;QACf,oBAAoB,CAAC,EAAE,OAAO,CAAA;KAC/B,GAAG,iBAAiB;kDAQyB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBlE;AACD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAC1E,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAA"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { parseV3Asset, serializeV3Asset, compileV3Asset, captureV3AuthoredInputs } from "./v3-asset.js";
|
|
2
2
|
import { createV3AuthoringSession } from "./v3-authoring-session.js";
|
|
3
|
-
import { addV3Box } from "./v3-create.js";
|
|
3
|
+
import { addV3Box, addV3Primitive } from "./v3-create.js";
|
|
4
4
|
import { editV3Part } from "./v3-part-edit.js";
|
|
5
5
|
import { V3ContractError } from "./v3-contract.js";
|
|
6
|
-
function fail(code, message) {
|
|
6
|
+
function fail(code, message) {
|
|
7
|
+
throw new V3ContractError(code, 'workspace', message);
|
|
8
|
+
}
|
|
7
9
|
/** One history for structural and input edits. No persistence or authentication is implied. */
|
|
8
10
|
export function createV3EditorWorkspace() {
|
|
9
11
|
let active = null, epoch = 0;
|
|
@@ -20,11 +22,17 @@ export function createV3EditorWorkspace() {
|
|
|
20
22
|
if (q.expectedRevision !== a.revision)
|
|
21
23
|
fail('REVISION_CONFLICT', 'editor changed since request');
|
|
22
24
|
}
|
|
23
|
-
function dirty() {
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
function dirty() {
|
|
26
|
+
return !!active && serializeV3Asset(active.asset) !== serializeV3Asset(active.baseline);
|
|
27
|
+
}
|
|
28
|
+
function leave(discard) {
|
|
29
|
+
if (dirty() && !discard)
|
|
30
|
+
fail('UNSAVED_DESIGN', 'current asset has unsaved design edits');
|
|
31
|
+
}
|
|
26
32
|
const snapshot = (a) => structuredClone({ asset: a.asset, inputs: a.inputs });
|
|
27
|
-
function validate(s) {
|
|
33
|
+
function validate(s) {
|
|
34
|
+
compileV3Asset(captureV3AuthoredInputs(s.asset, s.inputs, { captureStateDefaults: true })).evaluate();
|
|
35
|
+
}
|
|
28
36
|
function install(a, next) {
|
|
29
37
|
validate(next);
|
|
30
38
|
a.undo.push(snapshot(a));
|
|
@@ -39,7 +47,18 @@ export function createV3EditorWorkspace() {
|
|
|
39
47
|
if (!active)
|
|
40
48
|
return { context: null, name: null, fields: [], geometry: [], bindings: [], dirty: false, revision: null };
|
|
41
49
|
const a = active, rendered = compileV3Asset(captureV3AuthoredInputs(a.asset, a.inputs, { captureStateDefaults: true })).evaluate();
|
|
42
|
-
return {
|
|
50
|
+
return {
|
|
51
|
+
context: a.context,
|
|
52
|
+
name: a.asset.name,
|
|
53
|
+
revision: a.revision,
|
|
54
|
+
dirty: dirty(),
|
|
55
|
+
canUndo: a.undo.length > 0,
|
|
56
|
+
canRedo: a.redo.length > 0,
|
|
57
|
+
fields: a.asset.document.model.inputs.map(i => ({ ...i, value: a.inputs[i.id] })),
|
|
58
|
+
geometry: rendered.geometry,
|
|
59
|
+
bindings: rendered.bindings,
|
|
60
|
+
palette: rendered.palette
|
|
61
|
+
};
|
|
43
62
|
}
|
|
44
63
|
function candidate(a, q) {
|
|
45
64
|
control(a, q);
|
|
@@ -54,11 +73,26 @@ export function createV3EditorWorkspace() {
|
|
|
54
73
|
leave(discardDesignChanges);
|
|
55
74
|
const asset = parseV3Asset(text), inputs = { ...asset.designInputs, ...asset.stateDefaults };
|
|
56
75
|
validate({ asset, inputs });
|
|
57
|
-
active = {
|
|
76
|
+
active = {
|
|
77
|
+
asset,
|
|
78
|
+
inputs,
|
|
79
|
+
baseline: structuredClone(asset),
|
|
80
|
+
revision: 0,
|
|
81
|
+
context: `asset-context-${++epoch}`,
|
|
82
|
+
undo: [],
|
|
83
|
+
redo: []
|
|
84
|
+
};
|
|
85
|
+
return read();
|
|
86
|
+
},
|
|
87
|
+
close({ discardDesignChanges = false } = {}) {
|
|
88
|
+
leave(discardDesignChanges);
|
|
89
|
+
active = null;
|
|
90
|
+
epoch++;
|
|
58
91
|
return read();
|
|
59
92
|
},
|
|
60
|
-
|
|
61
|
-
|
|
93
|
+
preview({ context, ...q }) {
|
|
94
|
+
return candidate(current(context), q);
|
|
95
|
+
},
|
|
62
96
|
apply({ context, ...q }) {
|
|
63
97
|
const a = current(context), c = candidate(a, q);
|
|
64
98
|
if (c.changes.length)
|
|
@@ -72,12 +106,22 @@ export function createV3EditorWorkspace() {
|
|
|
72
106
|
install(a, { asset, inputs });
|
|
73
107
|
return read();
|
|
74
108
|
},
|
|
109
|
+
addPrimitive({ context, part, ...q }) {
|
|
110
|
+
const a = current(context);
|
|
111
|
+
control(a, q);
|
|
112
|
+
const asset = addV3Primitive(a.asset, part), inputs = { ...asset.designInputs, ...asset.stateDefaults, ...a.inputs };
|
|
113
|
+
install(a, { asset, inputs });
|
|
114
|
+
return read();
|
|
115
|
+
},
|
|
75
116
|
editPart({ context, edit, ...q }) {
|
|
76
117
|
const a = current(context);
|
|
77
118
|
control(a, q);
|
|
78
119
|
const asset = editV3Part(a.asset, edit);
|
|
79
120
|
if (serializeV3Asset(asset) !== serializeV3Asset(a.asset)) {
|
|
80
|
-
const inputs = Object.fromEntries(asset.document.model.inputs.map(i => [
|
|
121
|
+
const inputs = Object.fromEntries(asset.document.model.inputs.map(i => [
|
|
122
|
+
i.id,
|
|
123
|
+
a.inputs[i.id] ?? asset.designInputs[i.id] ?? asset.stateDefaults[i.id]
|
|
124
|
+
]));
|
|
81
125
|
install(a, { asset, inputs });
|
|
82
126
|
}
|
|
83
127
|
return read();
|
|
@@ -112,14 +156,19 @@ export function createV3EditorWorkspace() {
|
|
|
112
156
|
},
|
|
113
157
|
export({ context, captureStateDefaults = false }) {
|
|
114
158
|
const a = current(context);
|
|
115
|
-
return {
|
|
159
|
+
return {
|
|
160
|
+
context,
|
|
161
|
+
revision: a.revision,
|
|
162
|
+
text: serializeV3Asset(captureV3AuthoredInputs(a.asset, a.inputs, { captureStateDefaults }))
|
|
163
|
+
};
|
|
116
164
|
},
|
|
117
165
|
acknowledgeSaved({ context, revision, text }) {
|
|
118
166
|
const a = current(context);
|
|
119
167
|
if (revision !== a.revision)
|
|
120
168
|
fail('REVISION_CONFLICT', 'edited since export');
|
|
121
169
|
const saved = parseV3Asset(text), ordinary = captureV3AuthoredInputs(a.asset, a.inputs), withPose = captureV3AuthoredInputs(a.asset, a.inputs, { captureStateDefaults: true });
|
|
122
|
-
if (serializeV3Asset(saved) !== serializeV3Asset(ordinary) &&
|
|
170
|
+
if (serializeV3Asset(saved) !== serializeV3Asset(ordinary) &&
|
|
171
|
+
serializeV3Asset(saved) !== serializeV3Asset(withPose))
|
|
123
172
|
fail('SAVE_MISMATCH', 'acknowledgement does not match current asset');
|
|
124
173
|
a.asset = saved;
|
|
125
174
|
a.baseline = structuredClone(saved);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3-editor-workspace.js","sourceRoot":"","sources":["../src/v3-editor-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AACvG,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AAEpE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"v3-editor-workspace.js","sourceRoot":"","sources":["../src/v3-editor-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type V3WorldBox } from './v3-gate.ts';
|
|
2
|
+
import { type InstanceScale } from './sizing.ts';
|
|
3
|
+
import type { Axis, FigureSource, Vec3 } from './types.ts';
|
|
4
|
+
import type { V3Asset } from './v3-asset-types.ts';
|
|
5
|
+
/** A rule the converter cannot write in V3. The asset is not converted. */
|
|
6
|
+
export interface V3ConversionRefusal {
|
|
7
|
+
code: string;
|
|
8
|
+
part?: string;
|
|
9
|
+
detail: string;
|
|
10
|
+
}
|
|
11
|
+
/** Something the V3 asset does not carry over from the V2 source. Listed, never dropped quietly. */
|
|
12
|
+
export interface V3ConversionLoss {
|
|
13
|
+
code: string;
|
|
14
|
+
part?: string;
|
|
15
|
+
detail: string;
|
|
16
|
+
}
|
|
17
|
+
export type V3ConversionResult = {
|
|
18
|
+
status: 'converted';
|
|
19
|
+
asset: V3Asset;
|
|
20
|
+
lost: V3ConversionLoss[];
|
|
21
|
+
} | {
|
|
22
|
+
status: 'refused';
|
|
23
|
+
refusals: V3ConversionRefusal[];
|
|
24
|
+
lost: V3ConversionLoss[];
|
|
25
|
+
};
|
|
26
|
+
export interface V3ConversionOptions {
|
|
27
|
+
/** Colour of every palette token the source uses. The converter invents no colours. */
|
|
28
|
+
palette: Record<string, string>;
|
|
29
|
+
/** Asset name. Defaults to the V2 `type`. */
|
|
30
|
+
name?: string;
|
|
31
|
+
}
|
|
32
|
+
/** The V3 design inputs that stand for the instance size, in mm. */
|
|
33
|
+
export declare const V3_SIZE_INPUTS: Readonly<Record<Axis, string>>;
|
|
34
|
+
/** Rx·Ry·Rz for degrees, the order V2 (`three` 'XYZ') and V3 `rigid@1` share. */
|
|
35
|
+
export declare function eulerXYZ(rotation: Partial<Vec3> | undefined): number[][];
|
|
36
|
+
/**
|
|
37
|
+
* Convert one validated V2 source to a V3 asset that places every part where V2 places it, at every
|
|
38
|
+
* instance size in the input range. See the file comment for what is refused and what is listed as lost.
|
|
39
|
+
*/
|
|
40
|
+
export declare function convertV2ToV3(source: unknown, options: V3ConversionOptions): V3ConversionResult;
|
|
41
|
+
/** One placed body in the world, from either side, in the bottom-origin asset frame. */
|
|
42
|
+
export type WorldBox = V3WorldBox;
|
|
43
|
+
/** Where V2 draws every part (and copy) at an instance scale, as world boxes. */
|
|
44
|
+
export declare function v2WorldBoxes(source: FigureSource, scale: InstanceScale): WorldBox[];
|
|
45
|
+
/** Where a converted V3 asset draws every part at an instance size, as world boxes. */
|
|
46
|
+
export declare function v3WorldBoxes(asset: V3Asset, size: Vec3): WorldBox[];
|
|
47
|
+
export interface V3SameDifference {
|
|
48
|
+
part: string;
|
|
49
|
+
scale: InstanceScale;
|
|
50
|
+
what: string;
|
|
51
|
+
v2: string;
|
|
52
|
+
v3: string;
|
|
53
|
+
}
|
|
54
|
+
export interface V3SameReport {
|
|
55
|
+
same: boolean;
|
|
56
|
+
/** Instance scales checked: the base and every combination of doubled axes. */
|
|
57
|
+
scales: InstanceScale[];
|
|
58
|
+
boxesCompared: number;
|
|
59
|
+
differences: V3SameDifference[];
|
|
60
|
+
}
|
|
61
|
+
/** ADR-0087 decision 2 tolerances. */
|
|
62
|
+
export declare const SAME_TOLERANCE_MM = 1;
|
|
63
|
+
export declare const SAME_TOLERANCE_DEG = 0.1;
|
|
64
|
+
/**
|
|
65
|
+
* "The same" (ADR-0087 decision 2): the V2 source and the V3 asset draw the same parts, each at the same
|
|
66
|
+
* centre and world extents within 1 mm and the same rotation within 0.1°, with the same material, at the
|
|
67
|
+
* base size and at every combination of doubled axes.
|
|
68
|
+
*/
|
|
69
|
+
export declare function compareV2WithV3(source: FigureSource, asset: V3Asset, factor?: number): V3SameReport;
|
|
70
|
+
//# sourceMappingURL=v3-from-v2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v3-from-v2.d.ts","sourceRoot":"","sources":["../src/v3-from-v2.ts"],"names":[],"mappings":"AA4BA,OAAO,EAA+B,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAK3E,OAAO,EAQL,KAAK,aAAa,EACnB,MAAM,aAAa,CAAA;AAEpB,OAAO,KAAK,EAAE,IAAI,EAAuB,YAAY,EAAgB,IAAI,EAAE,MAAM,YAAY,CAAA;AAC7F,OAAO,KAAK,EAAE,OAAO,EAA4B,MAAM,qBAAqB,CAAA;AAG5E,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,oGAAoG;AACpG,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,gBAAgB,EAAE,CAAA;CAAE,GACjE;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAAC,IAAI,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAA;AAEpF,MAAM,WAAW,mBAAmB;IAClC,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,oEAAoE;AACpE,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAA4D,CAAA;AA4EtH,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,EAAE,EAAE,CAaxE;AA0CD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAmU/F;AAOD,wFAAwF;AACxF,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAA;AAEjC,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,GAAG,QAAQ,EAAE,CAqBnF;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAE,CAInE;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,aAAa,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAA;IACb,+EAA+E;IAC/E,MAAM,EAAE,aAAa,EAAE,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,gBAAgB,EAAE,CAAA;CAChC;AAED,sCAAsC;AACtC,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAClC,eAAO,MAAM,kBAAkB,MAAM,CAAA;AAUrC;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAI,GAAG,YAAY,CAuD9F"}
|